使用Wireshark获取USB HID(Human Interface Device)报告描述符

时间:2024-11-13 07:11:05

使用Wireshark选择需要获取的USB进行抓取数据,找到设备(host)接收信息的数据

第二栏出现hid报告,右击选择复制流 

将复制的内容粘贴到USB标准请求及描述符在线分析工具 - USB中文网 进行解析

以图中获取手写板的数据为例:

0x05, 0x0D,        // Usage Page (Digitizer)
0x09, 0x01,        // Usage (Digitizer)
0xA1, 0x01,        // Collection (Application)
0x85, 0x01,        //   Report ID (1)
0x09, 0x02,        //   Usage (Pen)
0xA1, 0x00,        //   Collection (Physical)
0x15, 0x00,        //     Logical Minimum (0)
0x25, 0x01,        //     Logical Maximum (1)
0x75, 0x01,        //     Report Size (1)
0x09, 0x42,        //     Usage (Tip Switch)
0x09, 0x44,        //     Usage (Barrel Switch)
0x09, 0x45,        //     Usage (Eraser)
0x09, 0x3C,        //     Usage (Invert)
0x95, 0x04,        //     Report Count (4)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x01,        //     Report Count (1)
0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x32,        //     Usage (In Range)
0x95, 0x01,        //     Report Count (1)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x02,        //     Report Count (2)
0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
0x15, 0x00,        //     Logical Minimum (0)
0x35, 0x00,        //     Physical Minimum (0)
0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
0x55, 0x0F,        //     Unit Exponent (-1)
0x75, 0x10,        //     Report Size (16)
0x95, 0x01,        //     Report Count (1)
0x09, 0x30,        //     Usage (X)
0x26, 0x38, 0x63,  //     Logical Maximum (25400)
0x45, 0x73,        //     Physical Maximum (115)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x31,        //     Usage (Y)
0x26, 0x03, 0x3E,  //     Logical Maximum (15875)
0x45, 0x48,        //     Physical Maximum (72)
0x95, 0x01,        //     Report Count (1)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x65, 0x00,        //     Unit (None)
0x55, 0x00,        //     Unit Exponent (0)
0x05, 0x0D,        //     Usage Page (Digitizer)
0x09, 0x30,        //     Usage (Tip Pressure)
0x15, 0x00,        //     Logical Minimum (0)
0x26, 0xFF, 0x1F,  //     Logical Maximum (8191)
0x75, 0x10,        //     Report Size (16)
0x95, 0x01,        //     Report Count (1)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x3D,        //     Usage (X Tilt)
0x16, 0xD8, 0xDC,  //     Logical Minimum (-9000)
0x26, 0x28, 0x23,  //     Logical Maximum (9000)
0x75, 0x10,        //     Report Size (16)
0x95, 0x01,        //     Report Count (1)
0x55, 0x0E,        //     Unit Exponent (-2)
0x65, 0x14,        //     Unit (System: English Rotation, Length: Centimeter)
0x36, 0xD8, 0xDC,  //     Physical Minimum (-9000)
0x46, 0x28, 0x23,  //     Physical Maximum (9000)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x3E,        //     Usage (Y Tilt)
0x16, 0xD8, 0xDC,  //     Logical Minimum (-9000)
0x26, 0x28, 0x23,  //     Logical Maximum (9000)
0x75, 0x10,        //     Report Size (16)
0x95, 0x01,        //     Report Count (1)
0x55, 0x0E,        //     Unit Exponent (-2)
0x65, 0x14,        //     Unit (System: English Rotation, Length: Centimeter)
0x36, 0xD8, 0xDC,  //     Physical Minimum (-9000)
0x46, 0x28, 0x23,  //     Physical Maximum (9000)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              //   End Collection
0xC0,              // End Collection
0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
0x09, 0x06,        // Usage (Keyboard)
0xA1, 0x01,        // Collection (Application)
0x85, 0x02,        //   Report ID (2)
0x05, 0x07,        //   Usage Page (Kbrd/Keypad)
0x75, 0x01,        //   Report Size (1)
0x95, 0x08,        //   Report Count (8)
0x19, 0xE0,        //   Usage Minimum (0xE0)
0x29, 0xE7,        //   Usage Maximum (0xE7)
0x15, 0x00,        //   Logical Minimum (0)
0x25, 0x01,        //   Logical Maximum (1)
0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x0C,        //   Report Count (12)
0x75, 0x08,        //   Report Size (8)
0x15, 0x00,        //   Logical Minimum (0)
0x25, 0xFF,        //   Logical Maximum (-1)
0x05, 0x07,        //   Usage Page (Kbrd/Keypad)
0x19, 0x00,        //   Usage Minimum (0x00)
0x29, 0xFF,        //   Usage Maximum (0xFF)
0x81, 0x00,        //   Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              // End Collection

// 188 bytes

// best guess: USB HID Report Descriptor

这段是一个USB HID(Human Interface Device)报告描述符,用于描述支持**触控笔(Pen Digitizer)键盘(Keyboard)**功能的设备。这种描述符通常用于告诉主机(比如电脑或手机),设备支持哪些功能,并定义输入报告的格式。 

1. 触控笔描述符(Report ID 1)

0x05, 0x0D0xC0, 0xC0 是描述触控笔功能的部分,使用的是报告 ID 1

1.1. 基本描述
0x05, 0x0D        // Usage Page (Digitizer): 使用 Digitizer(数位板/触控笔)功能页
0x09, 0x01        // Usage (Digitizer): 使用 Digitizer 功能
0xA1, 0x01        // Collection (Application): 开始一个应用集合
1.2. 开关功能(Tip Switch, Barrel Switch, Eraser, Invert)
0x85, 0x01        // Report ID (1): 报告 ID 为 1
0x09, 0x02        // Usage (Pen): 使用 Pen(触控笔)
0xA1, 0x00        // Collection (Physical): 开始一个物理集合
0x09, 0x42        // Usage (Tip Switch): 笔尖开关(即触摸状态)
0x09, 0x44        // Usage (Barrel Switch): 侧键开关
0x09, 0x45        // Usage (Eraser): 橡皮擦开关
0x09, 0x3C        // Usage (Invert): 翻转检测
  • 这部分定义了触控笔的各种开关,如笔尖、侧键、橡皮擦和翻转状态
1.3. 位置输入(X, Y 坐标)
0x05, 0x01        // Usage Page (Generic Desktop Ctrls): 通用桌面控制
0x09, 0x30        // Usage (X): X 轴坐标
0x09, 0x31        // Usage (Y): Y 轴坐标
0x26, 0x38, 0x63  // Logical Maximum (25400): X 坐标最大值为 25400
0x26, 0x03, 0x3E  // Logical Maximum (15875): Y 坐标最大值为 15875
  • 定义了触控笔的 X 和 Y 轴坐标输入,分别有 16 位(Report Size 16),逻辑最大值是 25400 和 15875,分别表示最大分辨率 
1.4. 压力与倾斜输入(Tip Pressure, X Tilt, Y Tilt)
0x09, 0x30        // Usage (Tip Pressure): 笔尖压力
0x26, 0xFF, 0x1F  // Logical Maximum (8191): 压力最大值为 8191
0x09, 0x3D        // Usage (X Tilt): X 轴倾斜
0x09, 0x3E        // Usage (Y Tilt): Y 轴倾斜
0x16, 0xD8, 0xDC  // Logical Minimum (-9000): 倾斜最小值 -9000
0x26, 0x28, 0x23  // Logical Maximum (9000): 倾斜最大值 9000
  • 笔尖压力为 16 位输入,逻辑范围是 0-8191。
  • 倾斜输入(X Tilt, Y Tilt)也为 16 位,范围为 -9000 到 9000。

2. 键盘描述符(Report ID 2)

0x05, 0x010xC0 是描述键盘功能的部分,使用的是报告 ID 2

2.1. 键盘基本描述
0x05, 0x01        // Usage Page (Generic Desktop Ctrls): 通用桌面控制
0x09, 0x06        // Usage (Keyboard): 键盘功能
0xA1, 0x01        // Collection (Application): 开始一个应用集合
0x85, 0x02        // Report ID (2): 报告 ID 为 2
2.2. 键盘修饰键输入
0x75, 0x01        // Report Size (1): 每个输入 1 位
0x95, 0x08        // Report Count (8): 有 8 个输入
0x19, 0xE0        // Usage Minimum (0xE0): 使用最小值为 0xE0(修饰键如 Shift, Ctrl)
0x29, 0xE7        // Usage Maximum (0xE7): 使用最大值为 0xE7
  • 这部分描述了 8 位的修饰键输入(如 Ctrl、Shift、Alt、Win 键)。 
2.3. 普通键盘按键输入
0x75, 0x08        // Report Size (8): 每个按键输入 8 位
0x95, 0x0C        // Report Count (12): 支持最多同时 12 个按键输入
0x19, 0x00        // Usage Minimum (0x00): 使用最小值为 0x00
0x29, 0xFF        // Usage Maximum (0xFF): 使用最大值为 0xFF
  • 定义了普通按键的输入,共 12 个按键,每个按键 8 位(1 字节) 

  • 报告 ID 1 是用于**触控笔(Digitizer)**的输入:
    • 包含按钮状态(笔尖、侧键、橡皮擦)、X 和 Y 坐标、笔尖压力、X 和 Y 倾斜。
  • 报告 ID 2 是用于键盘的输入:
    • 包含修饰键(Ctrl、Shift 等)和普通按键的输入,支持最多 12 个按键同时按下。

这个 HID 报告描述符总共占用 188 字节,涵盖了一个带触控笔和键盘功能的设备,适用于像平板电脑或触控显示器这样的输入设备。