gpt4 book ai didi

bluetooth - BLE 设备无法连续发送多个 GATT 通知

转载 作者:行者123 更新时间:2023-12-02 07:50:46 25 4
gpt4 key购买 nike

我正在尝试使用 GATT 的蓝牙 LE,但遇到了一个问题,需要您的帮助。

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

我选择了一种仅具有一个特征的架构(我将其视为套接字),并在其上编写来自客户端的请求。服务器通过通知响应请求。通知的长度只能是 20 字节,因此有时我必须将响应分成几个 block 并将其作为单独的通知发送。

我的问题是,当我将响应分成 10 个或更多 block 时,客户端永远不会收到它们。 (对于 1..9 个 block ,一切都按预期进行)。

我使用 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

(对于每个通知 block )

发送通知失败时,下一个输出来自 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

但我没有收到“完成的数据包”事件,而是收到一个简单的设备:断开连接

我还没有弄清楚错误发生在通信的哪一端。据我所知,可能是客户端无法足够“快”地接收和确认通知,因为我在服务器端排队了太多请求。

我已经测试过在服务器上发送每个通知之间添加 Sleep() 命令。它确实有效,但感觉太不稳定。对于 10 个通知,我需要 6 毫秒的延迟才能让通知通过;对于 30 个通知,我需要 10 毫秒的延迟。

有人知道从哪里开始寻找问题吗?如果需要,我很乐意提供更多信息。

注释:

  • 我已经测试并发现我的 Android 和 iOS 设备具有完全相同的限制。

最佳答案

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

在 bleno 的情况下,您需要等待在特征的 onIndicate 回调中返回指示,然后再发送下一个 block :

var Characteristic = bleno.Characteristic;

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

至少对于 iOS,您不必更改实现即可获取指示。只要您调用了 setNotifyValue:forCharacteristic:,您还可以根据 Apple 文档启用指示:

Sets notifications or indications for the value of a specified characteristic.

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

关于bluetooth - BLE 设备无法连续发送多个 GATT 通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36056667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com