Appearance
HID蓝牙控制
使用的是HOGP这一个协议
使用一个报告地图进行描述数据的格式(实际的数据使用gatt里面的一个表项), 之后使用发送数据修改这一个表项的方式进行发送数据
HOGP规范
HID设备通过HOGP这一个协议进行连接
HID(Human Interface Device,人机接口设备)是 USB 设备中常用的设备类型,是直接与人交互的 USB 设备,例如键盘、鼠标与游戏杆等。HID 设备并不一定要有人机交互功能,只要符合 HID 类别规范的设备都是HID 设备。
Wndows操作系统最先支持的HID设备。在windows 98以及后来的版本中内置有HID设备的驱动程序,应用程序可以直接使用这些驱动程序来与设备通信。
在设计一个 USB 接口的计算机外部设备时,如果 HID 类型的设备可以满足需要,可以将其设计为 HID 类型设备,这样可以省去比较复杂的 USB 驱动程序的编写,直接利用Windows 操作系统对标准的 HID 类型 USB 设备的支持。
蓝牙HID服务
硬件本地化, 这一个和不同的国家有关
使用的模式一般是使用报告模式
控制点: 设备低功耗模式, 可一个是可选的

数据格式
对应代码里面的hidReportMap
USB_HID协议中文版.pdf这一个文档里面有实际的数据的每一位含义的描述
在使用输入标签的时候, 数据最多只定义了9位
c
// HID Report Map characteristic value
// Keyboard report descriptor (using format for Boot interface descriptor)
static const uint8_t hidReportMap[] = {
0x05, 0x01, // Usage Page (Generic Desktop) 用途: 桌面通用 0000 0101 0000 0001 Global标签, 长度为1, 使用页面
0x09, 0x02, // Usage (Mouse) 用途 鼠标 0000 1001 0000 0010 标签, 大小为1, 用法页面
0xA1, 0x01, // Collection (Application) 1010 0001 0000 0001开集合 这是一个应用程序
0x85, 0x01, // Report Id (1) 1000 0101 报告ID, ID是01
0x09, 0x01, // Usage (Pointer) 用途指针
0xA1, 0x00, // Collection (Physical) 开集合-物理
//第一个8位数据
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) 一共有三个报告: 3个按键
0x81, 0x02, // Input (Data, Variable, Absolute) - Button states 数据输入, 可变, 独立, 绝对值
0x75, 0x05, // Report Size (5) 报告大小 5个bit, 和前面的3bit为一个byte(这几位是无效的)
0x95, 0x01, // Report Count (1) 报告数量 1
0x81, 0x01, // Input (Constant) - Padding or Reserved bits 数据输入: 常量, 独立, 绝对值
//3个字节, 鼠标的位移
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
第一行是一个Usage的声明, 在hut1_22.pdf这一个文件里面有这一个类型的数据的具体类型
使用页面的列表
使用页面下面的用法, 这一个是第一条获取的, 0x02是鼠标
c
0x05, 0x01, // Usage Pg (Generic Desktop)
0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection: (Application)
0x85, 0x02, // Report Id (2)
//
0x05, 0x07, // Usage Pg (Key Codes)
0x19, 0xE0, // Usage Min (224)
0x29, 0xE7, // Usage Max (231)
0x15, 0x00, // Log Min (0)
0x25, 0x01, // Log Max (1)
//
// Modifier byte 第一个byte
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x81, 0x02, // Input: (Data, Variable, Absolute)
//
// Reserved byte 保留的那一byte
0x95, 0x01, // Report Count (1)
0x75, 0x08, // Report Size (8)
0x81, 0x01, // Input: (Constant)
//
// LED report
0x95, 0x05, // Report Count (5)
0x75, 0x01, // Report Size (1)
0x05, 0x08, // Usage Pg (LEDs)
0x19, 0x01, // Usage Min (1)
0x29, 0x05, // Usage Max (5)
0x91, 0x02, // Output: (Data, Variable, Absolute)
//
// LED report padding
0x95, 0x01, // Report Count (1)
0x75, 0x03, // Report Size (3)
0x91, 0x01, // Output: (Constant)
//
// Key arrays (6 bytes) 按键
0x95, 0x06, // Report Count (6)
0x75, 0x08, // Report Size (8)
0x15, 0x00, // Log Min (0)
0x25, 0x65, // Log Max (101)
0x05, 0x07, // Usage Pg (Key Codes)
0x19, 0x00, // Usage Min (0)
0x29, 0x65, // Usage Max (101)
0x81, 0x00, // Input: (Data, Array)
//
0xC0, // End Collection
实际实现
- 初始化低功耗蓝牙
- 注册回调函数, 设置安全相关的参数
- 在hid的回调函数里面设置GAP的设备名字以及设备的设置
- 在hidd注册函数里面设置gatt的回调函数, 以及APP的注册
- gatt的回调函数里面设置数据库(先设置电池)
c
esp_hidd_register_callbacks(hidd_event_callback);
使用者一个函数注册HID的回调函数