如何在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,当我尝试 getServiceGetCharacteristic 时它会返回 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编写快速稳定的特性?的主要内容,如果未能解决你的问题,请参考以下文章

Android中不稳定的BLE连接

如何在同一个界面页面读取两个服务的两个BLE特性?

如何在 Xamarin/Android 上启用多个 BLE 特征通知?

在 GATT Android 中获取 BLE 特性的值

Android BLE 读取特性

Android BLE 无法从设备接收 Gatt 特性通知