2

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命令将返回 status 0x0C (Command Disallowed)

这有(至少)两个问题:

  • 在已经启用的情况下启用广告可能会导致随机地址发生变化。禁用已禁用的广告无效。[1]

  • BlueZ 堆栈在大多数 HCI 库函数的末尾包含以下代码:
        if (status) {
            errno = EIO;
            return -1;
        }
    
    这会导致例如hci_le_set_advertise_enable函数返回通用失败代码-1并设置errnoEIO,这与任何其他 BlueZ 错误、HCI 错误或实际 IO 错误(HCI 层使用 UART)无法区分。

如何检查 LE 广告是否已经启用以能够执行安全/严格的错误处理?我在 BT Core Specs 中找不到任何获取广告状态的命令。我不能依赖类似的东西

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 部分,控制器错误代码
4

1 回答 1

1

这个想法是主机端的蓝牙堆栈应该知道它是否已经开始做广告。这就是它应该如何工作的方式。如果您手动绕过主机端的蓝牙堆栈(除非您正在调试或其他东西,否则您不应该这样做),发送您自己的 hci 命令,那么您将无法知道。

于 2020-01-31T23:54:37.460 回答