15

我正在 Android 中开发 BLE,我可以扫描、连接并将特征写入 BLE 设备。

当单击. _ BluetoothGatt_characteristicAsyncTaskButton

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没有将every写入characteristicBLE设备

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

问题:

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

4

1 回答 1

22

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

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

于 2015-02-13T06:06:02.333 回答