Molay
Molay

Reputation: 1404

RxAndroidBLE multiple connections issue

Using RxAndroidBLE Library.

Specifications : macOS Sierra Version 10.12.6, Android studio 3.0.1, hand set model :Moto E, Android version 5.0.2

Getting below BleDisconnectedException issue when i tried to connect to 2 BLE devices, please suggest:

On debugging, realised issue is showing up at connection.subscribe..:

RxBleLog.setLogLevel(RxBleLog.VERBOSE);    
Observable<ScanResult> bleSharedScanner
                        = rxBleClient.scanBleDevices(
                        new ScanSettings.Builder()
                                .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
                                .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
                                .build(),
                        new ScanFilter.Builder()
                                .build()
                ).share();

                scanSubscription = bleSharedScanner.subscribe(
                        scanResult -> {
                            if (scanResult.getBleDevice().getName() != null &&
                                    scanResult.getBleDevice().getName().startsWith("MOB")) {
                                final RxBleDevice rxBleDevice = scanResult.getBleDevice();
                                System.out.println("Connecting....");
                                // connect to device
                                final rx.Observable<RxBleConnection> connection = rxBleDevice.establishConnection(false);

                                connection.subscribe(rxBleConnection -> {
                                            System.out.println("Connected....");
                                        },
                                        throwable -> {
                                            throwable.printStackTrace();
                                            System.out.println("Disconnected...");
                                        }
                                );
                            }
                        },
                        throwable -> subject.onError(throwable)
                );

getting below error:

D/RxBle#ClientOperationQueue:   QUEUED ScanOperationApi21(439507796)
D/RxBle#ClientOperationQueue:  STARTED ScanOperationApi21(439507796)
I/RxBle#QueueOperation: Scan operation is requested to start.
D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5
D/RxBle#ClientOperationQueue: FINISHED ScanOperationApi21(439507796)
D/BluetoothLeScanner: onScanResult() - ScanResult{mDevice=22:22:18:53:D5:1C, mScanRecord=ScanRecord [mAdvertiseFlags=26, mServiceUuids=[8ec1e808-67c9-11e6-8b77-86f30ca893d3], mManufacturerSpecificData={}, mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=US1], mRssi=-66, mTimestampNanos=466666244618}
D/BluetoothLeScanner: onScanResult() - ScanResult{mDevice=22:22:B4:4B:2E:67, mScanRecord=ScanRecord [mAdvertiseFlags=26, mServiceUuids=[8ec1e808-67c9-11e6-8b77-86f30ca893d3], mManufacturerSpecificData={}, mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=US2], mRssi=-59, mTimestampNanos=466756052951}
D/BluetoothLeScanner: onScanResult() - ScanResult{mDevice=67:2A:F2:1C:D5:5E, mScanRecord=ScanRecord [mAdvertiseFlags=26, mServiceUuids=[00001805-0000-1000-8000-00805f9b34fb], mManufacturerSpecificData={}, mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=111-1], mRssi=-73, mTimestampNanos=466785244253}
I/System.out: Connecting....
D/BluetoothLeScanner: onScanResult() - ScanResult{mDevice=7B:98:4E:7A:34:97, mScanRecord=ScanRecord [mAdvertiseFlags=2, mServiceUuids=[00001805-0000-1000-8000-00805f9b34fb], mManufacturerSpecificData={}, mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=111-2], mRssi=-58, mTimestampNanos=466933499931}
D/RxBle#ClientOperationQueue:   QUEUED ConnectOperation(683111114)
D/RxBle#ClientOperationQueue:  STARTED ConnectOperation(683111114)
I/System.out: Connecting....
D/RxBle#ClientOperationQueue:   QUEUED ConnectOperation(868920235)
V/RxBle#BleConnectionCompat: Connecting without reflection
D/BluetoothGatt: connect() - device: 67:2A:F2:1C:D5:5E, auto: false
D/BluetoothGatt: registerApp()
D/BluetoothGatt: registerApp() - UUID=87a04fa1-ac28-4e0b-965a-e43bc3a5cc2a
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=6
D/BluetoothLeScanner: onScanResult() - ScanResult{mDevice=28:43:81:F1:E3:C2, mScanRecord=ScanRecord [mAdvertiseFlags=-1, mServiceUuids=null, mManufacturerSpecificData={6=[1, 9, 32, 0, 24, 67, -125, -102, 90, -34, 56, -22, 127, 22, -113, -94, -55, -22, -37, -12, -111, -124, -36, 11, 111, 14, -18]}, mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=null], mRssi=-103, mTimestampNanos=467087746285}
D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=6 device=67:2A:F2:1C:D5:5E
D/RxBle#BluetoothGatt: onConnectionStateChange newState=2 status=0
D/RxBle#ClientOperationQueue: FINISHED ConnectOperation(683111114)
D/RxBle#ClientOperationQueue:  STARTED ConnectOperation(868920235)
V/RxBle#BleConnectionCompat: Connecting without reflection
I/System.out: Connected....
D/BluetoothGatt: connect() - device: 7B:98:4E:7A:34:97, auto: false
D/BluetoothGatt: registerApp()
D/BluetoothGatt: registerApp() - UUID=1729dc19-b4ee-4088-b9a3-507c0b80c0bb
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=7
D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=7 device=7B:98:4E:7A:34:97
D/RxBle#BluetoothGatt: onConnectionStateChange newState=2 status=0
D/BluetoothGatt: onClientConnectionState() - status=62 clientIf=7 device=7B:98:4E:7A:34:97
D/RxBle#BluetoothGatt: onConnectionStateChange newState=0 status=62
D/RxBle#ClientOperationQueue: FINISHED ConnectOperation(868920235)
W/System.err: BleDisconnectedException{bluetoothDeviceAddress='7B:98:4E:7A:34:97'}
W/System.err:     at com.polidea.rxandroidble.internal.connection.RxBleGattCallback$2.onConnectionStateChange(RxBleGattCallback.java:76)
W/System.err:     at android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:181)
W/System.err:     at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:70)
W/System.err:     at android.os.Binder.execTransact(Binder.java:446)
I/System.out: Disconnected...
I/RxBle#ConnectionOperationQueue: Connection operations queue to be terminated (7B:98:4E:7A:34:97)
D/RxBle#Executors$RunnableAdapter: Terminated.
D/RxBle#ClientOperationQueue:   QUEUED DisconnectOperation(810732953)
D/RxBle#ClientOperationQueue:  STARTED DisconnectOperation(810732953)
D/BluetoothManager: getConnectionState()
D/BluetoothManager: getConnectedDevices
D/BluetoothGatt: close()
D/BluetoothGatt: unregisterApp() - mClientIf=7
D/RxBle#ClientOperationQueue: FINISHED DisconnectOperation(810732953)

Upvotes: 0

Views: 1048

Answers (1)

Dariusz Seweryn
Dariusz Seweryn

Reputation: 3222

status=62 is 0x3E which means #define GATT_CONN_FAIL_ESTABLISH HCI_ERR_CONN_FAILED_ESTABLISHMENT/* 0x03E connection fail to establish */ in the AOSP source code.

As you can see that is not too descriptive. The problem lies in the lower levels of Android BLE stack.

I did not see any place in the code where you stop the scan. What you can do is to stop the scan before attempting to connect to the second device. Even less straining for the BLE stack would be:

  1. scan both devices
  2. stop the scan
  3. connect to both devices (this will be serialised by the library anyway)

Upvotes: 1

Related Questions