Как управлять несколькими вызовами BLE writeCharacteristic и readCharacteristic? - PullRequest
0 голосов
/ 02 октября 2018

В настоящее время я работаю с приложением Android, которое связывается с устройством Bluetooth с низким энергопотреблением (BLE) CC2650.

Мне нужно сделать вызов writeCharacteristic, а затем несколько вызовов readCharacteristic с функцией.Этот порядок может быть отменен без ущерба для функциональности.


Вопрос 1: Когда индивидуально вызывается только writeCharacteristic или readCharacteristic, программное обеспечение работает как положено.Но программное обеспечение, кажется, не работает, когда вызовы выполняются последовательно.

Ниже приведен код.


Ссылка на раздел кода writeCharacteristic код (поток пользовательского интерфейса)

final BluetoothGattCharacteristic characteristic_select = mGattCharacteristicMap.get("hotstate");
    if (characteristic_select != null) {
        final int charaProp = characteristic_select.getProperties();
        if ((charaProp | BluetoothGattCharacteristic.PROPERTY_WRITE) > 0) {
            String strData = "00";
            int len = strData.length();
            byte[] data = new byte[len / 2];
            for (int i = 0; i < len; i += 2) {
                data[i / 2] = (byte) ((Character.digit(strData.charAt(i), 16) << 4)
                        + Character.digit(strData.charAt(i + 1), 16));
            }
            characteristic_select.setValue(data);
            mBLE_Service.writeCharacteristic(characteristic_select);
        }
    }

Раздел кода с readCharacteristic (поток пользовательского интерфейса).Примечание Несколько вызовов чтения, которые находятся в очереди

final BluetoothGattCharacteristic characteristic_time = mGattCharacteristicMap.get("timestate");
if (characteristic_time != null) {
        final int charaProp = characteristic_time.getProperties();
        if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) {
            for (int i = 0; i < 10; i++) {
                mBLE_Service.readCharacteristic(characteristic_time);
                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {

                    }
                }, 5000);
            }
        }
    }

Код для readCharacteristic

 public void readCharacteristic(BluetoothGattCharacteristic characteristic) {

        // Queue the characteristic to read, since several reads are done on startup
        characteristicQueue.add(characteristic);

        // If there is only 1 item in the queue, then read it. If more than 1, it is handled
        // asynchronously in the callback
        if((characteristicQueue.size() <= 1)) {

            mBluetoothGatt.readCharacteristic(characteristic);
        }

    }

Код для writeCharacteristic

  public void writeCharacteristic(BluetoothGattCharacteristic characteristic) {
    if (mBluetoothAdapter == null || mBluetoothGatt == null) {
        Log.w(TAG, "BluetoothAdapter not initialized");
        return;
    }
    mBluetoothGatt.writeCharacteristic(characteristic);

}

Код для onCharacteristicRead

       @Override
    public void onCharacteristicRead(BluetoothGatt gatt,
                                     BluetoothGattCharacteristic characteristic,
                                     int status) {
        // Read action has finished, remove from queue
        characteristicQueue.remove();

        if (status == BluetoothGatt.GATT_SUCCESS) {
            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
        }

        // Handle the next element from the queues
        if(characteristicQueue.size() > 0)
            mBluetoothGatt.readCharacteristic(characteristicQueue.element());
        else if(descriptorWriteQueue.size() > 0)
            mBluetoothGatt.writeDescriptor(descriptorWriteQueue.element());
    }

Код для onCharacteristicWrite

       @Override
    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
        super.onCharacteristicWrite(gatt, characteristic, status);
        if (status==BluetoothGatt.GATT_SUCCESS){
            broadcastUpdate(ACTION_WRITE_SUCCESS, characteristic);
            } 
    }

Вопрос 2: Поскольку у меня несколько чтений, ясоздал очередь для обработки.Как вы думаете, чтение и запись являются причиной проблемы?Если да, то есть ли какие-либо предложения по управлению и блокированию операций чтения и записи?

Примечание. Код для Android API 21 и выше

Ссылки:

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы на полпути, понимая, что вам нужна очередь.Но вы должны убедиться, что используете его для ВСЕХ операций ГАТТ.Смотрите мой полный ответ: Android BLE BluetoothGatt.writeDescriptor () иногда возвращает false .

0 голосов
/ 02 октября 2018

Это потому, что вам нужно подождать, пока обратный вызов вернется, прежде чем снова писать / читать.Аналогичная проблема для ответа здесь.

Android BLE BluetoothGattDescriptor проблема writeDescriptor

За исключением того, что вместо записи вам может потребоваться дождаться readDescriptor / Characteristic в дополнение к записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...