问题描述
我想在用户点击按钮时连接并从 BLE 设备获取读数。如果用户多次点击按钮,如果连接在 disposing
中,即 connected state
,然后再次建立连接,我是 BLE 连接的 RxBleConnection.RxBleConnectionState.CONNECTED
。
用户点击按钮时的流程如下
-
检查设备状态是否等于
RxBleConnection.RxBleConnectionState.CONNECTED
-
如果是
dispose of the connection
,因为处理连接需要时间我使用了以下代码(这可能不是最好的代码)if(device.getConnectionState() == RxBleConnection.RxBleConnectionState.CONNECTED){ disposable disposable = Observable.just(connectdisposable) .map(d -> { d.dispose(); return d; }) .delay(10,TimeUnit.SECONDS) .blockingFirst(); }
-
与BLE Device建立连接
device.establishConnection(false)
在上述方法中,我们经常遇到以下情况,无法提供无缝体验。
-
当我们处理连接时,它会在 logcat 中抛出以下错误
2021-01-15 13:16:54.395 17470-17470/com.ble.troubleshoot D/BluetoothGatt: setCharacteristicNotification() - uuid: 72cd0e39-cd22-415d-5eae-0a71b4861f3e enable: false 2021-01-15 13:16:54.398 17470-18013/com.ble.troubleshoot D/RxBle#ClientOperationQueue: QUEUED disconnectOperation(77885651) 2021-01-15 13:16:54.402 17470-17556/com.ble.troubleshoot D/RxBle#ClientOperationQueue: STARTED disconnectOperation(77885651) 2021-01-15 13:16:54.403 17470-17470/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: QUEUED DescriptorWriteOperation(177636368) 2021-01-15 13:16:54.406 17470-17556/com.ble.troubleshoot I/RxBle#ClientOperationQueue: RUNNING disconnectOperation{MAC='XX:XX:XX:XX:XX:XX'} 2021-01-15 13:16:54.406 17470-17470/com.ble.troubleshoot D/BluetoothGatt: setCharacteristicNotification() - uuid: 705f68f7-83c9-6562-b2c5-709e51b3a168 enable: false 2021-01-15 13:16:54.406 17470-18012/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: STARTED DescriptorWriteOperation(177636368) 2021-01-15 13:16:54.408 17470-17565/com.ble.troubleshoot D/BluetoothManager: getConnectionState() 2021-01-15 13:16:54.412 17470-18012/com.ble.troubleshoot I/RxBle#ConnectionoperationQueue: RUNNING DescriptorWriteOperation{MAC='XX:XX:XX:XX:XX:XX',descriptor=[uuid='00002902-0000-1000-8000-00805f9b34fb',hexValue=[...]]} 2021-01-15 13:16:54.412 17470-17470/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: QUEUED DescriptorWriteOperation(45304585) 2021-01-15 13:16:54.414 17470-17565/com.ble.troubleshoot D/BluetoothManager: getConnectedDevices 2021-01-15 13:16:54.417 17470-18013/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: Connection operations queue to be terminated (MAC='XX:XX:XX:XX:XX:XX') com.polidea.rxandroidble2.exceptions.BledisconnectedException: disconnected from MAC='XX:XX:XX:XX:XX:XX' with status -1 (UNKNowN) at com.polidea.rxandroidble2.internal.serialization.ConnectionoperationQueueImpl.onConnectionUnsubscribed(ConnectionoperationQueueImpl.java:162) at com.polidea.rxandroidble2.internal.connection.ConnectorImpl$1$1.run(ConnectorImpl.java:65) at io.reactivex.internal.operators.observable.ObservableDoFinally$DoFinallyObserver.runFinally(ObservableDoFinally.java:142) at io.reactivex.internal.operators.observable.ObservableDoFinally$DoFinallyObserver.dispose(ObservableDoFinally.java:98) at io.reactivex.internal.disposables.disposableHelper.dispose(disposableHelper.java:124) at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.dispose(ObservableSubscribeOn.java:73) at io.reactivex.internal.operators.observable.ObservableunsubscribeOn$UnsubscribeObserver$disposeTask.run(ObservableunsubscribeOn.java:95) at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38) at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) 2021-01-15 13:16:54.419 17470-17470/com.ble.troubleshoot D/BluetoothGatt: setCharacteristicNotification() - uuid: 314fae3a-d0cf-51c4-4a67-502ce399b33f enable: false 2021-01-15 13:16:54.421 17470-18012/com.ble.troubleshoot W/RxBle#ConnectionoperationQueue: Queue's awaitRelease() has been interrupted abruptly while it wasn't released by the release() method. java.lang.InterruptedException at java.lang.Object.wait(Native Method) at com.polidea.rxandroidble2.internal.serialization.QueueSemaphore.awaitRelease(QueueSemaphore.java:15) at com.polidea.rxandroidble2.internal.serialization.ConnectionoperationQueueImpl$1.run(ConnectionoperationQueueImpl.java:74) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) 2021-01-15 13:16:54.424 17470-17470/com.ble.troubleshoot D/BluetoothGatt: setCharacteristicNotification() - uuid: 8599c5ba-f827-2d16-ce14-e9c2231aa26d enable: false 2021-01-15 13:16:54.428 17470-17470/com.ble.troubleshoot D/BluetoothGatt: setCharacteristicNotification() - uuid: 6fbba050-e87b-6ea8-6e5d-52714ca81a0e enable: false 2021-01-15 13:16:54.430 17470-17565/com.ble.troubleshoot D/BluetoothGatt: cancelopen() - device: 58:8E:81:66:A2:DC 2021-01-15 13:16:54.433 17470-17550/com.ble.troubleshoot D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=8 device=58:8E:81:66:A2:DC 2021-01-15 13:16:54.436 17470-17550/com.ble.troubleshoot I/RxBle#GattCallback: MAC='XX:XX:XX:XX:XX:XX' onConnectionStateChange(),status=0,value=0 2021-01-15 13:16:54.442 17470-17565/com.ble.troubleshoot D/BluetoothGatt: close() 2021-01-15 13:16:54.442 17470-17565/com.ble.troubleshoot D/BluetoothGatt: unregisterapp() - mClientIf=8 2021-01-15 13:16:54.443 17470-18012/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: FINISHED DescriptorWriteOperation(177636368) in 37 ms 2021-01-15 13:16:54.446 17470-18012/com.ble.troubleshoot V/RxBle#Executors: Terminated (MAC='XX:XX:XX:XX:XX:XX') 2021-01-15 13:16:54.446 17470-17556/com.ble.troubleshoot D/RxBle#ClientOperationQueue: FINISHED disconnectOperation(77885651) in 45 ms
-
有时它会抛出
disconnected from MAC='XX:XX:XX:XX:XX:XX' with status 133 (GATT_ERROR)
,在这种情况下,我们正在处理连接并重新连接。2021-01-15 14:50:02.042 25625-25875/com.ble.troubleshoot I/RxBle#GattCallback: MAC='XX:XX:XX:XX:XX:XX' onConnectionStateChange(),status=133,value=0 2021-01-15 14:50:02.056 25625-25875/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: Connection operations queue to be terminated (MAC='XX:XX:XX:XX:XX:XX') com.polidea.rxandroidble2.exceptions.BledisconnectedException: disconnected from MAC='XX:XX:XX:XX:XX:XX' with status 133 (GATT_ERROR) at com.polidea.rxandroidble2.internal.connection.RxBleGattCallback$2.onConnectionStateChange(RxBleGattCallback.java:81) at android.bluetooth.BluetoothGatt$1$4.run(BluetoothGatt.java:249) at android.bluetooth.BluetoothGatt.runorQueueCallback(BluetoothGatt.java:725) at android.bluetooth.BluetoothGatt.-wrap0(UnkNown Source:0) at android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:244) at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:70) at android.os.Binder.execTransact(Binder.java:704) 2021-01-15 14:50:02.061 25625-25878/com.ble.troubleshoot V/RxBle#Executors: Terminated (MAC='XX:XX:XX:XX:XX:XX') 2021-01-15 14:50:02.063 25625-25875/com.ble.troubleshoot E/BLEActivity: connectDevice 2 disconnected from MAC='XX:XX:XX:XX:XX:XX' with status 133 (GATT_ERROR) (GATT_ERROR)
-
设置指示时执行卡住,应用崩溃。
2021-01-15 14:51:50.605 25625-25879/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: QUEUED CharacteristicWriteOperation(18212147) 2021-01-15 14:51:50.612 25625-25879/com.ble.troubleshoot D/BluetoothGatt: setCharacteristicNotification() - uuid: bb388409-4496-33db-4a32-ebed75a7f560 enable: true 2021-01-15 14:51:50.621 25625-25879/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: QUEUED DescriptorWriteOperation(177885424) 2021-01-15 14:51:50.625 25625-26002/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: FINISHED ServicediscoveryOperation(195793005) in 1091 ms 2021-01-15 14:51:50.627 25625-26002/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: STARTED CharacteristicWriteOperation(18212147) 2021-01-15 14:51:50.630 25625-25638/com.ble.troubleshoot D/BluetoothGatt: onConnectionUpdated() - Device=58:8E:81:66:A2:DC interval=39 latency=0 timeout=500 status=0 2021-01-15 14:51:50.630 25625-26002/com.ble.troubleshoot I/RxBle#ConnectionoperationQueue: RUNNING CharacteristicWriteOperation{MAC='XX:XX:XX:XX:XX:XX',characteristic=[uuid='23fa698a-9f76-c895-4f8f-c84385382623',hexValue=[...]]} 2021-01-15 14:51:50.634 25625-25638/com.ble.troubleshoot I/RxBle#GattCallback: MAC='XX:XX:XX:XX:XX:XX' onConnectionUpdated(),interval=39 (48.75 ms),latency=0,timeout=500 (5000 ms) 2021-01-15 14:51:50.790 25625-25638/com.ble.troubleshoot I/RxBle#GattCallback: MAC='XX:XX:XX:XX:XX:XX' onCharacteristicWrite(),value=[uuid='23fa698a-9f76-c895-4f8f-c84385382623'] 2021-01-15 14:51:50.799 25625-26002/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: FINISHED CharacteristicWriteOperation(18212147) in 170 ms 2021-01-15 14:51:50.803 25625-26002/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: STARTED DescriptorWriteOperation(177885424) 2021-01-15 14:51:50.808 25625-26002/com.ble.troubleshoot I/RxBle#ConnectionoperationQueue: RUNNING DescriptorWriteOperation{MAC='XX:XX:XX:XX:XX:XX',hexValue=[...]]} 2021-01-15 14:51:50.887 25625-25638/com.ble.troubleshoot I/RxBle#GattCallback: MAC='XX:XX:XX:XX:XX:XX' onDescriptorWrite(),value=[uuid='00002902-0000-1000-8000-00805f9b34fb'] 2021-01-15 14:51:50.895 25625-26002/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: FINISHED DescriptorWriteOperation(177885424) in 90 ms 2021-01-15 14:51:50.897 25625-25638/com.ble.troubleshoot I/RxBle#GattCallback: MAC='XX:XX:XX:XX:XX:XX' onCharacteristicChanged(),value=[uuid='bb388409-4496-33db-4a32-ebed75a7f560',hexValue=[...]] 2021-01-15 14:51:50.900 25625-25879/com.ble.troubleshoot E/BLEActivity: initiateRead RxBleThread-1 2021-01-15 14:51:50.901 25625-25879/com.ble.troubleshoot E/BLEActivity: getReadings RxBleThread-1 2021-01-15 14:51:50.911 25625-25879/com.ble.troubleshoot D/BluetoothGatt: setCharacteristicNotification() - uuid: 72cd0e39-cd22-415d-5eae-0a71b4861f3e enable: true 2021-01-15 14:51:50.914 25625-25879/com.ble.troubleshoot E/BLEActivity: Here 1 2021-01-15 14:51:50.921 25625-25879/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: QUEUED DescriptorWriteOperation(241929244) 2021-01-15 14:51:50.926 25625-25879/com.ble.troubleshoot D/BluetoothGatt: setCharacteristicNotification() - uuid: 705f68f7-83c9-6562-b2c5-709e51b3a168 enable: true 2021-01-15 14:51:50.927 25625-26002/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: STARTED DescriptorWriteOperation(241929244) 2021-01-15 14:51:50.930 25625-25879/com.ble.troubleshoot E/BLEActivity: Here 2 2021-01-15 14:51:50.932 25625-26002/com.ble.troubleshoot I/RxBle#ConnectionoperationQueue: RUNNING DescriptorWriteOperation{MAC='XX:XX:XX:XX:XX:XX',hexValue=[...]]} 2021-01-15 14:51:50.935 25625-25879/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: QUEUED DescriptorWriteOperation(35872805) 2021-01-15 14:51:50.938 25625-25879/com.ble.troubleshoot D/BluetoothGatt: setCharacteristicNotification() - uuid: 314fae3a-d0cf-51c4-4a67-502ce399b33f enable: true 2021-01-15 14:51:50.942 25625-25879/com.ble.troubleshoot E/BLEActivity: Here 3 2021-01-15 14:51:50.946 25625-25879/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: QUEUED DescriptorWriteOperation(33121786) 2021-01-15 14:51:50.949 25625-25879/com.ble.troubleshoot D/BluetoothGatt: setCharacteristicNotification() - uuid: 8599c5ba-f827-2d16-ce14-e9c2231aa26d enable: true 2021-01-15 14:51:50.951 25625-25879/com.ble.troubleshoot E/BLEActivity: Here 4 2021-01-15 14:51:50.955 25625-25879/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: QUEUED DescriptorWriteOperation(228509611) 2021-01-15 14:51:50.958 25625-25879/com.ble.troubleshoot D/BluetoothGatt: setCharacteristicNotification() - uuid: 6fbba050-e87b-6ea8-6e5d-52714ca81a0e enable: true 2021-01-15 14:51:50.960 25625-25879/com.ble.troubleshoot E/BLEActivity: Here 5 2021-01-15 14:51:50.964 25625-25879/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: QUEUED DescriptorWriteOperation(112414216) 2021-01-15 14:51:50.967 25625-25879/com.ble.troubleshoot D/BluetoothGatt: setCharacteristicNotification() - uuid: bb388409-4496-33db-4a32-ebed75a7f560 enable: false 2021-01-15 14:51:50.971 25625-25879/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: QUEUED DescriptorWriteOperation(240048545) 2021-01-15 14:51:51.032 25625-25638/com.ble.troubleshoot I/RxBle#GattCallback: MAC='XX:XX:XX:XX:XX:XX' onDescriptorWrite(),value=[uuid='00002902-0000-1000-8000-00805f9b34fb'] 2021-01-15 14:51:51.037 25625-25638/com.ble.troubleshoot I/RxBle#GattCallback: MAC='XX:XX:XX:XX:XX:XX' onCharacteristicChanged(),value=[uuid='72cd0e39-cd22-415d-5eae-0a71b4861f3e',hexValue=[...]] 2021-01-15 14:51:51.037 25625-26002/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: FINISHED DescriptorWriteOperation(241929244) in 111 ms 2021-01-15 14:51:51.044 25625-26002/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: STARTED DescriptorWriteOperation(35872805) 2021-01-15 14:51:51.047 25625-26002/com.ble.troubleshoot I/RxBle#ConnectionoperationQueue: RUNNING DescriptorWriteOperation{MAC='XX:XX:XX:XX:XX:XX',hexValue=[...]]} 2021-01-15 14:51:51.135 25625-25638/com.ble.troubleshoot I/RxBle#GattCallback: MAC='XX:XX:XX:XX:XX:XX' onDescriptorWrite(),value=[uuid='00002902-0000-1000-8000-00805f9b34fb'] 2021-01-15 14:51:51.143 25625-26002/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: FINISHED DescriptorWriteOperation(35872805) in 101 ms 2021-01-15 14:51:51.148 25625-26002/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: STARTED DescriptorWriteOperation(33121786) 2021-01-15 14:51:51.152 25625-26002/com.ble.troubleshoot I/RxBle#ConnectionoperationQueue: RUNNING DescriptorWriteOperation{MAC='XX:XX:XX:XX:XX:XX',hexValue=[...]]} 2021-01-15 14:51:51.180 25625-25638/com.ble.troubleshoot I/RxBle#GattCallback: MAC='XX:XX:XX:XX:XX:XX' onCharacteristicChanged(),value=[uuid='705f68f7-83c9-6562-b2c5-709e51b3a168',hexValue=[...]] 2021-01-15 14:51:51.229 25625-25638/com.ble.troubleshoot I/RxBle#GattCallback: MAC='XX:XX:XX:XX:XX:XX' onDescriptorWrite(),value=[uuid='00002902-0000-1000-8000-00805f9b34fb'] 2021-01-15 14:51:51.237 25625-26002/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: FINISHED DescriptorWriteOperation(33121786) in 88 ms 2021-01-15 14:51:51.241 25625-26002/com.ble.troubleshoot D/RxBle#ConnectionoperationQueue: STARTED DescriptorWriteOperation(228509611) 2021-01-15 14:51:51.246 25625-26002/com.ble.troubleshoot I/RxBle#ConnectionoperationQueue: RUNNING DescriptorWriteOperation{MAC='XX:XX:XX:XX:XX:XX',hexValue=[...]]}
那么除了断开和重新连接之外,是否有可能如果设备已经连接,则只需再次设置指示并读取数据?
当前代码
connectdisposable=
device.establishConnection(false)
.flatMap(rxBleConnection -> {
rxBleConnection.discoverServices();
mRxBleConnection = rxBleConnection;
return Observable.just(rxBleConnection);
})
.flatMap(rxBleConnection->initiateRead(rxBleConnection,initiateReadingCommand))
.flatMap(pairObj ->getReadings(pairObj))
.doOnNext(data -> displayReadings(data))
.subscribe(data -> {
try {
if (data != null) {
//switch to activity and pass data
}
} catch (Exception e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
hideLoader();
showError(e.getMessage());
}
});
}
});
public Observable<Map<Integer,MetaData>>
getReadings(Pair<byte[],RxBleConnection> pairObj ){
RxBleConnection rxBleConnection = pairObj.second;
return Observable.zip(
rxBleConnection.setupIndication(TSDictionary.UUID1,NotificationSetupMode.QUICK_SETUP).doOnNext(observable -> Log.e(TAG,"Here 1 ")).flatMap(it -> it),rxBleConnection.setupIndication(TSDictionary.UUID2,"Here 2 ")).flatMap(it -> it),rxBleConnection.setupIndication(TSDictionary.UUID3,"Here 3 ")).flatMap(it -> it),rxBleConnection.setupIndication(TSDictionary.UUID4,"Here 4 ")).flatMap(it -> it),rxBleConnection.setupIndication(TSDictionary.UUID5,"Here 5 ")).flatMap(it -> it),TSDictionary::IDUReadings);
}
我尝试通过 auto connect
在 establishConnection(true)
模式下设置连接并捕获异常 BleAlreadyConnectedException
并重新启动读取操作,但我没有在 getReading
.onErrorResumeNext(e -> {
return getReadings(Pair.create(initiateReadingCommand,mRxBleConnection));
});
我遇到了一些报告过 RxAndroidBle 库的类似问题,但还没有找到解决方案 RxAndroidBle
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)