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

【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)
http://www.xdnf.cn/news/7018.html

相关文章:

  • Elasticsearch 初步认识
  • 用 UniApp 构建习惯打卡 App —— HabitLoop 开发记
  • 【cursor】有效解决
  • Denoising Score Matching with Langevin Dynamics
  • 【HarmonyOS 5开发入门】DevEco Studio安装配置完全指南
  • Flink 的窗口机制
  • 【ant design】ant-design-vue 4.0实现主题色切换
  • 【软考 McCabe度量法】
  • 深入理解指针(6)
  • 基因编辑根治胰腺癌-陈墨仙
  • Raft 协议:分布式一致性算法的核心思想
  • 欢乐熊大话蓝牙知识4:GATT 协议全解:蓝牙传数据到底怎么传?
  • 费马小定理
  • 数学复习笔记 16
  • 【Linux网络编程】Socket编程:协议理论入门
  • 数据库的规范化设计方法---3种范式
  • AIStarter Windows 版本迎来重磅更新!模型插件工作流上线,支持 Ollama / ComfyUI 等多平台本地部署模型统一管理
  • FPC连接器的未来趋势:柔性时代的核心桥梁
  • 【Redis】Hash 哈希
  • opencv4.11生成ArUco标记 ArUco Marker
  • IP68防水Type-C连接器实测:水下1米浸泡72小时的生存挑战
  • CodeBuddy 开发 JSON 可视化工具实录:JsonVision 的诞生之旅
  • 广东省省考备考(第十三天5.17)——言语:接语选择题(听课后强化练习)
  • 永磁同步电机公式总结——反电动势、磁链、转矩公式;三项、两项电压方程;坐标表换方程
  • 通过多线程获取VENC的H264码流数据
  • 11.1 LangGraph生产级AI Agent开发:状态管理与多智能体系统构建全解析
  • RAID学习笔记
  • USB和串口软件编程控制继电器通断
  • windows系统各版本下载
  • 查看电脑信息的方法-CPU核心数量、线程数量等