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

【0x0044】HCI_LE_Periodic_Advertising_Create_Sync全面解析

作者头像
byte轻骑兵
发布2026-01-20 20:11:38
发布2026-01-20 20:11:38
1530
举报

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

一、命令概述

1.1. 命令功能

HCI_LE_Periodic_Advertising_Create_Sync 命令用于与来自广播者的周期性广播序列进行同步,并开始接收周期性广播数据包。这种同步机制是在蓝牙5.1及更高版本中引入的,旨在支持更加低功耗和高效的数据广播和接收。

1.2. 使用条件

  • 扫描状态:虽然此命令可以在扫描启用或禁用的情况下发出,但同步实际上只能在扫描启用时发生。如果扫描被禁用,则不会尝试进行同步。这意味着,在命令执行期间,如果扫描被禁用,那么即使命令已经发出,也不会建立同步。
  • 命令挂起:在命令挂起期间(即等待命令响应的过程中),可以启用或禁用扫描(通过 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命令的格式通常包括命令操作码、命令参数等部分。具体格式可能因不同的蓝牙实现和版本而略有差异,以下是一个通用的格式示例:

  • 命令操作码:这是一个固定的16位值,用于标识HCI_LE_Periodic_Advertising_Create_Sync命令。在蓝牙核心规范中,每个HCI命令都有一个唯一的操作码。
  • 命令参数:这些参数用于指定同步接收者想要与哪个周期性广播者同步,以及同步的具体参数。这些参数可能包括广播者的地址类型、地址、广播集标识符(SID)、同步超时、跳过数和同步周期等。

2.1. 格式示例

以下是一个HCI_LE_Periodic_Advertising_Create_Sync命令的格式示例,其中包含了命令操作码和假设的命令参数:

代码语言:javascript
复制
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、超时值、跳过数和同步周期都是假设的,实际使用时需要根据具体的蓝牙设备和规范来确定。

2.2. 响应参数

  • 如果命令成功执行,将返回以下参数:
    • Status (1 octet): 命令执行状态。0x00表示成功。
    • Sync Handle (2 octets): 返回的同步句柄,用于后续的操作,如读取同步信息或删除同步。

三、命令参数解析

3.1. Options

Options参数在BLE的周期性广播同步创建过程中起着关键作用。它用于确定是否使用周期性广播者列表(Periodic Advertiser List),以及是否初始启用或禁用针对此周期性广播序列的HCI_LE_Periodic_Advertising_Report事件,同时控制是否过滤重复报告。

  • 是否使用周期性广播者列表
    • 当Options参数设置为使用周期性广播者列表时,Advertising_SID(广播标识符)、Advertiser_Address_Type(广播地址类型)和Advertiser_Address(广播地址)这三个参数将被忽略。因为同步将基于周期性广播者列表中的广播者进行,而不是基于这三个参数指定的单个广播者。
    • 相反,如果Options参数设置为不使用周期性广播者列表,则这三个参数将指定要监听的周期性广播设备。意味着同步将基于这些参数来识别并监听特定的周期性广播。
  • 是否初始启用HCI_LE_Periodic_Advertising_Report事件
    • Options参数还决定了是否在创建同步时立即启用HCI_LE_Periodic_Advertising_Report事件。如果启用,则接收者将开始接收来自指定周期性广播设备的广播报告。
    • 如果禁用,则接收者将不会立即开始接收这些报告,但可以在稍后通过其他命令或操作来启用它们。
  • 是否过滤重复报告
    • Options参数还包含了一个用于控制是否过滤重复报告的选项。如果启用过滤,则相同的广播数据可能只被报告一次,从而减少了不必要的数据传输和处理。
    • 如果禁用过滤,则接收者可能会收到多个相同的广播报告,这取决于周期性广播的发送频率和接收者的处理能力。

注意事项

  • 在使用Options参数时,需要确保它与所使用的蓝牙协议栈或设备兼容。不同的蓝牙协议栈或设备可能具有不同的实现方式和参数要求。
  • 在设置Options参数时,需要仔细考虑其各个位字段的值,以确保它们正确地反映了所需的功能和行为。
  • 如果Options参数包含保留位,则这些位应设置为0,以符合蓝牙核心规范的要求。保留位用于未来扩展和兼容性考虑,不应被用于当前实现中的任何功能。

3.2. Advertising_SID

Advertising_SID(广播标识符)参数在BLE的周期性广播同步过程中起着关键作用。它允许设备根据特定的广播标识符来识别并同步周期性广播,通过合理配置广播标识符的值,可以提高BLE广播的接收效率和准确性,从而满足不同的应用需求。

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

  • 广播识别:Advertising_SID 用于识别特定的周期性广播。在BLE中,广播是设备向周围广播其存在和可用性的方式。周期性广播是一种特殊类型的广播,它以固定的时间间隔重复发送。
  • 同步建立:当一个BLE设备想要接收来自另一个设备的周期性广播时,它需要使用Advertising_SID来与接收到的广播进行匹配。只有匹配成功时,才能建立同步,从而确保设备能够持续接收并处理这些周期性广播。
  • 过滤与效率:使用Advertising_SID可以提高广播接收的效率。通过只关注具有特定Advertising_SID的广播,设备可以减少不必要的处理开销,并更快地找到它感兴趣的广播。

3.3. Advertiser_Address_Type

Advertiser_Address_Type(广播地址类型) 参数定义了正在发送广播的设备所使用的地址类型。它告诉接收设备如何解析广播中的广播地址字段。广播地址类型对于建立BLE连接和识别广播源至关重要。

Advertiser_Address_Type 参数的大小通常为1个字节(8位)。意味着它可以表示256个不同的值(从0x00到0xFF)。但Advertiser_Address_Type 参数的常用的值包括:

  • 0x00:表示公共设备地址(Public Device Address)或公共身份地址(Public Identity Address)。这是一个全球唯一的地址,由蓝牙SIG分配给设备制造商。它用于标识设备的物理身份,并在设备的整个生命周期内保持不变。
  • 0x01:表示随机设备地址(Random Device Address)或随机静态身份地址(Random Static Identity Address)。这是一个在设备每次启动或重新配置时生成的随机地址。它用于提供一定程度的隐私保护,防止设备被跟踪。随机设备地址可以是可解析的(Resolvable)或不可解析的(Non-resolvable),具体取决于地址的生成方式和BLE规范的版本。
  • All other values:预留给未来使用。这些值在当前的BLE规范中未定义,但可能会在未来的规范版本中引入新的地址类型。

蓝牙MAC地址-CSDN博客

注意事项

  • 在使用Advertiser_Address_Type 参数时,需要确保它与广播地址字段的值相匹配。如果广播商地址类型指示为公共设备地址,但广播商地址字段的值却是一个随机地址,那么这可能会导致连接失败或通信错误。
  • 不同的BLE设备和协议栈可能对Advertiser_Address_Type 参数的实现和支持有所不同。在开发BLE应用时,需要确保所使用的设备和协议栈都支持所需的广播地址类型功能。

3.4. Advertiser_Address

广播地址(Advertiser_Address)用于标识正在发送广播的设备。它可以是设备的公共设备地址(Public Device Address)或随机设备地址(Random Device Address)。广商地址的主要功能是帮助接收设备识别正在发送广播的设备,并与之建立连接(如果需要的话)。

周期性广播者的地址类型可以是公共地址(0x00)或随机地址(0x01)蓝牙MAC地址-CSDN博客

注意事项:在使用广播地址时,需要注意隐私保护的问题。使用随机设备地址可以减少设备被跟踪的风险。

3.5. Skip

Skip 参数在BLE的周期性广播(Periodic Advertising)模式中非常重要,其用于指定在成功接收到一个周期性广播数据包后,接收器可以跳过的最大连续周期性广播事件数。通过调整这个参数,接收器可以控制自己接收广播数据的速率,从而优化资源使用和电池寿命。

  • 范围值0x0000 to 0x01F3(十进制的0到499)。Skip参数的值在这个范围内是有效的。其中,0x0000表示不跳过任何事件,而0x01F3是允许跳过的最大事件数。

Skip 参数在多种BLE应用场景中都非常有用,包括但不限于:

  • 资源优化:通过调整 Skip 参数,接收器可以根据自己的处理能力和资源限制来优化广播数据的接收。例如,在资源受限的设备上,可以通过增加 Skip 参数的值来减少广播数据的接收频率,从而节省处理时间和电池寿命。
  • 数据同步:在需要同步多个设备的数据时,可以通过设置适当的 Skip 参数来确保接收器能够在需要时接收到广播数据,同时避免不必要的数据接收和处理。
  • 节能模式:在BLE的节能模式中,Skip 参数可以帮助接收器在不需要频繁接收广播数据的情况下进入低功耗状态,从而延长设备的电池寿命。

注意事项:在使用 Skip 参数时,需要确保它与周期性广播事件的发送频率相匹配。如果 Skip 参数的值设置得过大,可能会导致接收器错过重要的广播数据。相反,如果 Skip 参数的值设置得过小,可能会导致接收器接收到过多的广播数据,从而增加处理负担和功耗。

3.6. Sync_Timeout

Sync_Timeout,即同步超时参数,是一个关键的时间阈值,用于衡量BLE接收器与周期性广播事件保持同步的能力。当接收器在Sync_Timeout所设定的时间内未能成功接收到预期的周期性广播事件时,将视为同步丢失,并可能需要重新启动同步过程。

3.6.1. Sync_Timeout参数的设置与计算
  • 值域:Sync_Timeout参数的值N为0x000A(十进制10)到0x4000(十进制16384)之间的任意整数。
  • 时间范围:对应的时间范围是100毫秒(N=10)到163.84秒(N=16384)。
  • 计算公式:时间计算公式为“Time = N x 10 ms”,其中N的值决定了同步超时时间的长短。
3.6.2. Sync_Timeout参数的应用场景
  • 周期性数据收集:在需要定期从BLE设备收集数据的场景中,Sync_Timeout参数能够确保数据的连续性和准确性,防止接收器因错过太多周期性广播事件而丢失同步。
  • 低功耗模式:在BLE的低功耗模式中,Sync_Timeout参数有助于接收器在不需要频繁接收数据时进入低功耗状态,同时确保在需要时能够快速恢复同步。
  • 多设备同步:在需要同步多个BLE设备的场景中,Sync_Timeout参数能够确保所有设备按照预定的时间间隔接收到周期性广播事件,实现设备之间的同步。
3.6.3. 注意事项
  • 在设置Sync_Timeout参数时,需要综合考虑接收器的处理能力、电池寿命以及周期性广播事件的发送频率。
  • 如果Sync_Timeout设置得太短,可能会导致接收器频繁尝试重新同步,增加功耗和处理负担。
  • 如果Sync_Timeout设置得太长,可能会导致接收器在长时间未接收到周期性广播事件后才意识到同步已经丢失,从而错过重要数据。

Sync_Timeout参数在BLE通信中发挥着至关重要的作用。通过合理设置和使用该参数,可以确保BLE通信的可靠性、性能和低功耗特性,同时满足各种应用场景的需求。

例如,假设有一个蓝牙传感器设备在按照一定的时间间隔(比如每10秒)进行周期性广播,接收设备在接收到一个数据包后就开始计时。如果Sync_Timeout参数被设置为30秒,那么接收设备在30秒内必须再次接收到来自该传感器设备的广播数据包,否则接收设备就会判定与该传感器设备的同步状态丢失。 这种同步丢失可能会导致接收设备需要重新进行同步操作,或者采取其他错误处理机制,比如停止接收该设备的广播数据、向用户发送同步丢失的通知等。这一参数有助于确保接收设备和广播设备之间的数据传输准确性和稳定性,避免因长时间未接收到广播数据而导致的数据不一致或通信中断等问题。

3.7. Sync_CTE_Type

Sync_CTE_Type 参数用于指定蓝牙设备是否仅与包含特定类型常音调扩展(Constant Tone Extension,CTE)的周期性广播进行同步。当该参数设置为0时,表示CTE的存在与否对于同步过程来说是不重要的。

在蓝牙技术中,CTE(Constant Tone Extension,常音调扩展)是一种用于增强测距和定位能力的信号扩展。它通过在数据传输的末尾添加一个或多个常音调信号,使得接收设备能够更准确地测量信号的传播时间,从而提高定位精度。

3.7.1. 参数设置与行为

Sync_CTE_Type 是指在进行蓝牙通信时,设备之间用于同步的CTE信号的特定类型。不同的CTE类型可能具有不同的调制方式、带宽或持续时间等特性,这些特性决定了CTE信号的传输性能和定位精度。

  • Sync_CTE_Type = 0:表示CTE的有无对同步过程无影响,蓝牙设备可以与任何周期性广播进行同步,无论其是否包含CTE或CTE的类型如何。
  • Sync_CTE_Type ≠ 0:表示蓝牙设备仅与包含特定类型CTE的周期性广播进行同步。如果周期性广播中的CTE类型与Sync_CTE_Type指定的类型不匹配,那么将根据Options参数的设置来决定设备的行为。
  • Sync_CTE_Type变更后的同步:当扫描器(Scanner)已经与周期性广播(Periodic Advertising)同步后,如果周期性广播(Advertiser)更改了常音调扩展(CTE)的类型,扫描器的链路层(Link Layer)将保持同步。意味着CTE类型的变更不会影响已经建立的同步关系。
3.7.2. CTE类型不匹配时的处理

当蓝牙设备尝试与周期性广播进行同步,但发现CTE类型不匹配时,设备的行为将取决于Options参数中的位0的设置:

  • 位0设置(Options[0] = 1):如果Options参数的位0被设置,表示设备在CTE类型不匹配时采取灵活的处理方式。此时,蓝牙设备将忽略当前周期性广播的地址和SID(Service Instance ID,服务实例标识),并继续搜索其他可能的周期性广播以尝试同步。
  • 位0未设置(Options[0] = 0):如果Options参数的位0未被设置,表示设备在CTE类型不匹配时采取严格的处理方式。此时,蓝牙设备将取消同步过程,并报告一个错误代码,即“不支持的远程功能”(Unsupported Remote Feature,错误代码0x1A)。
3.7.3. 实际应用中的考虑
  • 灵活性与控制Sync_CTE_Type参数为蓝牙设备提供了同步过程中的灵活性和控制权。
  • 互操作性与兼容性:该参数有助于在包含多个蓝牙设备的环境中实现设备间的相互同步,确保互操作性和兼容性。
  • 类型定义与选择:同步CTE类型通过特定的参数或配置来定义,设备之间需要协商并选择共同的同步CTE类型。
  • 同步过程:一旦选择了同步CTE类型,设备将按照该类型的特性来发送和接收CTE信号,以测量信号的传播时间并计算设备间的距离或位置。
  • 性能考虑:不同的同步CTE类型对传输性能和定位精度有不同的影响,需根据应用场景和需求进行选择。
  • 应用场景:高精度定位场景可能选择具有更宽带宽和更高性能的CTE类型;对能耗和复杂度有严格要求的场景则可能选择更低性能和更低能耗的CTE类型。

Sync_CTE_Type参数是蓝牙设备在同步周期性广播时的重要工具,它提供了对CTE类型要求的明确指定,并根据Options参数的设置来决定在CTE类型不匹配时的行为。通过仔细配置这些参数,可以确保设备在同步过程中满足特定的应用需求,提高蓝牙通信的灵活性和可靠性。

四、错误处理规则

4.1. Sync_CTE_Type参数设置错误

  • 问题描述:主机在发送命令时,将Sync_CTE_Type参数的所有非保留位都设置为1。
  • 错误代码Command Disallowed(0x0C)
  • 原因Sync_CTE_Type参数的设置超出了控制器支持的范围。
  • 处理:控制器应返回错误代码,并停止处理该命令。

4.3. Skip参数与同步超时

  • 问题描述:Skip参数的设置可能导致控制器跳过数据包,进而影响同步。
  • 处理:不论Skip参数的值如何设置,控制器都应在Sync_Timeout超时之前停止跳过数据包,以确保及时接收到必要的同步信息。

4.4. 命令冲突

  • 问题描述:主机在另一个HCI_LE_Periodic_Advertising_Create_Sync命令挂起时发出新命令。
  • 错误代码Command Disallowed(0x0C)
  • 原因:不允许同时执行多个同步创建命令,以避免资源冲突和命令处理混乱。
  • 处理:控制器应返回错误代码,并停止处理新命令。

4.5. 已存在连接

  • 问题描述:主机发出的命令中的Advertising_SIDAdvertiser_Address_TypeAdvertiser_Address与控制器已经同步的周期性广播序列相同。
  • 错误代码Connection Already Exists(0x0B)
  • 原因:已经存在一个与指定广播商同步的连接。
  • 处理:控制器应返回错误代码,并拒绝创建新的同步关系。

4.6. 资源不足

  • 问题描述:主机发出命令,但控制器没有足够的资源来处理更多的周期性广播序列。
  • 错误代码Memory Capacity Exceeded(0x07)
  • 原因:控制器的内存资源已经耗尽。
  • 处理:控制器应返回错误代码,并拒绝接受新的同步请求。

4.7. Options参数位1和位2的设置

  • 情况一
    • 问题描述Options参数的位1设置为1,且控制器支持周期性广播ADI支持功能。
    • 处理:控制器应忽略位2的设置。
  • 情况二
    • 问题描述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)
    • 原因:控制器无法执行必要的命令来建立同步关系。
    • 处理:控制器应返回错误代码,并标记同步失败。

这些错误处理规则确保了蓝牙设备在周期性广播同步过程中的稳定性和兼容性。通过遵循这些规则,设备可以更有效地利用蓝牙技术进行通信和数据传输,同时减少因错误配置或资源不足而导致的同步失败。在实际应用中,应仔细考虑这些规则,并在设备设计和实现中加以遵循。

五、返回HCI_Command_Status 事件

当主机(Host)向控制器(Controller)发送 HCI_LE_Periodic_Advertising_Create_Sync 命令时,控制器会首先返回一个 HCI_Command_Status 事件给主机。这个事件用于告知主机命令是否已被控制器接收并处理。

  • 作用:确认命令的接收状态。
  • 包含信息:通常包括命令的OpCode(操作码)、状态码(表示命令是否被成功接收或存在错误)以及任何相关的错误信息。

5.1. HCI_LE_Periodic_Advertising_Sync_Established 事件

当控制器开始接收到周期性广播数据包时,它会生成一个 HCI_LE_Periodic_Advertising_Sync_Established 事件并发送给主机。这个事件标志着周期性广播同步的建立。

  • 作用:通知主机周期性广播同步已经建立。
  • 包含信息
    • 同步句柄(Sync Handle):用于标识这个同步关系的唯一标识符。
    • 广播地址类型(Advertiser Address Type):广播设备的地址类型。
    • 广播地址(Advertiser Address):广播设备的地址。
    • 广播SID(Advertising SID):广播集的标识符。
    • 周期广播间隔(Periodic Advertising Interval):周期性广播的间隔。
    • 同步超时(Sync Timeout):如果在指定时间内没有接收到周期性广播数据包,同步将被取消。
    • 状态(Status):表示同步建立的状态,成功或失败(如同步超时)。

5.2. HCI_LE_Periodic_Advertising_Report 事件

如果报告功能被启用,当控制器接收到周期性广播数据包时,会生成 HCI_LE_Periodic_Advertising_Report 事件并发送给主机。这个事件包含了接收到的广播数据包的内容。

  • 作用:提供接收到的周期性广播数据包的内容。
  • 包含信息
    • 同步句柄(Sync Handle):标识这个同步关系的唯一标识符。
    • 数据包计数器(Packet Counter):接收到的数据包的序列号。
    • 数据包内容(Data):广播数据包的实际内容。

5.3. 同步超时与状态设置

如果在首次监听后的6个周期性广播事件内,控制器没有接收到任何周期性广播数据包,它将生成一个 HCI_LE_Periodic_Advertising_Sync_Established 事件,但此时的状态(Status)将被设置为 Connection Failed to be Established / Synchronization Timeout(0x3E)

  • 作用:通知主机同步未能建立,因为超过了同步超时时间。

5.4. 取消同步与事件生成

HCI_LE_Periodic_Advertising_Sync_Established 事件也可能由于 HCI_LE_Periodic_Advertising_Create_Sync_Cancel 命令而被发送。这表示同步被主动取消,此时事件的状态可能反映了取消操作的结果。

以上这些事件共同构成了蓝牙BLE周期性广播同步过程中的通信机制。它们允许主机和控制器之间有效地交换关于周期性广播同步的建立、数据包的接收以及任何同步失败或取消的信息。在实际应用中,这些事件对于实现稳定的蓝牙通信和数据处理至关重要。

六、命令执行流程

在执行HCI_LE_Periodic_Advertising_Create_Sync命令时,整个流程可以划分为几个关键阶段,每个阶段都有其特定的任务和作用。以下是对整个流程的详细说明。

6.1. 命令准备阶段

  • 目的:确保周期性广播参数和数据已正确配置。
  • 关键步骤
    • 使用HCI_LE_Set_Periodic_Advertising_Parameters命令设置广播参数,如广播间隔、持续时间等。
    • 使用HCI_LE_Set_Periodic_Advertising_Data命令设置广播数据。

6.2. 发送命令阶段

  • 目的:通过蓝牙主机控制器接口(HCI)向蓝牙控制器发送同步创建命令。
  • 关键步骤
    • 主机组装HCI_LE_Periodic_Advertising_Create_Sync命令,包括广播句柄、同步参数等。
    • 主机通过HCI接口发送该命令给蓝牙控制器。

6.3. 控制器处理阶段

  • 目的:蓝牙控制器接收并处理同步创建命令。
  • 关键步骤
    • 控制器接收命令并解析参数。
    • 控制器验证参数的合法性,并检查是否支持该命令。
    • 控制器根据参数执行同步操作,如果参数不合法或不支持该命令,则返回错误响应。

6.4. 返回响应阶段

  • 目的:控制器向主机发送响应事件,告知命令执行结果。
  • 关键步骤
    • 控制器处理完命令后,生成并发送响应事件。
    • 响应事件包含命令的状态码以及可能的额外信息。
    • 主机接收并解析响应事件,根据状态码判断命令是否执行成功。

6.5. 命令接收阶段(控制器向主机反馈)

  • 目的:控制器告知主机命令已被接收。
  • 关键事件
    • 控制器发送HCI_Command_Status事件给主机。
    • 主机接收并解析该事件,了解命令的初步处理状态。

6.6. 同步建立阶段

  • 目的:控制器根据参数准备并尝试建立同步。
  • 关键步骤
    • 控制器解析命令参数,准备同步操作。
    • 如果扫描功能已启用,控制器开始尝试与周期性广播序列同步。
    • 成功同步后,控制器生成并发送HCI_LE_Periodic_Advertising_Sync_Established事件给主机。

6.7. 数据接收与报告阶段(如果启用报告功能)

  • 目的:控制器接收并报告周期性广播数据包。
  • 关键事件
    • 控制器接收周期性广播数据包。
    • 如果报告功能启用,控制器生成并发送HCI_LE_Periodic_Advertising_Report事件给主机。

6.8. 同步超时处理阶段

  • 目的:处理同步失败的情况。
  • 关键步骤
    • 控制器监测接收情况。
    • 如果在指定时间内未接收到周期性广播数据包,控制器生成并发送HCI_LE_Periodic_Advertising_Sync_Established事件,状态设置为同步超时。

6.9. 同步取消情况(特殊情况)

  • 目的:处理同步被取消的情况。
  • 关键步骤
    • 执行HCI_LE_Periodic_Advertising_Create_Sync_Cancel命令取消同步。
    • 控制器生成并发送HCI_LE_Periodic_Advertising_Sync_Established事件,表示同步结束。

6.10. 示例代码

下面提供一个简化的框架,展示HCI_LE_Periodic_Advertising_Create_Sync命令的执行流程。请注意,这个示例不会包含实际的蓝牙硬件交互代码,因为那通常需要特定的硬件抽象层(HAL)或蓝牙协议栈API。

代码语言:javascript
复制
#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*)&param_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_commandhci_event_callback 函数是假设存在的,需要根据所使用的蓝牙协议栈或硬件抽象层提供的API来实现它们。
  • 实际的HCI命令和事件结构体字段会根据蓝牙规范有所不同,需要查阅相关文档来正确填充这些字段。
  • 主循环中应该有一个异步机制来接收和处理来自蓝牙控制器的HCI事件,这通常是通过中断、轮询或异步I/O操作来实现的。
  • 错误处理和资源清理在实际应用中是非常重要的,这里为了简化而省略了部分细节。

整个HCI_LE_Periodic_Advertising_Create_Sync命令执行流程涉及命令准备、发送、控制器处理、返回响应以及后续的同步建立、数据接收与报告、同步超时处理和同步取消等多个阶段。每个阶段都有其特定的任务和作用,共同确保了周期性广播同步操作的正确性和可靠性。通过这一流程,主机可以成功地与周期性广播设备进行同步,并接收来自该设备的周期性广播数据包。

七、应用场景

HCI_LE_Periodic_Advertising_Create_Sync命令在BLE技术中具有特定的应用场景,这些场景主要围绕周期性广播的同步与接收。以下是对该命令应用场景的详细归纳。

7.1. 智能设备连接与交互

  • 场景描述:在智能设备网络中,多个设备可能需要通过BLE进行连接和数据交互。周期性广播允许设备以固定间隔发送相同的数据包,从而便于其他设备发现和连接。
  • 应用方式:使用HCI_LE_Periodic_Advertising_Create_Sync命令,接收设备可以创建与发送周期性广播设备的同步,从而确保在正确的时间间隔内接收数据。

7.2. 数据采集与监测

  • 场景描述:在环境监测、健康监测等应用中,传感器设备需要定期发送数据。这些数据可以通过BLE的周期性广播进行传输。
  • 应用方式:传感器设备使用周期性广播发送数据,而接收设备(如智能手机或中央控制器)则使用HCI_LE_Periodic_Advertising_Create_Sync命令创建同步,以接收并处理这些数据。

7.3. 位置服务与室内定位

  • 场景描述:在商场、医院等大型室内场所中,提供位置服务可以帮助用户快速找到目标位置。BLE的周期性广播可以用于发送设备的位置信息。
  • 应用方式:定位设备(如信标)通过周期性广播发送其位置信息,而用户的移动设备则使用HCI_LE_Periodic_Advertising_Create_Sync命令创建同步,以接收并显示这些信息。

7.4. 可穿戴设备与健康监测

  • 场景描述:可穿戴设备(如智能手表、健身追踪器)需要定期向用户的移动设备发送健康数据(如心率、步数等)。
  • 应用方式:可穿戴设备使用周期性广播发送健康数据,而用户的移动设备则使用HCI_LE_Periodic_Advertising_Create_Sync命令创建同步,以接收并显示这些数据,从而实现对用户健康的持续监测。

7.5. 特定通信需求支持

  • 场景描述:在某些特定应用中,设备之间可能需要以固定间隔发送相同的数据包以满足特定的通信需求。
  • 应用方式:使用HCI_LE_Periodic_Advertising_Create_Sync命令可以创建与周期性广播设备的同步,从而确保数据在正确的时间间隔内被接收和处理。

HCI_LE_Periodic_Advertising_Create_Sync命令在BLE技术中具有广泛的应用场景,特别是在智能设备连接与交互、数据采集与监测、位置服务与室内定位、可穿戴设备与健康监测以及特定通信需求支持等方面发挥着重要作用。

八、注意事项

8.1. 命令参数理解与设置

  • Options参数
    • 精确理解Options参数中的每一位设置,确保它们符合应用需求。例如,是否使用周期性广播者列表、是否启用报告功能、是否过滤重复报告等。
    • 注意Options参数与其他参数(如Advertising_SID、Advertiser Address_Type和Advertiser Address)之间的关联和互斥关系。
  • 广播相关参数
    • 当不使用周期性广播者列表时,确保Advertising_SID、Advertiser Address_Type和Advertiser Address参数的准确性,以避免同步到错误的设备。
    • 如果使用周期性广播者列表,则这些参数将不起作用,但应确保列表中的条目正确无误。
  • Sync_CTE_Type参数
    • 根据应用需求设置Sync_CTE_Type参数,并考虑广播者可能改变CTE类型的情况。
    • 避免将Sync_CTE_Type参数全设置为1,因为这会导致控制器返回错误代码。
  • Skip和Sync_Timeout参数
    • 合理配置Skip参数,以平衡数据接收能力和数据重要性。
    • 确保Sync_Timeout参数足够长,以避免因短暂的网络波动或设备休眠而导致同步丢失。

8.2. 设备状态与命令执行顺序

  • 扫描功能状态
    • 在发送HCI_LE_Periodic_Advertising_Create_Sync命令之前,确保蓝牙设备的扫描功能已启用。
    • 如果扫描功能被禁用,需要先发送HCI_LE_Set_Scan_Enable命令来启用扫描。
    • 如果广播参数(如广播间隔)在同步创建过程中发生变化,可能需要重新评估同步的创建或调整同步参数以适应新的广播状态。
  • 命令冲突
    • 避免在另一个HCI_LE_Periodic_Advertising_Create_Sync命令还未处理完时发送相同的命令。
    • 如果需要发送多个同步命令,应确保它们之间有足够的时间间隔,以避免命令冲突。

8.3. 资源与兼容性考虑

  • 资源限制
    • 在开发应用时,要预估设备需要同步的周期性广播数量,并确保控制器的资源足够支持这些同步操作。
    • 如果控制器资源不足,可能需要考虑优化应用逻辑,减少同步数量或降低数据更新频率。
  • 兼容性问题
    • 验证目标设备是否支持HCI_LE_Periodic_Advertising_Create_Sync命令以及所需的蓝牙版本(如蓝牙5.1或更高版本)。
    • 对于不支持的功能或参数设置,应提供备用方案或进行错误提示。
    • 在部署应用之前,应进行充分的测试,以确保在不同设备和控制器上的兼容性。

8.4. 事件处理与错误处理

  • 事件处理
    • 熟悉并正确处理HCI_LE_Periodic_Advertising_Create_Sync命令执行过程中生成的各种事件。
    • 根据事件类型执行相应的操作,如处理同步建立事件、接收报告事件等。
  • 错误处理
    • 建立完善的错误处理机制,捕获并处理可能出现的错误代码。
    • 对于同步超时、不支持的功能或参数设置等错误情况,应提供用户友好的错误提示和解决方案。
    • 记录错误日志,以便在出现问题时进行故障排查和修复。

8.5. 其它注意事项

  • 安全性考虑
    • 在处理周期性广播数据时,要注意安全性问题,如数据加密、身份验证等。
    • 确保只有授权的设备才能接收和处理周期性广播数据。
  • 性能优化
    • 根据应用需求优化同步参数和数据接收逻辑,以提高性能和降低功耗。
    • 考虑使用低功耗模式或睡眠模式来减少不必要的功耗。
  • 文档和规范
    • 定期查阅最新的蓝牙核心规范文档和相关技术资料,以确保对HCI_LE_Periodic_Advertising_Create_Sync命令的理解和使用是最新的。
    • 遵循蓝牙核心规范中的相关要求,确保命令的使用符合标准。

使用HCI_LE_Periodic_Advertising_Create_Sync命令时,需要仔细考虑命令参数的设置、设备状态与命令执行顺序、资源与兼容性以及事件处理与错误处理等多个方面。同时,还需要注意安全性、性能优化以及遵循最新的蓝牙核心规范文档和相关技术资料。​​​​​​​

综上所述,通过 HCI_LE_Periodic_Advertising_Create_Sync 命令,BLE设备可以实现更加灵活和高效的通信模式,特别是在需要定期交换数据的场景中。正确理解和使用这一命令,对于开发低功耗、高性能的蓝牙应用至关重要。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、命令概述
    • 1.1. 命令功能
    • 1.2. 使用条件
  • 二、命令格式
    • 2.1. 格式示例
    • 2.2. 响应参数
  • 三、命令参数解析
    • 3.1. Options
    • 3.2. Advertising_SID
    • 3.3. Advertiser_Address_Type
    • 3.4. Advertiser_Address
    • 3.5. Skip
    • 3.6. Sync_Timeout
      • 3.6.1. Sync_Timeout参数的设置与计算
      • 3.6.2. Sync_Timeout参数的应用场景
      • 3.6.3. 注意事项
    • 3.7. Sync_CTE_Type
      • 3.7.1. 参数设置与行为
      • 3.7.2. CTE类型不匹配时的处理
      • 3.7.3. 实际应用中的考虑
  • 四、错误处理规则
    • 4.1. Sync_CTE_Type参数设置错误
    • 4.3. Skip参数与同步超时
    • 4.4. 命令冲突
    • 4.5. 已存在连接
    • 4.6. 资源不足
    • 4.7. Options参数位1和位2的设置
  • 五、返回HCI_Command_Status 事件
    • 5.1. HCI_LE_Periodic_Advertising_Sync_Established 事件
    • 5.2. HCI_LE_Periodic_Advertising_Report 事件
    • 5.3. 同步超时与状态设置
    • 5.4. 取消同步与事件生成
  • 六、命令执行流程
    • 6.1. 命令准备阶段
    • 6.2. 发送命令阶段
    • 6.3. 控制器处理阶段
    • 6.4. 返回响应阶段
    • 6.5. 命令接收阶段(控制器向主机反馈)
    • 6.6. 同步建立阶段
    • 6.7. 数据接收与报告阶段(如果启用报告功能)
    • 6.8. 同步超时处理阶段
    • 6.9. 同步取消情况(特殊情况)
    • 6.10. 示例代码
  • 七、应用场景
    • 7.1. 智能设备连接与交互
    • 7.2. 数据采集与监测
    • 7.3. 位置服务与室内定位
    • 7.4. 可穿戴设备与健康监测
    • 7.5. 特定通信需求支持
  • 八、注意事项
    • 8.1. 命令参数理解与设置
    • 8.2. 设备状态与命令执行顺序
    • 8.3. 资源与兼容性考虑
    • 8.4. 事件处理与错误处理
    • 8.5. 其它注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档