Любой способ реализовать уведомления BLE в предварительном просмотре Android-L
Этот вопрос не о Android notificatinos, а о BLE-уведомлениях (как подсказывает название)
У меня есть базовый периферийный режим BLE, работающий на Android-L
Есть ли способ реализовать уведомления BLE в предварительном просмотре Android-L. Я мог бы сделать что-то вроде следующего, чтобы сделать характерным для уведомления, но пытаясь слушать
BluetoothGattCharacteristic firstServiceChar = new BluetoothGattCharacteristic(
UUID.fromString(serviceOneCharUuid),
BluetoothGattCharacteristic.PROPERTY_NOTIFY, BluetoothGattCharacteristic.PERMISSION_READ );
Но в приложении LightBlue на iOS я не могу подписаться на эту характеристику. Очевидно, нет API, который можно было бы использовать для ответа на вызовы, когда подписка на символ (как в iOS)
Пожалуйста, поделитесь своим кодом, если вы успешно включили уведомления BLE на Android-L
1 ответ
Помимо того, что сделал OP:
BluetoothGattCharacteristic firstServiceChar = new BluetoothGattCharacteristic(UUID.fromString(serviceOneCharUuid), BluetoothGattCharacteristic.PROPERTY_NOTIFY, BluetoothGattCharacteristic.PERMISSION_READ )
Следующим шагом является добавление дескриптора конфигурации характеристики клиента (UUID - это 128-битная версия 16-битного 0x2902, использующего базовый UUID Bluetooth), чтобы подключенное устройство могло сообщить вам, что оно хочет получать уведомления (или указания), а затем добавить этот дескриптор вашей характеристики:
BluetoothGattDescriptor gD = new BluetoothGattDescriptor(UUID.fromString("00002902-0000-1000-8000-00805F9B34FB"), BluetoothGattDescriptor.PERMISSION_WRITE | BluetoothGattDescriptor.PERMISSION_READ);
firstServiceChar.addDescriptor(gD);
Это UUID из спецификации Bluetooth. Очевидно, что устройство подписывается на уведомления, обновляя этот дескриптор, поэтому вы должны обработать это в своем BluetoothGattServerCallback, переопределив onDescriptorWriteRequest:
@Override
public void onDescriptorWriteRequest (BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
btClient = device; // perhaps add to some kind of collection of devices to update?
// now tell the connected device that this was all successfull
btGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, value);
}
Теперь обновите ваше значение и уведомите подключившегося:
firstServiceChar.setValue("HI");
btGattServer.notifyCharacteristicChanged(btClient, firstServiceChar, false);
Надеюсь, этот быстрый и грязный код поможет, потому что это был код OP, который я использовал в первую очередь, чтобы заставить работать даже базовый периферийный режим:)