Отправка атрибутов GATT клиенту -> Серверу

#android #bluetooth-lowenergy #gatt

#Android #bluetooth — низкое энергопотребление #gatt

Вопрос:

Я пытаюсь создать соединение между планшетом и моим микроконтроллером, которое подключается как к BLE, так и к характеристикам отправки / получения через GATT. MCU — это сервер GATT, а планшет — мой клиент GATT.

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

Но у меня какое-то странное поведение при записи характеристик с моего клиента Gatt на сервер. Я запускаю процесс отправки с помощью функции onClick:

 buttonOne.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
        byte[] testByte = new byte[1];
        testByte[0] = 3;
        characteristic.setValue(testByte);
        bluetoothGatt.writeCharacteristic(characteristic);
        }
     });
  

И это работает до сих пор (я заполняю характеристический объект перед onClick).
Теперь у меня есть другой OnClickListener, чтобы просто изменить значение характеристики и отправить его снова.

 buttonTwo.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
    byte[] testByte = new byte[1];
    testByte[0] = 7;
    characteristic.setValue(testByte);
    bluetoothGatt.writeCharacteristic(characteristic);
    }
 });
  

Итак, как только моя характеристика на сервере GATT должна иметь значение 3 и один раз 7. И это работает только один раз, пока мое соединение не разорвется и не откроется снова, тогда я смогу повторно отправить характеристику. Характеристика записи взята из класса BluetoothGatt и выглядит следующим образом:

 public boolean writeCharacteristic(BluetoothGattCharacteristic characteristic) {
    if ((characteristic.getProperties() amp; BluetoothGattCharacteristic.PROPERTY_WRITE) == 0
        amp;amp; (characteristic.getProperties() amp;
            BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) == 0) return false;

    if (VDBG) Log.d(TAG, "writeCharacteristic() - uuid: "   characteristic.getUuid());
    if (mService == null || mClientIf == 0 || characteristic.getValue() == null) return false;

    BluetoothGattService service = characteristic.getService();
    if (service == null) return false;

    BluetoothDevice device = service.getDevice();
    if (device == null) return false;

    synchronized(mDeviceBusy) {
        if (mDeviceBusy) return false;
        mDeviceBusy = true;
    }

    try {
        mService.writeCharacteristic(mClientIf, device.getAddress(),
            service.getType(), service.getInstanceId(),
            new ParcelUuid(service.getUuid()), characteristic.getInstanceId(),
            new ParcelUuid(characteristic.getUuid()),
            characteristic.getWriteType(), AUTHENTICATION_NONE,
            characteristic.getValue());
    } catch (RemoteException e) {
        Log.e(TAG,"",e);
        mDeviceBusy = false;
        return false;
    }

    return true;
}
  

Я обнаружил, что процесс застрял в

 synchronized(mDeviceBusy) {
    if (mDeviceBusy) return false;
    mDeviceBusy = true;
}
  

но я пока понятия не имею, почему. Есть ли какой-либо бит, который я должен установить, чтобы сообщить моему серверу GATT, что я «перепишу» эту характеристику? Нужно ли мне использовать поток или что-то в этом роде и перевести его в спящий режим?

Комментарии:

1. Что вы подразумеваете под «работает только один раз»? Сначала вы нажимаете buttonOne , а затем нажимаете buttonTwo , верно? Оба значения записаны на сервер GATT правильно или нет? И почему / когда ваше соединение прерывается? Пожалуйста, уточните и предоставьте более подробную информацию о точной последовательности действий.

2. Да, вы правы. Это выглядит так: 1. Нажмите buttonOne -> значения записываются на сервере GATT 2. Разрыв соединения -> требуется повторное подключение со стороны MCU 3. повторно подключен 4. нажмите buttonTwo -> новое значение записывается на сервере GATT 5. как 2. продолжается, кажется, что что-то происходитотсутствует в процессе подтверждения, но я отправляю ответ с моего сервера gatt о том, что новое значение было записано моему клиенту.

3. хорошо, проблема в синхронизированной части, которая теперь точно работает, потому что каждый раз, когда она достигает mService.writeCharacteristic в блоке try, мои значения отправляются на сервер. но до сих пор не знаю, почему