蓝牙标准 HID 指令集完整指南
前言
蓝牙HID是蓝牙联盟规定的,适用于键盘鼠标等设备标准交互规范,不同厂家的蓝牙设备可以互联互通的基础,本文归纳总结了蓝牙HID的进阶规范协议及规范中没有表述的蓝牙鼠标的双击、长按等功能的协议实现。
一、蓝牙 HID 指令体系概览
蓝牙 HID 指令集基于 USB HID 规范,定义了设备与主机间的通信协议和数据格式,主要包含三大类指令:报告指令、控制指令和协议指令。蓝牙 HID 支持两种协议模式:Boot Protocol(适用于键盘、鼠标等基础设备)和Report Protocol(支持自定义功能,兼容性更强)。
二、报告指令(核心数据传输指令)
1. 报告类型与格式
报告类型 | 代码 | 传输方向 | 用途 |
Input Report | 0xA1 | 设备→主机 | 发送设备输入数据(如按键、鼠标移动) |
Output Report | 0x91 | 主机→设备 | 发送控制命令(如键盘 LED 控制) |
Feature Report | 0xB1 | 双向 | 读取 / 设置设备特性(如获取设备状态) |
通用报告格式:
[消息类型][报告ID][数据...][校验] |
2. 标准设备报告格式
键盘报告(8 字节):
[0xA1][0x01][modifier][reserved][key1][key2][key3][key4][key5][key6] |
- modifier:控制键状态(如 Ctrl、Shift,每 bit 对应一个键)
- key1~key6:按下的键值(USB HID Usage Tables 定义)
键值示例:
- 0x04:A 键
- 0x1E:Enter 键
- 0x2A:左 Shift 键
鼠标报告(4 字节):
[0xA1][0x01][buttons][x][y][wheel] |
- buttons:按键状态(bit0: 左键,bit1: 右键,bit2: 中键)
- x/y:相对位移(有符号)
- wheel:滚轮偏移(有符号)
游戏手柄报告(可变长度):
[0xA1][0x01][buttons(2字节)][axis(4字节)][hats(1字节)]... |
- buttons:按键矩阵(16 位)
- axis:摇杆坐标(x,y,z,rx,ry)
- hats:方向键(8 方向)
三、控制指令(设备配置与管理)
1. 控制传输结构
[0x00][操作码][参数1][参数2][...][校验] |
- 操作码:定义具体控制操作
- 参数:取决于操作类型,长度可变
2. 标准控制操作码列表
操作码 | 名称 | 参数 | 说明 |
0x01 | GET_REPORT | [报告类型][报告 ID] | 主机请求设备发送特定报告 |
0x02 | SET_REPORT | [报告类型][报告 ID][数据...] | 主机向设备发送报告数据 |
0x03 | GET_IDLE | - | 主机查询设备空闲时间 |
0x04 | SET_IDLE | [空闲时间] | 主机设置设备空闲超时时间 |
0x05 | GET_PROTOCOL | - | 主机查询当前协议模式 |
0x06 | SET_PROTOCOL | [协议模式 (0=Boot,1=Report)] | 主机设置设备协议模式 |
0x07 | SET_FEATURE | [报告 ID][数据...] | 设置设备特性参数 |
0x08 | GET_FEATURE | [报告 ID] | 查询设备特性参数 |
四、协议指令(连接与状态管理)
1. 连接建立指令
- HID_CONNECT:设备请求连接主机
- HID_ACCEPT:主机接受连接
- HID_REJECT:主机拒绝连接(附带错误码)
2. 协议模式指令
Boot Protocol 模式:
- SET_BOOT_PROTOCOL:切换到 Boot 模式,使用固定报告格式
- GET_BOOT_PROTOCOL:查询当前是否为 Boot 模式
Report Protocol 模式:
- SET_REPORT_PROTOCOL:切换到 Report 模式,使用自定义报告描述符
- GET_REPORT_PROTOCOL:查询当前是否为 Report 模式
3. 断开连接指令
- HID_DISCONNECT:设备或主机发起断开连接
- HID_DISCONNECT_ACK:确认断开(可选)
五、报告描述符(核心配置)
报告描述符是定义设备功能和数据格式的核心配置,采用二进制编码,由多个条目组成。
1. 条目格式
类型 | 格式 | 说明 |
短条目 | [bTag][bData] | 2 字节,常用 |
长条目 | [bTag][wData (2 字节)] | 3 字节,用于大数值 |
bTag 字段定义:
- 0x05:Usage Page(定义用途类别,如键盘、鼠标)
- 0x09:Usage(定义具体用途,如 A 键、左键)
- 0x15:Logical Minimum(数据最小值)
- 0x25:Logical Maximum(数据最大值)
- 0x75:Report Size(数据位宽)
- 0x95:Report Count(数据项数量)
- 0xA1:Collection(开始数据集合)
- 0xC0:End Collection(结束数据集合)
- 0x81:Input(定义输入数据)
- 0x91:Output(定义输出数据)
- 0xB1:Feature(定义特性数据)
2. 键盘报告描述符示例
[0x05,0x01] // Usage Page (Generic Desktop) [0x09,0x06] // Usage (Keyboard) [0xA1,0x01] // Collection (Application) [0x05,0x07] // Usage Page (Key Codes) [0x19,0xE0] // Usage Minimum (224) [0x29,0xE7] // Usage Maximum (231) [0x15,0x00] // Logical Minimum (0) [0x25,0x01] // Logical Maximum (1) [0x75,0x01] // Report Size (1bit) [0x95,0x08] // Report Count (8bit) [0x81,0x02] // Input (Data,Var,Abs) - 修饰键 [0x95,0x01] // Report Count (1) [0x75,0x08] // Report Size (8bit) [0x81,0x03] // Input (Cnst,Var,Abs) - 保留字节 [0x95,0x06] // Report Count (6) [0x75,0x08] // Report Size (8bit) [0x81,0x00] // Input (Data,Arr,Abs) - 按键 [0xC0] // End Collection |
六、指令传输流程示例
键盘按键传输(Boot Protocol):
- 用户按下 "A" 键
- 设备生成报告:[0xA1][0x01][0x00][0x00][0x04][0x00][0x00][0x00][0x00][0x00]
- 通过蓝牙 L2CAP/ATT 通道发送至主机
- 主机解析报告,识别为 "A" 键按下事件
主机设置键盘 LED(Caps Lock):
- 主机发送控制指令:[0x00][0x02][0x91][0x01][0x01][0x00][0x00][0x00][0x00][0x00][校验]
- 0x02: SET_REPORT
- 0x91: Output Report
- 0x01: Report ID
- 0x01: Caps Lock 状态(1 = 开启)
- 设备接收到指令,设置 Caps Lock LED 状态
- 设备返回确认(可选):[0x00][0x00][0x00][0x00][0x00][0x00][0x00][0x00][0x00][0x00][校验]
- 鼠标应用
1、鼠标报告基础格式
蓝牙 HID 鼠标报告标准格式 (4 字节):
[报告ID][按键状态][X位移][Y位移][滚轮] (部分设备含滚轮信息) |
- 报告 ID:通常为 0x01
- 按键状态:第 1 字节,每 bit 对应一个按键
- Bit 0: 左键 (0x01)
- Bit 1: 右键 (0x02)
- Bit 2: 中键 (0x04)
- X/Y 位移:第 2/3 字节,8 位有符号整数 (范围 - 128~127),表示相对移动像素
- 滚轮:第 4 字节,正数表示向下滚动,负数表示向上滚动
示例:
- 左键按下:[0x01][0x01][0x00][0x00]
- 右键按下:[0x01][0x02][0x00][0x00]
- 中键按下:[0x01][0x04][0x00][0x00]
- 左键按下且向右移动 32 像素:[0x01][0x01][0x20][0x00]
2、鼠标按键功能详解
2.1 单击 (Click)
定义:按下按键后 100ms 内释放
指令序列:
- 按下按键:[0x01][按键位][0x00][0x00]
- 例:左键按下:[0x01][0x01][0x00][0x00]
- 释放按键:[0x01][0x00][0x00][0x00]
应用场景:
- 选择文件 / 图标
- 点击网页链接
- 确认对话框
2.2双击 (Double Click)
定义:两次连续单击,间隔在 300ms 内
指令序列:
// 第一次单击 [0x01][按键位][0x00][0x00] // 按下 [0x01][0x00][0x00][0x00] // 释放(100ms内) // 间隔<300ms ... // 第二次单击 [0x01][按键位][0x00][0x00] // 按下 [0x01][0x00][0x00][0x00] // 释放(100ms内) |
应用场景:
- 打开文件 / 应用程序
- 文字 / 段落选中
- 地图 / 图像缩放 (双击放大)
2.3 长按 (Long Press/Hold)
定义:按键按下持续时间≥500ms
指令序列:
- 按下按键:[0x01][按键位][0x00][0x00]
- 保持按下状态 (每 100-200ms 发送一次报告):
[0x01][按键位][0x00][0x00] // 持续发送以保持连接 |
- 释放按键:[0x01][0x00][0x00][0x00]
应用场景:
- 上下文菜单 (右键长按)
- 文件拖放 (左键长按 + 移动)
- 游戏角色持续移动
- 特殊功能激活 (如截图、录音)
2.4 组合按键 (Composite Buttons)
定义:同时按下多个按键
指令序列:
[0x01][按键组合][0x00][0x00] |
按键组合示例:
- 左右键同时按下:[0x01][0x03][0x00][0x00](0x01|0x02=0x03)
- 三键同时按下:[0x01][0x07][0x00][0x00](0x01|0x02|0x04=0x07)
应用场景:
- 游戏快捷键
- 专业软件特殊操作
- 系统级功能 (如截图、强制退出)
3、鼠标移动与滚轮指令
3.1 鼠标移动
指令格式:
[0x01][0x00][X位移][Y位移] |
位移编码:
- 正数:X 向右,Y 向下
- 负数:X 向左,Y 向上
- 示例:向右移动 100 像素:[0x01][0x00][0x64][0x00]
3.2. 滚轮操作
指令格式:
[0x01][0x00][0x00][0x00][滚轮值] // 5字节格式 |
- 滚轮值 > 0:向下滚动
- 滚轮值 < 0:向上滚动
- 示例:向下滚动 3 格:[0x01][0x00][0x00][0x00][0x03]
4、实战应用示例
4.1 完整左键单击流程
// 1. 按下左键 [0x01][0x01][0x00][0x00] // 2. 短暂停留(20-100ms) ... // 3. 释放左键 [0x01][0x00][0x00][0x00] |
4.2 双击实现 (左键)
// 第一次单击 [0x01][0x01][0x00][0x00] // 按下 [0x01][0x00][0x00][0x00] // 释放(50ms后) // 间隔(100ms) ... // 第二次单击 [0x01][0x01][0x00][0x00] // 按下 [0x01][0x00][0x00][0x00] // 释放(50ms后) |
4.3 长按实现 (右键)
// 1. 按下右键 [0x01][0x02][0x00][0x00] // 2. 保持按下状态(每150ms发送一次) [0x01][0x02][0x00][0x00] // 150ms后 [0x01][0x02][0x00][0x00] // 300ms后 [0x01][0x02][0x00][0x00] // 450ms后 // 3. 500ms后释放(触发长按事件) [0x01][0x00][0x00][0x00] |
5、指令注意事项与实现要点
5.1报告发送频率:
- 按键状态变化时立即发送
- 持续按下时建议每 100-200ms 发送一次以保持连接
- 移动时根据位移速度调整频率 (最高 1000Hz)
5.2消抖处理:
- 按键检测添加 10-30ms 消抖延迟,防止误触发
5.3兼容性考虑:
- 确保报告 ID 正确 (通常为 0x01)
- 严格遵循 4/5 字节格式
- 位移值控制在 - 128~127 范围内
5.4低功耗优化:
- 无操作时进入低功耗模式
- 减少不必要的报告发送
- 总结与资源
蓝牙 HID 指令集是 USB HID 协议的无线实现,主要包括报告指令(数据传输)、控制指令(配置管理)和协议指令(连接管理)。
蓝牙 HID 鼠标通过标准 4/5 字节报告实现各种功能,核心在于按键状态位编码和位移数据的正确传输。掌握单击 (按下 - 释放)、双击 (两次快速单击)、长按 (持续按下 > 500ms) 和组合按键的指令序列,即可实现完整的鼠标交互功能。实际应用中,建议结合设备特性和主机需求,优化报告发送策略以平衡性能和功耗。
注:蓝牙 HID 协议完全兼容 USB HID 标准,因此上述指令同样适用于 USB 有线鼠标。
完整指令细节可参考以下官方文档:
- 蓝牙 SIG 官方文档:
- Human Interface Device Profile (HID Profile)
- HID over GATT Profile (HOGP)
- USB-IF 官方文档:
- Device Class Definition for HID 1.11
- HID Usage Tables 1.22
注:本指南基于蓝牙 HID 1.1.1 和 HOGP 1.1 标准整理,部分厂商可能有自定义扩展指令。如需特定设备的完整指令集,建议参考对应设备的官方开发文档或蓝牙 SIG 会员专区获取完整规范。
获取更多蓝牙知识文章,有想法请在评论区留言!下一篇,我们介绍蓝牙HID扩展应用,敬请关注!