我正在开发BLE应用程序。我一直在建立移动应用程序(CENTRAL-BluetoothGattClient)和PERIPHERAL(GATT SERVER)之间的通信,尽管不是很巧妙。

PERIPHERAL具有一项服务,而该服务又具有CENTRAL已启用通知的单一特征。通过此特性,可以从双方进行读/写

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

android - 如何在BLE中央(移动)和外围设备之间同步通信?-LMLPHP

问题1

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

在这种情况下,虽然我发出bleGatt.readCharacteristic(charac),但从未调用过onCharactristicRead()。 CENTRAL卡住了。等待时无法阅读。

问题2

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

问题3

总体沟通非常缓慢。写入一整块( 400毫秒。

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

如何提高通讯速度?

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

我已经在Moto E(棉花糖),Moto G5(牛轧糖)和Samsung S6(棒棒糖)上进行了测试。行为在设备之间是一致的。

我的外围设备是nRF52840

谢谢

最佳答案

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

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

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

08-18 06:12
查看更多