目录
3.3. 分片偏好(Fragment Preference)编辑
3.4. 扫描响应数据长度(Scan_Response_Data_Length)
3.5. 扫描响应数据(Scan Response Data)
LE Set Extended Scan Response Data command是蓝牙低功耗(BLE)技术中的一个重要命令,它允许设备在扫描响应过程中发送额外的数据。这个命令在蓝牙5.0及更高版本中引入,是蓝牙技术扩展广播功能的一部分。通过该命令,设备可以定制其扫描响应数据,以便在扫描过程中向其他设备提供更多信息。
一、命令概述
HCI_LE_Set_Extended_Scan_Response_Data 命令用于提供在扫描响应协议数据单元(PDU)中使用的扫描响应数据。此命令可以在使用 HCI_LE_Set_Extended_Advertising_Parameters 命令LE Set Extended Advertising Data command(0x0037)命令全面解析-CSDN博客创建由 Advertising_Handle 参数标识的广播集之后的任何时间发出,无论该广播集中的广播是否已启用或禁用。
BLUETOOTH CORE SPECIFICATION Version 5.4 | Vol 4, Part E page 2459
1.1. 功能
-
广播启用时:如果指定的广播集当前已启用广播,则芯片应在后续扩展广播事件中使用此新数据。如果在此命令发出时扩展广播事件正在进行,则芯片可能会为该事件使用旧数据或新数据。
-
广播禁用时:如果指定的广播集当前已禁用广播,则芯片将保存这些数据,并在为该集启用广播时使用它们。当广播集被移除时,这些数据将被丢弃。
-
数据长度:只有扫描响应数据的重要部分才应在广播包中传输。如果数据的总长度超过了由 Advertising_Handle 参数标识的广播集的容量或当前可用的内存量,则所有数据都将被丢弃,并且芯片将返回错误代码“Memory Capacity Exceeded (内存容量超出)”(0x07)。
-
操作参数:主机可以使用命令中的 Operation 参数在一个或多个操作中设置扫描响应数据。如果 Operation 指示新数据的开始(值为0x01或0x03),则任何现有的部分或完整的扫描响应数据都将被丢弃。
-
分片偏好:Fragment_Preference 参数为芯片提供了一个提示,指示是否应将广播数据分段。
1.2. 错误处理
- 如果广播集不可扫描,并且主机使用此命令(除了丢弃现有数据之外),则芯片将返回错误代码“Invalid HCI Command Parameters(无效的HCI命令参数)”(0x12)。
- 如果广播集使用可扫描的传统广播PDU,并且 Operation 不是0x03 或 Scan_Response_Data_Length 参数超过31个八位字节,则芯片将返回错误代码“Invalid HCI Command Parameters(无效的HCI命令参数)”(0x12)。
- 如果 Operation 不是0x03 并且 Scan_Response_Data_Length 为零,则芯片将返回错误代码“Invalid HCI Command Parameters(无效的HCI命令参数)”(0x12)。
- 如果指定的广播集当前已启用广播,并且 Operation 的值不是0x03,则芯片将返回错误代码“Command Disallowed (命令不允许)”(0x0C)。
- 如果广播集使用扩展广播,并且数据的总长度大于芯片在当前广播集参数下(如果广播已启用,则使用当前广播间隔)可以在最长的可能辅助广播段中传输的最大长度,则所有数据都将被丢弃,并且芯片将返回错误代码“Packet Too Long(数据包太长)”(0x45)。
- 如果广播集使用可扫描的扩展广播PDU,指定的广播集当前已启用广播,并且 Scan_Response_Data_Length 为零,则芯片将返回错误代码“Command Disallowed (命令不允许)”(0x0C))。
- 如果与 Advertising_Handle 参数对应的广播集不存在,则芯片将返回错误代码“Unknown Advertising Identifier(未知的广播标识符)”(0x42)。
此命令允许主机灵活地设置和管理广播集中的扫描响应数据,以适应不同的BLE应用场景。
二、命令格式
2.1. 一般格式
LE Set Extended Scan Response Data command的命令格式通常遵循蓝牙协议栈中的主机控制器接口层(HCI)所定义的数据格式。该命令包含多个字段,每个字段都有其特定的长度和含义。
一般来说,该命令的格式可能如下(具体格式可能因蓝牙版本或实现而有所不同):
-
命令操作码(Opcode):由OGF(Opcode Group Field,操作码组字段)和OCF(Opcode Command Field,操作码命令字段)组成。在上述snoop中,OGF被标识为“LE Controller”,而OCF的值为0x0038。这两个字段结合起来唯一标识了这个HCI命令。
-
参数长度(Parameter Length):这个字段表示紧随命令操作码之后的参数的总长度。在上述snoop中并没有直接给出这个字段的值,但根据后续参数的长度,可以推断出它的值。
-
操作(Operation):这个字段描述了命令的具体操作。在上述snoop中,操作码为“Complete extended advertising data”,意味着这个命令用于设置完整的扩展广播数据。
-
分片偏好(Fragment Preference):这个字段指示了芯片应该如何处理主机提供的广播数据。在上述snoop中,分片偏好被设置为“Controller should not fragment or should minimize fragmentation of Host advertising data”,意味着芯片应该尽量避免对主机提供的广播数据进行分片。
-
服务数据(Service Data):这个字段包含了要设置的扫描响应数据中的服务数据部分。在上述snoop中,显示了两个服务数据项,分别具有不同的Uuid和值。这些服务数据项遵循BLE广播数据的格式,包括长度字段、类型字段和数据字段
2.2. 格式示例
以下是一个LE Set Extended Scan Response Data command的格式示例(请注意,这只是一个示例,具体格式可能因蓝牙版本或实现而有所不同):
OGF: xx (LE Controller Commands, 根据具体实现确定)
OCF: 0x00YY (YY为特定于实现的命令码,假设为扩展扫描响应数据设置)
Length: N (整个命令的长度,包括OGF, OCF, Length字段, Parameter Length字段, 以及后续的参数)
Parameter Length: M (参数的长度,即扫描响应数据的长度加上任何额外的参数长度)
Scan Response Data:
- Length of Data: L1 (第一个广播数据段的长度)
- Type: T1 (第一个广播数据段的类型)
- Data: D1 (第一个广播数据段的内容)
- ... (可能包含多个广播数据段)
- Length of Data: Ln (第n个广播数据段的长度)
- Type: Tn (第n个广播数据段的类型)
- Data: Dn (第n个广播数据段的内容)
说明:
-
OGF:操作码组字段,用于指示命令所属的类别。对于BLE相关的命令,OGF的值通常是固定的,用于区分BLE命令与其他蓝牙命令。具体值应根据所使用的蓝牙芯片或模块的文档确定。
-
OCF:操作码命令字段,与OGF结合使用,唯一标识一个特定的HCI命令。对于假设的LE Set Extended Scan Response Data命令,OCF将是一个特定的值,该值由蓝牙芯片制造商或软件栈提供商定义。
-
Length:表示整个命令的长度(包括OGF、OCF、Length字段、Parameter Length字段以及后续的参数)。
-
Parameter Length&