Как написать последовательный характер быстро и стабильно для BLE в Android?

Я разрабатываю BLE в Android, я могу сканировать, подключать и писать характеристики для устройства BLE.

Я вызываю следующую функцию для передачи BluetoothGatt и characteristic в AsyncTask при нажатии 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

Система чтения/записи в стеке Android Bluetooth не подходит для очередей нескольких операций. Вам нужно дождаться завершения операций перед отправкой по другой. Кроме того, поскольку ваш код использует AsyncTask, вы получите параллельное выполнение задач на некоторых устройствах, поэтому даже запросы не сериализуются, когда вы нажимаете кнопку.

Чтобы получить стабильные результаты из фреймворка, вам нужно будет самостоятельно подождать эти запросы и ждать BluetoothGattCallback onCharacteristicWrite(), чтобы вызвать перед отправкой следующей команды. Вашему коду необходимо синхронизировать весь доступ к объекту GATT, чтобы следующий writeCharacteristic() никогда не появлялся до тех пор, пока обратный вызов завершения не выполнит предыдущий запрос.