#usb-hid #mouse #hid #keyboard #mouse-input #usb #linux

bin+lib hid-api-rs

键盘/鼠标输入的硬件代理,用于注入和拦截

7 个稳定版本

3.0.1 2024 年 5 月 26 日
3.0.0 2024 年 5 月 25 日
2.0.1 2024 年 1 月 25 日
1.1.3 2023 年 6 月 13 日

#171硬件支持

Download history 320/week @ 2024-05-25 15/week @ 2024-06-01 6/week @ 2024-06-08 2/week @ 2024-06-15 1/week @ 2024-06-29 8/week @ 2024-07-06

415 每月下载量

GPL-2.0-or-later

56KB
1.5K SLoC

hid-api-rs

Crates.io docs.rs

想要访问按键和鼠标输入,而不调用系统级 API 或甚至在主机内核处理之前?这个库通过代理设备通过微型计算机(Raspberry PI 4b & 5)实现,然后反过来路由到任何计算机。这允许对每个代理设备进行注入、修改和状态查看。

C# 版本 相比,这是一个改进,因为可以同时使用多个键盘。

设置

  1. 确保 SBC 通过 OTG 端口连接到主机 PC。如果您使用的是 Raspberry Pi 4 Model B 或 5,请使用 USBC-USBA 适配器或 USBC 电缆。
  2. 遵循 首次安装
  3. 将鼠标或键盘(如果有备用,可以更容易地进行)连接到 SBC。
  4. /dev/input/ 中找到您的鼠标位置(它应该是 /dev/input/mice/)。如果您没有插入鼠标,请跳过此步骤。
  5. 如果您使用键盘,它将不同,并且应显示在 /dev/input/by-id/ 中,命名为 ...-event-kbd。如果您没有插入键盘,请跳过此步骤。
  6. 现在,找到您的设备路径。如果不是,请尝试暴力破解 hidg0-..x。这部分很重要,是必须的。
  7. 找到路径后,将其插入项目或 示例 中,构建/运行,然后它会通过微型计算机将输入传递到主机 PC。

首次安装

在您的 Raspberry Pi 上运行以下命令

  1. echo "dwc2" | sudo tee -a /etc/modules && echo "libcomposite" | sudo tee -/etc/modules,这些启用 OTG 主机/从机驱动程序和 ConfigFS
  2. echo "dtoverlay=dwc2, dr_mode=peripheral" | /boot/firmware/config.txt,确保otg_mode=1被注释掉或完全删除,否则将无法工作。
  3. sudowget -O/usr/bin/example_gadget https://raw.githubusercontent.com/StrateimTech/hid-api-rs/master/example_gadget.sh
  4. sudochmod +x /usr/bin/example_gadget
  5. echo"/usr/bin/example_gadget" |sudo tee-a/etc/rc.local
  6. 重启或运行 sudo /usr/bin/example_gadget
  7. 完成,你很可能再也不会需要这样做。/dev/hidg0... 应该在启动时自动生成。
  8. (可选)根据您的喜好修改示例小工具。

如果以下命令中的任何一个没有工作,您可以遵循这个外部但仍然相关的指南,由Tobi提供。

构建示例

git clone https://github.com/StrateimTech/hid-api-rs
cd ./hid-api-rs
cargo build --bin hid_api_example --target armv7-unknown-linux-gnueabihf

构建完成后,使用您首选的方法将其传输到树莓派上,在运行之前,请确保使用提升权限,因为它正在访问/dev/目录。 chmod +x hid_api_example

需求

  • 微型计算机/备用计算机,支持USB OTG(树莓派4型号B或5)

示例

  • hid_api_example,键盘和鼠标示例代码,带有状态注入。
  • hid_api_example_mouse,仅鼠标,每500毫秒显示鼠标的当前状态。
  • hid_api_example_injection,仅注入,无设备直通。它应该每秒将鼠标向右移动25px。

ConfigFs小工具的报告描述符

0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
0x09, 0x02,        // Usage (Mouse)
0xA1, 0x01,        // Collection (Application)
0x09, 0x01,        //   Usage (Pointer)
0xA1, 0x00,        //   Collection (Physical)
0x85, 0x01,        //     Report ID (1)
0x05, 0x09,        //     Usage Page (Button)
0x19, 0x01,        //     Usage Minimum (0x01)
0x29, 0x05,        //     Usage Maximum (0x05)
0x15, 0x00,        //     Logical Minimum (0)
0x25, 0x01,        //     Logical Maximum (1)
0x95, 0x05,        //     Report Count (5)
0x75, 0x01,        //     Report Size (1)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x01,        //     Report Count (1)
0x75, 0x03,        //     Report Size (3)
0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
0x09, 0x30,        //     Usage (X)
0x09, 0x31,        //     Usage (Y)
0x16, 0x01, 0x80,  //     Logical Minimum (-32767)
0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
0x75, 0x10,        //     Report Size (16)
0x95, 0x02,        //     Report Count (2)
0x81, 0x06,        //     Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x38,        //     Usage (Wheel)
0x15, 0x81,        //     Logical Minimum (-127)
0x25, 0x7F,        //     Logical Maximum (127)
0x75, 0x08,        //     Report Size (8)
0x95, 0x01,        //     Report Count (1)
0x81, 0x06,        //     Input (Data,Var,Rel,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)
0x19, 0xE0,        //   Usage Minimum (0xE0)
0x29, 0xE7,        //   Usage Maximum (0xE7)
0x15, 0x00,        //   Logical Minimum (0)
0x25, 0x01,        //   Logical Maximum (1)
0x75, 0x01,        //   Report Size (1)
0x95, 0x08,        //   Report Count (8)
0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x75, 0x08,        //   Report Size (8)
0x95, 0x01,        //   Report Count (1)
0x81, 0x01,        //   Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x75, 0x01,        //   Report Size (1)
0x95, 0x03,        //   Report Count (3)
0x05, 0x08,        //   Usage Page (LEDs)
0x19, 0x01,        //   Usage Minimum (Num Lock)
0x29, 0x03,        //   Usage Maximum (Scroll Lock)
0x91, 0x02,        //   Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x75, 0x01,        //   Report Size (1)
0x95, 0x05,        //   Report Count (5)
0x91, 0x01,        //   Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x75, 0x08,        //   Report Size (8)
0x95, 0x06,        //   Report Count (6)
0x15, 0x00,        //   Logical Minimum (0)
0x26, 0xFF, 0x00,  //   Logical Maximum (255)
0x05, 0x07,        //   Usage Page (Kbrd/Keypad)
0x19, 0x00,        //   Usage Minimum (0x00)
0x2A, 0xFF, 0x00,  //   Usage Maximum (0xFF)
0x81, 0x00,        //   Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              // End Collection

// 133 bytes

https://eleccelerator.com/usbdescreqparser解析

十六进制

0x05 0x01 0x09 0x02 0xA1 0x01 0x09 0x01 0xA1 0x00 0x85 0x01 0x05 0x09 0x19 0x01 0x29 0x03 0x15 0x00 0x25 0x01 0x95 0x03 0x75 0x01 0x81 0x02 0x95 0x01 0x75 0x05 0x81 0x03 0x05 0x01 0x09 0x30 0x09 0x31 0x16 0x01 0x80 0x26 0xFF 0x7F 0x75 0x10 0x95 0x02 0x81 0x06 0x09 0x38 0x15 0x81 0x25 0x7F 0x75 0x08 0x95 0x01 0x81 0x06 0xC0 0xC0 0x05 0x01 0x09 0x06 0xA1 0x01 0x85 0x02 0x05 0x07 0x19 0xe0 0x29 0xe7 0x15 0x00 0x25 0x01 0x75 0x01 0x95 0x08 0x81 0x02 0x75 0x08 0x95 0x01 0x81 0x01 0x75 0x01 0x95 0x03 0x05 0x08 0x19 0x01 0x29 0x03 0x91 0x02 0x75 0x01 0x95 0x05 0x91 0x01 0x75 0x08 0x95 0x06 0x15 0x00 0x26 0xff 0x00 0x05 0x07 0x19 0x00 0x2a 0xff 0x00 0x81 0x00 

依赖关系

~1.2–1.7MB
~41K SLoC