Периферийное устройство Android BLE отключается с кодом состояния BLE_HCI_INSTANT_PASSED (0x28)

Мое приложение может успешно подключиться к периферийному устройству BLE (которое является устройством OBDII / J1939).

2018-01-24 14:58:38,413 INFO  LogUtil -     GATT Server Status = (0) : BLE_HCI_STATUS_CODE_SUCCESS(0x00)
2018-01-24 14:58:38,414 INFO  LogUtil -     GATT Server New State = (2) : STATE_CONNECTED
2018-01-24 14:58:38,414 INFO  LogUtil - Connected to GATT server.

Приложение начало связь с устройством, но через некоторое время оно получило сообщение об отключении сервера GATT в onConnectionStateChange в реализации обратного вызова BluetoothGattCallback. Ниже представлены логи из приложения:

2018-01-24 15:07:46,396 INFO  LogUtil -     GATT Server Status = (40) : BLE_HCI_INSTANT_PASSED(0x28)
2018-01-24 15:07:46,397 INFO  LogUtil -     GATT Server New State = (0) : STATE_DISCONNECTED
2018-01-24 15:07:46,398 INFO  LogUtil - Disconnected from GATT server.

Не удалось найти причину BLE_HCI_INSTANT_PASSED кода состояния.

Любая помощь по этому поводу будет полезна.


person Ravi Sharma    schedule 25.01.2018    source источник
comment
Это происходит постоянно или только один раз? Если вы прочитали спецификацию канального уровня в спецификации Bluetooth Core, вы увидите, что они могут происходить во время обновлений параметров соединения и обновлений карты каналов, если соединение нестабильно.   -  person Emil    schedule 26.01.2018
comment
@ Эмиль Нет, это происходит не все время. Иногда соединение нестабильно. Соединение разрывается с кодом ошибки HCI, например BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT. Мы не меняем параметры подключения после того, как подключение установлено.   -  person Ravi Sharma    schedule 29.01.2018
comment
Я думаю, что лучший способ отладить это - использовать анализатор воздуха. Затем вы видите каждый пакет и почему он не работает.   -  person Emil    schedule 29.01.2018


Ответы (1)


Когда данные передаются через BLE, передача данных может начинаться только в моменты синхронизации, известные как «события соединения». На канальном уровне BLE есть несколько специальных запросов, которые могут быть выполнены относительно этих точек синхронизации. Они есть:

  • LL_CHANNEL_MAP_REQ - запрос на изменение передаваемых каналов BLE. Микросхемы Bluetooth изменят карту каналов в зависимости от шума в окружающей среде, чтобы попытаться ограничить отбрасывание пакетов.
  • LL_CONNECTION_UPDATE_REQ - запрос на изменение частоты «событий подключения» (известный как «интервал подключения»). Это сделано для повышения пропускной способности / задержки или экономии энергии.

Каждый из этих запросов канального уровня при передаче по воздуху содержит «Мгновенное» изменение. «Мгновенное» - это «событие подключения» в будущем, чтобы применить изменение.

На канальном уровне BLE надежен. Это означает, что каждый пакет канального уровня должен быть подтвержден другой стороной. В шумной радиочастотной среде пакет канального уровня может потребовать нескольких повторных попыток для фактической отправки. Это означает, что пакет может прибыть на много "событий соединения" после того, как первоначально предполагалось.

Если один из пакетов, упомянутых выше, получен после «Мгновенного», изменения должны были быть применены, по определению чип BLE должен отключиться по причине 0x28 (Мгновенно пройден)

Дополнительные сведения по теме см. В спецификации ядра Bluetooth, доступной на веб-сайте Bluetooth SIG. хорошая ссылка:

person chrisc11    schedule 27.01.2018