Skip to content

HID蓝牙控制

使用的是HOGP这一个协议

使用一个报告地图进行描述数据的格式(实际的数据使用gatt里面的一个表项), 之后使用发送数据修改这一个表项的方式进行发送数据

HOGP规范

image-20240622230516285

HID设备通过HOGP这一个协议进行连接

HID(Human Interface Device,人机接口设备)是 USB 设备中常用的设备类型,是直接与人交互的 USB 设备,例如键盘、鼠标与游戏杆等。HID 设备并不一定要有人机交互功能,只要符合 HID 类别规范的设备都是HID 设备。

Wndows操作系统最先支持的HID设备。在windows 98以及后来的版本中内置有HID设备的驱动程序,应用程序可以直接使用这些驱动程序来与设备通信。

在设计一个 USB 接口的计算机外部设备时,如果 HID 类型的设备可以满足需要,可以将其设计为 HID 类型设备,这样可以省去比较复杂的 USB 驱动程序的编写,直接利用Windows 操作系统对标准的 HID 类型 USB 设备的支持。

image-20240622231038265

蓝牙HID服务

image-20240622231339714

image-20240622231410183

硬件本地化, 这一个和不同的国家有关

使用的模式一般是使用报告模式

控制点: 设备低功耗模式, 可一个是可选的

image-20240622231943306

数据格式

对应代码里面的hidReportMap

image-20240623122116963

image-20240623122630648

USB_HID协议中文版.pdf这一个文档里面有实际的数据的每一位含义的描述

在使用输入标签的时候, 数据最多只定义了9位

image-20240623152748240

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这一个文件里面有这一个类型的数据的具体类型

image-20240623150212401

使用页面的列表

image-20240623145901217

使用页面下面的用法, 这一个是第一条获取的, 0x02是鼠标

image-20240623154108299

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

实际实现

image-20240622223526138

  1. 初始化低功耗蓝牙
  2. 注册回调函数, 设置安全相关的参数
  3. 在hid的回调函数里面设置GAP的设备名字以及设备的设置
  4. 在hidd注册函数里面设置gatt的回调函数, 以及APP的注册
  5. gatt的回调函数里面设置数据库(先设置电池)
c
esp_hidd_register_callbacks(hidd_event_callback);

使用者一个函数注册HID的回调函数