Чтение / запись пользовательских характеристик с устройства BLE - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь взаимодействовать с устройством BLE измерителя температуры, используя Android Studio в качестве IDE и Java в качестве языка программирования. Используя приложение на своем смартфоне, я обнаружил службы, предоставляемые этим устройством во время его работы: было много общих служб / характеристик и одна специальная служба.

Прежде всего я попытался прочитать

  • Сервис ТЕРМОМЕТРА ЗДОРОВЬЯ (UUID = 00001809-0000-1000-8000-00805F9B34FB)
  • Характеристика измерения температуры (UUID = 00002A1C-0000-1000-8000-00805F9B34FB) [помечена как INDICATE]

восстановление характеристики из списка служб и доступ к ее дескрипторам:

BluetoothGattCharacteristic temp_char = mBluetoothGattServiceList.get(2).getCharacteristics().get(0); 
for (BluetoothGattDescriptor descriptor : temp_char.getDescriptors()) {
    descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
    mBluetoothGatt.writeDescriptor(descriptor);
}
mBluetoothGatt.setCharacteristicNotification(temp_char, true);

В этом случае я могу увидеть результат измерения в обратном вызове onCharacteristicChanged:

public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
float char_float_value = characteristic.getFloatValue(BluetoothGattCharacteristic.FORMAT_FLOAT, 1);
}

Тем не менее, в документации, прилагаемой к устройству, намекает на подключение к счетчику, следуя GATT:

  • ПОЛЬЗОВАТЕЛЬСКИЙ сервис (UUID = 00001523-1212-EFDE-1523-785FEABCD123)
  • ПОЛЬЗОВАТЕЛЬСКАЯ характеристика (UUID = 00001524-1212-EFDE-1523-785FEABCD123) [помечена как WRITE / INDICATE / NOTIFY в приложении для смартфона)
  • дескриптор (UUID = 00002902-0000-1000-8000-00805F9B34FB, помеченный как READ в приложении для смартфона)

и перечисление нескольких 8-байтовых команд для отправки на счетчик в ожидании 8-байтового ответа от него. Команды отправляются с использованием фрейма в этом формате

[0x51 CMD Данные_0 Данные_1 Данные_2 Данные_3 0xA3 CHK-SUM]

и ответ такой же, с небольшими отличиями.

Я могу отправить кадр с помощью gatt.writeCharacteristic, но я не могу получить ответный кадр, получая всегда 0x01 0x00 в качестве единственного ответа от счетчика (2 байта вместо 8).

Вот что я делаю:

    BluetoothGattCharacteristic custom_char = mBluetoothGattServiceList.get(5).getCharacteristics().get(0);                mBluetoothGatt.setCharacteristicNotification(custom_char, true);
    for (BluetoothGattDescriptor descriptor : custom_char.getDescriptors()) {
        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
        mBluetoothGatt.writeDescriptor(descriptor);
    }
    byte[] req_frame = new byte[8];
    req_frame[0] = (byte) 0x51;
    req_frame[1] = (byte) 0x24;
    req_frame[2] = (byte) 0x0;
    req_frame[3] = (byte) 0x0;
    req_frame[4] = (byte) 0x0;
    req_frame[5] = (byte) 0x0;
    req_frame[6] = (byte) 0xA3;
    req_frame[7] = (byte) 0x18;
    custom_char.setValue(req_frame);
    mBluetoothGatt.writeCharacteristic(custom_char);

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

@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
    System.out.println("[onCharacteristicRead] status : " + status);
    if (status == BluetoothGatt.GATT_SUCCESS) {
        Log.d(TAG, "[onCharacteristicChanged] " + ByteArrayToString(characteristic.getValue()));
    }
}

@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
    byte[] response = characteristic.getValue();
    Log.d(TAG, "[onCharacteristicChanged] " + ByteArrayToString(response));
    }
}

Единственный обратный вызов, который не запускается, - это OnCharacteristicRead, где, я полагаю, я найду ответ кадра.

Я сделал какую-то ошибку во время протокола связи? Как я могу получить 8-байтовый кадр ответа?

Заранее спасибо!

1 Ответ

0 голосов
/ 05 января 2019

Ваша ошибка в том, что вам разрешено одновременно выполнять только одну операцию Гатта. Вы должны дождаться обратного вызова, прежде чем отправлять следующий. См. Android BLE BluetoothGatt.writeDescriptor () для получения дополнительной информации иногда возвращает false .

...