3

我正在用 GATT 试验蓝牙 LE,我遇到了一个需要你帮助的问题。

我在客户端(一个 Android 应用程序和一个 iOS 应用程序)和服务器(当前运行 Bleno)之间来回发送数据。

我选择了一个只有一个特性的架构(我认为它是一个套接字),我在上面写了来自客户端的请求。服务器使用通知响应请求。通知只能是 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 设备完全相同的限制。
4

1 回答 1

2

在队列被填满之前,您可以发送多少“块”是有限制的。在发送下一个块之前,您必须等待中央确认它已准备好接收更多数据。

onIndicate在 bleno 的情况下,您将等待在发送下一个块之前在您的特征回调中取回指示:

var Characteristic = bleno.Characteristic;

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

至少对于 iOS,您不必更改实现即可获得指示。根据 Apple 的文档,只要您打电话,setNotifyValue:forCharacteristic:您就可以启用指示:

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

我不确定Android是否需要做更多的工作。

于 2016-11-01T09:42:02.150 回答