BLE协议—HID
HID设备
HID(Human Interface Device,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,比如键盘、鼠标、游戏手柄等。为了无线与有线设备相同类型设备的兼容,BLE HID设备与USB HID设备使用的都是同一种规范。
HOGP(HID Over GATT Profile)
HOGP(HID Over GATT Profile)是在BLE GATT协议的基础上实现的HID协议。
HID服务
以普通鼠标HID服务为例子
服务UUID:0x1812
HID服务包含了多个特征。
--------------------------------------------------------------------------------------
HID info特征
UUID:0x2A4A
用来放置一些 HID 信息:分别为版本号,设备目的国家的识别码,特性标志。
--------------------------------------------------------------------------------------
HID MAP特征
UUID:0x2A4B
HID MAP也称为Report Description,用于描述上报事件的格式以及功能。HID MAP主要由一个个项目组成,项目的结构可近似于json数据格式,项目的结构如上图所示。
Collection:集合,相当于json中的{}。
Application Collection:应用集合,用于区分功能。
Physical Collection:子集合,细化区分。
Report ID:报告ID,用于区分Report,一个HID MAP里可能有多个Report。
Report Size:报告大小,描述报告的大小,单位为bit(位)。
Report Count: 报告数量,描述报告总共有多少项。
Logical Minimum:逻辑最小值,每个项的取值范围中的最小值。
Logical Maximum:逻辑最大值,每个项的取值范围中的最大值。
Usage:使用方式,对设备类型、功能进行说明。
以普通鼠标的HID MAP为例
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x02, // Usage (Mouse)
0xA1, 0x01, // Collection (Application)
0x85, 0x01, // Report Id (1)
0x09, 0x01, // Usage (Pointer)
0xA1, 0x00, // Collection (Physical)
0x05, 0x09, // Usage Page (Buttons)
0x19, 0x01, // Usage Minimum (01) - Button 1
0x29, 0x03, // Usage Maximum (03) - Button 3
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x03, // Report Count (3)
0x81, 0x02, // Input (Data, Variable, Absolute) - Button states
0x75, 0x05, // Report Size (5)
0x95, 0x01, // Report Count (1)
0x81, 0x01, // Input (Constant) - Padding or Reserved bits
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x30, // Usage (X)
0x09, 0x31, // Usage (Y)
0x09, 0x38, // Usage (Wheel)
0x15, 0x81, // Logical Minimum (-127)
0x25, 0x7F, // Logical Maximum (127)
0x75, 0x08, // Report Size (8)
0x95, 0x03, // Report Count (3)
0x81, 0x06, // Input (Data, Variable, Relative) - X & Y coordinate
0xC0, // End Collection
0xC0, // End Collection
0x05, 0x01, // Usage Page (Generic Desktop)
二进制为0000 0101,对应上图可得类型为0000 01xx = Usage Page,数据为0x01,通过查找官方文档可得Generic Desktop(0x01)
所以从上面鼠标的HID MAP我们可以得到鼠标的HID结构为
{
Usage Page (Generic Desktop) - 通用桌面设备
Usage (Mouse) - 具体设备是鼠标
{ Collection (Application)
Report Id (1) - 报告ID为1
Usage (Pointer) - Pointer,用于指向或指示用户意图的值
{ Collection (Physical)
Usage Page (Buttons) - 按键功能
Usage Minimum (01) - 最小按键使用数量为1,意思是最小是1个按键
Usage Maximum (03) - 最大按键使用数量为3,意思是最大是3个按键
Logical Minimum (0) - 按键值最小为0
Logical Maximum (1) - 按键值最大为1
Report Size (1) - 按键值大小为1bit
Report Count (3) - 按键值数据为3个
Input (Data, Variable, Absolute) - 按键值为可读数据、变量、绝对值
Report Size (5) - 添加5bit数据
Report Count (1) - 添加1个5bit数据
Input (Constant) - 5bit数据为常量,为了筹够1byte
Usage Page (Generic Desktop) - 通用桌面设备
Usage (X) - x方向坐标
Usage (Y) - y方向坐标
Usage (Wheel) - 滚轮
Logical Minimum (-127) - x、y、滚轮最小值为-127
Logical Maximum (127) - x、y、滚轮最大值为127
Report Size (8) - x、y、滚轮数据都为8bit
Report Count (3) - 添加x、y、滚轮数据
Input (Data, Variable, Relative) - x、y坐标数据为可读数据、变量、相对值
} Collection (Physical)
} Collection (Application)
}
所得到的具体数据格式可以参考下图
具体Usage数据可以查看官方文档
官方HID Usage列表
--------------------------------------------------------------------------------------
HID Control Point 特征
UUID:0x2A4C
用于通知 HID HOST 的状态。比如当电脑休眠时,通知HID device进入挂起状态,电脑唤醒后通知HID device退出挂起状态。
--------------------------------------------------------------------------------------
HID Report 特征
UUID:0x2A4D
HID Report分为三种:Input Reports、Output Reports和Feature Reports
Input Reports:输入报告,表示BLE HID设备可读数据,BLE主机可以读取数据,例如键盘鼠标滚轮。
Output Reports:输出报告,表示BLE HID设备可写数据,BLE主机可以写入数据,例如控制键盘上的灯亮灭。
Feature Reports:特征报告,表示BLE HID设备可读可写数据,BLE主机可以读取和写入数据,例如耳机音量大小可以手机控制也可以耳机控制同时同步到手机上。
三种Report根据特征描述的值进行区分(UUID 0x2908)
--------------------------------------------------------------------------------------
HID Mode 特征
UUID:0x2A4E
HID Mode分为两种,boot mode和report mode。
boot mode:启动模式,也称为boot protocol,数据格式固定,一般用于鼠标键盘在PC BIOS运行时识别工作。
report mode:报告模式,也称为report protocol,数据格式不固定,需要PC正常启动后识别才能正常工作。比如电竞鼠标会比普通鼠标多几个按键。
--------------------------------------------------------------------------------------
HID Boot Report 特征
HID在Boot模式下使用的特征,根据不同的设备有一个或多个(input或output)不同的UUID。
--------------------------------------------------------------------------------------
电池服务
BLE HID设备因为是无线设备,所以BLE服务中一般还会包含电池服务,用于提醒用户设备电量。
UUID:0x180F
特征
UUID:0x2A19
支持NOTIFY和READ,不支持WRITE。
学习笔记,有问题欢迎指出
参考链接:
https://www.bilibili.com/video/BV1rv4y197HW?p=19&vd_source=d886d6911e91d9cfab17458b99639624