Мы работаем над пользовательским периферийным гаджетом BLE и пишем приложение для Android для взаимодействия с ним. Мы обнаружили режим сбоя, который мы никак не можем понять.
Периферийное устройство имеет ряд характеристик, некоторые из них помечены как PROPERTY_INDICATE
.
Обычно приложение прекрасно работает. В частности, когда мы выдаем gatt.disconnect()
, а затем gatt.close()
, устройство распознает отключение и возвращается в рекламный режим.
Существует режим, в который периферийное устройство может войти, хотя оно транслирует изменения на 2 характеристики с PROPERTY_INDICATE каждую секунду. Когда периферийное устройство находится в этом режиме, и мы отключаемся, устройство никогда не получает отключение. Каким-то образом устройство Android (Samsung Tab2 или Samsung S9) остается подключенным. Мы знаем, что он подключен, потому что до тех пор, пока мы не отключим контроллер, устройство не обнаружит разъединение. НО, если вы запрашиваете BluetoothManager.getConnectedDevices (), он показывает 0.
Мы сделали несколько итераций, чтобы попытаться триангулировать причину:
- Уменьшить количество признаков -> НЕТ ИЗМЕНЕНИЯ
- Уменьшить частоту обновления каждые 2 секунды -> УСПЕХ
- Измените одну из характеристик, чтобы использовать NOTIFY -> УСПЕХ
- Чередуйте изменения так, чтобы мы изменили оба, но на 0,5 секунды не в фазе друг с другом, чтобы они не были в одно и то же время -> NO CHANGE
Кто-нибудь может подсказать, в чем может быть проблема? Или как приблизиться к происходящему?
Быстрое решение для нас - третье изменение. Для этого сценария NOTIFY vs INDICATE это не так важно. Но меня беспокоит необходимость такого рода изменений, не понимая почему.
У нас есть вариант приложения для iOS, который не имеет ни одной из этих проблем. Соединение с iOS работает нормально (это означает, что оно отключается правильно) с двумя указаниями, происходящими каждую секунду.