Я пытаюсь взаимодействовать с устройством 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-байтовый кадр ответа?
Заранее спасибо!