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
并设置errno
为EIO
,这与任何其他 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 部分,控制器错误代码