繁体   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