问题描述:

I am working on an Android BLE application.

Is there any procedure for connecting multiple BLE devices (creating multiple connections)at same time in Android. As In my app there are multiple BLE lights so first light is successfully gets connected, when I click to connect to second Second light also gets connected. but after some time second light automatically gets disconnected. I have to connected multiple lights maximum 8.

Here is what I am 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);

}

}

And reading characteristics and readRss()

 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 am adding GATT object to HashMap for every 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;

}

网友答案:

You are going to handle each BLE device by creating each BluetoothGattCallback for each one. for example like:

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

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

then try to connect mBluetoothGattA = deviceA.connectGatt(this, false, oneGattcallback ); and mBluetoothGattB = deviceB.connectGatt(this, false, twoGattcallback ); just like that. you will find a lot examples handle one connection and just develop more for multiple connection. Besides, checkout this video https://www.youtube.com/watch?v=qx55Sa8UZAQ show that max concurrent GATT connections is (4) Android 4.5 and (7) Android 4.4+

网友答案:

I read earlier that Bluetooth 4 can support upto seven devices.

You might want to use library like:

http://arissa34.github.io/Android-Multi-Bluetooth-Library/

Hope it helps.

相关阅读:
Top