Проблемы с подключением к Marshmallow BLE для Android 6.0
Я испытываю серьезные проблемы с Android 6.0 и некоторыми устройствами с Bluetooth Low Energy. Одно из этих конфликтных устройств - это следующее:
DEVICE INFO:
Name: Samsung Galaxy SV
Model number: SM-G900V
Android vers: 6.0.1
Patch level: May 1, 2016
Hard. vers: G900V.05
Если я сделаю некоторый стресс-тест, основанный на подключении и отключении приложения к периферии BLE, коэффициент успеха едва достигает 50%.
Прочитав последнюю документацию Android, они рекомендуют указать режим транспорта в последнем параметре connectGatt, чтобы обеспечить перенос BLE вместо BR/EDR:
device.connectGatt(this, false, mGattCallback, BluetoothDevice.TRANSPORT_LE);
Ничто не изменилось с этим улучшением.
Следуя некоторым рекомендациям, а также прочитав о проблемах с подключением BLE, я обнаружил несколько связанных с ним проблем с Samsung Galaxy S6 и в один из них, они предложили ряд шагов для устранения проблем с подключением BLE. Ключевым является очистить данные о приложении Bluetooth Share. Таким образом, коэффициент связности увеличился почти на 100% успеха сразу. Однако, если вы ждете и играете с некоторыми другими приложениями BLE и подключаетесь к другим периферийным устройствам, проблема рано или поздно вернется.
В Google Play есть некоторые приложения, которые пытаются исправить эти проблемы BLE и что они в основном делают:
/system/bin/rm -r /data/misc/bluetoothd/*
/system/bin/rm -r /data/misc/hcid/*
Хотя это способ очистить кэш Bluetooth, он требует, чтобы устройство было внедрено, что не является разумным решением для профессиональных приложений.
Ни один из частных API Android, который я исследовал, не помог мне решить эту проблему, и единственное, что я нашел, это принудительное очищение кэша обнаружения сервисов, которое не имеет ничего общего с сделайте это.
Используя пакетный сниффер BLE, я вижу, что ADV_CONNECT_REQ
даже не отправляется с устройства на периферию, и через некоторое время пакет Android запускает событие STATE_DISCONNECTED
в BluetoothGattCallback
.
Я точно не знаю, почему эта проблема возникает в некоторых устройствах 6.0, а не в других, поскольку проблема с кэшем Bluetooth Share. Что там точно хранится? Только ранее подключенные/сопряженные устройства? Я единственный, кто испытывает эту проблему? Если нет, как вы, ребята, решаете это? Мне бы не хотелось наставлять конечных пользователей о том, как очистить данные приложения Bluetooth Share.
Ответы
Ответ 1
Существует скрытый метод, называемый "removeBond". Иногда устройства с разъемами не могут быть отключены четко, в этом случае вам нужно вызвать удаление связи.
Коды из здесь
//remove authrization
Method method = null;
try {
method = gatt.getDevice().getClass().getMethod("removeBond", (Class[]) null);
method.invoke(gatt.getDevice(), (Object[]) null);
} catch (Exception e) {
e.printStackTrace();
}
gatt.disconnect();
Кроме того, вы можете обновлять службы gatt с помощью скрытого метода "Обновить". Первоначально метод обновления предназначен для служб обновления gatt, но в некоторых случаях нежелательного отключения вам может понадобиться обновить, чтобы правильно подключить службу gatt.
Как программно заставить обнаружение услуг с низким энергопотреблением Bluetooth на Android без использования кеша