如何通过HCI检查BLE广播是否已启用以实现安全错误处理?
如何安全检查BLE广播是否已启用?
做BLE开发的朋友肯定对HCI_LE_Set_Advertising_Enable命令不陌生——用它就能启用BLE广播,但这里面的坑还真不少:
- 命令执行成功会返回状态码
0x00,失败则返回0x01到0xFF之间的状态码 - 如果广播本来就处于启用状态,你再调用这个命令且把
Advertising_Enable参数设为0x01,或者去调用HCI_LE_Set_Advertising_Data,都会得到0x0C(命令不允许)的返回码
而且这还带来两个实际问题:
- 重复启用广播可能会导致随机地址变更
- 重复禁用广播则完全没效果,白忙活一场
更头疼的是BlueZ协议栈的处理逻辑:多数HCI库函数末尾都加了这么一段代码:
if (status) { errno = EIO; return -1; }
这就导致像hci_le_set_advertise_enable这类函数出错时只会返回通用错误码-1,还把errno设成EIO——你根本分不清这到底是BlueZ自己的问题、HCI层的错误,还是真的UART IO出问题了。
我把蓝牙核心规范翻了个遍,也没找到专门“获取广播状态”的命令,而且总不能依赖这种自欺欺人的逻辑吧:
if ((rc == -1) && (errno == EIO)) { /* 强行当成广播已启用的正常情况 */ return 0; }
所以想请教各位:到底该怎么检查BLE广播是否已启用,才能实现安全、严格的错误处理?
参考文献
- [1] BT CS 5.2 [Vol 4] Part E, Section 7.8.9
- [2] BT CS 5.2 [Vol 1] Part F, Controller Error Codes
内容的提问来源于stack exchange,提问作者Bojan P.
相关产品推荐
相关产品推荐

