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() {
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; }