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

时间:2018-04-10 12:29:13

标签: android bluetooth-lowenergy android-ble nrf52

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

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

以下是来自CENTRAL(移动)方的完整通信流程

enter image description here

问题1

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

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

问题2

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

问题3

整体沟通非常缓慢。它需要&gt; 400ms写入一个数据块(<= 20个字节)。

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

可以采取哪些措施来提高沟通速度?

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

我在Moto E(Marshmallow),Moto G5(Nougat)和三星S6(Lollipop)上测试了这个。不同设备的行为是一致的。

我的外围设备是nRF52840

谢谢

1 个答案:

答案 0 :(得分:1)

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

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

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

相关问题