目录
3.6. Response_Data_Length和Response_Data
HCI_LE_Set_Periodic_Advertising_Response_Data
命令低功耗是蓝牙(Bluetooth Low Energy, BLE)核心规范中定义的一个主机控制接口(HCI)命令,以设置周期性广播响应(Periodic Advertising with Response,简称PAwR)中特定子事件的响应槽的数据。这个数据将在被同步的设备请求时传输一次。
一、 命令概述
HCI_LE_Set_Periodic_Advertising_Response_Data
命令允许主机设置BLE设备在周期性广播响应中的特定子事件(subevent)的响应数据。通过这个命令,主机可以控制设备在接收到来自其他设备的扫描请求时,在特定的同步句柄(Sync_Handle)所标识的周期性广播响应子事件中发送特定的数据。它允许主机控制设备在特定情况下提供更详细的信息,增强设备之间的交互性和可识别性。
BLUETOOTH CORE SPECIFICATION Version 6.0 | Vol 4, Part E Page 2790
1.1. 命令背景和用途
周期性广播是蓝牙5.1引入的一种新型广播模式,用于以固定间隔发送相同的数据包。这种模式特别适用于需要频繁发送相同信息的场景,例如环境传感器数据广播。而周期性广播响应则允许在周期性广播的基础上,为特定的广播子事件设置响应数据,这些数据将在接收到相应请求时发送。
-
定制响应数据内容
- 主机可以通过这个命令指定设备在接收到扫描请求后发送的响应数据。这些数据可以包括设备的特定属性、服务信息、状态变化等。例如,可以设置响应数据为设备的制造商信息、软件版本号、当前运行模式等。
- 响应数据的格式和长度通常受到蓝牙规范的限制。主机需要根据规范要求来组织和设置响应数据,以确保其他设备能够正确解析和识别。
-
增强连接建立过程
- 在蓝牙低功耗连接建立过程中,扫描设备可能会发送扫描请求以获取更多关于广播设备的信息。通过设置周期性广播响应数据,广播设备可以提供更详细的回应,帮助扫描设备更好地了解其特性和功能,从而促进连接的建立。
- 例如,如果一个设备支持特定的服务,通过响应数据可以明确告知扫描设备这些服务的可用性,以便扫描设备决定是否发起连接请求。
-
灵活适应不同场景
- 根据不同的应用场景和需求,主机可以动态地调整周期性广播响应数据。例如,在特定的工作模式下,可以提供特定的状态信息或配置参数;在与不同类型的设备进行交互时,可以根据对方的需求提供相应的响应数据。
- 这使得设备能够更加灵活地适应各种环境和应用需求,提高设备的通用性和互操作性。
1.2. 命令行为
- 当使用HCI_LE_Set_Periodic_Advertising_Response_Data命令设置数据时,该数据将被与特定Sync_Handle关联的周期性广播子事件的响应槽所使用。
- 一旦设置了响应数据,并且相应的周期性广播子事件被触发且接收到响应请求,该数据将被传输一次。
- 如果在命令发送时,周期性广播子事件正在进行中,蓝牙控制器可能会选择在该事件中使用旧数据或新数据,这取决于控制器的具体实现。
- 如果周期性广播被禁用,当发送此命令时,控制器将保存新的响应数据。一旦周期性广播被重新启用,并且相应的子事件被触发且接收到响应请求,控制器将使用之前保存的响应数据。
1.3. 关键特性
-
响应数据的一次性传输:响应数据在特定子事件的响应槽中只会被传输一次。这意味着设备在该子事件中只会发送一次由主机设置的响应数据,确保了数据传输的确定性和高效性。
-
基于同步句柄的标识:使用同步句柄来确定要设置响应数据的特定周期性广播响应子事件。同步句柄提供了一种机制,让主机能够准确地指定要操作的特定广播周期中的子事件,从而实现对不同广播周期的精细控制。
1.4. 与其他蓝牙命令的关系
-
与周期性广播相关命令的协同:该命令通常与其他周期性广播相关的命令一起使用,如 HCI_LE_Set_Periodic_Advertising_Parameters(设置周期性广播参数)和 HCI_LE_Set_Periodic_Advertising_Data(设置周期性广播数据)等。这些命令共同协作,实现对周期性广播和响应的全面控制。【0x003E/0x86】HCI_LE_Set_Periodic_Advertising_Parameters 命令全面解析_read periodic advertiser lis size-CSDN博客【0x003F】HCI_LE_Set_Periodic_Advertising_Data命令全面解析-CSDN博客【0x003E/0x86】HCI_LE_Set_Periodic_Advertising_Parameters 命令全面解析_read periodic advertiser lis size-CSDN博客
-
对连接建立的支持:通过设置周期性广播响应数据,可以为连接建立过程提供更多的信息和交互。当其他设备接收到周期性广播并发送扫描请求时,响应数据可以帮助决定是否建立连接以及如何进行连接配置。
1.5. 错误处理
-
响应数据长度限制:如果
Response_Data_Length
(响应数据长度)超过了控制器在响应槽位内能够传输的最大长度,那么响应数据将被丢弃,并且控制器将返回错误码“Packet Too Long”(0x45)。这个规则确保了BLE通信中数据的完整性和一致性。如果尝试传输的数据量超过了控制器的处理能力,那么丢弃数据并返回错误码是一种合理的错误处理机制,它防止了数据丢失或通信故障。 -
响应槽位超时:如果由
Response_Slot
参数标识的响应槽位在控制器接收到此命令时已经过期,那么控制器将返回错误码“Too Late”(0x46),并丢弃Response_Data
参数。这个规则确保了BLE通信中的时间同步。如果响应槽位已经过期,那么再尝试发送响应数据就没有意义了,因为接收方可能已经不再监听这个槽位。因此,丢弃数据并返回错误码是一种合理的处理方式。 -
响应子事件限制:如果
Response_Subevent
超过了周期性广播序列中的numSubevents
(子事件数量),或者控制器没有与子事件同步,那么控制器应该返回错误码“Command Disallowed”(0x0C)。这个规则确保了BLE通信中的子事件同步和一致性。如果尝试响应的子事件超出了广播序列中定义的子事件数量,或者控制器没有正确地与子事件同步,那么发送响应数据可能会导致通信故障或数据丢失。因此,返回错误码并禁止执行命令是一种合理的处理方式。
1.6. LE Coded PHY 和 S=8 编码
如果周期性广播序列是在LE Coded PHY(低功耗蓝牙编码物理层)上进行的,那么应假设使用S=8编码。
LE Coded PHY是BLE 5.0及更高版本中引入的一种物理层,它使用编码技术来提高通信的鲁棒性和范围。S=8编码表示每个物理位被编码为8个比特,这有助于在噪声环境中提高数据传输的可靠性。
二、命令格式
HCI_LE_Set_Periodic_Advertising_Response_Data命令格式通常遵循蓝牙核心规范中定义的HCI命令格式。
2.1. 命令操作码(OpCode)
- 组域(OGF, Opcode Group Field):对于BLE相关的命令,OGF通常为0x08,表示该命令属于LE(低功耗)控制器命令组。
- 命令域(OCF, Opcode Command Field):对于HCI_LE_Set_Periodic_Advertising_Response_Data命令,OCF是0X83,用于标识该命令。这个值在蓝牙核心规范中有明确的定义。
将OGF和OCF组合在一起,可以得到完整的命令操作码。例如,如果OCF为某个特定值(假设为X),则完整的操作码为0x08|X(在某些文档或上下文中,可能会看到合并为一个16位值的结果,如0xXXXX,这是将OGF左移一定位数后与OCF进行或运算的结果)。
2.2. 参数长度(Parameter Length)
参数长度是一个无符号8位整数(uint8_t),表示后续参数的总长度(以字节为单位)。对于HCI_LE_Set_Periodic_Advertising_Response_Data命令,这个长度是可变的,它取决于响应数据的实际长度加上其他必要参数(如Sync_Handle、Response_Data_Length等)的长度。
2.3. 命令参数
HCI_LE_Set_Periodic_Advertising_Response_Data命令的主要参数包括:
-
Sync_Handle:无符号16位整数(uint16_t)。用于标识特定的周期性广播实例。这个句柄是在之前使用HCI_LE_Set_Periodic_Advertising_Parameters命令创建周期性广播时分配的。
-
Response_Event、Request_Subevent、Response_Subevent 和 Response_Slot:
- 这些参数在特定的周期性广播响应场景中起到进一步细化和定位响应时机的作用。
- Response_Event 用于指示响应发生的特