Уведомления о периферийном режиме Android BLE GATT
Я пытаюсь настроить приложение для работы в качестве периферийного устройства BLE с помощью API Android 5.0 (21). До сих пор я настроил сервер, установил работу рекламы и подключений, настроил пользовательские службы и характеристики GATT и мог читать и писать между периферийным устройством и другими устройствами тестирования. Сейчас я пытаюсь добавить уведомления к нескольким параметрам, но проще говоря; они не работают.
При определении этих характеристик они включают свойство notify:
BluetoothGattService battService = new BluetoothGattService(BatteryProfile.UUID_BATTERY_SERVICE, BluetoothGattService.SERVICE_TYPE_PRIMARY);
BluetoothGattCharacteristic batteryLevelCharacteristic =
new BluetoothGattCharacteristic(BatteryProfile.UUID_BATTERY_LEVEL,
BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_NOTIFY,
BluetoothGattCharacteristic.PERMISSION_READ);
battService.addCharacteristic(batteryLevelCharacteristic);
mGattServer.addService(battService);
В моемBluetoothGattServerCallback
Я включил метод:
@Override
public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
Log.d(TAG, "Descriptor write: " + descriptor.toString());
if (responseNeeded) {
mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, value);
}
super.onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value);
}
который я ожидаю, чтобы записывать сообщение «Descriptor write:» всякий раз, когда клиент включает уведомления (или пишет в любой дескриптор по этому вопросу); но ни одно такое сообщение никогда не регистрируется (и при этом отладчик никогда не попадает в эту функцию).
Позже я попытаюсь отправить уведомления, используя:
BluetoothGattCharacteristic batteryLevelCharacteristic = service.getCharacteristic(BatteryProfile.UUID_BATTERY_LEVEL);
batteryLevelCharacteristic.setValue(new byte[]{ mBatteryLevel });
mGattServer.notifyCharacteristicChanged(mConnectedDevice, batteryLevelCharacteristic, false);
Который, хотя это обновляет значение; он не отправляет уведомление подключенному клиенту.
Я протестировал это с помощью Android 6.0.1 на Nexus 5X (к сожалению, единственное устройство Android, с которым я могу тестировать). Существует не так много примеров использования API периферийных устройств / BluetoothGattServer, поэтому я немного растерялся. Есть какой-то метод, который я забыл вызвать, или что-то, что мне нужно сделать в недокументированном порядке, чтобы заставить работать уведомления?
Любая помощь будет принята с благодарностью!