Управление параметрами подключения Bluetooth Low Energy, похоже, изменилось на Android 6.
У меня есть периферийное устройство BLE, которому необходимо использовать определенные параметры соединения (в частности, интервал подключения), и я хочу использовать минимальный интервал соединения, разрешенный спецификацией BLE (т.е. 7,5 мс).
Android SDK не позволяет выбрать его со стороны BLE GAP Central (смартфон), поэтому правильный способ сделать это, чтобы мое периферийное устройство GAP отправило L2CAP Connection Parameter Update Request
после подключения GAP.
Параметры, которые я запрашиваю:
- интервал связи мин: 7,5 мс
- интервал связи max: 7,5 мс
- латентность slave: 0
- тайм-аут контроля: 2000 мс
Это работало так, как ожидалось, на всех Android-устройствах, которые я тестировал, начиная с 4.3 до 5.x: после отправки L2CAP Connection Parameter Update Request
мое устройство получает L2CAP Connection Parameter Update Response
с 0x0000 (принято), а затем LE Connection Update Complete event
где я вижу, что запрошенные параметры подключения хорошо учтены.
Теперь, имея планшет Nexus 9 или 2 разных устройства Nexus 5, все из которых имеют Android 6.0.1, я вижу, что L2CAP Connection Parameter Update Request
всегда отклоняется (я получаю L2CAP Connection Parameter Update Response
с 0x0001 (отклонено)), Затем я получаю LE Connection Update Complete event
, где я вижу, что запрошенные параметры подключения НЕ были приняты во внимание.
Я пробовал это с двумя различными реализациями на периферийной стороне (один с BlueNRG от ST Microelectronics, один с Nordic Semiconductor nRF52), оба с точно таким же результатом.
Затем, после большего тестирования: я пробовал разные наборы параметров, меняя интервал связи max (я сохранил другие параметры одинаково). Вот что я нашел:
- с интервалом связи max = 18,75 мс, запрос обновления был принят с интервалом, установленным на 18,75 мс
- с интервалом связи max = 17,50 мс, запрос обновления был принят с интервалом, установленным на 15,00 мс
- с интервалом связи max = 15,00 мс, запрос обновления был принят с интервалом, установленным на 15,00 мс
- с интервалом связи max = 13,75 мс, запрос обновления был принят с интервалом, установленным в 11,25 мс
- с интервалом связи max = 11,25 мс, запрос обновления был принят с интервалом, установленным на 11,25 м.
- с любым другим максимальным значением интервала контактов ниже 11,25 мс, я отклоняюсь.
Таким образом, наблюдение заключается в том, что что-то явно изменилось с учетом того, как стек Android 6 BLE обрабатывает параметры соединения. Но для подтверждения этого не существует никакой информации или документации.
Мои наблюдения приводят к выводу, что минимальный допустимый интервал подключения составляет 11,25 мс (что действительно соответствует моим потребностям) вместо 7,5 мс в более ранних версиях Android. Но, найдя его эмпирически, я хочу быть уверенным, что у меня не хватает других ограничений/правил или если этот минимум не будет динамическим, в зависимости, например, от текущего уровня заряда батареи...
Было бы здорово иметь эквивалент Руководства Apple по дизайну Bluetooth (см. §3.6), чтобы четко определить, как LE Peripheral должен заниматься этой темой.
Кто-нибудь имеет такую же проблему или знает какую-то более полезную информацию от Google?