目录
4.1. 返回事件:HCI_Command_Complete
HCI_LE_Set_Event_Mask
是蓝牙低功耗(Bluetooth Low Energy, BLE)协议栈中的一个主机控制器接口(Host Controller Interface, HCI)命令。该命令用于设置蓝牙设备在BLE模式下感兴趣的事件类型。通过配置事件掩码(Event Mask),主机可以指定哪些BLE事件应该被报告给主机。
一、命令概述
HCI_LE_Set_Event_Mask 命令允许主机通过HCI(主机控制器接口)来控制哪些LE(低功耗)事件会被生成并报告给主机。
BLUETOOTH CORE SPECIFICATION Version 5.4 | Vol 4, Part E page 2341
该命令的主要功能:
- 事件控制:通过设置LE_Event_Mask,主机可以精确地指定它感兴趣的事件类型,从而避免接收到不必要的事件通知,减少系统开销。
- 性能优化:通过仅启用必要的事件,主机可以减少中断和数据处理的频率,从而优化蓝牙低功耗设备的性能和响应时间。
- 兼容性保障:控制器会忽略不支持或为未来保留的位,这确保了HCI_LE_Set_Event_Mask命令的向后兼容性和对未来扩展的支持。
此外,要生成LE事件,还需要确保Event_Mask中的LE Meta事件位被设置。如果该位未设置,则无论LE_Event_Mask如何配置,都不会生成LE事件。
二、命令格式
2.1. 一般格式
HCI_LE_Set_Event_Mask
命令的格式如下:
- OGF (Opcode Group Field): 0x08,表示这是一个LE(低功耗)相关的命令组。
- OCF (Opcode Command Field): 0x0001,表示这是一个设置事件掩码的命令。
- Parameter Length: 8字节(因为事件掩码是64位),表明紧随其后的参数长度为8字节,即事件掩码的大小。
- Parameters
- Event Mask (8 bytes)
- 这是一个64位的二进制位掩码,每一位与一个特定的事件相关联。
- 如果某一位被设置为1,则表明主机对该事件感兴趣,期望接收其通知。
- 如果某一位被设置为0,则表明主机对该事件不感兴趣,不希望接收其通知。
- Event Mask (8 bytes)
2.2. 格式示例
以下是一个HCI_LE_Set_Event_Mask命令的示例,其中事件掩码被设置为一个具体的值(仅为示例,实际值应根据需要设置):
OGF: 0x08
OCF: 0x0001
Parameter Length: 0x08
Event Mask: 0x1122334455667788 (示例值,每位代表一个事件的兴趣状态)
在实际应用中,Event Mask的值将基于主机希望接收的事件类型来设置。例如,如果主机只对连接建立和断开事件感兴趣,那么它将相应地设置这些事件对应的位为1,而其他位则为0。
2.3. 发送命令
当主机准备好发送HCI_LE_Set_Event_Mask命令时,它会将上述字段组合成一个完整的HCI命令数据包,并通过HCI接口发送给蓝牙控制器。蓝牙控制器在接收到命令后,会解析事件掩码,并根据其配置来生成和报告事件给主机。
三、命令参数详解
3.1. LE_Event_Mask
LE_Event_Mask 是一个 64 位的字段,用于指定蓝牙低功耗(BLE)设备中主机控制器接口(HCI)应报告给主机的事件类型。每一位都对应一个特定的事件,这些事件的类型和含义由蓝牙低功耗技术的规范来定义。
以下是蓝牙规范的版本5.4定义的事件及其对应的位(注意:这些位的具体分配可能会根据蓝牙规范的版本有所不同):
1. 位数与事件对应:
- Event Mask 共有 64 位,每一位代表一个可能的事件。
- 如果某一位被设置为 1,则表明主机对该事件感兴趣,并希望接收其通知。
- 如果某一位被设置为 0,则表明主机对该事件不感兴趣,不希望接收其通知。
2. 事件类型与含义:
- 事件的类型和具体含义由蓝牙低功耗技术的规范详细定义。
- 这些事件可能包括连接建立、连接断开、广播报告、连接更新完成等。
3. 默认值与全零值:
- 当所有位都被设置为 0 时,表示没有指定任何事件。
- 默认情况下,位 0 到 4(即值 0x0000 0000 0000 001F)被设置为 1,这通常对应于一些基本或常见的事件类型。
4. 保留位:
- 在此表中未列出的所有位都保留为将来使用。
- 这意味着这些位目前不应被设置或修改,因为它们可能在未来版本的蓝牙规范中用于定义新的事件。
3.2. 常见事件掩码
以下是一些常见的事件及其对应的位(注意:这些位的具体分配可能会根据蓝牙规范的版本有所不同,以下列出的是一些常见的事件):
1. LE Connection Complete Event(0x0000000000000001):
- 当BLE设备成功建立或断开一个连接时,会触发此事件。
- 主机可以通过此事件了解连接的建立或断开状态,以及相关的连接参数。
2. LE Advertising Report Event(0x0000000000000002):
- 当BLE设备在扫描过程中接收到其他设备的广播数据时,会触发此事件。
- 主机可以通过此事件获取广播设备的地址、类型、数据等信息。
3. LE Connection Update Complete Event(0x0000000000000004):
- 当BLE设备成功更新连接参数(如连接间隔、从设备延迟等)时,会触发此事件。
- 主机可以通过此事件了解连接参数的更新结果。
4. LE Read Remote Features Complete Event(0x0000000000000008):
- 当BLE设备成功读取远程设备的特性集时,会触发此事件。
- 主机可以通过此事件了解远程设备支持的特性。
5. LE Long Term Key Request Event(0x0000000000000010):
- 当BLE设备需要生成或请求长期密钥(LTK)时,会触发此事件。
- 主机可以通过此事件处理LTK的生成或请求过程。
6. LE Remote Connection Parameter Request Event(0x0000000000000020):
- 当BLE设备接收到远程设备提出的连接参数更新请求时,会触发此事件。
- 主机可以通过此事件决定是否接受或拒绝远程设备的连接参数更新请求。
7. LE Data Length Change Event(0x0000000000000040):
- 当BLE设备成功更改数据包的长度时,会触发此事件。
- 主机可以通过此事件了解数据包长度的更改结果。
8. LE Read