Подтвердить что ты не робот

Проблемы с подключением к 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.

4b9b3361

Ответ 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 без использования кеша