#usb-hid #linux #hid #gadget #tokio #usb #input

tokio-hidg

为 tokio 异步运行时提供的 Linux USB HID Gadget 仿真

3 个不稳定版本

0.2.0 2024年5月11日
0.1.1 2023年3月2日
0.1.0 2022年10月2日

Unix API 排名第 793

每月下载量 35

MIT 许可证

80KB
1.5K SLoC

Rust 中的 HID Gadget 仿真

github crate docs MIT CI

Rust 库,用于与 Linux HID Gadget 设备(/dev/hidgX)交互。该库支持 tokio 异步运行时。

由于所有功能都依赖于 Linux 函数调用,因此该库仅适用于 Linux 系统。

  • hidg-core - 核心抽象和底层接口(不适用于最终用户)
  • hidg - 仅支持同步操作的标准接口
  • tokio-hidg - 为 tokio 运行时提供的异步接口
  • async-hidg - 为其他运行时提供的异步接口

功能

使用示例

键盘输入仿真

use tokio_hidg::{Class, Device, Keyboard, Key, Led, StateChange};

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut device = Device::<Keyboard>::open(0).await?; // open device

    // Create input report
    let mut input = Keyboard.input();

    // Press left ctrl modifier
    input.press_key(Key::LeftCtrl);

    // Press key 'A'
    input.press_key(Key::A);

    // Print pressed keys
    println!("Keys: {:?}", input.pressed().collect::<Vec<Key>>());

    // Send input report
    device.input(&input).await?;

    // Release left ctrl modifier
    input.release_key(Key::LeftCtrl);

    // Release key 'A'
    input.release_key(Key::A);

    // Send input report
    device.input(&input).await?;

    // Create output report
    let mut output = Keyboard.output();

    // Receive output report
    device.output(&mut output).await?;

    // Print lit LEDs
    println!("LEDs: {:?}", output.lit().collect::<Vec<Led>>());

    Ok(())
}

鼠标输入仿真

use tokio_hidg::{Button, Class, Device, Mouse, StateChange, ValueChange};

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut device = Device::<Mouse>::open("hidg0").await?; // open device

    // Create input report
    let mut input = Mouse.input();

    // Press primary button
    input.press_button(Button::Primary);

    // Set pointer coordinates
    input.change_pointer((150, 50), false);

    // Send input report
    device.input(&input).await?;

    // Move pointer relatively
    input.change_pointer((70, -30), true);

    // Print pressed buttons
    println!("Buttons: {:?}", input.pressed().collect::<Vec<Button>>());

    // Release primary button
    input.release_button(Button::Primary);

    // Send input report
    device.input(&input).await?;

    Ok(())
}

依赖项

~3–11MB
~101K SLoC