Wie kann ich in Android Bluetooth Low Energy (BLE) mehrere Verbindungen gleichzeitig herstellen?Android

Forum für diejenigen, die für Android programmieren
Anonymous
 Wie kann ich in Android Bluetooth Low Energy (BLE) mehrere Verbindungen gleichzeitig herstellen?

Post by Anonymous »

Ich arbeite an einer Android BLE-Anwendung.

Gibt es in Android ein Verfahren zum gleichzeitigen Verbinden mehrerer BLE-Geräte (Erstellen mehrerer Verbindungen)? Da in meiner App mehrere BLE-Leuchten vorhanden sind, wird die erste Leuchte erfolgreich verbunden. Wenn ich auf „Verbindung mit der zweiten“ klicke, wird auch die zweite Leuchte verbunden. aber nach einiger Zeit wird das zweite Licht automatisch ausgeschaltet. Ich muss mehrere Lichter anschließen, maximal 8.

Hier ist, was ich mache

Code: Select all

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

}
Und Leseeigenschaften und readRss()

Code: Select all

 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  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)
{
}
}
}
};
und Verbindungsmethode, bei der ich für jedes Licht ein GATT-Objekt zu HashMap hinzufüge:-

Code: Select all

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;
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post