Notificações do modo periférico BLE GATT para Android
Estou tentando configurar um aplicativo para se comportar como um dispositivo periférico BLE usando a API do Android 5.0 (21). Até agora, configurei o servidor, coloquei publicidade e conexões em funcionamento, configurei serviços e características personalizadas do GATT e posso ler e escrever entre o dispositivo periférico e outros dispositivos de teste. Agora estou tentando adicionar notificações a alguns dos parâmetros, mas basta colocar; eles não estão trabalhando.
Ao definir essas características, elas incluem a propriedade de notificação:
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);
No meuBluetoothGattServerCallback
, Incluí o método:
@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);
}
que espero registrar a mensagem "Gravação do descritor:" sempre que um cliente ativar notificações (ou gravar em qualquer descritor para esse assunto); mas nenhuma dessas mensagens é registrada (o depurador nunca entra nessa função).
Mais tarde, tento enviar notificações usando:
BluetoothGattCharacteristic batteryLevelCharacteristic = service.getCharacteristic(BatteryProfile.UUID_BATTERY_LEVEL);
batteryLevelCharacteristic.setValue(new byte[]{ mBatteryLevel });
mGattServer.notifyCharacteristicChanged(mConnectedDevice, batteryLevelCharacteristic, false);
Qual, embora atualize o valor; ele não envia uma notificação para o cliente conectado.
Testei isso usando o Android 6.0.1 em um Nexus 5X (infelizmente, o único dispositivo Android que tenho disponível para testar). Não há realmente muitos exemplos de uso da API periférica / BluetoothGattServer por aí, então estou um pouco perdido. Existe algum método para o qual estou esquecendo de ligar ou algo que preciso fazer em alguma ordem não documentada para que as notificações funcionem?
Qualquer ajuda seria muito apreciada!