Как отключить уведомление с помощью rxandroidble?

В настоящее время я пытаюсь использовать rxandroidble, чтобы заменить собственный BLE API Android одного из наших приложений.

Как отключить уведомление? Я могу включить его с помощью примера кода, вот этот:

device.establishConnection(context, false)
.flatMap(rxBleConnection -> rxBleConnection.setupNotification(characteristicUuid)) 
.doOnNext(notificationObservable -> { // OK }) 
.flatMap(notificationObservable -> notificationObservable)     
.subscribe(bytes -> { // OK });

Но в моем продукте у меня есть вариант использования, когда мне нужно отключить/включить уведомления по требованию.

Кроме того, я пытался напрямую отписаться/повторно подключиться вместо отключения/включения уведомления, но команда отказа от подписки, по-видимому, никогда не выполняется, моя гипотеза заключается в том, что у меня высокая пропускная способность (мое устройство уведомляет с частотой 300–400 Гц), это правдоподобно?

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

Спасибо за вашу помощь!


person Myx    schedule 08.11.2016    source источник


Ответы (2)


Включение уведомлений происходит всякий раз, когда Observable из RxBleConnection.setupNotification() будет подписан. Чтобы отключить уведомление, необходимо отписаться от вышеуказанной подписки.

Существует несколько способов его кодирования. Один из них является:

    final RxBleDevice rxBleDevice = // your RxBleDevice
    final Observable<RxBleConnection> sharedConnectionObservable = rxBleDevice.establishConnection(this, false).share();

    final Observable<Boolean> firstNotificationStateObservable = // an observable that will emit true when notification should be enabled and false when disabled
    final UUID firstNotificationUuid = // first of the needed UUIDs to enable / disable
    final Subscription subscription = firstNotificationStateObservable
            .distinctUntilChanged() // to be sure that we won't get more than one enable commands
            .filter(enabled -> enabled) // whenever it will emit true
            .flatMap(enabled -> sharedConnectionObservable // we take the shared connection
                    .flatMap(rxBleConnection -> rxBleConnection.setupNotification(firstNotificationUuid)) // enable the notification
                    .flatMap(notificationObservable -> notificationObservable) // and take the bytes
                    .takeUntil(firstNotificationStateObservable.filter(enabled1 -> !enabled1)) // and we are subscribing to this Observable until we want to disable - note that only the observable from sharedConnectionObservable will be unsubscribed
            )
            .subscribe(
                    notificationBytes -> { /* handle the bytes */ },
                    throwable -> { /* handle exception */ }
            );

Обратите внимание, что в приведенном выше примере соединение будет закрыто всякий раз, когда закончится последняя подписка на sharedConnectionObservable.

Чтобы включить / отключить различные характеристики, вы можете скопировать и вставить приведенный выше код с разными Observable<Boolean> в качестве входов включения / отключения и разными UUID.

person Dariusz Seweryn    schedule 08.11.2016
comment
Вместо Subscription subscription будет Disposable disposable вместо RxJava2. Однако для firstNotificationStateObservable я пробовал Observable.just(true), но предложенный выше код ничего не делает. - person Hunt; 17.01.2021
comment
Как вы делитесь соединением sharedConnectionObservable = bleDevice .establishConnection(false).share(); ? потому что, пока мы не подпишемся, он фактически не выполнит операцию подключения, как вы предлагаете использовать establishConenction в приведенном выше коде - person Hunt; 18.01.2021

Котлин

В kotlin используйте dispose(), чтобы отключить уведомление.

#ENABLE NOTIFICATION
val result = device.establishConnection(false)
.flatMap(rxBleConnection -> rxBleConnection.setupNotification(characteristicUuid))
.doOnNext(notificationObservable -> {
    // Notification has been set up
})
.flatMap(notificationObservable -> notificationObservable) // <-- Notification has been set up, now observe value changes.
.subscribe(
    bytes -> {
        // Given characteristic has been changes, here is the value.
    },
    throwable -> {
        // Handle an error here.
    }
);


#DISABLE NOTIFICATION
result.dispose()

Пытался отписаться, но это не сработало, до сих пор не уверен, что лучше dispose() или unsubscribe()

person Shelly Pritchard    schedule 03.09.2020