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

Android 6.0 Marshmallow BLE: параметры подключения

Управление параметрами подключения 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?

4b9b3361

Ответ 1

Сравнить метод connectionParameterUpdate() из GattService.java в AOSP 6.0.1_r17 vs AOSP 5.1.1_r14. В обоих случаях вызов идет до Buedroid в BTA_DmBleUpdateConnectionParams() в bta_dm_api.c с теми же параметрами.

6,0

    switch (connectionPriority)
    {
        case BluetoothGatt.CONNECTION_PRIORITY_HIGH:
            minInterval = 9; // 11.25ms
            maxInterval = 12; // 15ms
            break;

        case BluetoothGatt.CONNECTION_PRIORITY_LOW_POWER:
            minInterval = 80; // 100ms
            maxInterval = 100; // 125ms
            latency = 2;
            break;
    }

5,1

    switch (connectionPriority)
    {
        case BluetoothGatt.CONNECTION_PRIORITY_HIGH:
            minInterval = 6; // 7.5ms
            maxInterval = 8; // 10ms
            break;

        case BluetoothGatt.CONNECTION_PRIORITY_LOW_POWER:
            minInterval = 80; // 100ms
            maxInterval = 100; // 125ms
            latency = 2;
            break;
    }

Это может быть частью ответа на ваш вопрос. Хотя BLE позволяет снизить до 7,5 мс CI, я не могу предположить, почему уровень ссылки не переключается на более низкий CI по запросу периферийным. Я не знаю, контролирует ли какая-либо часть кода Android результат переговоров с периферийным устройством.

Ответ 2

Google не предоставил никакой документации о изменениях стека Bluetooth LE в отношении изменений параметров подключения, даже если в Android 6 явно есть.

Мой опыт работы с ним был таким же, как и ваш собственный, что в настоящее время самый быстрый интервал подключения в Android 6 + теперь составляет 11,25 м.

Мое образованное предположение о том, почему они не выпускают документацию, заключается в том, что многие производители помещают свои собственные BLE-стеки в свои телефоны (BLE на Samsung и HTC ведут себя иначе, чем у vanilla Android).

Еще одно замечание, которое я сделал, вызвало множество проблем, заключается в том, что Android 6+ изменит параметры подключения в 2-6 раз, прежде чем устанавливать требуемые параметры.

Я заметил, что после запроса интервала обновления параметра соединения от 800 мс до 1100 мс, я увидел, что начальный интервал вернулся на 7.5 мс, а затем перескочил до 48.75 мс, а затем прыгнул на запрошенный 1098.75 мс. Затем я подписался на уведомления в одной из моих служб, а интервал подключения снова отскочил назад до 7,5 мс, а затем вернулся к 1098,75 мс. После этого он стабилизировался на уровне 1098,75 мс в течение всего времени соединения.

Эти тесты выполнялись на Nexus 6 с Android 6.0.1

Очевидно, что некоторые некоторые странные вещи происходят в стеке Android 6 BLE.

Ответ 3

Ребята из Google допустили ошибку в одном из последних коммитов в Bluedroid, указав BTM_BLE_CONN_INT_MIN_LIMIT как 0x0009, который дает вам 1.25ms x 9 = 11.25ms. Чтобы соответствовать стандарту, он должен быть определен как 0x0006.

Ответ 4

11.25 ms - новый минимальный интервал соединения. Причина, по которой они не позволяют использовать 7,5 мс, заключается в том, что если вы передаете аудио через Bluetooth в то же время, звук может стать нестабильным.