How to create multiple connections at the same time in Android bluetooth low energy (BLE)?

I am working on an Android BLE application.

Is there any procedure for connecting multiple BLE devices (creating multiple connections) simultaneously in Android. As in my application, there are several BLE light sources, so the first light connects successfully, when I click to connect to the second second light, it also connects. but after a while the second light automatically turns off. I have to connect a few lights to a maximum of 8.

That's what I'm doing

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { String intentAction; if (newState == BluetoothProfile.STATE_CONNECTED) { intentAction = GattActions.ACTION_GATT_CONNECTED; broadcastUpdate(intentAction); Log.i(DSERVICE_TAG, "Connected to GATT server."); // Attempts to discover services after successful connection. Log.i(DSERVICE_TAG, "Attempting to start service discovery:" + mBluetoothGatt.discoverServices()); readRssi(); } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { intentAction = GattActions.ACTION_GATT_DISCONNECTED; Log.i(DSERVICE_TAG, "Disconnected from GATT server."); broadcastUpdate(intentAction); } } public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { broadcastUpdate(GattActions.ACTION_GATT_RSSI, rssi); } else { Log.w(DSERVICE_TAG, "onReadRemoteRssi received: " + status); } } @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { Log.v(DSERVICE_TAG, "Device Discovered Uuids Are==" + gatt.getDevice().getUuids()); broadcastUpdate(GattActions.ACTION_GATT_SERVICES_DISCOVERED); } else { Log.w(DSERVICE_TAG, "onServicesDiscovered received: " + status); } } @Override public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { Log.d("TestCharacter", "onCharacteristicRead character " + characteristic.getUuid()); broadcastUpdate(GattActions.ACTION_DATA_AVAILABLE, characteristic); broadcastUpdate(GattActions.EXTRA_DATA, characteristic); filterCharacteristicOfDevices(gatt, characteristic); } } @Override public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { //super.onCharacteristicWrite(gatt, characteristic, status); if (status != BluetoothGatt.GATT_SUCCESS) { try { Thread.sleep(100); } catch (InterruptedException e) { } writeCharacteristic(characteristic, gatt); } } 

Both read and readRss () characteristics

  public void readCharacteristic(BluetoothGattCharacteristic characteristic) { if (mBluetoothAdapter == null || mBluetoothGatt == null) { Log.w(DSERVICE_TAG, "BluetoothAdapter not initialized"); return; } mBluetoothGatt.readCharacteristic(characteristic); try { Thread.sleep(100); } catch (InterruptedException e) { } } public void readRssi() { if (mBluetoothAdapter == null || mBluetoothGatt == null) { Log.w(DSERVICE_TAG, "BluetoothAdapter not initialized"); return; } mBluetoothGatt.readRemoteRssi(); new Handler().postDelayed(readRssi, 200); } private Runnable readRssi = new Runnable() { @Override public void run() { //read remote rssi every second for (Map.Entry<String, BluetoothGatt> entryGatt : myApplication.deviceGattMap.entrySet()) { String deviceAddress = entryGatt.getKey(); BluetoothGatt bluetothGatt = entryGatt.getValue(); bluetothGatt.readRemoteRssi(); //delay for reading rssi try { Thread.sleep(200); } catch (InterruptedException e) { } } } }; 

and connect method, where I add a GATT object to the HashMap for each light: -

 public boolean connect(final String address) { if (mBluetoothAdapter == null || address == null) { Log.w(DSERVICE_TAG, "BluetoothAdapter not initialized or unspecified address."); return false; } // Previously connected device. Try to reconnect. if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress) && mBluetoothGatt != null) { Log.d(DSERVICE_TAG, "Trying to use an existing mBluetoothGatt for connection."); if (mBluetoothGatt.connect()) { return true; } else { return false; } } final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); if (device == null) { Log.w(DSERVICE_TAG, "Device not found. Unable to connect."); return false; } // We want to directly connect to the device, so we are setting the // autoConnect // parameter to false. mBluetoothGatt = device.connectGatt(this, false, mGattCallback); Log.d(DSERVICE_TAG, "Trying to create a new connection."); mBluetoothDeviceAddress = address; //Arun //delay for reading rssi try { Thread.sleep(100); } catch (InterruptedException e) { } //map of gatt myApplication.deviceGattMap.put(mBluetoothDeviceAddress, mBluetoothGatt); try { Thread.sleep(50); } catch (InterruptedException e) { } Log.d(DSERVICE_TAG, "GATTMAP SIZE=="+ myApplication.deviceGattMap.size()+"---"+myApplication.deviceGattMap.get(mBluetoothDeviceAddress)); return true; } 
+4
source share
2 answers

You will process each BLE device by creating each Bluetooth GattCallback for each of them. for example, for example:

 private final BluetoothGattCallback oneGattcallback = new BluetoothGattCallback() ... 

private final BluetoothGattCallback twoGattcallback = new BluetoothGattCallback() ...

then try connecting mBluetoothGattA = deviceA.connectGatt(this, false, oneGattcallback ); and mBluetoothGattB = deviceB.connectGatt(this, false, twoGattcallback ); similar. You will find many examples handling a single join, and just design more for a multiple join. Also, check out this video https://www.youtube.com/watch?v=qx55Sa8UZAQ , show that the maximum number of simultaneous GATT connections is: (4) Android 4.5 and (7) Android 4.4 +

0
source

I read earlier that Bluetooth 4 can support up to seven devices.

You might want to use a library, for example:

http://arissa34.imtqy.com/Android-Multi-Bluetooth-Library/

Hope this helps.

-one
source

All Articles