如何在Android中为BLE编写快速稳定的特性?
Posted
技术标签:
【中文标题】如何在Android中为BLE编写快速稳定的特性?【英文标题】:How to write characteristic fast and stable for BLE in Android? 【发布时间】:2015-09-04 02:53:01 【问题描述】:我正在为 android 中的 BLE 进行开发。 Android可以通过Gatt.writeCharacteristic
向BLE设备发送数据。
但是当我将连续 Characteristic 写入 BLE 设备(1 秒内 5 次)时,我会得到 GATT_DISCONNECTED
,当我尝试 getService
和 GetCharacteristic
时它会返回 null
.
我在市场上看到了一些 BLE LED 产品。它在 Android 中使用了一个颜色选择器,如下图所示:
当用户在颜色选择器上快速改变颜色时,BLE LED也会立即改变颜色。
如何像市面上的BLE LED产品一样,为Android中的BLE编写快速稳定的特性?
【问题讨论】:
【参考方案1】:当您拨打gatt.writeCharacteristic
时,您需要做两件事:
-
您需要将gatt读写请求排队,这样当您发出读写请求时,您必须等待BluetoothGattCallback中相应的回调,然后再请求下一次读写。这是一个没有很好记录的 Android BluetoothGatt 行为。
和上面的1有点关系,你应该检查gatt读写请求的布尔返回值。如果它不返回 true,那么您的请求失败。如果在您发出下一个请求时其他一些 gatt 操作仍在进行中,则会发生这种情况。
我发现快速读取(或写入)BLE 特性的最佳方法是发出请求,等待回调并从回调发出下一个请求。如果有更快或更可靠的方法,我不知道。
【讨论】:
如果我有很多操作要做,我该如何同步这些操作??我的意思是等待一个操作的回调来做下一个操作 我有一个代表我的 ble 设备的对象。它的 api 看起来像:object.readX、obj.writeY、obj.addListener(l)。在它内部实现了一个命令队列(java.util.Queue),每个 readX 或 writeY(gatt 操作)都在其中排队。队列在 ble 回调时得到服务(如果回调永远不会发生,则超时。这就是基本思想 我尝试使用 ArrayDeque 来实现它。写/读回调有反馈后,请求下一次读或写。但是速度太慢了…… 你是妈妈! / Είσαι η μάνα! 你救了我的命。以上是关于如何在Android中为BLE编写快速稳定的特性?的主要内容,如果未能解决你的问题,请参考以下文章