【0x0044】HCI_LE_Periodic_Advertising_Create_Sync全面解析

目录

一、命令概述

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. 其它注意事项


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命令的格式示例,其中包含了命令操作码和假设的命令参数:

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 参数

猜你喜欢

转载自blog.csdn.net/weixin_37800531/article/details/143512398