
HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters 命令是低功耗蓝牙(BLE)核心规范中定义的一个主机控制器接口(HCI)命令,用于配置周期性广播同步传输参数。该命令允许设备在接收到周期性广播后,将这些广播的数据和参数转发给另一个设备(通常是中央设备),以便在它们之间共享周期性广播信息。
在蓝牙通信系统中,特别是BLE场景下,周期性广播是设备向外发送信息的一种重要方式,而同步这些广播信息的接收和处理对于确保通信的准确性和及时性至关重要。HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters命令主要用于设定控制器处理周期性广播同步信息的方式。

该命令明确提及信息是从由Connection_Handle参数所标识的设备接收的。Connection_Handle在这里起到了关键的桥梁作用,它唯一地确定了一个设备连接,使得控制器能够清楚地知道这些周期性广播同步信息的来源,从而针对这个特定的连接进行相应的处理方式设置。
不影响已接收的同步信息:该命令不会影响接收方从对等设备已经接收到的任何周期性广播同步信息的处理。意味着,无论接收方是否已经与周期性广播序列同步,执行此命令都不会改变其当前的同步状态或已接收的同步信息。
参数优先级:通过此命令提供的参数值将覆盖之前通过其他命令(如HCI_LE_Set_Default_Periodic_Advertising_Sync_Transfer_Parameters或同一连接上的HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters)设置的默认参数或偏好设置。这意味着,当执行此命令时,其提供的参数将成为当前有效的参数设置。
实际应用:在智能家居、物联网(IoT)或健康监测等应用场景中,该命令可用于优化周期性广播数据的接收和处理。例如,对于电池寿命有限的传感器设备,可以配置传输模式以减少不必要的数据传输,从而延长设备寿命。
实际应用中的考虑:
HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters命令在BLE通信系统中扮演着重要角色,通过精细配置传输模式,可以优化周期性广播数据的接收和处理过程,提高通信的效率和准确性。
HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters 命令HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters 命令通常包含以下几个关键部分:
以下是一个基于蓝牙核心规范的HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters命令格式示例:
OGF: 0x08 (LE Controller Commands)
OCF: 0x005C (LE Set Periodic Advertising Sync Transfer Parameters)
Command Parameters:
Service_Data (variable length):
Connection_Handle (2 octets): 用于标识特定的周期性广播实例。
Sync_Transfer_Mode (1 octet): 同步传输模式,定义如何转发周期性广播数据
Skip (1 octet): 跳过参数,表示在转发周期性广播之前需要跳过的周期性广播实例的数量。
...此外,命令中还可能包含其他与周期性广播同步传输相关的参数,这些参数的具体名称和含义取决于蓝牙核心规范的版本和设备的实现。在实际编写和发送HCI命令时,应确保遵循蓝牙核心规范的规定,并正确设置所有必要的参数,以确保命令的正确执行和设备的正常通信。
Connection_Handle在HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters命令中起到了关键性的指向作用,它像是一个“指针”,精确地指示蓝牙控制器将周期性广播同步信息转发至哪一个已建立连接的设备。

Connection_Handle通常为一个整数类型。Connection_Handle的取值范围在0x0000至0x0EFF之间(对应十进制0至239)。Connection_Handle的取值范围可能仅限于0至7(假设编号从0起始)。连接句柄验证:如果
Connection_Handle参数没有正确标识一个当前存在的连接,则控制器将返回错误代码“Unknown Connection Identifier”(0x02)。表示提供的连接句柄无效或不存在对应的连接。
Connection_Handle的唯一性确保了同步信息能够准确无误地传递至目标设备。
Connection_Handle在HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters命令中扮演着至关重要的角色。它不仅是连接设备间数据同步的桥梁,更是确保数据准确无误传递至目标设备的关键所在。在使用该命令时,必须准确指定Connection_Handle的值,以确保命令的顺利执行和数据的正确传输。同时,还需留意蓝牙设备所支持的最大连接数以及Connection_Handle的实际取值范围,以避免因取值不当而导致的错误或数据丢失。
Mode 参数在接收周期性广播同步信息时起着决定性作用,并控制着蓝牙控制器与主机的交互方式以及周期性广播报告的启用状态和重复数据过滤功能。这是一种决策性的参数,直接影响着信息后续的处理路径。

注意:如果主机将
Mode设置为0x03,但控制器不支持周期性广播ADI(Angle of Departure Indicator,离开角度指示器)支持特性,则控制器将返回错误代码“Unsupported Feature or Parameter Value”(0x11)。表示控制器不支持主机请求的模式或参数值。
Skip 参数主要用于指定接收设备在成功接收一个周期性广播数据包之后,可以连续跳过的周期性广播数据包的数量。这样做有几个好处:

取值范围: 0x0000 到 0x01F3(对应十进制0到499)。这个范围决定了可以跳过的周期性广播数据包数量的上下限。
skip参数是BLE通信中一个重要的参数,它允许接收方根据自己的需求和广播包的发送速率来调整接收和处理广播包的策略,以实现节能和高效的数据处理。
Sync_Timeout 参数用于指定在成功接收周期性广播数据包之间所允许的最长时间间隔。它的存在是为了确保设备之间的周期性广播同步状态能够得到有效维持。如果接收设备在这个最长时间间隔内没有成功接收到数据包,就会判定为同步丢失。这就像是一个时间警戒线,一旦超过这个时间没有收到新的数据包,设备就会认为广播发送设备和接收设备之间的同步出现了问题。
与Skip的关联:无论 Skip 参数的值是多少,控制器都应该在即将超过 Sync_Timeout 所规定的时间之前停止跳过数据包。这是为了保证能够及时接收数据包,避免同步丢失。例如,如果因为连续跳过数据包导致可能会超出 Sync_Timeout 规定的时间,控制器就需要调整策略,开始接收数据包以维持同步。

取值范围及时间换算:0x000A 到 0x4000。这个范围对应的时间是通过一个换算关系得到的,即 Time = N × 10ms。换算后的时间范围是从 100ms 到 163.84s。
注意事项:
Sync_Timeout参数确保接收方能够持续且可靠地接收周期性广播包。如果由于某种原因(如信号干扰、设备移动等)导致接收方在指定的时间间隔内未能成功接收到广播包,Sync_Timeout将触发同步丢失的机制。
CTE_Type参数用于指定是否仅与具有特定类型恒定音扩展(Constant Tone Extension,CTE)的周期性广播进行同步。CTE是BLE 5.1及更高版本中引入的一种特性,它允许设备在广播包中包含一个或多个恒定音调,这些音调可以用于角度测量(如到达角度(AoA)或离开角度(AoD))和其他定位应用。

位(Bit)含义说明:
说明:当 CTE_Type 参数的值为 0(即所有位都被清零)时,表示恒定音调扩展(Constant Tone Extension,CTE)的存在与否对于同步操作是无关紧要的。也就是说,接收设备在进行同步判断时,不会因为数据包是否带有 CTE 或者带有何种类型的 CTE 而有所不同,会按照正常流程对周期性广播数据包进行同步处理,不做基于 CTE 类型的特殊区分。
CTE_Type非法设置:如果主机将所有非保留位(即Bit 0、Bit 1、Bit 2 和 Bit 4 等))的CTE_Type都设置为1,则控制器应使用错误代码“Command Disallowed”(0x0C)返回一个错误。表示主机提供了非法的CTE_Type设置,控制器不允许执行此命令。
CTE_Type参数允许接收方根据广播包中CTE的类型来选择性地与周期性广播进行同步。通过正确设置CTE_Type参数,接收方可以优化通信性能、减少不必要的通信开销和数据处理负担,并提高定位的精度和可靠性。
在执行完HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters命令后,控制器会生成并上报HCI_Command_Complete事件。这是蓝牙通信协议中一种常见的反馈机制,用于告知主机设备命令的执行情况已经完成。
HCI_Command_Complete事件不仅提供命令执行结果信息,还引导主机进行后续操作和错误排查,确保蓝牙通信系统的正常运行。
1. 在主机操作流程中的作用
2. 事件屏蔽情况
status参数主要用于指示HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters命令的执行结果。通过该参数的值,发送命令的主机设备可以快速了解到命令在控制器端的执行情况,以便做出相应的后续操作决策。

在HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters命令的返回参数中,Connection_Handle参数明确了这个命令所针对的是哪一个特定的连接。因为在蓝牙通信环境中,一个设备可能同时与多个其他设备建立连接,或者存在多个潜在的连接场景,通过 Connection_Handle 就能精准地定位到该命令所操作的具体连接关系。

HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters命令返回的Connection_Handle参数是与周期性广播同步传输相关的连接的唯一标识符。它允许蓝牙设备在后续操作中识别和管理该连接,并执行相关的数据传输和控制操作。在使用该命令时,需要仔细处理返回的Connection_Handle参数,并确保其正确性和有效性。
HCI_Command_Complete事件。HCI_Command_Complete事件包含命令执行的状态码(成功或失败)和Connection_Handle参数。主机接收这些反馈信息,并根据状态码决定后续操作。HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters命令的执行流程通常涉及到与底层蓝牙硬件的直接交互,包括发送HCI命令、处理HCI事件以及管理蓝牙协议栈的状态。此外,蓝牙堆栈的实现(如BlueZ、Bluedroid等)和硬件抽象层(HAL)的具体细节也会极大地影响代码的结构。下面提供一个简化的代码框架,用于说明如何构建和发送HCI命令,并处理来自蓝牙控制器的响应。
请注意,这个示例不会包含所有必要的错误处理和完整性检查,也不会与实际的蓝牙硬件或协议栈直接交互;仅用于教学目的。
#include <stdio.h>
#include <stdint.h>
#include <string.h>
// 假设这些宏和结构体定义与您的蓝牙协议栈和硬件接口相匹配
#define HCI_COMMAND_PKT 0x01
#define HCI_OP_LE_SET_PERIODIC_ADV_SYNC_TRANSFER_PARAMS 0xXXXX // 需要替换为实际的Opcode
#define HCI_SUCCESS 0x00
// 假设的HCI命令结构体(根据您的蓝牙协议栈和硬件接口进行调整)
typedef struct {
uint8_t opcode[2];
uint8_t param_len;
uint16_t sync_handle;
uint8_t max_skip;
uint16_t timeout;
uint8_t mode;
// 可能还有其他参数...
} hci_le_set_periodic_adv_sync_transfer_params_cp;
// 假设的HCI事件结构体(根据您的蓝牙协议栈和硬件接口进行调整)
typedef struct {
uint8_t evt_code;
uint8_t pkt_len;
uint8_t status;
uint16_t connection_handle; // 假设这是返回的连接句柄(根据您的实际事件结构进行调整)
// 可能还有其他字段...
} hci_command_complete_ep;
// 发送HCI命令的假设函数(需要根据您的蓝牙协议栈和硬件接口实现)
void send_hci_command(const uint8_t *data, size_t len) {
// 这里应该包含与蓝牙硬件通信的代码,例如通过UART、SPI等发送数据
// 本示例中仅打印数据以表示发送
for (size_t i = 0; i < len; i++) {
printf("%02X ", data[i]);
}
printf("\n");
}
// 处理HCI事件的假设函数(需要根据您的蓝牙堆栈和硬件接口实现)
void handle_hci_event(const uint8_t *event, size_t len) {
// 解析HCI事件并处理
if (len < sizeof(hci_command_complete_ep)) {
// 事件太短,无法处理
return;
}
const hci_command_complete_ep *ep = (const hci_command_complete_ep *)event;
if (ep->evt_code == 0x0E && // HCI Command Complete Event code
ep->status == HCI_SUCCESS) {
// 命令执行成功
printf("Command completed successfully for connection handle 0x%04X\n", ep->connection_handle);
} else {
// 命令执行失败或不是预期的命令完成事件
printf("Command failed with status 0x%02X\n", ep->status);
}
}
int main() {
// 准备HCI命令参数
hci_le_set_periodic_adv_sync_transfer_params_cp cp;
cp.opcode[0] = (HCI_OP_LE_SET_PERIODIC_ADV_SYNC_TRANSFER_PARAMS >> 8) & 0xFF;
cp.opcode[1] = HCI_OP_LE_SET_PERIODIC_ADV_SYNC_TRANSFER_PARAMS & 0xFF;
cp.param_len = sizeof(cp) - 2; // 减去opcode的长度
cp.sync_handle = 0x0001; // 示例值,需要根据实际情况设置
cp.max_skip = 0x05; // 示例值
cp.timeout = 0x003C; // 示例值(500ms,假设单位是10ms)
cp.early_termination_enable = 0x01; // 启用早期终止
cp.periodic_adv_interval_min = 0x00A0; // 示例值(100ms,假设单位是0.625ms)
cp.periodic_adv_interval_max = 0x00F0; // 示例值(150ms)
cp.mode = 0x01; // 示例值
// 构建完整的HCI命令包
uint8_t hci_cmd_pkt[sizeof(cp) + 1]; // +1 for packet type byte
hci_cmd_pkt[0] = HCI_COMMAND_PKT;
memcpy(hci_cmd_pkt + 1, &cp, sizeof(cp));
// 发送HCI命令
send_hci_command(hci_cmd_pkt, sizeof(hci_cmd_pkt));
// 假设我们在这里接收到了一个HCI事件(在实际应用中,这将是异步的)
uint8_t hci_event_pkt[] = {
0x0E, // Event code: Command Complete
sizeof(hci_command_complete_ep) - 1, // Packet length (excluding event code byte)
HCI_SUCCESS, // Status
0x00, 0x01 // Connection handle (example values)
// 可能还有其他字段...(本示例中省略)
};
// 处理接收到的HCI事件
handle_hci_event(hci_event_pkt, sizeof(hci_event_pkt));
return 0;
}重要说明:
HCI_OP_LE_SET_PERIODIC_ADV_SYNC_TRANSFER_PARAMS是一个占位符,需要替换为实际的HCI操作码。
hci_le_set_periodic_adv_sync_transfer_params_cp和hci_command_complete_ep结构体是基于假设的,并且可能需要根据蓝牙协议栈和硬件接口进行调整。
send_hci_command和handle_hci_event函数是假设的,并且需要根据实际硬件接口和蓝牙协议栈实现。在实际应用中,发送HCI命令通常是异步的,并且接收HCI事件也是通过中断或回调来处理的。
HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters命令的使用场景可能包括但不限于以下几个方面。
Periodic_Advertising_Interval_Min和Periodic_Advertising_Interval_Max,把控传感器数据发送频率,避免更新异常。MaxSkip参数,在网络不稳时适当跳过广播数据包,保障数据同步流程。Mode参数控制中心设备接收同步信息后的操作,如是否通知应用层处理数据。Sync_Timeout参数确保在规定时间内成功接收广播数据包,维持定位数据连贯性。MaxSkip参数,平衡数据接收与设备功耗。Early_Termination_Enable参数,异常时及时终止同步传输,防更新出错。Periodic_Advertising_Interval_Min和Periodic_Advertising_Interval_Max以及MaxSkip参数,保障数据按预期传输。Mode参数,接收同步信息后及时处理数据,正确组合写入固件更新数据块。HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters命令,依据设备自身情况及应用需求,对广播集相关参数进行设置,提升广播数据传输效果并降低功耗。不同使用场景下,该命令的应用重点在于根据具体的设备类型、应用场景需求以及蓝牙核心规范版本等因素,灵活设置各项参数(如Periodic_Advertising_Interval_Min、Periodic_Advertising_Interval_Max、MaxSkip、Mode等),以实现数据的高效传输、准确接收、同步处理以及功耗的优化等目标。同时,实际应用中需参考特定蓝牙设备的文档或规范来确定准确的使用方法和参数设置。
1. 遵守蓝牙规范:
2. 设备兼容性检查:
MaxSkip等参数,避免数据丢失或功耗增加。HCI_Command_Complete事件的返回状态码。根据返回的错误代码,确定具体的错误原因,并及时采取纠正措施。通过了解 HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters 命令的格式和参数,可以更好地配置和管理蓝牙设备之间的周期性广播同步传输功能,从而实现更高效、更可靠的蓝牙通信。