多次连接和读取ble数据时出现的问题

问题描述

我想在用户点击按钮时连接并从 BLE 设备获取读数。如果用户多次点击按钮,如果连接在 disposing 中,即 connected state,然后再次建立连接,我是 BLE 连接的 RxBleConnection.RxBleConnectionState.CONNECTED

用户点击按钮时的流程如下

  1. 检查设备状态是否等于RxBleConnection.RxBleConnectionState.CONNECTED

  2. 如果是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();
     }
    
  3. 与BLE Device建立连接

      device.establishConnection(false)
    

在上述方法中,我们经常遇到以下情况,无法提供无缝体验。

  1. 当我们处理连接时,它会在 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
    
  2. 有时它会抛出 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)
    
  3. 设置指示时执行卡住,应用崩溃。

     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 connectestablishConnection(true) 模式下设置连接并捕获异常 BleAlreadyConnectedException 并重新启动读取操作,但我没有在 getReading

             .onErrorResumeNext(e -> {
                   return getReadings(Pair.create(initiateReadingCommand,mRxBleConnection));

                   
               });

我遇到了一些报告过 RxAndroidBle 库的类似问题,但还没有找到解决方RxAndroidBle

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)