目录

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)。 - 数据被丢弃或长度为零:如果周期性广播数据被命令丢弃,或者在命令完成后数据的总长度为零,则该广播集将没有周期性广播数据。