目录
3.1. 广播数据长度(Advertising_Data_Length)
HCI_LE_Set_Advertising_Data(0x0008)
是蓝牙低功耗(BLE)核心规范中定义的一个HCI(Host Controller Interface)命令,用于设置设备的广播数据。这个命令允许主机(Host)配置BLE控制器(Controller)在广播过程中发送的广播数据。
一、命令概述
BLUETOOTH CORE SPECIFICATION Version 5.4 | Vol 4, Part E page 2355
1.1. 命令功能
HCI_LE_Set_Advertising_Data命令允许主机(Host)为BLE设备配置广播数据。这些数据将被BLE控制器(Controller)用于广播,以便其他BLE设备可以发现和识别该设备。广播数据可以包含设备的名称、服务UUID、制造商特定数据等信息。
1.2. 数据内容
- 广播数据内容:广播数据包含在广播包的数据字段中,并且只有重要的部分应该被传输。这些重要部分根据蓝牙核心规范的[Vol 3] Part C, Section 11进行定义。
- 数据长度:广播数据的长度是可变的,但通常受到BLE广播包最大长度的限制(一般为31字节)。如果广播数据长度超过这个限制,BLE控制器可能会忽略超出部分或返回错误。
- 默认数据:如果未设置广播数据,则默认的广播数据长度应为零,且广播数据应为31个零八位字节(即全零数据)。
1.3. 命令执行
当执行HCI_LE_Set_Advertising_Data
命令时,BLE控制器的行为取决于当前的广播状态。
1.3.1. 广播当前已启用
- 控制器行为:如果广播当前已启用,并且广播事件正在进行中,控制器可能会选择在该事件中使用旧数据或新数据。这取决于控制器的具体实现和内部状态机。一些控制器可能会在完成当前广播事件后,在下一个广播事件中开始使用新的广播数据。
- 注意事项:由于存在这种不确定性,如果应用对广播数据的即时性有严格要求,可能需要通过其他机制(如定期发送广播数据更新命令)来确保广播信息的准确性。
1.3.2. 广播事件正在进行中但广播已请求禁用
- 控制器行为:如果广播事件正在进行中,但已经通过其他命令(如
HCI_LE_Set_Advertising_Enable
设置为0)请求禁用广播,控制器应尽可能快地停止广播事件。一旦广播被禁用,控制器不会为新的广播事件使用新的广播数据。 - 数据保存:然而,控制器应保存新提供的广播数据,以便在将来重新启用广播时使用。
1.3.3. 广播当前已禁用
- 控制器行为:如果广播当前已禁用,控制器应简单地保存新提供的广播数据。一旦广播被重新启用(通过
HCI_LE_Set_Advertising_Enable
设置为1),控制器应开始使用这些新保存的广播数据。 - 数据更新:通过发送新的
HCI_LE_Set_Advertising_Data
命令,可以随时更新保存的广播数据。这允许设备根据需要动态地改变其广播信息。
1.3.4. 数据更新流程
- 发送更新命令:当需要更新广播数据时,应用层通过HCI接口发送新的
HCI_LE_Set_Advertising_Data
命令。 - 控制器处理:控制器接收命令,验证数据的格式和内容,然后保存新数据(如果广播已禁用)或准备在下一个广播事件中使用新数据(如果广播已启用)。
- 广播启用:如果广播当前已禁用,应用层可以通过发送
HCI_LE_Set_Advertising_Enable
命令(设置为1)来启用广播。一旦广播被启用,控制器将开始使用新保存的广播数据。
1.3.5. 注意事项
- 数据格式:在发送
HCI_LE_Set_Advertising_Data
命令之前,应用层需要确保提供的广播数据符合BLE规范的要求。 - 命令响应:控制器应通过HCI_Command_Complete事件响应命令的完成情况。应用层需要接收并解析这个事件来确认命令是否成功执行。
- 状态同步:由于广播数据的更新和广播的启用/禁用可能涉及多个命令和状态变化,应用层需要确保这些操作之间的同步和一致性。
- 错误处理:如果命令执行失败,应用层需要根据错误代码进行相应的错误处理,并可能需要重试命令或采取其他恢复措施。
二、命令格式
HCI_LE_Set_Advertising_Data命令允许主机(Host)为BLE设备配置广播数据。这些数据将被BLE控制器(Controller)用于广播,以便其他BLE设备可以发现和识别该设备。广播数据可以包含设备的名称、服务UUID、制造商特定数据等信息。
2.1. 一般格式
HCI_LE_Set_Advertising_Data命令的格式通常包括以下几个部分:
- 组域(OGF, Opcode Group Field):对于BLE相关的命令,OGF通常为0x08,表示该命令属于LE(低功耗)控制器命令组。
- 命令域(OCF, Opcode Command Field):对于HCI_LE_Set_Advertising_Data命令,OCF为0x0008。因此,完整的操作码是这两个字段的组合,即0x08|0x0008(在某些文档或上下文中,可能会看到合并为一个16位值的结果,如0x0058,这是将OGF左移10位后与OCF进行或运算的结果)。
- 参数长度(Parameter Length):这是一个无符号8位整数(uint8_t),表示后续参数的总长度(以字节为单位)。对于HCI_LE_Set_Advertising_Data命令,这个长度是可变的,它取决于广播数据的实际长度加上广播数据长度的字段本身(1字节)。
- 广播数据长度(Advertising Data Length):表示广播数据的实际长度,通常是一个无符号8位整数。
- 广播数据(Advertising Data):这是要设置的广播数据本身,其长度和内容应符合BLE规范的要求。广播数据可以包含多个字段,每个字段都有一个类型和一个长度,以及相应的数据值。