如何在Android中为BLE快速稳定地编写连续特征



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

当单击Button时,我调用以下函数将BluetoothGattcharacteristic传递给AsyncTask

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?

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

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

最新更新