#usb-device #usb #web-usb

cross_usb

一个Rust USB库,能够在原生和WASM目标上无缝工作

11个不稳定版本 (3个破坏性版本)

0.4.0 2024年8月14日
0.3.4 2024年7月6日
0.3.2 2024年4月23日
0.3.1 2024年3月24日
0.1.1 2024年1月31日

#167WebAssembly

Download history 7/week @ 2024-04-29 2/week @ 2024-06-17 189/week @ 2024-07-01 32/week @ 2024-07-08 3/week @ 2024-07-22 143/week @ 2024-08-12

每月146次下载
用于 minidisc

MIT 许可证

45KB
817

Cross USB

Lib.rs Version docs.rs

一个在大多数原生和WASM目标上无缝工作的USB库。


[!NOTE] 目前Web USB仅在基于Chromium的浏览器中工作。

[!NOTE] Web USB在浏览器中有一定的交互要求,并需要安全上下文。请在此处了解更多信息:mdn web 文档

[!IMPORTANT] 在WASM目标上编译此crate时,您必须使用rustflags RUSTFLAGS=--cfg=web_sys_unstable_apis 或通过在 .cargo/config.toml 文件中传递参数。更多信息请参阅: https://wasm.rust-lang.net.cn/wasm-bindgen/web-sys/unstable-apis.html

依赖项

对于原生USB,该crate使用 nusb,一个类似于非常流行的libusb的纯Rust库。

对于WASM,此crate使用 web-sys,它提供了对浏览器API调用的访问,在此情况下用于与 WebUSB 交互

示例

要了解USB通信的工作原理,请查看 USB in a NutShell

use cross_usb::prelude::*;
use cross_usb::usb::{Recipient, ControlType, ControlIn};
use cross_usb::device_filter;

// Obtain a device descriptor using a DeviceFilter,
// in this case with its VendorID and ProductID
let filters = vec![
    device_filter!{vendor_id: 0x054c, product_id: 0x00c9}
];
let dev_descriptor = cross_usb::get_device(filters).await.expect("Failed to find device");

// Open the device that the descriptor is describing
let dev = dev_descriptor.open().await.expect("Failed to open device");

// Obtain an interface of the device
let interface = dev.open_interface(0).await.expect("Failed to open interface");

// Send a Control transfer to the device, obtaining
// the result and storing it in `result`
let result = interface.control_in(ControlIn {
        control_type: ControlType::Vendor,
        recipient: Recipient::Interface,
        request: 0x01,
        value: 0,
        index: 0,
        length: 4,
    })
    .await
    .expect("Sending control transfer failed");

还要查看文档

TODO

  • 添加在libusb包装器和纯Rust nusb之间选择原生后端的功能
  • 如果用户需要,允许平台特定的操作
  • 热插拔支持...需要使用libusb作为可选后端,或者nusb实现它

依赖项

~0.3–14MB
~141K SLoC