如何检查 BLE 广告是否已启用 (HCI)
How to check if BLE advertisement is already enabled (HCI)
可以使用 HCI_LE_Set_Advertising_Enable
[1] 命令启用 BLE 广告,如果 HCI_LE_Set_Advertising_Enable 命令成功 return 状态 0x00
或状态代码 0x01 to 0xFF
[2] 如果命令失败。
如果广告已经启用(例如第二次调用此命令时将 Advertising_Enable
参数设置为 0x01
),则此或 HCI_LE_Set_Advertising_Data
命令将 return状态 0x0C (Command Disallowed)
.
这有(至少)两个问题:
Enabling advertising when it is already enabled can cause the random
address to change. Disabling advertising when it is already disabled
has no effect. [1]
- BlueZ 堆栈在大多数 HCI 库函数的末尾包含以下代码:
if (status) {
errno = EIO;
return -1;
}
这导致例如hci_le_set_advertise_enable
函数到 return 通用故障代码 -1
并将 errno
设置为 EIO
,这与任何其他 BlueZ 错误、HCI 错误或实际 IO 错误没有区别(HCI 层使用 UART)。
如何检查 LE 广告是否已启用,以便能够执行 safe/strict 错误处理?我在 BT 核心规范中找不到 Get Advertising Status 的任何命令。我不能依赖
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 [第 1 卷] F 部分,控制器错误代码
这个想法是主机端的蓝牙堆栈应该知道它是否已经开始广播。这就是它应该如何工作的。如果你手动绕过主机端的蓝牙堆栈(除非你正在调试或其他什么,否则你不应该这样做),发送你自己的 hci 命令,那么你就不知道了。
可以使用 HCI_LE_Set_Advertising_Enable
[1] 命令启用 BLE 广告,如果 HCI_LE_Set_Advertising_Enable 命令成功 return 状态 0x00
或状态代码 0x01 to 0xFF
[2] 如果命令失败。
如果广告已经启用(例如第二次调用此命令时将 Advertising_Enable
参数设置为 0x01
),则此或 HCI_LE_Set_Advertising_Data
命令将 return状态 0x0C (Command Disallowed)
.
这有(至少)两个问题:
Enabling advertising when it is already enabled can cause the random address to change. Disabling advertising when it is already disabled has no effect. [1]
- BlueZ 堆栈在大多数 HCI 库函数的末尾包含以下代码:
这导致例如if (status) { errno = EIO; return -1; }
hci_le_set_advertise_enable
函数到 return 通用故障代码-1
并将errno
设置为EIO
,这与任何其他 BlueZ 错误、HCI 错误或实际 IO 错误没有区别(HCI 层使用 UART)。
如何检查 LE 广告是否已启用,以便能够执行 safe/strict 错误处理?我在 BT 核心规范中找不到 Get Advertising Status 的任何命令。我不能依赖
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 [第 1 卷] F 部分,控制器错误代码
这个想法是主机端的蓝牙堆栈应该知道它是否已经开始广播。这就是它应该如何工作的。如果你手动绕过主机端的蓝牙堆栈(除非你正在调试或其他什么,否则你不应该这样做),发送你自己的 hci 命令,那么你就不知道了。