Android BLE onCharacteristicRead и onCharacteristicChanged никогда не вызывали

Я пытаюсь подключиться к термометру Bluetooth LE. Подключение к устройству работает хорошо. Единственная часть, которая меня подвешивает, – это gattCallBack, и это onCharacteristicChanged / Read. 'SetNotification' и дескриптор 'setValue' и 'writeDescriptor' все возвращают true. OnCharacteristicChanged никогда не вызывается для возврата значения.

Я использовал довольно удобную небольшую программу из Play Store под названием BLE Scanner, чтобы помочь мне предоставить мне больше информации об устройстве и его услугах и характеристиках.

Введите описание изображения здесь

Вот почему я просто жестко кодированный сервис 2, характерный 0. Я просто не могу понять, почему после того, как я написалDescriptor, я никогда ничего не вижу. Интересно, что я могу использовать некоторые другие характеристики (один из которых представляет собой температурный интервал), и я получаю ответ (хотя данные искажены).

Кроме того, из любопытства, почему есть два дескриптора на этой характеристике?

Этот код содержится в моем методе MainActivity. Не уверен, что это будет иметь значение здесь. Я посмотрел и попробовал несколько методов, размещенных здесь, без везения.

private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { ... } @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { mGatt = gatt; List<BluetoothGattService> services = mGatt.getServices(); Log.i("onServicesDiscovered", services.toString()); BluetoothGattCharacteristic characteristic = services.get(2).getCharacteristics().get(0); mGatt.setCharacteristicNotification(characteristic, true); BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(CLIENT_CHARACTERISTIC_CONFIG)); descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE); mGatt.writeDescriptor(descriptor); } @Override public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { ... } @Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { ... } }; 

ОБНОВЛЕНИЕ: Я решил проверить метод onDescriptorWrite и занести некоторую информацию.

 @Override public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { Log.i("descriptorWRITE", Integer.toString(status)); } 

Интересным здесь является то, что статус возвращает 13, что «операция записи превышает максимальную длину атрибута».

Я буду изучать это дальше.

Solutions Collecting From Web of "Android BLE onCharacteristicRead и onCharacteristicChanged никогда не вызывали"

Я нашел проблему здесь. Я предполагал, что Термометр использовал стандартную настройку BLE и характерную настройку. Это не. Они создали свою собственную пользовательскую характеристику. Как только я переключился на эту характеристику, «измененный» метод начал стрелять.

Я думаю, что вам не хватает mGatt.readCharacteristic(characteristic) .

Когда вы его назовете, он будет ждать, пока чтение будет завершено, и вызовите onCharacteristicRead .