Любой способ реализовать уведомления 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, который я использовал в первую очередь, чтобы заставить работать даже базовый периферийный режим:)

Другие вопросы по тегам