簡體   English   中英

BLE設備無法連續發送多個GATT通知

[英]BLE device fails to send multiple GATT notifications in a row

我正在嘗試使用GATT的藍牙LE,我遇到了一個需要你幫助的問題。

我在客戶端(一個Android應用程序和一個iOS應用程序)和一個服務器(當前運行Bleno)之間來回發送數據。

我選擇了一個只有一個特性的架構(我認為它是一個Socket),我從客戶端編寫請求。 服務器使用通知響應請求。 通知只能是20字節長,因此我有時必須將響應拆分為多個塊並將其作為單獨的通知發送。

我的問題是,當我將響應分成10塊或更多時,它們永遠不會在客戶端上收到。 (對於1..9塊,一切都按預期工作)。

我已經使用HCIDump( hcidump -i hci0 -X )來檢查在BLE發生故障和成功時發送的命令。

發送通知成功時,從HCIDump獲取以下輸出:

< ACL data: handle 69 flags 0x00 dlen 27
ATT: Handle notify (0x1b)
  handle 0x000c
  value 0x06 0x09 0x46 0x46 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47

followed by:

> HCI Event: Number of Completed Packets (0x13) plen 5
handle 69 packets 1

(對於每個通知塊)

未能發送通知時,下一個輸出來自HCIDump:

< ACL data: handle 68 flags 0x00 dlen 27
ATT: Handle notify (0x1b)
  handle 0x000c
  value 0x08 0x0a 0x46 0x46 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47

但我沒有得到“已完成的數據包”事件,而是一個簡單的device: disconnected

我還沒弄清楚錯誤發生在通信的哪一側。 據我所知,它可能是客戶端無法“快速”接收和確認通知,因為我在服務器端排隊太多請求。

我已經測試過在服務器上發送每個通知之間添加Sleep()命令。 它確實有效,但感覺太不穩定了。 對於10個通知,我需要6毫秒的延遲才能通知,對於30個通知,我需要10毫秒的延遲。

有誰知道從哪里開始尋找問題? 如果需要,我很樂意提供更多信息。

筆記:

  • 我已經測試過並發現了與Android和iOS設備完全相同的限制。

在隊列填滿之前,您可以發送多少“塊”是有限制的。 在發送下一個塊之前,您必須等待中心確認它已准備好接收更多數據。

在bleno的情況下,你等待在發送下一個塊之前在你的特征的onIndicate回調中找回一個指示:

var Characteristic = bleno.Characteristic;

var characteristic = new Characteristic({
    uuid: 'fffffffffffffffffffffffffffffff1',
    properties: [ ... ],
    secure: [ ... ],
    value: null,
    onIndicate: null // <-- Right here
});

至少對於iOS,您不必更改實現以獲得指示。 只要您調用了setNotifyValue:forCharacteristic:您還可以根據Apple的文檔啟用指示:

設置指定特征值的通知或指示。

我不確定Android是否需要更多工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM