Как проверить, включена ли реклама BLE (HCI) - PullRequest
0 голосов
/ 30 января 2020

BLE-реклама может быть включена с помощью команды HCI_LE_Set_Advertising_Enable [1], которая возвращает статус 0x00, если HCI_LE_Set_Advertising_Enable, команда успешно или код состояния 0x01 to 0xFF [2], если команда не выполнена.

Если объявление уже включено (например, вызов этой команды во второй раз с параметром Advertising_Enable, установленным на 0x01), то эта или HCI_LE_Set_Advertising_Data команды вернут статус 0x0C (Command Disallowed).

Есть (по крайней мере) две проблемы с этим:

  • Включение рекламы, когда она уже включена, может привести к изменению случайного адреса. Отключение рекламы, когда она уже отключена, не имеет никакого эффекта. [1]

  • Стек BlueZ содержит следующий фрагмент кода в конце большинства функций библиотеки HCI:
        if (status) {
            errno = EIO;
            return -1;
        }
    
    , что вызывает, например, функцию hci_le_set_advertise_enable, возвращающую обобщенный c код ошибки -1 и установите errno на EIO, который неотличим от любой другой ошибки BlueZ, ошибки HCI или фактической ошибки ввода-вывода (уровень HCI использует UART).

Как проверить, если LE реклама уже включена, чтобы иметь возможность выполнять безопасную / строгую обработку ошибок? Я не могу найти команду для Получить рекламный статус в Базовых спецификациях BT. Я не могу положиться на что-то вроде

if ((rc == -1) && (errno == EIO)) {
    /* Actually OK, advertising is already enabled */
    return 0;
}

Спасибо.

Ссылки:

  • [1] BT CS 5.2 [Том 4 ] Часть E, раздел 7.8.9
  • [2] BT CS 5.2 [Vol 1] Часть F, Коды ошибок контроллера

1 Ответ

0 голосов
/ 01 февраля 2020

Идея состоит в том, что стек Bluetooth на стороне хоста должен знать, начал ли он рекламу или нет. Вот как это должно работать. Если вы вручную обойдете стек Bluetooth на стороне хоста (что не следует делать, если вы не отлаживаете что-либо), отправив собственную команду hci, вы не сможете знать.

...