1

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

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

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

在此处输入图像描述

问题 1

有时,在接收来自 PERIPHERAL 的多个数据包时,我会在完成写入 ACK(步骤 9)之前收到读取通知 - 'onCharcteristicChanged()',即在 onCharctristicWrite() 之前调用 onCharcteristicChanged()。

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

问题 2

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

问题 3

整体沟通非常缓慢。写入一大块(<=20 字节)数据需要 > 400 毫秒。

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

可以做些什么来提高通信速度?

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

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

我的外围设备是nRF52840

谢谢

4

1 回答 1

2

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

您在写响应之前收到通知的原因是外围设备在写响应之前发送通知。

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

于 2018-04-11T13:30:00.177 回答