BLE设备超时后,Android BLE不再连接[使用RxAndroidBle]
问题描述:
我正在使用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)
但是我能够连接到该设备,如果我和蓝牙在我的手机或者关闭我杀死应用程序并重新启动。
当我手动断开设备并再次连接时,重新连接正在工作。这个问题只有在超时断开连接时才会发生。
任何人都可以告诉我为什么会发生这种情况?
答
从错误和.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()));
}
}
});
}
一旦您取消订阅上一个,您应该能够建立新的连接。
感谢您的信息@s_noopy。但是我在下一次连线之前已经完全没有理由了。当我手动断开设备并再次连接时,重新连接正在工作。这个问题只有在超时断开连接时才会发生。 – VishnuSP
一旦发生外设端断开 - 来自'.establishConnection()'的'Observable'应该发出'BleDisconnectedException' - 是否会发生? –
不是,我没有收到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