1. HCI_Set_Event_Mask 命令作用
项目 | 内容 |
---|---|
命令名 | HCI_Set_Event_Mask |
OCF | 0x0001 |
作用 | 主机通过设置 Event Mask 告诉控制器:我只对某些事件感兴趣,屏蔽其他事件,以减少中断。 |
事件来源 | 事件是 HCI 与主机之间通信的反馈机制,控制器通过这些事件通知主机状态变化等信息。 |
关键点 | 设置位为 1 → 启用该事件;设置位为 0 → 屏蔽该事件。 控制器不支持的事件/保留位 → 自动忽略。 |
5 2025-04-24 15:55:53.350452 host controller HCI_CMD 12 Sent Set Event Mask
Bluetooth HCI Command - Set Event Mask
Command Opcode: Set Event Mask (0x0c01)
0000 11.. .... .... = Opcode Group Field: Host Controller & Baseband Commands (0x03)
.... ..00 0000 0001 = Opcode Command Field: Set Event Mask (0x001)
Parameter Total Length: 8
.... ...1 = Inquiry Complete: true (0x1)
.... ..1. = Inquiry Result: true (0x1)
.... .1.. = Connect Complete: true (0x1)
.... 1... = Connect Request: true (0x1)
...1 .... = Disconnect Complete: true (0x1)
..1. .... = Auth Complete: true (0x1)
.1.. .... = Remote Name Req Complete: true (0x1)
1... .... = Encrypt Change: true (0x1)
.... ...1 = Change Connection Link Key Complete: true (0x1)
.... ..1. = Master Link Key Complete: true (0x1)
.... .1.. = Read Remote Supported Features: true (0x1)
.... 1... = Read Remote Ver Info Complete: true (0x1)
...1 .... = QoS Setup Complete: true (0x1)
1... .... = Hardware Error: true (0x1)
.... ...1 = Flush Occurred: true (0x1)
.... ..1. = Role Change: true (0x1)
.... 1... = Mode Change: true (0x1)
...1 .... = Return Link Keys: true (0x1)
..1. .... = PIN Code Request: true (0x1)
.1.. .... = Link Key Request: true (0x1)
1... .... = Link Key Notification: true (0x1)
.... ...1 = Loopback Command: true (0x1)
.... ..1. = Data Buffer Overflow: true (0x1)
.... .1.. = Max Slots Change: true (0x1)
.... 1... = Read Clock Offset Complete: true (0x1)
...1 .... = Connection Packet Type Changed: true (0x1)
..1. .... = QoS Violation: true (0x1)
.1.. .... = Page Scan Mode Change: true (0x1)
1... .... = Page Scan Repetition Mode Change: true (0x1)
.... ...1 = Flow Specification Complete: true (0x1)
.... ..1. = Inquiry Result With RSSI: true (0x1)
.... .1.. = Read Remote Ext. Features Complete: true (0x1)
.... 1... = Synchronous Connection Complete: true (0x1)
...1 .... = Synchronous Connection Changed: true (0x1)
..1. .... = Sniff Subrate: true (0x1)
.1.. .... = Extended Inquiry Result: true (0x1)
1... .... = Encryption Key Refresh Complete: true (0x1)
.... ...1 = IO Capability Request: true (0x1)
.... ..1. = IO Capability Response: true (0x1)
.... .1.. = User Confirmation Request: true (0x1)
.... 1... = User Passkey Request: true (0x1)
...1 .... = Remote OOB Data Request: true (0x1)
..1. .... = Simple Pairing Complete: true (0x1)
1... .... = Link Supervision Timeout Changed: true (0x1)
.... ...1 = Enhanced Flush Complete: true (0x1)
.... .1.. = User Passkey Notification: true (0x1)
.... 1... = Keypress Notification: true (0x1)
[Response in frame: 6]
[Command-Response Delta: 0.756ms]
2. BLE 支持相关说明
在 Event_Mask
的第 61 位(即第 8 字节的第 5 位)是一个关键:
位 | 名称 | 说明 |
---|---|---|
61 | LE Meta Event | 启用所有 BLE 相关事件(0x3E),必须设置为 1,否则即使你用 HCI_LE_Set_Event_Mask 配置了子事件也没用。 |
3. Event_Mask 各位的详细含义(按位表格)
Event_Mask 是一个 **8 字节(64 位)的位掩码,每个 bit 控制一个事件类型。如下是规范中定义的位:
Bit | 事件名称 | 说明 / 功能描述 | 典型使用场景 |
---|---|---|---|
0 | Inquiry Complete | 查询流程完成 | 蓝牙设备搜索结束通知主机 |
1 | Inquiry Result | 查询结果到达 | 返回找到的设备信息列表 |
2 | Connection Complete | 连接建立完成 | 用于通知主机连接建立成功或失败 |
3 | Connection Request | 收到连接请求 | 从设备请求连接时主机收到通知 |
4 | Disconnection Complete | 断开连接完成 | 链路断开后通知主机 |
5 | Authentication Complete | 认证完成 | 完成配对认证流程 |
6 | Remote Name Request Complete | 远程设备名称请求完成 | 请求远程设备名称后返回结果 |
7 | Encryption Change | 加密状态变化 | 链路加密启用/禁用时通知主机 |
8 | Change Connection Link Key Complete | 更改连接密钥完成 | 更换加密密钥后通知主机 |
9 | Link Key Type Changed | 连接密钥类型改变 | 使用新密钥类型时通知主机 |
10 | Read Remote Supported Features Complete | 读取远程设备支持特性完成 | 蓝牙能力协商完成 |
11 | Read Remote Version Information Complete | 读取远程版本信息完成 | 获取设备蓝牙协议栈版本等信息 |
12 | QoS Setup Complete | QoS配置完成 | 设置服务质量后通知 |
15 | Hardware Error | 硬件错误 | 控制器发生严重错误 |
16 | Flush Occurred | 数据被 flush(清除) | 数据包被主动丢弃 |
17 | Role Change | 主/从角色切换完成 | 比如从 peripheral 变为 central |
19 | Mode Change | 工作模式切换完成 | 如 sniff 模式进入/退出 |
20 | Return Link Keys | 返回本地已保存的配对密钥 | 快速重连旧设备 |
21 | PIN Code Request | 请求 PIN 码 | 传统配对方式 |
22 | Link Key Request | 请求配对密钥 | 用于重连时安全验证 |
23 | Link Key Notification | 通知新密钥已生成 | 用于主机存储该密钥 |
24 | Loopback Command | 回环命令完成 | 测试链路时使用 |
25 | Data Buffer Overflow | 数据缓冲区溢出 | 数据发送过快时通知主机 |
26 | Max Slots Change | 最大时隙数变化 | 动态调整带宽时通知 |
27 | Read Clock Offset Complete | 读取时钟偏移完成 | 用于同步 |
28 | Connection Packet Type Changed | 链路包类型更改 | 切换数据包传输类型 |
29 | QoS Violation | QoS 违例 | 控制器未满足QoS需求 |
30 | Previously used (忽略) | 已废弃或保留位 | 无需使用 |
31 | Page Scan Repetition Mode Change | 页面扫描重复模式变化 | 页面扫描配置更新时通知主机 |
32 | Flow Specification Complete | 数据流规格设置完成 | 高级 QoS 控制场景 |
33 | Inquiry Result with RSSI | 查询结果包含 RSSI 值 | 精细设备选择,如距离靠近优先连接 |
34 | Read Remote Extended Features Complete | 读取远程扩展特性完成 | 了解对端是否支持 SSP、Secure Conn 等 |
43 | Synchronous Connection Complete | 同步连接建立完成(如 SCO/eSCO) | 通话或音频传输 |
44 | Synchronous Connection Changed | 同步连接参数改变 | 音频流参数调整 |
45 | Sniff Subrating | Sniff 子速率事件 | 低功耗优化场景 |
46 | Extended Inquiry Result | 扩展查询结果(含设备类别、名称等) | 提供更丰富的设备信息 |
47 | Encryption Key Refresh Complete | 加密密钥刷新完成 | LE 安全连接或 BR/EDR 密钥刷新后 |
48 | IO Capability Request | 请求设备输入输出能力(SSP配对过程) | 用户确认配对过程 |
49 | IO Capability Response | 返回对端 IO 能力 | SSP 安全确认 |
50 | User Confirmation Request | 请求用户确认配对 | 显示“是否配对此设备” |
51 | User Passkey Request | 请求用户输入配对码 | 键盘输入型配对 |
52 | Remote OOB Data Request | 请求 Out-of-Band 数据 | NFC 等配对方式 |
53 | Simple Pairing Complete | 简单配对完成(SSP) | 通知主机配对是否成功 |
55 | Link Supervision Timeout Changed | 链路监督超时时间改变 | 控制器断链检测参数更新 |
56 | Enhanced Flush Complete | 完成增强型 flush | 高优先级清除数据缓冲 |
58 | User Passkey Notification | 通知用户对方输入的配对码 | 显示数字以供用户核对 |
59 | Keypress Notification | 对方输入配对码状态(正在输入、删除等) | 增强用户体验 |
60 | Remote Host Supported Features Notification | 通知主机远程设备支持的特性 | 功能协商 |
61 | LE Meta Event | 开启所有 LE(低功耗蓝牙)相关事件 | BLE 通信必要事件掩码 |
注意:
默认值 是 bit 0~44 设为 1(值为
0x00001FFFFFFFFFFF
),表示支持经典蓝牙核心事件。若想启用 BLE,必须额外设置 bit 61 为 1。
4. 典型使用流程(含 BLE)
一个 BLE 主机设备通常在初始化时使用以下 HCI 命令序列:
HCI_Reset
HCI_Write_LE_Host_Support (0x01)
声明主机支持 BLEHCI_Set_Event_Mask
使能 bit 61(LE Meta Event)HCI_LE_Set_Event_Mask
控制哪些 BLE 子事件开启(如连接、广播报告等)
5. aosp 示例代码片段
static constexpr uint64_t kDefaultEventMask = 0x3dbfffffffffffff;
static constexpr uint64_t kDefaultLeEventMask = 0x000000004d02fe7f;
// system/gd/hci/controller.cc
struct Controller::impl {
void Start(hci::HciLayer* hci) {
...
le_set_event_mask(kDefaultLeEventMask);
set_event_mask(kDefaultEventMask);
write_le_host_support(Enable::ENABLED, Enable::DISABLED);
...
}
void set_event_mask(uint64_t event_mask) {
std::unique_ptr<SetEventMaskBuilder> packet = SetEventMaskBuilder::Create(event_mask);
hci_->EnqueueCommand(std::move(packet), module_.GetHandler()->BindOnceOn(
this, &Controller::impl::check_status<SetEventMaskCompleteView>));
}
- 在初始化 Controller 模块时, 在 Controller::impl::Start 函数中就会调用 set_event_mask 函数去设置
- 这里设置的 mask 为 0x3dbfffffffffffff
- 这里默认 [61] 位是设置了 1: 表示支持 ble
6. 注意事项
问题 | 描述 |
---|---|
未设置 bit 61 | 控制器不会发送任何 BLE 相关事件(0x3E),即使设置了 LE_Set_Event_Mask |
只设置 LE_Set_Event_Mask 而无 HCI_Set_Event_Mask |
无效,BLE 子事件不会触发 |
设置未知/保留位 | 控制器自动忽略,不会报错 |
7. 总结
关键点 | 内容 |
---|---|
命令名称 | HCI_Set_Event_Mask (0x0001) |
参数长度 | 8 字节(每一位控制一个事件) |
BLE 启用关键位 | 第 61 位(LE Meta Event)必须设置为 1 |
与 LE_Set_Event_Mask 关系 |
前者启用 BLE 总事件,后者启用子事件 |
默认值 | 仅经典蓝牙事件被启用(bit 0~44) |