【android bluetooth 协议分析 01】【HCI 层介绍 5】【SetEventMask命令介绍】

发布于:2025-05-18 ⋅ 阅读:(16) ⋅ 点赞:(0)

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 命令序列:

  1. HCI_Reset
  2. HCI_Write_LE_Host_Support (0x01) 声明主机支持 BLE
  3. HCI_Set_Event_Mask 使能 bit 61(LE Meta Event)
  4. 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)