gpt4 book ai didi

android - 如何同步 BLE Central (Mobile) 和 Peripheral 之间的通信?

转载 作者:行者123 更新时间:2023-11-30 00:02:04 25 4
gpt4 key购买 nike

我正在开发 BLE 应用程序。我已经完成了在移动应用程序(CENTRAL - BluetoothGattClient)和外围设备(GATT SERVER)之间建立通信,尽管不是很顺利。

PERIPHERAL 有一项服务,而该服务又具有 CENTRAL 启用通知的单一特征。双方的读/写就是通过这个特性发生的

这是来自中央(移动)端的完整通信流程

enter image description here

问题一

有时在从外设接收多个数据包时,我在完成写入 ACK(第 9 步)之前收到读取通知 - 'onCharcteristicChanged()',即在 onCharctristicWrite() 之前调用 onCharcteristicChanged()。

在这种情况下,虽然我发出了 bleGatt.readCharacteristic(charac) 但 onCharactristicRead() 永远不会被调用。 CENTRAL 卡住了。等待时无法读取。

问题2

有时,在发送 ACK 时,在发出 bleGatt.writeCharactristic(charac) 之后,onChactristicWrite() 不会被调用,因此 ACK 不会被 PERIPHERAL 接收并且通信停止。

问题3

整体沟通很慢。写入一个数据 block (<=20 字节)需要 > 400 毫秒。

是否有更好的策略来正确同步读/写?我尝试通过使用 BluetoothGattCallbacks 来做到这一点,但正如所解释的那样,它无法正常工作。

如何提高通信速度?

READ 和 WRITE 都发生在同一个线程中。

我已经在 Moto E (Marshmallow)、Moto G5 (Nougat) 和 Samsung S6 (Lollipop) 上对此进行了测试。该行为在设备间是一致的。

我的外围设备是 nRF52840 .

谢谢

最佳答案

确保 GATT 通信正常工作的最简单方法是为 BluetoothGatt 对象使用一个队列,因为一次只能运行一个 GATT 操作。这就是为什么当您在系统调用 onCharacteristicWrite 之前调用 readCharacteristic 时它不起作用的原因。

之所以在写响应之前得到通知是因为外设在写响应之前发送了通知。

要加快通信速度,您可以使用 Write Without Response 而不是 Write With Response。这样可以在一次往返中发送多个数据包。然后将立即调用 onCharacteristicWrite(只要内部缓冲区未填满)。请注意 https://issuetracker.google.com/issues/37121017 .

关于android - 如何同步 BLE Central (Mobile) 和 Peripheral 之间的通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49753693/

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