-2

我正在使用RxAndroidBle庫在Android BLE上工作。如果沒有交互,BLE設備的超時時間爲5分鐘。即如果5分鐘內沒有讀/寫操作,設備將自動斷開連接。 發生超時斷開連接時,我收到BleGattException。BLE設備超時後,Android BLE不再連接[使用RxAndroidBle]

 W/System.err: BleGattException{macAddress=24:71:89:FE:A0:88, status=19 (0x13 -> https://android.googlesource.com/platform/external/bluetooth/bluedroid/+/android-5.1.0_r1/stack/include/gatt_api.h), bleGattOperationType=BleGattOperation{description='CONNECTION_STATE'}} 
W/System.err:  at com.polidea.rxandroidble.internal.connection.RxBleGattCallback.propagateStatusErrorIfGattErrorOccurred(RxBleGattCallback.java:233) 
W/System.err:  at com.polidea.rxandroidble.internal.connection.RxBleGattCallback.access$200(RxBleGattCallback.java:35) 
W/System.err:  at com.polidea.rxandroidble.internal.connection.RxBleGattCallback$3.onConnectionStateChange(RxBleGattCallback.java:86) 
W/System.err:  at android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:228) 
W/System.err:  at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:70) 
W/System.err:  at android.os.Binder.execTransact(Binder.java:453) 

W/BluetoothGatt: Unhandled exception in callback 
                    rx.exceptions.OnErrorFailedException: Error occurred when trying to propagate error to Observer.onError 
                     at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:194) 
                     at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:115) 
                     at rx.observers.Subscribers$5.onError(Subscribers.java:230) 
                     at rx.observers.Subscribers$5.onError(Subscribers.java:230) 
                     at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) 
                     at rx.observers.Subscribers$5.onError(Subscribers.java:230) 
                     at rx.observers.Subscribers$5.onError(Subscribers.java:230) 
                     at rx.observers.Subscribers$5.onError(Subscribers.java:230) 
                     at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266) 
                     at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818) 
                     at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579) 
                     at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568) 
                     at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852) 
                     at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266) 
                     at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818) 
                     at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579) 
                     at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568) 
                     at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852) 
                     at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266) 
                     at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818) 
                     at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579) 
                     at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568) 
                     at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852) 
                     at rx.internal.operators.NotificationLite.accept(NotificationLite.java:132) 
                     at rx.subjects.SubjectSubscriptionManager$SubjectObserver.emitNext(SubjectSubscriptionManager.java:253) 
                     at rx.subjects.BehaviorSubject.onError(BehaviorSubject.java:141) 
                     at com.polidea.rxandroidble.internal.connection.RxBleGattCallback.propagateStatusError(RxBleGattCallback.java:241) 
                     at com.polidea.rxandroidble.internal.connection.RxBleGattCallback.propagateStatusErrorIfGattErrorOccurred(RxBleGattCallback.java:233) 
                     at com.polidea.rxandroidble.internal.connection.RxBleGattCallback.access$200(RxBleGattCallback.java:35) 
                     at com.polidea.rxandroidble.internal.connection.RxBleGattCallback$3.onConnectionStateChange(RxBleGattCallback.java:86) 
                     at android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:228) 
                     at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:70) 
                     at android.os.Binder.execTransact(Binder.java:453) 
                    Caused by: rx.exceptions.OnErrorFailedException: Error occurred when trying to propagate error to Observer.onError 
                     at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:187) 
                     at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:115) 
                     at rx.exceptions.Exceptions.throwOrReport(Exceptions.java:216) 
                     at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:139) 
                     at rx.internal.operators.OperatorDistinctUntilChanged$1.onNext(OperatorDistinctUntilChanged.java:96) 
                     at rx.internal.operators.NotificationLite.accept(NotificationLite.java:135) 
                     at rx.subjects.SubjectSubscriptionManager$SubjectObserver.emitNext(SubjectSubscriptionManager.java:253) 
                     at rx.subjects.BehaviorSubject.onNext(BehaviorSubject.java:160) 
                     at com.polidea.rxandroidble.internal.RxBleDeviceImpl$1$1.call(RxBleDeviceImpl.java:77) 
                     at rx.subscriptions.BooleanSubscription.unsubscribe(BooleanSubscription.java:71) 
                     at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136) 
                     at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125) 

一旦設備斷開連接由於超時,當我再次掃描我可以通過提供設備如預期發現在附近的設備。 但是,當我嘗試連接到同一臺設備,它拋出一個異常生動設備已經連接

W/System.err: BleAlreadyConnectedException{macAddress=24:71:89:FE:99:E3} 
W/System.err:  at com.polidea.rxandroidble.internal.RxBleDeviceImpl.lambda$establishConnection$3(RxBleDeviceImpl.java:54) 
W/System.err:  at com.polidea.rxandroidble.internal.RxBleDeviceImpl$$Lambda$1.call(Unknown Source) 
W/System.err:  at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46) 
W/System.err:  at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) 
W/System.err:  at rx.Observable.subscribe(Observable.java:10236) 
W/System.err:  at rx.Observable.subscribe(Observable.java:10203) 
W/System.err:  at rx.Observable.subscribe(Observable.java:10043) 

但是我能夠連接到該設備,如果我和藍牙在我的手機或者關閉我殺死應用程序並重新啓動。

當我手動斷開設備並再次連接時,重新連接正在工作。這個問題只有在超時斷開連接時纔會發生。

任何人都可以告訴我爲什麼會發生這種情況?

回答

0

從錯誤和.establishConnection()函數的實現中判斷,您不退訂已返回的前一個Observable

@Override 
public Observable<RxBleConnection> establishConnection(final boolean autoConnect) { 
    return Observable.defer(new Func0<Observable<RxBleConnection>>() { 
     @Override 
     public Observable<RxBleConnection> call() { 

      if (isConnected.compareAndSet(false, true)) { 
       return connector.prepareConnection(autoConnect) 
         .doOnSubscribe(new Action0() { 
          @Override 
          public void call() { 
           connectionStateSubject.onNext(CONNECTING); 
          } 
         }) 
         .doOnNext(new Action1<RxBleConnection>() { 
          @Override 
          public void call(RxBleConnection rxBleConnection) { 
           connectionStateSubject.onNext(CONNECTED); 
          } 
         }) 
         .doOnUnsubscribe(new Action0() { 
          @Override 
          public void call() { 
           connectionStateSubject.onNext(DISCONNECTED); 
           isConnected.set(false); 
          } 
         }); 
      } else { 
       return Observable.error(new BleAlreadyConnectedException(bluetoothDevice.getAddress())); 
      } 
     } 
    }); 
} 

一旦您取消訂閱上一個,您應該能夠建立新的連接。

+0

感謝您的信息@s_noopy。但是我在下一次連線之前已經完全沒有理由了。當我手動斷開設備並再次連接時,重新連接正在工作。這個問題只有在超時斷開連接時纔會發生。 – VishnuSP

+0

一旦發生外設端斷開 - 來自'.establishConnection()'的'Observable'應該發出'BleDisconnectedException' - 是否會發生? –

+0

不是,我沒有收到BleDisconnectedException,但是BleGattException 'W/System.err:BleGattException {status = 19,bleGattOperation = BleGattOperation {description ='CONNECTION_STATE'}} W/System.err:at com.polidea。 rxandroidble.internal.connection.RxBleGattCallback.propagateStatusErrorIfGattErrorOccurred(RxBleGattCallback.java:248)' – VishnuSP