首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【0x0045】HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令全面解析

【0x0045】HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令全面解析

作者头像
byte轻骑兵
发布2026-01-20 20:12:09
发布2026-01-20 20:12:09
1010
举报

HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令是低功耗蓝牙(BLE)协议栈中用于取消已经创建的周期性广播同步(Periodic Advertising Sync)的指令。这个命令属于蓝牙核心规范的一部分,特别是在BLE 5.1及更高版本中引入的周期性广播(Periodic Advertising)功能。

一、命令概述

HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令的主要作用是在 HCI_LE_Periodic_Advertising_Create_Sync命令处于未完成(pending,即正在等待处理、尚未执行完毕)的状态时,取消该创建同步的命令。

在蓝牙设备的通信流程中,当主机(如智能手机、平板电脑等具备蓝牙功能的设备)发起了 HCI_LE_Periodic_Advertising_Create_Sync 命令,希望建立与某个低功耗蓝牙设备的周期性广播的同步关系,但这个创建同步的过程还没有最终完成时,如果主机出于某些原因(例如发现不需要建立该同步关系了、设备资源紧张无法支持后续同步操作等)想要终止这个正在进行的创建同步操作,就可以使用HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令来实现。

错误处理情况:如果主机发出HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令时,并没有正在等待处理的HCI_LE_Periodic_Advertising_CCreate_Sync命令(也就是说,此时并没有在进行创建同步的操作),那么控制器将会返回错误代码 “Command Disallowed(0x0C)”。这是为了告知主机,当前的取消操作是不被允许的,因为没有对应的创建同步操作在进行中,主机接收到这个错误代码后,就可以知道自己的操作不符合当前的实际情况,进而可以采取相应的措施,比如检查自身的操作流程是否正确、确认是否真的需要取消某个创建同步操作等。

通过及时取消不必要的创建同步操作,可以避免在不必要的情况下继续占用设备资源(如内存、处理能力等)来进行后续可能不需要的同步建立工作,同时也规范了主机的操作行为,使其在进行取消操作时需要先确认是否存在对应的正在进行的创建同步操作,从而提高了整个蓝牙通信系统的稳定性和可靠性。

二、命令格式

2.1. 一般格式

HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令通常具有以下格式:

  • 命令操作码(OpCode):固定的值,用于标识HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令。
  • 参数长度(Parameter Length):表示命令参数的字节数。对于HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令,通常是一个较小的值,因为该命令不需要太多参数。
  • 命令参数:可能包含一些参数,用于提供更多关于取消操作的细节信息。例如,可能包含一个用于标识之前发起的 “HCI_LE_Periodic_Advertising_Create_Sync” 命令的标识符,以便控制器准确地知道要取消哪一个创建同步操作。

2.2. 示例格式

以下是一个HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令的示例格式:

代码语言:javascript
复制
OpCode: 0xXXXX (具体值根据蓝牙核心规范定义)
Parameter Length: 0x02 (表示Sync Handle为2字节)
Parameters: 
  Sync Handle: 0xYYYY (具体值,之前通过HCI_LE_Periodic_Advertising_Create_Sync命令获得的)
  • 0xXXXXHCI_LE_Periodic_Advertising_Create_Sync_Cancel命令的操作码,需要替换为蓝牙核心规范中定义的实际值。
  • 0x02表示Sync Handle的长度为2字节,这是标准的长度。
  • 0xYYYY是需要取消的周期性广播同步的Sync Handle,需要替换为之前通过HCI_LE_Periodic_Advertising_Create_Sync命令成功创建同步时返回的实际值。

2.3. 示例说明

假设我们已经通过HCI_LE_Periodic_Advertising_Create_Sync命令成功创建了一个周期性广播同步,并获得了Sync Handle 0x1234。现在,我们想要取消这个同步,那么我们可以发送以下命令:

代码语言:javascript
复制
OpCode: 0xXXXX (假设为实际的HCI_LE_Periodic_Advertising_Create_Sync_Cancel操作码)
Parameter Length: 0x02
Parameters: 
  Sync Handle: 0x1234

控制器在接收到这个命令后,将取消与Sync Handle 0x1234关联的周期性广播同步。

请注意,上述示例中的操作码0xXXXX和Sync Handle 0x1234都是假设的值,实际使用时需要替换为蓝牙核心规范中定义的实际值和之前通过HCI_LE_Periodic_Advertising_Create_Sync命令获得的实际Sync Handle。

三、返回事件和参数说明

3.1. HCI_Command_Complete 事件

  • 无论HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令是否成功,控制器都会向主机发送一个HCI_Command_Complete事件。这个事件的主要作用是告知主机,取消创建同步的命令已经执行完毕,无论取消操作最终是否成功,该事件都会被发送。
  • 主机接收到这个事件后,就能够知道控制器已经处理完了自己发出的取消命令请求,从而可以根据这个反馈继续后续的操作规划,比如等待进一步的结果反馈或者进行其他相关的蓝牙操作处理。
  • 这个事件包含了命令的完成状态(成功或失败)以及任何相关的返回参数。
  • 如果命令失败,HCI_Command_Complete事件将包含错误代码,说明失败的原因(例如,如果尝试取消一个没有活动的同步,可能会返回Command Disallowed错误)。

3.2. HCI_LE_Periodic_Advertising_Sync_Established 事件

  • 在HCI_Command_Complete事件发送之后,如果取消 HCI_LE_Periodic_Advertising_Create_Sync命令的操作是成功的,那么控制器会接着向主机发送一个HCI_LE_Periodic_Advertising_Sync_Established事件。这个事件原本通常是在成功建立周期性广播同步(HCI_LE_Periodic_Advertising_Create_Sync)关系时才会发送。【0x0044】HCI_LE_Periodic_Advertising_Create_Sync全面解析-CSDN博客
  • 但在这里,由于是取消了创建同步的操作且取消成功,所以也会发送这个事件来告知主机相关情况。并且,在这个事件中会附带一个特定的错误代码 “Operation Cancelled by Host (0x44)”,以此明确地告诉主机,之前发起的创建同步操作已经被主机成功取消了。
  • 主机接收到这个事件及对应的错误代码后,就可以确切地知道创建同步操作已被取消,进而可以对自身的蓝牙连接状态、资源分配等方面进行相应的调整,比如释放原本为可能建立的同步关系所预留的资源等。

3.3. 关于事件屏蔽

在实际的蓝牙设备设置或应用开发中,可能存在对某些事件进行屏蔽的情况。比如,在一些对功耗要求极为严格的低功耗蓝牙设备应用场景中,为了进一步节省电量,可能会选择屏蔽一些非关键的事件通知。但如果没有进行特意的屏蔽设置,那么上述的这些事件就会按照正常流程生成并发送给主机,以保证主机能够准确知晓命令的执行情况以及相关的结果状态。

3.4 Status

Status参数是返回HCI_Command_Complete事件所包含的状态,表示命令的执行结果。

  • Size(大小): 1 octet(1字节),即此状态字段占用1个字节的空间。
  • 0x00: 表示HCl_LE_Periodic_Advertising_Create_Sync_Cancel命令成功执行。
  • 0x01至0xFF: 表示HCl_LE_Periodic_Advertising_Create_Sync_Cancel命令执行失败。在这种情况下,应参考蓝牙核心规范[Vol 1] Part F中的控制器错误代码列表,以获取具体的错误代码和描述。这些错误代码提供了关于命令失败原因的详细信息。蓝牙Controller错误代码全面概览_蓝牙错误码04-CSDN博客

四、命令执行流程

以下是HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令执行流程。

4.1. 命令发送阶段

  • 确定取消需求:主机判断是否需要取消正在等待处理的周期性广播同步创建命令。
  • 构建命令包:主机按照蓝牙核心规范构建HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令,包括操作码和必要的参数(如同步句柄)。
  • 发送命令:主机通过HCI接口(如UART、SPI等)将命令发送给蓝牙控制器。

4.2. 命令接收与验证阶段

  • 接收命令:蓝牙控制器接收主机发送的HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令。
  • 验证命令合法性:控制器检查命令格式是否正确,包括操作码和参数部分。
  • 检查是否有对应的创建同步命令:控制器检查是否存在正在处理的HCI_LE_Periodic_Advertising_Create_Sync命令。如果不存在,控制器返回错误代码“Command Disallowed(0x0C)”给主机。

4.3. 取消操作阶段

  • 定位目标创建同步操作:控制器根据命令中的参数或内部状态记录,定位到要取消的HCI_LE_Periodic_Advertising_Create_Sync命令相关的资源和处理流程。
  • 释放资源和停止处理:控制器释放与该创建同步操作相关的资源,如缓存区、定时器、通信通道等。停止正在进行的与创建同步相关的处理步骤。

4.4. 事件生成与反馈阶段

  • 发送HCI_Command_Complete事件:控制器生成并发送HCI_Command_Complete事件给主机,告知命令处理完毕。
  • (可选)发送HCI_LE_Periodic_Advertising_Sync_Established事件
    • 如果取消操作成功,并且控制器选择发送此事件(这取决于具体实现),则控制器会附带错误代码“Operation Cancelled by Host(0x44)”发送HCI_LE_Periodic_Advertising_Sync_Established事件给主机。
    • 注意:根据蓝牙核心规范,这一步骤是可选的,因为HCI_Command_Complete事件已经足够告知主机命令的处理结果。如果控制器选择发送HCI_LE_Periodic_Advertising_Sync_Established事件,它应该清晰地表明这是一个取消操作的结果。

4.5. 示例代码

下面提供一个简化的伪代码或框架,以帮助理解HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令执行流程。

请注意,以下代码是一个高度简化的示例,并不包含实际的硬件接口调用或蓝牙协议栈的具体实现。在实际项目中,需要根据所使用的硬件平台和蓝牙协议栈的API进行相应的修改和补充。

代码语言:javascript
复制
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

// 假设的蓝牙控制器接口函数(这些函数在实际项目中需要根据硬件和协议栈进行实现)
bool hci_send_command(uint16_t opcode, uint8_t *parameters, uint8_t parameter_length);
void hci_event_callback(uint16_t event_code, uint8_t *event_data, uint8_t event_length);

// 假设的同步句柄(在实际项目中,这个值应该由之前的操作获取)
#define SYNC_HANDLE 0x0001

// 命令操作码(这些值应该根据蓝牙核心规范进行定义)
#define HCI_LE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL 0xXXXX // 替换为实际的操作码

// 事件操作码(这些值应该根据蓝牙核心规范进行定义)
#define HCI_COMMAND_COMPLETE_EVENT 0x0E
#define HCI_LE_PERIODIC_ADVERTISING_SYNC_ESTABLISHED_EVENT 0xYY // 可能不存在,取决于实现

// 错误代码(这些值应该根据蓝牙核心规范进行定义)
#define COMMAND_DISALLOWED 0x0C
#define OPERATION_CANCELLED_BY_HOST 0x44

// 伪代码:发送HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令
void send_create_sync_cancel_command() {
    uint8_t parameters[2] = {0x00, SYNC_HANDLE & 0xFF}; // 假设同步句柄为16位,这里只发送低8位作为示例
    // 注意:在实际项目中,可能需要发送完整的16位同步句柄,以及其他可能的参数

    if (hci_send_command(HCI_LE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL, parameters, sizeof(parameters))) {
        printf("Command sent successfully.\n");
    } else {
        printf("Failed to send command.\n");
    }
}

// 伪代码:处理HCI事件回调
void handle_hci_event(uint16_t event_code, uint8_t *event_data, uint8_t event_length) {
    if (event_code == HCI_COMMAND_COMPLETE_EVENT) {
        // 解析命令完成事件,检查状态码
        uint8_t status = event_data[1];
        if (status == 0) {
            printf("Command completed successfully.\n");
            // 根据需要执行后续操作,如释放资源等
        } else {
            printf("Command failed with status code 0x%02X.\n", status);
            // 根据错误代码执行相应的错误处理
        }
    } else if (event_code == HCI_LE_PERIODIC_ADVERTISING_SYNC_ESTABLISHED_EVENT) {
        // 注意:这个事件可能是可选的,取决于蓝牙控制器的实现
        // 解析同步建立事件,检查是否是因为取消操作而触发的
        uint8_t status = event_data[X]; // X是状态码在事件数据中的偏移量,需要根据你的协议栈实现来确定
        if (status == OPERATION_CANCELLED_BY_HOST) {
            printf("Periodic advertising sync established event received, operation cancelled by host.\n");
        } else {
            // 处理其他可能的同步建立事件
        }
    }
    // 处理其他可能的事件代码...
}

// 主函数(示例)
int main() {
    // 初始化蓝牙控制器接口(这部分代码取决于你的硬件和协议栈)
    // ...

    // 发送取消同步创建命令
    send_create_sync_cancel_command();

    // 在实际应用中,需要一个事件循环来接收和处理来自蓝牙控制器的回调事件
    // 这里使用一个简单的无限循环作为示例(在实际项目中,应该使用更合适的机制,如RTOS任务、线程或中断)
    while (1) {
        // 假设hci_event_callback函数会在有事件时由蓝牙控制器接口调用
        // 在这个示例中,我们没有实现这个机制,所以这里只是一个空循环
        // 在实际项目中,应该在这里等待并处理事件
    }

    // 注意:在实际项目中,应该有一个适当的退出机制来终止程序(如用户输入、系统关闭等)
    // 这个示例中的无限循环只是为了说明事件处理的概念

    return 0;
}

// 假设的蓝牙控制器接口函数实现(这些函数在实际项目中需要根据硬件和协议栈进行实现)
// 这里只提供函数声明,不实现具体功能
bool hci_send_command(uint16_t opcode, uint8_t *parameters, uint8_t parameter_length) {
    // 实现发送HCI命令到蓝牙控制器的功能
    // ...
    return true; // 假设发送成功
}

void hci_event_callback(uint16_t event_code, uint8_t *event_data, uint8_t event_length) {
    // 实现处理来自蓝牙控制器的HCI事件的功能
    // 调用handle_hci_event函数来处理事件
    handle_hci_event(event_code, event_data, event_length);
}

请注意,这个示例代码中的函数hci_send_commandhci_event_callback是假设的,并且没有实际实现。在实际项目中,需要根据硬件平台和蓝牙协议栈的API来实现这些函数。此外,需要根据蓝牙控制器和协议栈的文档来确定正确的操作码、事件码、参数格式和错误代码。

另外,由于BLE技术的复杂性和多样性,不同的硬件平台和蓝牙协议栈可能会有不同的API和接口。因此,在实际项目中,需要仔细阅读并理解所使用的硬件平台和蓝牙协议栈的文档。

五、使用场景

5.1. 资源管理

  • 内存资源优化
    • 场景描述:在蓝牙设备中,当尝试建立周期性广播同步时,可能会预先分配一定的内存。如果设备内存有限,且发现内存占用过高,可能影响其他重要功能,此时可以使用该命令取消同步创建,释放内存资源。
    • 应用实例:智能家居设备在尝试与多个传感器建立同步时,发现内存资源紧张,选择取消部分低优先级传感器的同步创建。
  • 处理器资源分配
    • 场景描述:创建同步操作可能会占用处理器时间。如果处理器正在处理多个高优先级任务,且创建同步操作导致处理器负载过高,可以取消同步创建,合理分配处理器资源。
    • 应用实例:智能手表在同时处理健康监测数据实时分析和用户交互响应时,发现创建同步操作导致处理器负载过高,选择取消同步创建,确保关键任务流畅运行。

5.2. 连接策略调整

  • 优先连接其他设备
    • 场景描述:当蓝牙设备同时尝试与多个低功耗蓝牙设备建立周期性广播同步时,可能会根据设备的优先级或用户需求改变连接策略。
    • 应用实例:智能手机在同时尝试与多个蓝牙设备建立同步时,根据用户需求优先连接健康监测设备,取消与其他设备的同步创建。
  • 动态网络环境适应
    • 场景描述:在复杂多变的蓝牙网络环境中,设备之间的连接关系可能会频繁变化。如果某些同步创建变得不必要或不合适,可以取消相应的同步创建操作。
    • 应用实例:智能家居网关在检测到新设备加入或设备故障时,取消与故障设备或低优先级设备的同步创建,以适应新的网络环境。

5.3. 用户操作干预

  • 用户取消同步请求
    • 场景描述:在用户操作界面中,用户可能会直接通过应用程序手动取消正在进行的周期性广播同步创建操作。
    • 应用实例:用户在连接新的蓝牙设备过程中,发现连接的不是自己想要的设备,通过应用程序触发取消同步创建操作。
  • 避免不必要的同步
    • 场景描述:当用户已经通过其他方式获取了足够的设备信息,或者设备已经处于某种合适的连接状态时,可以选择取消正在进行的同步创建操作。
    • 应用实例:用户已经通过手动配对获取了蓝牙耳机的信息,选择取消正在进行的同步创建操作,避免额外的资源占用和潜在的安全风险。

5.4. 错误恢复

  • 创建同步出错补救
    • 场景描述:如果在创建周期性广播同步的过程中出现错误,且无法通过其他方式解决,可以使用该命令终止创建同步操作,然后重新评估同步的必要性和条件。
    • 应用实例:蓝牙设备在尝试与传感器建立同步时,由于同步参数不匹配导致创建失败,选择取消同步创建,纠正错误后再尝试建立同步。
  • 防止错误同步建立
    • 场景描述:当设备检测到可能会建立一个错误的或不符合预期的周期性广播同步时,可以通过该命令取消同步创建,保护设备的安全性和正常功能运行。
    • 应用实例:蓝牙设备在接收到错误的同步请求或识别出恶意设备试图建立同步时,选择取消同步创建,确保设备安全。

HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令在资源管理、连接策略调整、用户操作干预和错误恢复等多个场景中具有重要的应用价值。通过合理使用该命令,可以优化设备资源利用、提高连接效率、增强用户体验和确保设备安全。

六、注意事项

针对HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令的执行,以下是对注意事项的详细梳理。

6.1. 命令执行前的准备

  • 确认广播状态:在执行取消同步命令之前,必须确认目标周期性广播是处于已同步状态。如果广播未同步或已取消,执行此命令可能无效或产生错误。
  • 检查同步创建状态:确保HCI_LE_Periodic_Advertising_Create_Sync命令正在等待处理或已成功创建同步。如果同步创建命令尚未完成或失败,执行取消同步命令可能会返回错误。
  • 验证同步对象合法性:要确保打算取消同步创建的对象是合法的,包括检查同步对象的设备地址、广播类型等信息是否符合预期。

6.2. 命令执行时的注意事项

  • 命令格式与参数:确保命令的格式正确,参数齐全且符合蓝牙规范的要求。
  • 错误处理:蓝牙控制器在执行命令时可能会返回错误代码。在执行取消同步命令后,应检查返回的状态码,并根据错误代码采取相应的处理措施。
  • 避免重复执行:一旦成功执行了取消同步命令,就不应再重复执行该命令,以避免不必要的资源消耗或产生冲突。

6.3. 命令执行后的影响

  • 同步状态:执行取消同步命令后,目标周期性广播的同步状态将被取消,蓝牙设备将不再接收来自该广播的周期性数据。
  • 资源释放:取消同步后,蓝牙控制器可能会释放与该同步相关的资源。因此,在执行取消同步命令后,应注意检查并管理相关资源的使用情况。
  • 后续操作:根据应用需求,取消同步后可能需要进行其他操作,如重新同步、关闭广播或执行其他相关任务。在执行这些操作之前,应确保已正确取消同步并释放了相关资源。

6.4. 兼容性考虑

  • 蓝牙版本与实现:不同的蓝牙版本和实现可能支持不同的命令和功能。因此,在执行取消同步命令之前,应确保目标蓝牙设备支持该命令,并了解其具体实现方式。
  • 设备兼容性:在与其他蓝牙设备进行交互时,应注意设备的兼容性。特别是当使用不同品牌或型号的蓝牙设备时,应确保它们之间的通信协议和参数设置相匹配。

6.5. 参数配置与优化影响

  • 广播间隔敏感性:周期性广播的间隔会影响取消同步操作的效果。在设计设备通信策略时,需要考虑广播间隔与取消同步操作之间的协调。
  • 数据长度和处理:广播数据的长度也很关键。设备需要根据广播数据的长度和处理方式,合理安排取消同步操作的时机。

6.6. 资源管理与释放问题

  • 资源释放完整性:当取消同步创建操作后,要确保与该同步操作相关的所有资源都被正确释放。
  • 资源释放顺序和时机:注意资源释放的顺序和时机,以避免数据丢失或系统出现异常。

6.7. 错误处理和恢复机制

  • 错误代码处理:熟悉并正确处理可能返回的错误代码,并根据不同的错误代码采取相应的应对策略。
  • 恢复策略规划:在取消同步创建操作出现错误后,要有一个合理的恢复策略,如重新评估同步的必要性、调整设备状态以重新尝试取消操作等。

执行HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令时需要注意多个方面,包括命令执行前的准备、命令执行时的注意事项、命令执行后的影响、兼容性考虑、参数配置与优化影响、资源管理与释放问题以及错误处理和恢复机制等。通过仔细规划和错误处理,可以确保该命令的有效性和可靠性。

综上所述,HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令是BLE协议中用于管理周期性广播同步的重要工具。通过正确使用该命令,设备可以有效地控制其资源使用,并优化电源消耗。理解这个命令的工作机制和使用场景对于开发高效、可靠的BLE应用至关重要。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、命令概述
  • 二、命令格式
    • 2.1. 一般格式
    • 2.2. 示例格式
    • 2.3. 示例说明
  • 三、返回事件和参数说明
    • 3.1. HCI_Command_Complete 事件
    • 3.2. HCI_LE_Periodic_Advertising_Sync_Established 事件
    • 3.3. 关于事件屏蔽
    • 3.4 Status
  • 四、命令执行流程
    • 4.1. 命令发送阶段
    • 4.2. 命令接收与验证阶段
    • 4.3. 取消操作阶段
    • 4.4. 事件生成与反馈阶段
    • 4.5. 示例代码
  • 五、使用场景
    • 5.1. 资源管理
    • 5.2. 连接策略调整
    • 5.3. 用户操作干预
    • 5.4. 错误恢复
  • 六、注意事项
    • 6.1. 命令执行前的准备
    • 6.2. 命令执行时的注意事项
    • 6.3. 命令执行后的影响
    • 6.4. 兼容性考虑
    • 6.5. 参数配置与优化影响
    • 6.6. 资源管理与释放问题
    • 6.7. 错误处理和恢复机制
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档