【0x003F】HCI_LE_Set_Periodic_Advertising_Data命令全面解析

目录

一、命令概述

1.1. 命令的行为

1.1.1. 周期性广播启用时

1.1.2. 周期性广播进行中时

1.1.3. 周期性广播禁用时

1.1.4. 广播集移除时

1.2. 广播数据的设置

1.2.1. 分段设置广播数据

1.2.2. 数据长度限制

1.2.3. 错误处理

扫描二维码关注公众号,回复: 17453179 查看本文章

1.2.4. 数据长度与广播间隔的关系

1.3. LE Coded PHY的编码假设

1.4. Operation 参数的行为

1.5. 错误处理规则

二、命令格式

2.1. 命令操作码

2.2. 命令参数

2.3. 命令格式示例

三、命令参数详细说明

3.1. Advertising_Handle

3.2. Operation

3.3. Advertising_Data_Length

3.4. Advertising_Data

四、命令返回事件及参数的说明

4.1. HCI_Command_Complete事件

4.2. Status

五、命令执行流程

5.1. 命令准备

5.2. 发送命令

5.3. 控制器处理

5.4. 返回响应

5.5. 后续操作

5.6. 代码示例

 六、应用场景

6.1. 传感器数据广播

6.2. 设备状态更新

6.3. 广告与营销

6.4. 接近感知与定位

6.5. 能源管理与低功耗操作

6.6. 特定通信需求支持

七、注意事项

7.1. 参数验证与设置

7.2. 广播状态与参数更改

7.3. 兼容性与电源效率

7.4. 错误处理与隐私保护

7.5. 数据格式与长度

7.6. 命令发送时机

7.7. 遵循蓝牙核心规范


HCI_LE_Set_Periodic_Advertising_Data 命令是低功耗蓝牙(BLE)核心规范中定义的一个主机控制接口(HCI)命令,用于设置周期性广播的数据。周期性广播是蓝牙5.1引入的一种新型广播模式,用于以固定间隔发送相同的数据包,适用于需要频繁发送相同信息的应用场景,例如环境传感器数据广播。

一、命令概述

HCI_LE_Set_Periodic_Advertising_Data命令的主要目的是设置用于周期性广播协议数据单元(PDU)的数据。在发出此命令之前,必须使用HCI_LE_Set_Periodic_Advertising_Parameters命令为具有特定Advertising_Handle的广播集配置周期性广播参数(如间隔、持续时间等)。【0x003E/0x86】HCI_LE_Set_Periodic_Advertising_Parameters 命令全面解析_read periodic advertiser lis size-CSDN博客

在使用HCI_LE_Set_Periodic_Advertising_Data命令时,需要特别注意广播数据的长度和格式。主机应该确保只包含重要的数据部分,并根据需要分段设置数据。同时,还需要检查广播集的最大数据长度和当前可用的内存资源,以避免遇到内存容量超出的错误。通过仔细规划和错误处理,可以确保周期性广播的有效性和可靠性。 

1.1. 命令的行为

HCI_LE_Set_Periodic_Advertising_Data命令的行为取决于周期性广播的当前状态。在启用时,新数据将立即生效;在进行中时,控制器可能会选择使用旧数据或新数据;在禁用时,数据将被存储以供将来使用;在广播集移除时,所有数据都将被丢弃。了解这些行为对于正确配置和管理周期性广播至关重要。

1.1.1. 周期性广播启用时

  • 如果为指定的广播集启用了周期性广播,当发出HCI_LE_Set_Periodic_Advertising_Data命令时,蓝牙控制器将在后续的周期性广播事件中使用新的广播数据。这意味着,一旦广播数据被更新,所有后续的周期性广播都将包含这些新数据。

1.1.2. 周期性广播进行中时

  • 如果在发出HCI_LE_Set_Periodic_Advertising_Data命令时,周期性广播事件正在进行中,蓝牙控制器可能会选择在该事件中使用旧数据或新数据。规范中并没有明确要求控制器必须选择哪一种数据,因此这取决于具体实现。不过,从用户体验和数据一致性的角度来看,最好确保在广播数据更新时,不会有正在进行中的广播事件受到影响,或者至少这种行为应该是可预测的。

1.1.3. 周期性广播禁用时

  • 如果为指定的广播集禁用了周期性广播,当发出HCI_LE_Set_Periodic_Advertising_Data命令时,蓝牙控制器将不会立即使用新数据。相反,它会存储这些数据,并在周期性广播再次为该广播集启用时使用它们。这意味着,即使广播当前未在运行,也可以预先设置广播数据,以便在需要时快速启用。

1.1.4. 广播集移除时

  • 当广播集被移除时,与该广播集关联的所有周期性广播数据都将被丢弃。这是为了清理资源并确保不会留下任何不再需要的数据。如果广播集在将来可能需要重新使用,那么应该在移除之前保存任何重要的数据。

1.2. 广播数据的设置

在BLE的周期性广播中,只有重要的数据部分应该被包含在广播数据包中。这些数据部分是根据蓝牙核心规范([Vol 3] Part C, Section 11)中定义的格式来组织的。也就是说,在构建广播数据时,需要仔细选择包含哪些信息,以确保它们既符合规范,又能有效地传达所需的内容。蓝牙规范中的广播和扫描响应数据格式研究-CSDN博客

1.2.1. 分段设置广播数据

  • 主机可以使用HCI_LE_Set_Periodic_Advertising_Data命令中的Operation参数来分段设置周期性广播数据。这允许主机在多个操作中逐步构建完整的广播数据集,而不是一次性发送所有数据。这种方法的优点是可以减少单个命令的数据负载,并提高命令处理的灵活性。

1.2.2. 数据长度限制

  • 尽管可以分段设置广播数据,但所有数据的总长度不能超过由Advertising_Handle参数标识的广播集所允许的最大长度。这个最大长度可以通过LE Read Maximum Advertising Data Length命令(见第7.8.57节)来查询。【0x003A】HCI_LE_Read_Maximum_Advertising_Data_Length命令全面解析-CSDN博客如果尝试设置的广播数据总长度超过了广播集的容量或当前可用的内存量,那么所有已设置的数据都将被丢弃,并且蓝牙控制器将返回错误代码Memory Capacity Exceeded(0x07)

1.2.3. 错误处理

  • 当遇到Memory Capacity Exceeded错误时,主机应该采取适当的措施来处理这种情况。这可能包括减少广播数据的量、优化数据格式、检查并释放不必要的内存资源,或者尝试在稍后的时间点重新设置广播数据(如果此时内存资源可能已经变得可用)。

1.2.4. 数据长度与广播间隔的关系

  • 当前广播间隔的限制:如果周期性广播当前已启用,那么数据的总长度不能超过控制器在当前周期性广播间隔内能够传输的最大长度。
  • 广播集的最大广播间隔限制:如果周期性广播当前未启用,那么数据的总长度也不能超过为该广播集设置的Periodic_Advertising_Interval_Max

如果数据的总长度超过了上述任一限制,那么所有已设置的数据都将被丢弃,并且蓝牙控制器将返回错误代码Packet Too Long(0x45)。这意味着,在设置周期性广播数据时,需要考虑到广播间隔和数据长度的匹配,以确保数据能够在规定的时间内被完整传输。

1.3. LE Coded PHY的编码假设

当使用LE Coded PHY进行广播时,编码方式的选择取决于当前的广播参数:

  • S=8编码:如果当前的广播参数没有要求使用S=2编码,则默认使用S=8编码。S=8编码提供了更高的数据速率和更远的传输距离,但相应地也会增加能耗。
  • S=2编码:如果当前的广播参数要求使用S=2编码(通常是为了在保持一定传输距离的同时降低能耗),则对于该广播物理通道,应假设使用S=2编码。

1.4. Operation 参数的行为

  • 开始新数据(0x01 或 0x03)
    • 如果Operation参数的值是0x01或0x03,则表示要开始设置新数据。
    • 在这种情况下,任何现有的部分数据或完整数据都将被丢弃。
  • 重新发送当前数据(0x04)
    • 如果Operation参数的值是0x04,则行为就跟再次发送当前的周期性广播数据一样。
    • 这可以用于更新广播的数据标识符(DID)值,但不影响数据的实际内容。(参见Core5.4 [Vol 6] Part B, Section 4.4.2.11)

1.5. 错误处理规则

  • Operation 为 0x04 时的错误:如果Operation是0x04,但周期性广播对于该广播集是禁用的,或者广播集中不包含数据,或者Advertising_Data_Length(广播数据长度)不为零,则控制器应返回错误代码Invalid HCI Command Parameters(0x12)
  • 非 0x03/0x04 操作且数据长度为零:如果Operation不是0x03或0x04,并且Advertising_Data_Length为零,则控制器也应返回错误代码Invalid HCI Command Parameters(0x12)
  • 数据被丢弃或长度为零:如果周期性广播数据被命令丢弃,或者在命令完成后数据的总长度为零,则该广播集将没有周期性广播数据。

猜你喜欢

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