BLE 的 HID over GATT Profile(简称 HOGP)就是把 USB HID 那套"键盘/鼠标/手柄即插即用"的能力搬到了低功耗链路上。手机、电脑、电视之所以能"连上蓝牙键盘就能打字、不用装驱动",靠的就是它。本文把 HOGP 的服务构成、关键特性和落地时最容易踩的坑讲清楚,适合要做 BLE 键鼠/手柄/遥控器的嵌入式工程师。
HOGP 里只有两种角色:
一个 HID 设备至少要注册三个服务:
可选还有 Scan Parameters Service(0x1813),让主机把自己的扫描窗口告诉设备,省电用;不做也能跑。
| 特性 | UUID | 属性 | 说明 |
|---|---|---|---|
| Protocol Mode | 0x2A4E | Read / Write Without Response | 0 = Boot 协议,1 = Report 协议 |
| Report | 0x2A4D | Read / Write / Notify | 数据主通道,可有多个实例 |
| Report Map | 0x2A4B | Read | HID 描述符(二进制),告诉主机数据怎么解析 |
| Boot Keyboard Input | 0x2A22 | Read / Notify | Boot 模式下键盘输入(8 字节固定) |
| Boot Keyboard Output | 0x2A32 | Read / Write / Write Without Response | Boot 模式下 LED 状态(Caps/Num/Scroll Lock) |
| Boot Mouse Input | 0x2A33 | Read / Notify | Boot 模式下鼠标输入(3 字节固定) |
| HID Information | 0x2A4A | Read | 4 字节:bcdHID + 国家码 + 标志位 |
| HID Control Point | 0x2A4C | Write Without Response | 0 = Suspend,1 = Exit Suspend |
Protocol Mode(0x2A4E) 决定设备用哪种数据格式:
实际产品里几乎都用 Report 模式:因为 PC/手机的 BIOS 阶段根本不会加载 BLE 协议栈(鼠标键盘的 BLE 连接要进系统后才有),Boot 模式在现代系统上基本用不上。设备启动后默认进 Report 模式即可。
HID 服务里通常有多个 Report 特性(UUID 都是 0x2A4D)——比如键盘有"输入报告"(按键)、"输出报告"(LED),手柄有多个输入报告。怎么区分它们?靠 Report Reference 描述符(0x2908):
属性也要配套:Input 报告至少要能 Notify;Output 报告至少要能 Write;Feature 报告至少要能 Read + Write。主机扫到多个 0x2A4D 时,就是靠 Report Reference 的 Type 和 ID 来分辨谁是谁。
Report Map(0x2A4B) 是一段二进制 HID Report Descriptor,它描述每个 Report 里每一位的含义:哪个字节是 Modifier、哪个是按键码、鼠标 X/Y 各占几位、有没有滚轮……主机只有解析了它,才知道收到的字节流怎么翻译成按键。
它是只读的,一般在设备初始化时一次性写死。写错 Report Map 是最常见的"连上了但主机完全不懂数据"的原因——它必须和你在 Report 里实际发的字节布局严格对应。
HID Information(0x2A4A):4 字节。前 2 字节是 bcdHID(版本,如 0x0101 表示 1.1),第 3 字节国家码(0x00 = 不限),第 4 字节标志位(如 0x02 = Normally Connectable)。HID Control Point(0x2A4C):主机用来通知设备挂起/唤醒。0x00 = Suspend(主机休眠,设备进低功耗),0x01 = Exit Suspend。用 Write Without Response。很多工程师只实现 0x1812,结果在部分系统上"能连但识别异常或电量不显示"。原因是 HOGP 规范把 Battery Service(0x180F,电量 0x2A19) 和 Device Information Service(0x180A) 列为期望服务,操作系统会主动去读。建议至少提供:
让主机在扫描阶段就把你识别成 HID 设备,广播包建议包含:
即便用 Report 模式,了解 Boot 键盘格式也有助于调试(8 字节定长):
例如按下 Page Down(Usage ID 0x4E):[0x00, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00]。
一句话总结:HOGP = HID Service(0x1812)为核心 + Battery + DIS 作标配,Report Map 描述数据、Report Reference 区分多报告、Protocol Mode 切 Boot/Report;把 Report Map 和 CCCD 做对,键鼠就即插即用了。