#usb-device #usb #async #hardware #libusb

eusb

Rust 用于访问USB设备的库

15 个版本 (6 个稳定版本)

1.0.5 2024年2月27日
1.0.2 2024年1月5日
1.0.1 2023年12月28日
0.4.2 2023年8月29日

硬件支持 中排名 625

Download history 37/week @ 2024-03-27 60/week @ 2024-04-03 1/week @ 2024-05-22

每月下载量 387
hackrf-rs 中使用

MIT 许可证

1.5MB
25K SLoC

C 16K SLoC // 0.3% comments Visual Studio Project 4.5K SLoC Rust 3K SLoC // 0.0% comments C++ 1K SLoC // 0.0% comments Visual Studio Solution 753 SLoC Automake 67 SLoC

Build Build Build Build

EUsb

eusb crate 提供了一种使用 async fn 的简单方式来与USB进行通信。

示例

使用 hackrf one 设备进行测试。

use log::*;
use eusb::prelude::*;

#[tokio::main]
async fn main() {
    let _ = env_logger::builder().filter_level(LevelFilter::Info).is_test(true).try_init();

    let devices = UsbDevice::list().unwrap();
    for device in devices {
        let mut product = "".to_string();
        let mut manufacturer = "".to_string();

        if let Ok(s) = device.product() {product=s};
        if let Ok(s) = device.manufacturer() {manufacturer=s};

        let sn = match device.serial_number() {
            Ok(s) => { s }
            Err(_) => { "没有权限,无法获取部分信息".to_string() }
        };

        let bcd_usb = device.bcd_usb_version().unwrap();
        let bcd_device = device.bcd_device_version().unwrap();
        let des = device.device_descriptor().unwrap();
        let mut msg = format!(r"
Device:
  pid: 0x{:04X}
  vid: 0x{:04X}
  sn: {}
  bcd usb: {}.{}
  bcd device: {}.{}
  class: {:?}
  subclass: {:?}
  protocol: {:?}
  manufacturer: {}
  product: {}
",
                              des.idProduct,
                              des.idVendor,
                              sn,
                              bcd_usb[1],bcd_usb[2],
                              bcd_device[1],bcd_device[2],
                              device.device_class().unwrap(),
                              device.device_subclass().unwrap(),
                              device.device_protocol().unwrap(),
                              manufacturer, product);
        let cfg_list = device.config_list().unwrap();
        for cfg in &cfg_list {
            msg += format!(r"
  Configuration [{}]:
    Value {}
    MaxPower {} mA
    Extra {:?}
           ", cfg.configuration, cfg.value, cfg.max_power,cfg.extra).as_str();

            for alts in &cfg.interfaces {
                let interface = &alts.alt_settings[0];

                msg += format!(r"
    Interface [{}]:
      Alternate Setting {}
      Class: {:?}
      Subclass: {:?}
      Protocol {:?}
      Extra: {:?}
                ",
                               interface.interface,
                               interface.alt_setting,
                               interface.device_class,
                               interface.device_sub_class,
                               interface.protocol,
                               interface.extra
                ).as_str();


                for endpoint in &interface.endpoints {
                    msg += format!(r"
      Endpoint [{}]:
        Direction {:?}
        Transfer Type: {:?}
        Usage Type: {:?}
        Sync Type {:?}
        Extra: {:?}
                ",
                                   endpoint.num,
                                   endpoint.direction,
                                   endpoint.transfer_type,
                                   endpoint.usage_type,
                                   endpoint.sync_type,
                                   endpoint.extra
                    ).as_str();
                }
            }
        }


        info!("{}", msg)
    }
}


依赖项

~1.2–4MB
~78K SLoC