2016-08-23 25 views
0

我目前正在開發專用藍牙低功耗設備的Android應用程序。RxAndroidBle在訂閱多個特徵時崩潰

我決定使用RxAndroidBle,我很高興它與內置藍牙堆棧相比更易於使用。

我在哪裏遇到問題:我需要訂閱兩個特徵,並不斷閱讀和彙總它們的值。

查看此示例頁面http://polidea.github.io/RxAndroidBle/,我已經能夠根據示例閱讀多個特性,但是在組合多個訂閱時未能成功。

這是我的本錢:

subscriptionA = device.establishConnection(this, false) 
      .flatMap(rxBleConnection -> rxBleConnection.setupNotification(aUUID)) 
      .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. 
       System.out.printf("Received 03: %d\n\tdata: %s\n", bytes.length, Arrays.toString(bytes)); 
      }); 
    subscriptionB = device.establishConnection(this, false) 
      .flatMap(rxBleConnection -> rxBleConnection.setupNotification(bUUID)) 
      .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. 
       System.out.printf("Received 05: %d\n\tdata: %s\n", bytes.length, Arrays.toString(bytes)); 
      }); 

它一旦它到達第二預訂崩潰。我究竟做錯了什麼?

這裏的錯誤:

17:47:33.444 27758-27758/com.exam E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.exam, PID: 27758 
                     rx.exceptions.OnErrorNotImplementedException 
                      at rx.Observable$27.onError(Observable.java:7923) 
                      at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:159) 
                      at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120) 
                      at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:240) 
                      at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:776) 
                      at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:537) 
                      at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:526) 
                      at rx.internal.operators.OperatorMerge$MergeSubscriber.onError(OperatorMerge.java:250) 
                      at rx.internal.operators.OperatorMap$1.onError(OperatorMap.java:48) 
                      at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71) 
                      at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:240) 
                      at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:776) 
                      at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:537) 
                      at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:526) 
                      at rx.internal.operators.OperatorMerge$MergeSubscriber.onError(OperatorMerge.java:250) 
                      at rx.internal.operators.OperatorMap$1.onError(OperatorMap.java:48) 
                      at rx.observers.Subscribers$5.onError(Subscribers.java:225) 
                      at rx.Observable$ThrowObservable$1.call(Observable.java:9984) 
                      at rx.Observable$ThrowObservable$1.call(Observable.java:9974) 
                      at rx.Observable.unsafeSubscribe(Observable.java:8098) 
                      at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51) 
                      at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) 
                      at rx.Observable$2.call(Observable.java:162) 
                      at rx.Observable$2.call(Observable.java:154) 
                      at rx.Observable$2.call(Observable.java:162) 
                      at rx.Observable$2.call(Observable.java:154) 
                      at rx.Observable$2.call(Observable.java:162) 
                      at rx.Observable$2.call(Observable.java:154) 
                      at rx.Observable$2.call(Observable.java:162) 
                      at rx.Observable$2.call(Observable.java:154) 
                      at rx.Observable$2.call(Observable.java:162) 
                      at rx.Observable$2.call(Observable.java:154) 
                      at rx.Observable.subscribe(Observable.java:8191) 
                      at rx.Observable.subscribe(Observable.java:8158) 
                      at rx.Observable.subscribe(Observable.java:7914) 
                      at com.exam.BTConnection.enableConnection(BTConnection.java:65) 
                      at com.exam.MActivity$3.onServiceConnected(mActivity.java:104) 
                      at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1208) 
                      at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1225) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:135) 
                      at android.app.ActivityThread.main(ActivityThread.java:5254) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
                      at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115) 
                     Caused by: BleAlreadyConnectedException{macAddress=35:32:30:30:44:53} 
                      at com.polidea.rxandroidble.internal.RxBleDeviceImpl.lambda$establishConnection$79(RxBleDeviceImpl.java:54) 
                      at com.polidea.rxandroidble.internal.RxBleDeviceImpl.access$lambda$0(RxBleDeviceImpl.java) 
                      at com.polidea.rxandroidble.internal.RxBleDeviceImpl$$Lambda$1.call(Unknown Source) 
                      at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46) 
                      at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)  
                      at rx.Observable$2.call(Observable.java:162)  
                      at rx.Observable$2.call(Observable.java:154)  
                      at rx.Observable$2.call(Observable.java:162)  
                      at rx.Observable$2.call(Observable.java:154)  
                      at rx.Observable$2.call(Observable.java:162)  
                      at rx.Observable$2.call(Observable.java:154)  
                      at rx.Observable$2.call(Observable.java:162)  
                      at rx.Observable$2.call(Observable.java:154)  
                      at rx.Observable$2.call(Observable.java:162)  
                      at rx.Observable$2.call(Observable.java:154)  
                      at rx.Observable.subscribe(Observable.java:8191)  
                      at rx.Observable.subscribe(Observable.java:8158)  
                      at rx.Observable.subscribe(Observable.java:7914)  
                      at com.exam.BTConnection.enableConnection(BTConnection.java:65)  
                      at com.exam.MActivity$3.onServiceConnected(MActivity.java:104)  
                      at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1208)  
                      at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1225)  
                      at android.os.Handler.handleCallback(Handler.java:739)  
                      at android.os.Handler.dispatchMessage(Handler.java:95)  
                      at android.os.Looper.loop(Looper.java:135)  
                      at android.app.ActivityThread.main(ActivityThread.java:5254)  
                      at java.lang.reflect.Method.invoke(Native Method)  
                      at java.lang.reflect.Method.invoke(Method.java:372)  

回答

2

你已經犯了兩個錯誤:

  1. 您試圖建立到同一設備兩個連接。你在日誌中看到這個(Caused by: BleAlreadyConnectedException{macAddress=35:32:30:30:44:53})。 BLE連接是點對點類型,您不能同時打開同一設備的兩個連接(與HTTP不同)。
  2. 您沒有處理連接期間可能發生的異常。您可以在日誌中看到這個問題,以及(rx.exceptions.OnErrorNotImplementedException

,你應該怎麼做:

subscription = device.establishConnection(this, false) 
      .flatMap(rxBleConnection -> Observable.combineLatest(// use the same connection and combine latest emissions 
        rxBleConnection.setupNotification(aUUID).<byte[]>flatMap(observable -> observable), // sometimes IDE get's lost in what type is returned from an Observable - that's why I added <byte[]> 
        rxBleConnection.setupNotification(bUUID).<byte[]>flatMap(observable -> observable), 
        Pair::new // merge into a Pair 
      )) 
      .subscribe(
        byteArrayPair -> { 
         // here you get the latest values from notifications 
         byte[] aBytes = byteArrayPair.first; 
         byte[] bBytes = byteArrayPair.second; 
         // do your thing 
        }, 
        throwable -> { 
         // handle errors 
        } 
      ); 

問候

+0

我試着開始做這樣的事情,但沒有得到它上班。這好多了。非常感謝!明天再試,讓你知道它是如何發展的 – KG6ZVP