Bluetooth 如何检查BLE播发是否已启用(HCI)
可使用Bluetooth 如何检查BLE播发是否已启用(HCI),bluetooth,bluetooth-lowenergy,bluez,hci,btle,Bluetooth,Bluetooth Lowenergy,Bluez,Hci,Btle,可使用HCI\u LE\u Set\u advancing\u Enable[1]命令启用BLE广告,如果HCI\u LE\u Set\u advancing\u Enable命令成功,则返回状态0x00,如果命令失败,则返回状态代码0x01至0xFF[2] 如果已启用播发(例如,第二次调用此命令时,advancing\u Enable参数设置为0x01),则此命令或HCI\u LE\u set\u advancing\u Data命令将返回状态0x0C(不允许命令) 这(至少)有两个问题:
HCI\u LE\u Set\u advancing\u Enable
[1]命令启用BLE广告,如果HCI\u LE\u Set\u advancing\u Enable命令成功,则返回状态0x00
,如果命令失败,则返回状态代码0x01至0xFF
[2]
如果已启用播发(例如,第二次调用此命令时,advancing\u Enable
参数设置为0x01
),则此命令或HCI\u LE\u set\u advancing\u Data
命令将返回状态0x0C(不允许命令)
这(至少)有两个问题:
- 在广告已启用时启用广告可能会导致 要更改的地址。已禁用广告时禁用广告 没有效果。[1]
- BlueZ stack在大多数HCI库函数的末尾包含以下代码:
这导致例如,if(状态){ errno=EIO; 返回-1; }
函数返回通用故障代码hci\u le\u set\u advision\u enable
并将-1
设置为errno
,这与任何其他BlueZ错误、hci错误或实际IO错误(hci层使用UART)无法区分EIO
if((rc==1)和&(errno==EIO)){
/*实际上,广告已经启用了*/
返回0;
}
多谢各位
参考资料:
- [1] 5.2[第4卷]E部分,第7.8.9节
- [2] BT CS 5.2[Vol 1]F部分,控制器错误代码
- 这个想法是主机端的蓝牙协议栈应该知道它是否已经开始发布广告。这就是它的工作原理。如果您手动绕过主机端的蓝牙堆栈(除非您正在调试或做其他事情,否则不应该这样做),发送您自己的hci命令,那么您无法知道。总是停止和启动播发会导致相同的问题-
hci\LE\u Set\u advision\u Enable(false)
如果广告已禁用,也会以同样的方式失败。