如何在Android中为BLE写出连续快速稳定的特性?

时间:2015-02-13 05:47:25

标签: android bluetooth-lowenergy characteristics

我正在Android中开发BLE,我可以扫描,连接和写入BLE设备的特性。

点击BluetoothGatt后,我调用以下函数将characteristicAsyncTask传递给Button

write_btn.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
        new WriteCharacteristic(mBluetoothGatt , HueCharacteristic).execute();
     }
});

写特性的代码如下:

private class WriteCharacteristic extends AsyncTask<String, Void, String> {

        public BluetoothGatt mGatt;
        public BluetoothGattCharacteristic mCharacteristic;

        public WriteCharacteristic(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic){
            mGatt = gatt;
            mCharacteristic = characteristic;
        }

        @Override
        protected String doInBackground(String... urls) {
            mGatt.writeCharacteristic(mCharacteristic);
            return null;
        }
    }

但是我尝试连续点击该按钮,似乎 Android 没有将每个characteristic写入 BLE设备

如果我连续点击按钮5次,则会丢失1~3次。它只会将characteristic写入 BLE设备两次。

问题:

Is there any better way to write characteristic consecutive and stable to BLE device for Android?

1 个答案:

答案 0 :(得分:20)

Android蓝牙堆栈中的读/写特性系统不擅长排队多个操作。在发送另一个操作之前,您需要等待操作完成。此外,由于您的代码使用AsyncTask,您将在某些设备上并行执行任务,因此当您反复按下按钮时,即使请求也不会被序列化。

要从框架获得稳定的结果,您需要自己排队这些请求并等待BluetoothGattCallback onCharacteristicWrite()在发送下一个命令之前触发。您的代码需要同步对GATT对象的所有访问权限,以便下一个writeCharacteristic()永远不会出现,直到完成回调为前一个请求触发。