2016-11-08 6 views
1

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

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

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

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

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

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

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

ответ

1

Включение уведомлений происходит, когда 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.

+0

Отлично, отписавшись от него, хорошо работает! Спасибо! – Myx