RxAndroidBle как читать уведомления от нескольких сервисов? - PullRequest
0 голосов
/ 27 февраля 2019

Я использую rxandroid: 2.1.0, rxjava: 1.4.0 и rxandroidble: 1.8.1.

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

Я уже посетил тонны страниц, но не нашел подходящего решения.Может быть, у кого-нибудь есть представление о том, как это можно сделать?

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Для настройки всех возможных уведомлений / показаний на любом заданном периферийном устройстве необходимо сначала подключиться к устройству, а затем обнаружить все службы и получить все подходящие характеристики.По этим характеристикам должны быть установлены уведомления / указания, а затем в паре с их источником (если это необходимо).

Пример кода:

device.establishConnection(false)
        .flatMap(connection -> connection.discoverServices()
                .map(RxBleDeviceServices::getBluetoothGattServices) // get them
                .flatMapObservable(Observable::fromIterable) // map to individual services
                .map(BluetoothGattService::getCharacteristics) // for each service take all characteristics
                .flatMap(Observable::fromIterable) // map to individual characteristic)
                .filter(characteristic -> (characteristic.getProperties() & (BluetoothGattCharacteristic.PROPERTY_NOTIFY | BluetoothGattCharacteristic.PROPERTY_INDICATE)) != 0) // consider only characteristics that have indicate or notify property
                .flatMap(characteristic -> {
                    NotificationSetupper notificationSetupper;
                    if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_NOTIFY) != 0) {
                        notificationSetupper = setupNotifications(characteristic); // if supports notifications
                    } else {
                        notificationSetupper = setupIndications(characteristic); // else indications
                    }
                    return notificationSetupper.setupOn(connection);
                })
        )
        .subscribe(
                pair -> {
                    BluetoothGattCharacteristic characteristic = pair.first;
                    byte[] value = pair.second;
                    // do your thing with the emissions
                },
                throwable -> {
                    // log potential errors
                }
        );

Где помощники:

interface NotificationSetupper {

    Observable<Pair<BluetoothGattCharacteristic, byte[]>> setupOn(RxBleConnection connection);
}

static NotificationSetupper setupNotifications(BluetoothGattCharacteristic characteristic) {
    return connection -> connection.setupNotification(characteristic, getModeFor(characteristic))
            .compose(pairNotificationsWith(characteristic));
}

static NotificationSetupper setupIndications(BluetoothGattCharacteristic characteristic) {
    return connection -> connection.setupIndication(characteristic, getModeFor(characteristic))
            .compose(pairNotificationsWith(characteristic));
}

static NotificationSetupMode getModeFor(BluetoothGattCharacteristic characteristic) { // a different mode is needed if a characteristic has no Client Characteristic Configuration Descriptor
    UUID clientCharacteristicConfigurationDescriptorUuid = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
    return characteristic.getDescriptor(clientCharacteristicConfigurationDescriptorUuid) != null ? NotificationSetupMode.DEFAULT : NotificationSetupMode.COMPAT;
}

static ObservableTransformer<Observable<byte[]>, Pair<BluetoothGattCharacteristic, byte[]>> pairNotificationsWith(BluetoothGattCharacteristic characteristic) { // to distinguish the source of notification we need to pair the value with the source
    return upstream -> upstream.flatMap(it -> it).map(bytes -> Pair.create(characteristic, bytes));
}
0 голосов
/ 19 марта 2019

Я разместил свой ответ здесь [ Программно включив все уведомления .

Я не смог сделать это с библиотекой rxAndroidBle, но стандартная версия была хороша для моих целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...