我正在开发BLE应用程序。我一直在建立移动应用程序(CENTRAL-BluetoothGattClient)和PERIPHERAL(GATT SERVER)之间的通信,尽管不是很巧妙。
PERIPHERAL具有一项服务,而该服务又具有CENTRAL已启用通知的单一特征。通过此特性,可以从双方进行读/写
这是来自CENTRAL(移动)端的完整通信流程
问题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。