当前位置: 首页 > news >正文

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

1. HCI_Set_Event_Mask 命令作用

项目内容
命令名HCI_Set_Event_Mask
OCF0x0001
作用主机通过设置 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 位)是一个关键:

名称说明
61LE Meta Event启用所有 BLE 相关事件(0x3E),必须设置为 1,否则即使你用 HCI_LE_Set_Event_Mask 配置了子事件也没用。

3. Event_Mask 各位的详细含义(按位表格)

Event_Mask 是一个 **8 字节(64 位)的位掩码,每个 bit 控制一个事件类型。如下是规范中定义的位:

Bit事件名称说明 / 功能描述典型使用场景
0Inquiry Complete查询流程完成蓝牙设备搜索结束通知主机
1Inquiry Result查询结果到达返回找到的设备信息列表
2Connection Complete连接建立完成用于通知主机连接建立成功或失败
3Connection Request收到连接请求从设备请求连接时主机收到通知
4Disconnection Complete断开连接完成链路断开后通知主机
5Authentication Complete认证完成完成配对认证流程
6Remote Name Request Complete远程设备名称请求完成请求远程设备名称后返回结果
7Encryption Change加密状态变化链路加密启用/禁用时通知主机
8Change Connection Link Key Complete更改连接密钥完成更换加密密钥后通知主机
9Link Key Type Changed连接密钥类型改变使用新密钥类型时通知主机
10Read Remote Supported Features Complete读取远程设备支持特性完成蓝牙能力协商完成
11Read Remote Version Information Complete读取远程版本信息完成获取设备蓝牙协议栈版本等信息
12QoS Setup CompleteQoS配置完成设置服务质量后通知
15Hardware Error硬件错误控制器发生严重错误
16Flush Occurred数据被 flush(清除)数据包被主动丢弃
17Role Change主/从角色切换完成比如从 peripheral 变为 central
19Mode Change工作模式切换完成如 sniff 模式进入/退出
20Return Link Keys返回本地已保存的配对密钥快速重连旧设备
21PIN Code Request请求 PIN 码传统配对方式
22Link Key Request请求配对密钥用于重连时安全验证
23Link Key Notification通知新密钥已生成用于主机存储该密钥
24Loopback Command回环命令完成测试链路时使用
25Data Buffer Overflow数据缓冲区溢出数据发送过快时通知主机
26Max Slots Change最大时隙数变化动态调整带宽时通知
27Read Clock Offset Complete读取时钟偏移完成用于同步
28Connection Packet Type Changed链路包类型更改切换数据包传输类型
29QoS ViolationQoS 违例控制器未满足QoS需求
30Previously used (忽略)已废弃或保留位无需使用
31Page Scan Repetition Mode Change页面扫描重复模式变化页面扫描配置更新时通知主机
32Flow Specification Complete数据流规格设置完成高级 QoS 控制场景
33Inquiry Result with RSSI查询结果包含 RSSI 值精细设备选择,如距离靠近优先连接
34Read Remote Extended Features Complete读取远程扩展特性完成了解对端是否支持 SSP、Secure Conn 等
43Synchronous Connection Complete同步连接建立完成(如 SCO/eSCO)通话或音频传输
44Synchronous Connection Changed同步连接参数改变音频流参数调整
45Sniff SubratingSniff 子速率事件低功耗优化场景
46Extended Inquiry Result扩展查询结果(含设备类别、名称等)提供更丰富的设备信息
47Encryption Key Refresh Complete加密密钥刷新完成LE 安全连接或 BR/EDR 密钥刷新后
48IO Capability Request请求设备输入输出能力(SSP配对过程)用户确认配对过程
49IO Capability Response返回对端 IO 能力SSP 安全确认
50User Confirmation Request请求用户确认配对显示“是否配对此设备”
51User Passkey Request请求用户输入配对码键盘输入型配对
52Remote OOB Data Request请求 Out-of-Band 数据NFC 等配对方式
53Simple Pairing Complete简单配对完成(SSP)通知主机配对是否成功
55Link Supervision Timeout Changed链路监督超时时间改变控制器断链检测参数更新
56Enhanced Flush Complete完成增强型 flush高优先级清除数据缓冲
58User Passkey Notification通知用户对方输入的配对码显示数字以供用户核对
59Keypress Notification对方输入配对码状态(正在输入、删除等)增强用户体验
60Remote Host Supported Features Notification通知主机远程设备支持的特性功能协商
61LE 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.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)

相关文章:

  • 2025年- H29-Lc137- 19.删除链表的倒数第N个节点(快慢指针)---java版
  • STC89C52单片机模拟洗衣机源代码程序 C语言程序 按键设置洗衣模式和洗衣时间 洗衣完成后语音报警提示
  • 机器学习(11)——xgboost
  • JavaScript 中的 Window 对象详解
  • 超越想象:利用MetaGPT打造高效的AI协作环境
  • 1_Spring 【IOC容器的创建】
  • deepseek手动实现一个Spring Starter具体方案
  • 【2025版】SpringCloud Gateway网关快速入门
  • 系统启动时开启选择内核菜单
  • 【内存分配】
  • Python 向量化操作如何实现多条件筛选
  • 双列集合——HashMap,LinkedHashMap,TreeMap基本介绍
  • 聚类算法K-means和Dbscan的对比
  • React Native打包报错: Task :react-native-picker:verifyReleaseResources FAILE
  • 《Python星球日记》 第88天:ChatGPT 与 LangChain
  • 心理学层次结构
  • java中的Servlet2.x详解
  • 基于LabVIEW的双音多频系统设计
  • 【PINN】DeepXDE学习训练营(27)——pinn_forward-diffusion_1d_resample.py
  • 游戏:英雄联盟游戏开发代码(谢苏)
  • 国家统计局:下阶段要继续发挥宏观政策作用,促进价格合理回升
  • 高温最强时段来了!北方局地高温有明显极端性
  • 中国田径巡回赛西安站完赛:男子跳远石雨豪夺冠,女子跳高刘肼毅折桂
  • 玛丽亚·凯莉虹口连唱两夜,舞台绽放唤醒三代人青春记忆
  • 全国多家健身房女性月卡延长,补足因月经期耽误的健身时间
  • 技术派|威胁F-35、击落“死神”,胡塞武装防空战力如何?