news 2026/1/9 18:22:10

蓝牙标准 HID 指令集完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
蓝牙标准 HID 指令集完整指南

蓝牙标准 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):

  1. 用户按下 "A" 键
  2. 设备生成报告:[0xA1][0x01][0x00][0x00][0x04][0x00][0x00][0x00][0x00][0x00]
  3. 通过蓝牙 L2CAP/ATT 通道发送至主机
  4. 主机解析报告,识别为 "A" 键按下事件

主机设置键盘 LED(Caps Lock):

  1. 主机发送控制指令:[0x00][0x02][0x91][0x01][0x01][0x00][0x00][0x00][0x00][0x00][校验]
    • 0x02: SET_REPORT
    • 0x91: Output Report
    • 0x01: Report ID
    • 0x01: Caps Lock 状态(1 = 开启)
  1. 设备接收到指令,设置 Caps Lock LED 状态
  2. 设备返回确认(可选):[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 内释放

指令序列

  1. 按下按键:[0x01][按键位][0x00][0x00]
    • 例:左键按下:[0x01][0x01][0x00][0x00]
  1. 释放按键:[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

指令序列

  1. 按下按键:[0x01][按键位][0x00][0x00]
  2. 保持按下状态 (每 100-200ms 发送一次报告):

[0x01][按键位][0x00][0x00] // 持续发送以保持连接

  1. 释放按键:[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扩展应用,敬请关注!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/2 16:53:55

期末文献分析报告撰写指南与实践研究

开题报告前那两个月&#xff0c;我电脑里塞满了乱七八糟的PDF&#xff0c;参考文献格式错得千奇百怪&#xff0c;导师一句“脉络不清”打回来三次。后来才发现&#xff0c;问题不是读得不够多&#xff0c;而是工具没用对。这三个工具帮我理清了思路&#xff0c;把一堆文献变成了…

作者头像 李华
网站建设 2025/12/13 0:29:53

【JavaWeb】Servlet_HelloWorld

目录Servlet 开发流程目标创建JavaWeb项目&#xff0c;同时将tomcat添加为当前项目的依赖编写Java代码web.xml中&#xff0c;配置Servlet 对应的的请求映射路径测试Servlet 开发流程 创建JavaWeb项目&#xff0c;同时将tomcat添加为当前项目的依赖重写service方法&#xff0c;…

作者头像 李华
网站建设 2025/12/13 0:25:24

03_AI总结每日AI新闻推送到微信

效果展示&#xff1a; 一、 为什么选择“Python GitHub Actions”&#xff1f;(可忽略&#xff09; 每天早上&#xff0c;你是否花费大量时间筛选AI新闻&#xff1f;本教程将教你如何搭建一个完全免费&#xff08;仅需支付极少量API调用费&#xff09;、全自动的AI新闻摘要系…

作者头像 李华
网站建设 2025/12/13 0:23:56

空洞骑士模组管理新体验:Scarab工具全面解析

空洞骑士模组管理新体验&#xff1a;Scarab工具全面解析 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 模组管理对于《空洞骑士》玩家而言&#xff0c;从曾经的繁琐操作逐渐转…

作者头像 李华
网站建设 2025/12/13 0:23:40

7、Linux 和 Solaris 系统下文件归档与压缩实用指南

Linux 和 Solaris 系统下文件归档与压缩实用指南 在计算机操作中,将多个文件从一个位置复制到另一个位置时,如果能把这些文件打包成一个单元,操作效率会更高,尤其是在复制成百上千个文件时。在 Windows 环境里,我们可以轻松地通过点击和拖动文件夹来完成复制操作;而在 L…

作者头像 李华