
HCI_LE_Periodic_Advertising_Create_Sync 是蓝牙核心规范(Bluetooth Core Specification)中定义的一个主机控制器接口(HCI)命令,用于在低功耗蓝牙(BLE)设备上创建与周期性广播(Periodic Advertising)的同步。这个命令是在蓝牙5.1及更高版本中引入的,它允许设备(称为同步接收者)接收和同步来自另一个设备(称为周期性广播者)的周期性广播数据包。旨在支持更加低功耗和高效的数据广播和接收。
HCI_LE_Periodic_Advertising_Create_Sync 命令用于与来自广播者的周期性广播序列进行同步,并开始接收周期性广播数据包。这种同步机制是在蓝牙5.1及更高版本中引入的,旨在支持更加低功耗和高效的数据广播和接收。

LE Set Extended Scan Enable 命令)。但是,请注意,只有在扫描启用时,才能成功建立同步。HCI_LE_Periodic_Advertising_Create_Sync 命令适用于需要定期接收来自其他BLE设备的数据的场景,如传感器网络、环境监测系统、智能家居设备等。通过同步机制,这些设备可以在保持低功耗的同时,实现数据的定期交换和更新。
HCI_LE_Periodic_Advertising_Create_Sync命令是BLE通信中一个重要的功能,它允许设备在不需要主动扫描的情况下,定期接收来自其他设备的广播信息。正确理解和使用这一命令,对于开发低功耗、高性能的BLE应用至关重要。
HCI_LE_Periodic_Advertising_Create_Sync命令的格式通常包括命令操作码、命令参数等部分。具体格式可能因不同的蓝牙实现和版本而略有差异,以下是一个通用的格式示例:
HCI_LE_Periodic_Advertising_Create_Sync命令。在蓝牙核心规范中,每个HCI命令都有一个唯一的操作码。以下是一个HCI_LE_Periodic_Advertising_Create_Sync命令的格式示例,其中包含了命令操作码和假设的命令参数:
HCI_LE_Periodic_Advertising_Create_Sync Command
-----------------------------------------------
Command Opcode: 0xXXXX (假设的操作码,实际值需参考蓝牙核心规范)
Command Parameters:
- Advertiser Address Type: 0x00 (公共地址)
- Advertiser Address: XX:XX:XX:XX:XX:XX (广播者的蓝牙地址)
- Advertising SID: 0x00 (广播集标识符)
- Sync Timeout: 0xYYYY (同步超时值,单位可能是秒或毫秒,具体取决于实现)
- Skip: 0xZZ (跳过数,表示在尝试同步之前要跳过的周期性广播事件数量)
- Sync Period: 0xAAAA (同步周期,表示同步接收者期望接收周期性广播数据的周期)注意:上述示例中的操作码、地址、SID、超时值、跳过数和同步周期都是假设的,实际使用时需要根据具体的蓝牙设备和规范来确定。
Options参数在BLE的周期性广播同步创建过程中起着关键作用。它用于确定是否使用周期性广播者列表(Periodic Advertiser List),以及是否初始启用或禁用针对此周期性广播序列的HCI_LE_Periodic_Advertising_Report事件,同时控制是否过滤重复报告。

Advertising_SID(广播标识符)、Advertiser_Address_Type(广播地址类型)和Advertiser_Address(广播地址)这三个参数将被忽略。因为同步将基于周期性广播者列表中的广播者进行,而不是基于这三个参数指定的单个广播者。HCI_LE_Periodic_Advertising_Report事件: HCI_LE_Periodic_Advertising_Report事件。如果启用,则接收者将开始接收来自指定周期性广播设备的广播报告。注意事项
Advertising_SID(广播标识符)参数在BLE的周期性广播同步过程中起着关键作用。它允许设备根据特定的广播标识符来识别并同步周期性广播,通过合理配置广播标识符的值,可以提高BLE广播的接收效率和准确性,从而满足不同的应用需求。

Advertising_SID是一个字节(8位)大小的字段,其值范围从0x00到0x0F(即0到15)。在BLE的广播数据中,广播标识符被用作ADI(Advertising Data Info)字段的一个子字段,用于帮助接收设备识别并同步到特定的周期性广播。意味着当设备在接收广播信号时,通过检查广播数据包中ADI字段里的Advertising SID子字段的值,来判断这个广播是否是自己想要接收的周期性广播。例如,在一个有多个不同类型广播同时存在的蓝牙环境中,设备可以利用这个子字段从众多广播信号中筛选出特定的周期性广播,从而实现与该周期性广播的同步接收等操作。
Advertiser_Address_Type(广播地址类型) 参数定义了正在发送广播的设备所使用的地址类型。它告诉接收设备如何解析广播中的广播地址字段。广播地址类型对于建立BLE连接和识别广播源至关重要。

Advertiser_Address_Type 参数的大小通常为1个字节(8位)。意味着它可以表示256个不同的值(从0x00到0xFF)。但Advertiser_Address_Type 参数的常用的值包括:
注意事项
广播地址(Advertiser_Address)用于标识正在发送广播的设备。它可以是设备的公共设备地址(Public Device Address)或随机设备地址(Random Device Address)。广商地址的主要功能是帮助接收设备识别正在发送广播的设备,并与之建立连接(如果需要的话)。

周期性广播者的地址类型可以是公共地址(0x00)或随机地址(0x01)。蓝牙MAC地址-CSDN博客
注意事项:在使用广播地址时,需要注意隐私保护的问题。使用随机设备地址可以减少设备被跟踪的风险。
Skip 参数在BLE的周期性广播(Periodic Advertising)模式中非常重要,其用于指定在成功接收到一个周期性广播数据包后,接收器可以跳过的最大连续周期性广播事件数。通过调整这个参数,接收器可以控制自己接收广播数据的速率,从而优化资源使用和电池寿命。

Skip 参数在多种BLE应用场景中都非常有用,包括但不限于:
注意事项:在使用 Skip 参数时,需要确保它与周期性广播事件的发送频率相匹配。如果 Skip 参数的值设置得过大,可能会导致接收器错过重要的广播数据。相反,如果 Skip 参数的值设置得过小,可能会导致接收器接收到过多的广播数据,从而增加处理负担和功耗。
Sync_Timeout,即同步超时参数,是一个关键的时间阈值,用于衡量BLE接收器与周期性广播事件保持同步的能力。当接收器在Sync_Timeout所设定的时间内未能成功接收到预期的周期性广播事件时,将视为同步丢失,并可能需要重新启动同步过程。

Sync_Timeout参数在BLE通信中发挥着至关重要的作用。通过合理设置和使用该参数,可以确保BLE通信的可靠性、性能和低功耗特性,同时满足各种应用场景的需求。
例如,假设有一个蓝牙传感器设备在按照一定的时间间隔(比如每10秒)进行周期性广播,接收设备在接收到一个数据包后就开始计时。如果Sync_Timeout参数被设置为30秒,那么接收设备在30秒内必须再次接收到来自该传感器设备的广播数据包,否则接收设备就会判定与该传感器设备的同步状态丢失。 这种同步丢失可能会导致接收设备需要重新进行同步操作,或者采取其他错误处理机制,比如停止接收该设备的广播数据、向用户发送同步丢失的通知等。这一参数有助于确保接收设备和广播设备之间的数据传输准确性和稳定性,避免因长时间未接收到广播数据而导致的数据不一致或通信中断等问题。
Sync_CTE_Type 参数用于指定蓝牙设备是否仅与包含特定类型常音调扩展(Constant Tone Extension,CTE)的周期性广播进行同步。当该参数设置为0时,表示CTE的存在与否对于同步过程来说是不重要的。
在蓝牙技术中,CTE(Constant Tone Extension,常音调扩展)是一种用于增强测距和定位能力的信号扩展。它通过在数据传输的末尾添加一个或多个常音调信号,使得接收设备能够更准确地测量信号的传播时间,从而提高定位精度。

Sync_CTE_Type 是指在进行蓝牙通信时,设备之间用于同步的CTE信号的特定类型。不同的CTE类型可能具有不同的调制方式、带宽或持续时间等特性,这些特性决定了CTE信号的传输性能和定位精度。
Sync_CTE_Type指定的类型不匹配,那么将根据Options参数的设置来决定设备的行为。Sync_CTE_Type变更后的同步:当扫描器(Scanner)已经与周期性广播(Periodic Advertising)同步后,如果周期性广播(Advertiser)更改了常音调扩展(CTE)的类型,扫描器的链路层(Link Layer)将保持同步。意味着CTE类型的变更不会影响已经建立的同步关系。当蓝牙设备尝试与周期性广播进行同步,但发现CTE类型不匹配时,设备的行为将取决于Options参数中的位0的设置:
Options参数的位0被设置,表示设备在CTE类型不匹配时采取灵活的处理方式。此时,蓝牙设备将忽略当前周期性广播的地址和SID(Service Instance ID,服务实例标识),并继续搜索其他可能的周期性广播以尝试同步。Options参数的位0未被设置,表示设备在CTE类型不匹配时采取严格的处理方式。此时,蓝牙设备将取消同步过程,并报告一个错误代码,即“不支持的远程功能”(Unsupported Remote Feature,错误代码0x1A)。Sync_CTE_Type参数为蓝牙设备提供了同步过程中的灵活性和控制权。
Sync_CTE_Type参数是蓝牙设备在同步周期性广播时的重要工具,它提供了对CTE类型要求的明确指定,并根据Options参数的设置来决定在CTE类型不匹配时的行为。通过仔细配置这些参数,可以确保设备在同步过程中满足特定的应用需求,提高蓝牙通信的灵活性和可靠性。
Sync_CTE_Type参数的所有非保留位都设置为1。Command Disallowed(0x0C)Sync_CTE_Type参数的设置超出了控制器支持的范围。Sync_Timeout超时之前停止跳过数据包,以确保及时接收到必要的同步信息。HCI_LE_Periodic_Advertising_Create_Sync命令挂起时发出新命令。Command Disallowed(0x0C)Advertising_SID、Advertiser_Address_Type和Advertiser_Address与控制器已经同步的周期性广播序列相同。Connection Already Exists(0x0B)Memory Capacity Exceeded(0x07)Options参数的位1设置为1,且控制器支持周期性广播ADI支持功能。Options参数的位1设置为0,位2设置为1,但控制器不支持周期性广播ADI支持功能。Unsupported Feature or Parameter Value(0x11)Options参数的位1设置为1,但控制器不支持HCI_LE_Set_Periodic_Advertising_Receive_Enable命令。Connection Failed to be Established / Synchronization Timeout(0x3E)这些错误处理规则确保了蓝牙设备在周期性广播同步过程中的稳定性和兼容性。通过遵循这些规则,设备可以更有效地利用蓝牙技术进行通信和数据传输,同时减少因错误配置或资源不足而导致的同步失败。在实际应用中,应仔细考虑这些规则,并在设备设计和实现中加以遵循。
当主机(Host)向控制器(Controller)发送 HCI_LE_Periodic_Advertising_Create_Sync 命令时,控制器会首先返回一个 HCI_Command_Status 事件给主机。这个事件用于告知主机命令是否已被控制器接收并处理。
当控制器开始接收到周期性广播数据包时,它会生成一个 HCI_LE_Periodic_Advertising_Sync_Established 事件并发送给主机。这个事件标志着周期性广播同步的建立。
如果报告功能被启用,当控制器接收到周期性广播数据包时,会生成 HCI_LE_Periodic_Advertising_Report 事件并发送给主机。这个事件包含了接收到的广播数据包的内容。
如果在首次监听后的6个周期性广播事件内,控制器没有接收到任何周期性广播数据包,它将生成一个 HCI_LE_Periodic_Advertising_Sync_Established 事件,但此时的状态(Status)将被设置为 Connection Failed to be Established / Synchronization Timeout(0x3E)。
HCI_LE_Periodic_Advertising_Sync_Established 事件也可能由于 HCI_LE_Periodic_Advertising_Create_Sync_Cancel 命令而被发送。这表示同步被主动取消,此时事件的状态可能反映了取消操作的结果。
以上这些事件共同构成了蓝牙BLE周期性广播同步过程中的通信机制。它们允许主机和控制器之间有效地交换关于周期性广播同步的建立、数据包的接收以及任何同步失败或取消的信息。在实际应用中,这些事件对于实现稳定的蓝牙通信和数据处理至关重要。
在执行HCI_LE_Periodic_Advertising_Create_Sync命令时,整个流程可以划分为几个关键阶段,每个阶段都有其特定的任务和作用。以下是对整个流程的详细说明。
下面提供一个简化的框架,展示HCI_LE_Periodic_Advertising_Create_Sync命令的执行流程。请注意,这个示例不会包含实际的蓝牙硬件交互代码,因为那通常需要特定的硬件抽象层(HAL)或蓝牙协议栈API。
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// 假设这些函数是由蓝牙协议栈或硬件抽象层提供的
extern bool hci_send_command(uint8_t *command, uint16_t length);
extern void hci_event_callback(uint8_t *event, uint16_t length);
// 假设的HCI命令结构体(实际结构可能不同)
typedef struct {
uint8_t opcode;
uint16_t param_length;
// 参数字段(这里省略,根据具体命令填充)
} hci_command_t;
// 假设的HCI事件结构体(实际结构可能不同)
typedef struct {
uint8_t event_code;
uint8_t status;
// 其他字段(这里省略,根据具体事件填充)
} hci_event_t;
// 示例:设置周期性广播参数
bool set_periodic_advertising_parameters(uint16_t interval, uint16_t duration) {
// 构建HCI_LE_Set_Periodic_Advertising_Parameters命令
// ...(省略具体实现)
// 发送命令
hci_command_t param_cmd = {/* 填充命令字段 */};
return hci_send_command((uint8_t*)¶m_cmd, sizeof(param_cmd));
}
// 示例:设置周期性广播数据
bool set_periodic_advertising_data(/* 参数 */) {
// 构建HCI_LE_Set_Periodic_Advertising_Data命令
// ...(省略具体实现)
// 发送命令
// ...
return true; // 假设成功
}
// 示例:创建周期性广播同步
bool create_periodic_advertising_sync(uint8_t advertising_handle, uint8_t options, /* 其他参数 */) {
// 构建HCI_LE_Periodic_Advertising_Create_Sync命令
hci_command_t sync_cmd = {
.opcode = 0x/* 填写正确的操作码 */,
.param_length = sizeof(/* 参数结构体大小 */) - 2, // 减去opcode和param_length字段
// ...(填充其他参数字段)
};
// 发送命令
return hci_send_command((uint8_t*)&sync_cmd, sizeof(sync_cmd));
}
// 示例:HCI事件回调函数
void on_hci_event(uint8_t *event, uint16_t length) {
hci_event_t *evt = (hci_event_t*)event;
switch (evt->event_code) {
case 0x/* HCI_Command_Status事件代码 */:
// 处理命令状态事件
// ...
break;
case 0x/* HCI_LE_Periodic_Advertising_Sync_Established事件代码 */:
// 处理同步建立事件
// ...
break;
case 0x/* HCI_LE_Periodic_Advertising_Report事件代码 */:
// 处理周期性广播报告事件(如果启用了报告功能)
// ...
break;
// 其他事件处理...
default:
break;
}
}
int main() {
// 初始化蓝牙协议栈或硬件(省略)
// 设置周期性广播参数
if (!set_periodic_advertising_parameters(/* 参数 */)) {
// 处理错误
return -1;
}
// 设置周期性广播数据
if (!set_periodic_advertising_data(/* 参数 */)) {
// 处理错误
return -1;
}
// 创建周期性广播同步
if (!create_periodic_advertising_sync(/* 参数 */)) {
// 处理错误
return -1;
}
// 主循环(通常在实际应用中会有一个事件循环来处理HCI事件)
while (true) {
// 等待并处理HCI事件(这里应该有一个异步机制来接收和处理事件)
uint8_t event_buffer[256]; // 假设事件缓冲区大小
uint16_t event_length = /* 从蓝牙协议栈或硬件获取事件长度 */;
if (event_length > 0) {
hci_event_callback(event_buffer, event_length);
}
// 其他任务...
}
// 清理和退出(在实际应用中会有适当的清理代码)
return 0;
}注意:
hci_send_command 和 hci_event_callback 函数是假设存在的,需要根据所使用的蓝牙协议栈或硬件抽象层提供的API来实现它们。整个HCI_LE_Periodic_Advertising_Create_Sync命令执行流程涉及命令准备、发送、控制器处理、返回响应以及后续的同步建立、数据接收与报告、同步超时处理和同步取消等多个阶段。每个阶段都有其特定的任务和作用,共同确保了周期性广播同步操作的正确性和可靠性。通过这一流程,主机可以成功地与周期性广播设备进行同步,并接收来自该设备的周期性广播数据包。
HCI_LE_Periodic_Advertising_Create_Sync命令在BLE技术中具有特定的应用场景,这些场景主要围绕周期性广播的同步与接收。以下是对该命令应用场景的详细归纳。
HCI_LE_Periodic_Advertising_Create_Sync命令在BLE技术中具有广泛的应用场景,特别是在智能设备连接与交互、数据采集与监测、位置服务与室内定位、可穿戴设备与健康监测以及特定通信需求支持等方面发挥着重要作用。
使用HCI_LE_Periodic_Advertising_Create_Sync命令时,需要仔细考虑命令参数的设置、设备状态与命令执行顺序、资源与兼容性以及事件处理与错误处理等多个方面。同时,还需要注意安全性、性能优化以及遵循最新的蓝牙核心规范文档和相关技术资料。
综上所述,通过 HCI_LE_Periodic_Advertising_Create_Sync 命令,BLE设备可以实现更加灵活和高效的通信模式,特别是在需要定期交换数据的场景中。正确理解和使用这一命令,对于开发低功耗、高性能的蓝牙应用至关重要。