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 MaskBluetooth HCI Command - Set Event MaskCommand 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_ResetHCI_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.ccstruct 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) |
