目录
4.2. HCI_LE_Connection_Complete或HCI_LE_Enhanced_Connection_Complete事件
HCI_LE_Set_Advertising_Enable
是低功耗蓝牙(Bluetooth Low Energy, BLE)协议栈中的一个主机控制接口(Host Controller Interface, HCI)命令,用于启用或禁用蓝牙设备的广播功能。广播是BLE设备发现其他设备或广播自身存在的一种机制。
一、命令概述
HCI_LE_Set_Advertising_Enable 命令的主要功能是控制BLE设备的广播状态。当设备需要被发现或广播某些信息时,主机(Host)会通过发送此命令并设置相应的参数来启用广播。相反,当设备不再需要广播时,主机可以发送此命令并禁用广播功能。
BLUETOOTH CORE SPECIFICATION Version 5.4 | Vol 4, Part E page 2359
广播的具体行为(如广播间隔、广播类型等)由之前发送的HCI_LE_Set_Advertising_Parameters命令所设置的参数决定。这些参数定义了广播发送的频率、方式以及广播中包含的数据类型。HCI_LE_Set_Advertising_Parameters(0x0006)命令全面解析-CSDN博客
1.1. 命令参数
- Advertising_Enable: 这是一个单字节的参数,用于指示是否启用广播。
0x00
: 禁用广播。0x01
: 启用广播。
1.2. 广播停止条件
广播过程会在以下情况下停止:
- 主机请求: 主机发送另一个HCI_LE_Set_Advertising_Enable命令,并将Advertising_Enable参数设置为0x00。
- 连接建立: 通过广播过程成功建立了连接。
- 广播超时: 在高占空比定向广播(Directed Advertising)的情况下,由于广播占空比过高而导致广播超时。
在这些情况下,广播功能将被禁用,BLE设备将停止发送广播数据包。
1.3. 返回错误情况
HCI_LE_Set_Advertising_Enable
命令在执行时,根据Own_Address_Type
参数的设置以及设备地址的状态是否有效,蓝牙控制器可能返回错误的情况,以反馈配置错误或无效的广播操作。
- 当
Advertising_Enable
设置为0x01,且Own_Address_Type
设置为0x00(表示使用公共地址),但设备没有公共地址时:- 蓝牙控制器应返回错误代码
Invalid HCI Command Parameters
(0x12),因为设备没有有效的公共地址来用于广播。
- 蓝牙控制器应返回错误代码
- 当
Advertising_Enable
设置为0x01,且Own_Address_Type
设置为0x01(表示使用随机静态地址),但设备的随机地址尚未使用HCI_LE_Set_Random_Address
命令初始化时:- 蓝牙控制器同样应返回错误代码
Invalid HCI Command Parameters
(0x12),因为设备没有有效的随机静态地址来用于广播。
- 蓝牙控制器同样应返回错误代码
- 当
Advertising_Enable
设置为0x01,且Own_Address_Type
设置为0x02(表示使用私有可解析地址,且地址由控制器根据IRK生成),但控制器的解析列表中没有匹配的条目,且设备没有公共地址时:- 蓝牙控制器应返回错误代码
Invalid HCI Command Parameters
(0x12),因为控制器无法为设备生成有效的私有可解析地址。
- 蓝牙控制器应返回错误代码
- 当
Advertising_Enable
设置为0x01,且Own_Address_Type
设置为0x03(表示使用私有不可解析地址),但控制器的解析列表中没有匹配的条目,且设备的随机地址尚未使用HCI_LE_Set_Random_Address
命令初始化时:- 蓝牙控制器应返回错误代码
Invalid HCI Command Parameters
(0x12),因为设备没有有效的随机地址来用于广播,且控制器无法为其生成私有不可解析地址。
- 蓝牙控制器应返回错误代码
1.4. 额外说明
当执行HCI_LE_Set_Advertising_Enable命令时,BLE控制器的行为取决于当前的广播状态和提供的参数。例如,如果广播当前已启用,并且收到禁用广播的命令,则控制器应尽可能快地停止广播事件。相反,如果广播当前已禁用,并且收到启用广播的命令,则控制器应开始广播,并使用之前通过HCI_LE_Set_Advertising_Data等命令设置的广播数据。
-
重复启用广播:如果广播已经启用,并且再次发送
HCI_LE_Set_Advertising_Enable
命令(Advertising_Enable
设置为0x01)来启用广播,这可能会导致随机地址的更改(如果使用的是随机地址类型)。这是因为某些实现可能会在每次启用广播时生成一个新的随机地址,以增加隐私保护。 -
禁用已禁用的广播:如果广播已经被禁用,并且再次发送
HCI_LE_Set_Advertising_Enable
命令(Advertising_Enable
设置为0x00)来禁用广播,这通常不会有任何效果,因为广播已经是禁用状态。
二、命令格式
2.1. 一般格式
HCI_LE_Set_Advertising_Enable命令格式通常遵循蓝牙核心规范中定义的HCI命令结构。一般来说,HCI命令的格式包括以下几个部分:
- 组域(OGF, Opcode Group Field):对于BLE相关的命令,OGF通常为0x08,表示该命令属于LE(低功耗)控制器命令组。
- 命令域(OCF, Opcode Command Field):OCF用于标识具体的HCI命令。对于HCI_LE_Set_Advertising_Enable命令,其OCF是0x000A。
- 参数长度:表示后续参数的总长度(以字节为单位)。对于HCI_LE_Set_Advertising_Enable命令,由于参数通常只有一个字节(用于表示启用或禁用状态),因此参数长度通常为1。
- 参数(Parameters):
- Advertising_Enable:1字节
- 0x00:禁用广播
- 0x01:启用广播
- Advertising_Enable:1字节
- 校验和(可选):某些HCI实现可能会要求命令包含一个校验和字段,用于验证命令数据的完整性。然而,这并不是所有HCI实现都必需的。
需要注意的是,具体的命令格式可能会因蓝牙版本、设备制造商或HCI实现的不同而有所差异。因此,在实际应用中,建议参考特定设备或具体版本的蓝牙协议的官方文档来获取最准确的命令格式和参数信息。
2.2. 格式示例
以下是一个基于通用蓝牙API(如Bluetooth SIG定义的蓝牙核心规范)的HCI_LE_Set_Advertising_Enable命令格式示例:
假设我们想要启用广播功能,那么命令的二进制表示可能如下(以十六进制为例):
- 命令代码:0x08 0x000A(OGF和OCF的组合&#x