
HCI_LE_Set_Periodic_Advertising_Enable 是一个用于低功耗蓝牙(BLE)的HCI(Host Controller Interface)命令,用于启用或禁用周期性广播。这个命令是蓝牙核心规范5.1及更高版本中引入的,专门用于支持周期性广播功能,这是一种低功耗且高效的数据广播方式,适用于需要定期发送固定数据的场景,如环境传感器数据广播。
HCI_LE_Set_Periodic_Advertising_Enable 命令用于请求控制器启用或禁用由Advertising_Handle参数指定的广播集的周期性广播。请注意,此命令仅影响周期性广播,而不会影响普通广播(即可连接广播和可扫描广播)。

BLUETOOTH CORE SPECIFICATION Version 5.4 | Vol 4, Part E page 2479
HCI_LE_Set_Periodic_Advertising_Enable命令包含2个参数:Enable和Advertising_Handle。 并且还有一个返回值Status,这是一个8位无符号整数,用于表示命令执行的结果。0x00表示成功,其他值表示出现错误。
HCI_LE_Set_Extended_Advertising_Enable命令启用,否则周期性广播不会开始。HCI_LE_Set_Periodic_Advertising_Parameters命令中指定的参数持续进行周期性广播,直到收到HCI_LE_Set_Periodic_Advertising_Enable命令且Enable参数的位0设置为0(禁用周期性广播)。Advertising_Handle参数对应的广播集不存在,控制器将返回错误代码Unknown Advertising Identifier(0x42)。Enable参数的位0设置为1(启用周期性广播),但广播集包含部分周期性广播数据,控制器将返回错误代码Command Disallowed(0x0C)。Enable参数的位0设置为1,但主机未为广播集发出HCI_LE_Set_Periodic_Advertising_Parameters命令,控制器将使用供应商指定的参数或返回错误代码Command Disallowed(0x0C)。Packet Too Long(0x45)。Command Disallowed(0x0C)。Enable参数的位0设置为0(禁用周期性广播),并且控制器支持周期性广播ADI支持功能,则控制器将忽略Enable参数的位1。如果Enable参数的位1设置为1,但控制器不支持周期性广播ADI支持功能,控制器应返回错误代码Unsupported Feature or Parameter Value(0x11)。HCI_LE_Set_Periodic_Advertising_Parameters命令中提供的参数管理广播的时序。HCI_LE_Set_Periodic_Advertising_Enable命令格式HCI_LE_Set_Periodic_Advertising_Enable命令的格式通常遵循蓝牙核心规范中定义的HCI命令结构。

具体来说,它可能包含以下几个字段:
HCI_LE_Set_Periodic_Advertising_Enable命令,其操作码是固定的。HCI_LE_Set_Periodic_Advertising_Parameters)创建广播集时分配的。HCI_LE_Set_Periodic_Advertising_Enable命令来说,它通常不包含除上述字段之外的额外参数,因此这个字段可能不存在或始终为0。示例格式:以下是一个HCI_LE_Set_Periodic_Advertising_Enable命令的具体示例格式。请注意,这个格式是基于蓝牙核心规范的一般性描述,并且可能因不同的蓝牙芯片或设备实现而有所差异。因此,在实际应用中,应参考特定蓝牙设备的文档或规范来确定确切的命令格式。
HCI Command Packet:
- HCI_type: 0x01 (表示这是一个HCI命令包)
- Opcode: 0x4020 (这是HCI_LE_Set_Periodic_Advertising_Enable命令的操作码)
- Parameter Length: 0x02 (表示后续参数的长度为2字节)
- Parameters:
- Advertising_Handle: 0xXX (8位,表示要启用或禁用的周期性广播集的句柄)
- Enable: 0x01 (8位,0x01表示启用,0x00表示禁用)HCI_type: 1字节,用于标识这是一个HCI命令包。对于命令包,该字段的值通常为0x01。
HCI_LE_Set_Periodic_Advertising_Enable命令执行后,BLE控制器会返回一个命令完成事件(HCI Command Complete Event)来指示命令的执行结果。

以下是HCI_LE_Set_Periodic_Advertising_Enable命令返回命令完成事件的示例格式。
- Event Code: 0x0E (表示这是一个命令完成事件)
- Parameter Total Length: 0x04 (表示后续参数的总长度为4字节)
- Command Opcode: 0x4020 (这是之前发送的HCI_LE_Set_Periodic_Advertising_Enable命令的操作码)
- Return Parameters:
- Status: 0x00 (表示命令成功完成,无错误)
- (可选) Number of Completed Advertising Sets: 1字节(如果控制器支持多个广播集,并且需要返回每个广播集的启用状态,则此字段表示已完成操作的广播集数量。但在简单实现中,此字段可能不存在或始终为1)
- (可选) Result for Each Advertising Set: 对于每个广播集,可能有一个或多个结果字段,具体取决于实现。但在大多数情况下,对于`HCI_LE_Set_Periodic_Advertising_Enable`命令,只需要一个状态字段来表示是否成功启用或禁用了周期性广播。HCI_LE_Set_Periodic_Advertising_Enable命令,其操作码为0x4020(但请再次注意,这可能会因不同的蓝牙版本或实现而有所变化)。HCI_LE_Set_Periodic_Advertising_Enable命令,只需要一个状态字段来表示是否成功启用或禁用了周期性广播。如果控制器返回了每个广播集的启用状态,则这些状态将在此字段中列出。HCI_LE_Set_Periodic_Advertising_Enable命令中的enable参数用于控制周期性广播的启用或禁用状态。

enable参数设置为0x01(或布尔值true),表示启用周期性广播。这意味着BLE设备将按照之前通过其他HCI命令(如HCI_LE_Set_Periodic_Advertising_Parameters)设置的参数和数据开始发送周期性广播。enable参数设置为0x00(或布尔值false),表示禁用周期性广播。这意味着BLE设备将停止发送之前启用的周期性广播。enable参数的值,BLE设备可以灵活地控制周期性广播的发送。这对于节省能源、避免不必要的干扰以及满足特定的应用场景需求具有重要意义。Advertising_Handle用于标识一个广播集。在BLE技术中,广播集是指一组特定的广播参数和数据,它们共同定义了一个BLE设备如何发送广播。每个广播集都有一个唯一的句柄(即Advertising_Handle),用于在BLE控制器中区分不同的广播集。

在实际应用中,Advertising_Handle是由BLE控制器在创建广播集时分配的,并且在使用HCI_LE_Set_Periodic_Advertising_Enable命令时作为参数传入。
参数大小:1 octet,即该参数的大小为1个字节(8位)。
参数范围:0x00 to 0xEF(十六进制表示)。表示BLE控制器可以支持最多239(即0xEF+1)个不同的广播集(假设范围是从0开始计数的)。但请注意,实际支持的广播集数量可能因BLE控制器的具体实现和配置而异。
使用场景:Advertising_Handle参数在使用HCI_LE_Set_Periodic_Advertising_Enable命令时非常重要,因为它指定了要启用或禁用的周期性广播集的句柄。通过更改此参数的值,BLE设备可以灵活地控制不同的广播集,从而满足不同的应用场景需求。
当BLE控制器接收到HCI_LE_Set_Periodic_Advertising_Enable命令并成功执行后,会生成一个HCI_Command_Complete事件,以通知主机命令的执行结果。在HCI_Command_Complete事件中,status参数是一个非常重要的字段,它用于指示HCI_LE_Set_Periodic_Advertising_Enable命令的执行状态。

status = 0x00:表示命令成功完成。这意味着BLE设备已经根据命令的要求启用了或禁用了周期性广播。
除了status参数外,HCI_Command_Complete事件还可能包含以下字段:
num_hci_command_packets:表示在生成此事件之前,主机已发送并等待完成的HCI命令包的数量。这个字段对于理解BLE设备的命令处理能力很重要。command_opcode:表示已完成的HCI命令的操作码。对于HCI_LE_Set_Periodic_Advertising_Enable命令,这个字段将包含该命令的特定操作码。return_parameters:对于某些命令,这个字段可能包含额外的返回参数。然而,对于HCI_LE_Set_Periodic_Advertising_Enable命令,通常不需要额外的返回参数,因此这个字段可能为空或不被使用。以下是HCI_LE_Set_Periodic_Advertising_Enable命令的执行流程。
HCI_LE_Set_Periodic_Advertising_Enable命令之前,需要确定要启用或禁用的周期性广播集。这通常通过广播集的句柄(Advertising_Handle)来标识。HCI_LE_Set_Extended_Advertising_Parameters命令来设置广播参数,如广播间隔、通道映射、地址类型等。HCI_LE_Set_Periodic_Advertising_Data命令来配置周期性广播的数据。这包括广播的有效载荷(payload),它包含了广播中发送的实际信息。HCI_LE_Set_Periodic_Advertising_Enable命令包。这包括设置操作码(OpCode)、参数长度(Parameter Length)以及参数实体(如Advertising_Handle和Enable标志)。HCI_Command_Complete事件:当HCI_LE_Set_Periodic_Advertising_Enable命令执行完成后,控制器会生成一个HCI_Command_Complete事件,并将其发送给主机。HCI_Command_Complete事件中,检查状态码(Status)以确定命令是否成功执行。状态码为0x00表示成功,其他值表示失败,并附带相应的错误代码。HCI_LE_Set_Periodic_Advertising_Enable命令,并将Enable标志设置为禁用状态。HCI_LE_Set_Periodic_Advertising_Enable命令的发送流程,通常涉及与BLE控制器进行通信的HCI层代码。由于实际的BLE协议栈实现(如Bluedroid、BlueZ、Zephyr OS的Bluetooth子系统等)可能有所不同。以下代码示例将提供一个简化的框架,以展示如何准备和发送该命令。请注意,这只是一个概念性的示例,并不包含完整的错误处理、事件监听或特定于硬件的代码。
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
// 假设我们有一个HCI层的抽象接口
// 这些函数需要根据实际的BLE协议栈实现进行替换
extern int hci_send_command(uint16_t opcode, const uint8_t *params, uint8_t param_len);
extern void hci_event_callback(const uint8_t *event, uint16_t event_len);
// 假设的广播句柄和启用标志
#define ADVERTISING_HANDLE 0x0001
#define ENABLE_PERIODIC_ADVERTISING true
// HCI_LE_Set_Periodic_Advertising_Enable 命令结构
typedef struct {
uint8_t Advertising_Handle;
uint8_t Enable;
} hci_le_set_periodic_advertising_enable_cp;
// 发送 HCI_LE_Set_Periodic_Advertising_Enable 命令的函数
void send_hci_le_set_periodic_advertising_enable(bool enable) {
hci_le_set_periodic_advertising_enable_cp cp;
cp.Advertising_Handle = ADVERTISING_HANDLE;
cp.Enable = enable ? 0x01 : 0x00;
// 发送命令到HCI层
const uint16_t opcode = 0x4020; // 这是HCI_LE_Set_Periodic_Advertising_Enable的操作码(示例值,需确认)
int result = hci_send_command(opcode, (const uint8_t *)&cp, sizeof(cp));
if (result < 0) {
// 发送失败,处理错误
fprintf(stderr, "Failed to send HCI_LE_Set_Periodic_Advertising_Enable command\n");
} else {
// 发送成功,等待HCI_Command_Complete事件
printf("Sent HCI_LE_Set_Periodic_Advertising_Enable command, waiting for response...\n");
}
}
// 假设的HCI事件回调处理函数
void handle_hci_event(const uint8_t *event, uint16_t event_len) {
// 检查事件头以识别事件类型
if (event_len < 2) return;
uint8_t event_code = event[1];
if (event_code == 0x0E) { // HCI_Command_Complete事件代码(示例值,需确认)
// 解析HCI_Command_Complete事件
if (event_len < 4) return;
uint8_t num_hci_command_packets = event[2];
uint16_t opcode = event[3] | (event[4] << 8);
// 检查是否是我们发送的命令的响应
if (opcode == 0x004A) { // HCI_LE_Set_Periodic_Advertising_Enable的操作码(示例值,需确认)
// 解析状态码
if (event_len < 6) return;
uint8_t status = event[5];
if (status == 0x00) {
// 命令成功执行
printf("HCI_LE_Set_Periodic_Advertising_Enable command succeeded\n");
} else {
// 命令执行失败,打印错误代码
printf("HCI_LE_Set_Periodic_Advertising_Enable command failed with status 0x%02X\n", status);
}
}
}
// 其他事件处理...
}
int main() {
// 注册HCI事件回调(假设的函数,需根据实际的BLE协议栈实现进行替换)
// hci_register_event_callback(handle_hci_event);
// 发送启用周期性广播的命令
send_hci_le_set_periodic_advertising_enable(ENABLE_PERIODIC_ADVERTISING);
// 在实际应用中,这里会有一个事件循环来监听和处理来自BLE控制器的HCI事件
// 例如:while (true) { handle_events(); }
return 0;
}注意事项:
hci_send_command和hci_event_callback是假设的函数,需要根据实际的BLE协议栈提供的API进行替换。0x4020需要使用实际的HCI_LE_Set_Periodic_Advertising_Enable命令的操作码。0x0E是HCI_Command_Complete事件的示例值,同样需要确认。HCI_LE_Set_Periodic_Advertising_Enable命令在BLE技术中具有特定的使用场景,这些场景主要围绕BLE设备的周期性广播功能。以下是对该命令使用场景的详细归纳。
周期性广播是BLE设备的一种广播模式,它允许设备以固定的时间间隔重复发送广播数据。这种广播模式特别适用于那些需要持续广播其存在或状态信息的BLE设备,如传感器、健康监测设备等。
HCI_LE_Set_Periodic_Advertising_Enable命令在BLE技术中具有广泛的应用场景,它可以帮助BLE设备实现低功耗、高效率的数据广播和设备发现。
在使用HCI_LE_Set_Periodic_Advertising_Enable命令时,需要注意以下几个方面。
HCI_LE_Set_Periodic_Advertising_Enable命令BLE技术中扮演着至关重要的角色,它是控制BLE设备上周期性广播功能的核心命令。通过精心配置和使用该命令,开发者能够根据需要灵活地启用或禁用周期性广播,从而确保BLE设备能够按照预定的时间间隔定期广播数据。这种功能在多种应用场景中都显得尤为关键,比如环境监测、资产管理以及设备状态广播等。
在配置该命令时,需要关注广播参数的设置,包括广播间隔、广播类型等,以确保广播能够按照预期的方式广播。同时,还需要注意广播数据的准备,确保广播的数据内容准确且符合应用需求。
此外,功耗管理也是在使用周期性广播功能时需要特别考虑的因素。开发者需要在数据更新频率和功耗之间找到平衡点,以确保BLE设备能够在满足应用需求的同时,尽可能地延长电池寿命。
最后,安全性也是不可忽视的一个方面。如果广播数据包含敏感信息,开发者需要采取相应的安全措施来保护数据的传输,确保数据的机密性和完整性。
综上所述,HCI_LE_Set_Periodic_Advertising_Enable命令是BLE技术中实现周期性广播功能的重要命令。通过正确配置和使用该命令,开发者可以灵活地控制BLE设备上的周期性广播,以满足各种应用场景的需求,并为最终用户提供更加智能、便捷和高效的蓝牙连接体验。