【问题标题】:How to get device path using libusb in Linux如何在 Linux 中使用 libusb 获取设备路径
【发布时间】:2013-02-20 12:37:47
【问题描述】:

我正在寻找一种在 C# 中获取 USB 到达和移除事件的跨平台方法,我发现了“LibUsbDotNet C# USB 库”(http://sourceforge.net/projects/libusbdotnet/?source=navbar)。

它可以正常工作,但在 Linux 中,我似乎无法获取设备挂载点(路径)。在 Linux 中,它使用“libusb”库,该库没有获取设备路径的方法。

这是一个检测设备事件的简单代码示例:

internal class DeviceNotification
{
    public static IDeviceNotifier UsbDeviceNotifier = DeviceNotifier.OpenDeviceNotifier();

    private static void Main(string[] args)
    {
        // Hook the device notifier event
        UsbDeviceNotifier.OnDeviceNotify += OnDeviceNotifyEvent;

        // Exit on and key pressed.
        Console.Clear();            
        Console.WriteLine();
        Console.WriteLine("Waiting for system level device events..");
        Console.Write("[Press any key to exit]");

        while (!Console.KeyAvailable)
            Application.DoEvents();

        UsbDeviceNotifier.Enabled = false;  // Disable the device notifier

        // Unhook the device notifier event
        UsbDeviceNotifier.OnDeviceNotify -= OnDeviceNotifyEvent;
    }

    private static void OnDeviceNotifyEvent(object sender, DeviceNotifyEventArgs e)
    {
        // A Device system-level event has occured

        Console.SetCursorPosition(0,Console.CursorTop);

        Console.WriteLine(e.ToString()); // Dump the event info to output.

        Console.WriteLine();
        Console.Write("[Press any key to exit]");
    }
}

这是一个输出示例:

[DeviceType:DeviceInterface] [EventType:DeviceArrival] 名称:usbdev1.17 BusNumber:1 DeviceAddress:17 Length:18 DescriptorType:Device BcdUsb:0x0200 类:PerInterface 子类:0x00 协议:0x00 MaxPacketSize0:64 VendorID:0x059F ProductID:0x1014 BcdDevice:0x0000 制造商字符串索引:1 产品字符串索引:2 序列字符串索引:3 配置计数:1

[按任意键退出][DeviceType:DeviceInterface] [EventType:DeviceRemoveComplete] 名称:usbdev1.17 BusNumber:1 设备地址:17 长度:18 描述符类型:设备 BcdUsb:0x0200 类:PerInterface 子类:0x00 协议:0x00 MaxPacketSize0:64 VendorID:0x059F ProductID:0x1014 BcdDevice:0x0000 制造商字符串索引:1 产品字符串索引:2 序列字符串索引:3 配置计数:1

我的问题是如何获取附加或移除设备的路径,或者如何将 libusb 返回的信息与实际设备路径绑定?

【问题讨论】:

  • 请注意,如果连接了设备,并不意味着它已安装。
  • 是的,我知道,但问题是我也无法获取设备路径

标签: c# linux usb libusb


【解决方案1】:

您需要使用 UDev 而不是 libusb。 Libusb 只会告诉您系统上有哪些 USB 设备,但不会告诉您它们的安装位置。 UDev 处理安装它们。

有 libudev,文档应该在这里:http://www.freedesktop.org/software/systemd/libudev/ 但它目前似乎已关闭。这是关于libudev的教程:Tutorial: How to use libudev and SysFS in Linux

还有一个基于 GLib 的 libudev 包装器,此处的文档:http://ftp.osuosl.org/pub/linux/utils/kernel/hotplug/gudev/ 并且似乎有一个用于 libgudev 的 c# 包装器。

但最后你可能会发现使用 GLib 的 GIO 比进入 udev 级别更容易:Volumes and Drives API 参考。

【讨论】:

    【解决方案2】:

    USB设备文件通常存放在路径:

    /dev/bus/usb
    

    该文件夹中的子目录应与您上面的巴士号码相匹配。如果 USB 设备没有直接连接到计算机,例如通过集线器或其他外部设备,事情会变得复杂。不要忘记从十六进制转换。

    【讨论】:

    • 如何将在 /dev/bus/usb 中找到的设备链接到系统将安装的开发名称。例如,我连接了两个 USB 设备,它们的总线地址均为 1,它们的设备地址分别为 5、6;挂载的设备分别是 /dev/sdb1 和 /dev/sdc1
    • 文件名完全独立于 USB 总线信息。它们由udev分配。
    • @LAS - 我不明白您的评论以及这与使用 libusb 有何关系?如果您正在寻找 /dev/sd* 设备(文件系统),则不需要 libusb 与这些设备进行通信。我自己使用 libusb 与各种类型的调制解调器进行通信。使用 libusb,我直接打开通道到 /dev/bus/usb/... 设备而不是 Linux 级别的字符设备。
    • @JimBlack 他需要通过 libusb 检测设备到达/移除,一旦设备到达通知被触发,他需要知道它的挂载点
    猜你喜欢
    • 2023-04-01
    • 2016-09-21
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多