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
    设置为
    EIO
    ,这与任何其他BlueZ错误、hci错误或实际IO错误(hci层使用UART)无法区分
如何检查LE播发是否已启用,以便能够执行安全/严格的错误处理?我在BT核心规范中找不到任何获取广告状态的命令。我不能依赖这样的东西

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)
      如果广告已禁用,也会以同样的方式失败。