Поддерживает ли Android 4.3 несколько подключений устройств BLE?
В настоящее время я работаю на Android 4.3 Bluetooth Low Energy, я могу подключиться к устройству, получить службы, службы чтения / записи. Теперь, когда я пытаюсь подключиться ко второму устройству, сервисы второго устройства принимаются, а сервисы первого устройства теряются. Теперь, когда я пытаюсь подключиться для записи / чтения характеристики первого устройства, ничего не работает.
Кто-нибудь пытался подключиться к нескольким устройствам. Как вы инициализируете Gatt для двух устройств?
3 ответа
Это должно работать для всех, если вы реализуете разные BluetoothGatt
экземпляр и разные GattCallback
для каждого устройства, которое вы хотите подключить...
Я думаю, что SAMSUNG BLE API и Google API имеют стек Broadcom Ble и стек Broadcom, которые в настоящее время не поддерживаются несколькими устройствами.
У меня было точно такое же поведение в стеке Samsung BLE (galaxy S4). Я взломал код Samsung и исправил его:
Класс BluetoothGatt хранит список "всех" обнаруженных сервисов. Вызов BluetoothGatt-> DiscoverServices очистит этот список. Я управлял своим собственным классом и изменил поведение функции, чтобы удалить только службы соответствующего BluetoothDevice. Это мой код:
public class MyBluetoothGatt extends BluetoothGatt {
MyBluetoothGatt(Context paramContext, BluetoothProfile.ServiceListener paramServiceListener)
{
super(paramContext, paramServiceListener);
}
public final boolean discoverServices(BluetoothDevice paramBluetoothDevice)
{
if (paramBluetoothDevice == null)
{
Log.e("BtGatt.BluetoothGatt", "discoverServices() - device is null ");
return false;
}
Log.d("BtGatt.BluetoothGatt", "discoverServices() - device: " + paramBluetoothDevice.getAddress());
if ((d == null) || (this.f == 0))
return false;
// old code this.h.clear();
//--new code
@SuppressWarnings("rawtypes")
Iterator localIterator = this.h.iterator();
while (localIterator.hasNext())
{
BluetoothGattService localBluetoothGattService;
localBluetoothGattService = (BluetoothGattService)localIterator.next();
if (localBluetoothGattService.a().equals(paramBluetoothDevice))
{
this.h.remove(paramBluetoothDevice);
}
}
//end new code
this.d.discoverServices(this.f, paramBluetoothDevice.getAddress());
return true;
}
}
мне также пришлось использовать редактор классов, чтобы удалить некоторые из "окончательных" модификаторов, чтобы иметь возможность извлекать свой собственный класс. Это был большой взлом, но теперь он работает прекрасно. Я обновлю свой S4 до android 4.3, как только выйдет официальный релиз, и перенесу мой код, так что скрестив пальцы, это будет работать и для android 4.3.