[英]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毫秒的延遲。
有誰知道從哪里開始尋找問題? 如果需要,我很樂意提供更多信息。
筆記:
在隊列填滿之前,您可以發送多少“塊”是有限制的。 在發送下一個塊之前,您必須等待中心確認它已准備好接收更多數據。
在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.