BLE Device Bonding Удалить автоматически в Android

Мы делаем ниже процесс, чтобы сделать пару с устройством BLE.

Подключить() + DiscoverServices() + Сопряжение (Связывание).

Иногда ОС Android не вписалась в наше устройство BT странным образом, то есть:

  • без отправки широковещательного уведомления о том, что состояние связи изменилось
  • даже приложение настроек Bluetooth Bluetooth считает, что устройство все еще сопряжено
  • только перезагрузка bt (выключение и включение в приложении настроек) обновляет состояние и показывает, что устройство больше не спаривается

Когда устройство успешно соединено, ACTION_BOND_STATE изменяется, как показано ниже.

[6:19:28 PM] Himen Patel: 04-09 18: 18: 27.325: D/BluetoothGatt (8380): onCharacteristicWrite() - Устройство = C2: 69: E9: 57: 93: A4 UUID = 860b2c07 -e3c5-11e2-a28f-0800200c9a66 Статус = 5 04-09 18: 18: 27.365: E/millisUntilFinished (8380): millisUntilFinished = 15 04-09 18: 18: 28.105: E/BelwithDeviceActor (8380): Состояние связи изменено для: C2: 69: E9: 57: 93: A4 новое состояние: 11 previous: 10

04-09 18: 18: 28.105: E/millisUntilFinished (8380): millisUntilFinished = 20 04-09 18: 18: 29.135: E/millisUntilFinished (8380): millisUntilFinished = 18 04-09 18: 18: 30.135: E/millisUntilFinished (8380): millisUntilFinished = 17 04-09 18: 18: 31.145: E/millisUntilFinished (8380): millisUntilFinished = 16 04-09 18: 18: 32.145: E/millisUntilFinished (8380): millisUntilFinished = 15

04-09 18: 18: 33.105: D/BluetoothGatt (8380): onCharacteristicWrite() - Устройство = C2: 69: E9: 57: 93: A4 UUID = 032a0000-0000-0000-0000-000000000000 Состояние = 137 04-09 18: 18: 33.115: E/BelwithDeviceActor (8380): Состояние облигаций изменено для: C2: 69: E9: 57: 93: A4 новое состояние: 12 предыдущее: 11

04-09 18: 18: 33.115: I/System.out(8380): unregisterReceiver true

Теперь, когда Pairing удаляется ОС по странному пути, ACTION_BOND_STATE изменяется, как показано ниже. , , , , Состояние связи изменено для: C2: 69: E9: 57: 93: новое состояние A4: 10.

мы также получаем немедленное событие act = android.bluetooth.device.action.ACL_DISCONNECTED flg = 0x4000010 в нашем APP.

что важно здесь, на данный момент мы просто потеряли связь с устройством, а защищенные характеристики больше не работают для нас. если мы перезагрузим bt с помощью приложения системных настроек или BluetoothAdapter:: disable() и enable(), мы увидим, что мы не спарены с устройством.

что смешно, без перезагрузки bt, приложение системных настроек все еще думает и показывает, что мы спарены с устройством.

протестирован с помощью 4-го уровня 4, работающего 4.4.2, nexus 5 с 4.4.2 и даже галактики Samsung s4 с 4.3.

наше ожидание таково:

  • в случае неработоспособности должна быть система вещания
  • Системные настройки приложения должны показывать текущий статус парирования даже без перезагрузки bt.

Мы также наблюдаем и получаем данные, которые были обнаружены, когда мы обнаружили, что наше шифрование установлено на 0x000000, когда наше соединение удаляется ОС по-настоящему.

Ответ 1

Я понятия не имею, нужна ли вам помощь или вы в конечном итоге решили свою проблему (вы знаете, поскольку вы отправили этот вопрос еще в апреле), но я хотел пойти дальше и опубликовать обходное решение, с которым я столкнулся, Я знаю, что у других людей есть эта проблема.

Используя Nexus 7, я провел в основном те же тесты, что и вы, и пришел к такому же выводу: Если планшет Android и удаленное устройство уже были связаны, существует высокая вероятность того, что вызов BluetoothGatt.discoverServices() будет отключать и отключать планшет от удаленного устройства. Но некоторые части ОС Android казались совершенно забытыми для несвязанных; хотя широковещательный приемник, который вы зарегистрировали для прослушивания изменений связи, был уведомлен о том, что связь между этими двумя устройствами была нарушена, остальная часть ОС Android считала, что облигация по-прежнему остается нетронутой. Поскольку ОС рассматривала планшет и удаленное устройство для соединения, планшет не мог записывать на любой из зашифрованных дескрипторов на удаленном устройстве, предоставляя статус записи 15 (GATT_INSUFFICIENT_ENCRYPTION) всякий раз, когда была предпринята попытка записи дескриптора.

Решение

Ключ к устранению неполадок Nexus и удаленного устройства до, у них есть шанс отключить себя этим странным способом. Что я делаю, это проверить, чтобы убедиться, что планшет и удаленное устройство связаны до того, как я начну сканирование с низкой энергией Bluetooth. Если они спарены, я удаляю связь, используя приведенную ниже функцию, а затем запускаю сканирование. Отказ от двух устройств программным образом гарантирует, что ОС Android знает, что они больше не связаны и, следовательно, пройдут обычный процесс склейки.

Ниже приведен код, чтобы проверить, не удалено ли удаленное устройство вместе с планшетами и не удастся ли он это сделать:

// Get the paired devices and put them in a Set
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();

// Loop through the Set of paired devices, checking to see
// if one of the devices is the device you need to unpair
// from. I use the device name, but I'm sure you can find
// another way to determine whether or not its your device
// -- if you need to. :)
for (BluetoothDevice bt : pairedDevices) {
        if (bt.getName().contains("String you know has to be in device name")) {
            unpairDevice(bt);
        }
}

// Function to unpair from passed in device
private void unpairDevice(BluetoothDevice device) {
    try {
        Method m = device.getClass().getMethod("removeBond", (Class[]) null);
        m.invoke(device, (Object[]) null);
    } catch (Exception e) { Log.e(TAG, e.getMessage()); }
}



Почему ожидание ошибки, а затем ее решение путем перезапуска Bluetooth - это плохая идея...

Как вы уже указывали в своем вопросе, перезапуск Bluetooth после того, как планшет и удаленное устройство таинственно не связаны друг с другом, вынуждают ОС Android осознать, что он больше не связан с удаленным девайсом. Это было первоначальное решение, которое я использовал, но вскоре стало ясно, что с этим "решением" были две серьезные проблемы:

  • Включение и выключение Bluetooth приведет к отключению всех устройств, подключенных к планшету.
  • Включение и выключение Bluetooth тратит лот.

Я бы только перезапустил Bluetooth как последнее средство. Например, если несвязанная ошибка все же чудесным образом произошла, единственным выбором будет перезапуск Bluetooth.