如何在Linux中使用libusb获取设备路径

5
我正在寻找一种跨平台的方式,以C#获取USB插入和拔出事件,并找到了“LibUsbDotNet C# USB Library”(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]");
    }
}

这里是输出示例:

[设备类型:设备接口] [事件类型:设备到达] 名称:usbdev1.17 总线编号:1 设备地址:17 长度:18 描述符类型:设备 BcdUsb:0x0200 类别:每个接口子类:0x00 协议:0x00 MaxPacketSize0:64 厂商ID:0x059F 产品ID:0x1014 BcdDevice:0x0000 制造商字符串索引:1 产品字符串索引:2 序列号字符串索引:3 配置计数:1

[按任意键退出] [设备类型:设备接口] [事件类型:设备移除完成] 名称:usbdev1.17 总线编号:1 设备地址:17 长度:18 描述符类型:设备 BcdUsb:0x0200 类别:每个接口子类:0x00 协议:0x00 MaxPacketSize0:64 厂商ID:0x059F 产品ID:0x1014 BcdDevice:0x0000 制造商字符串索引:1 产品字符串索引:2 序列号字符串索引:3 配置计数:1

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

请注意,如果连接了设备并不意味着它已经挂载。 - wRAR
是的,我知道这一点,但问题是我无法获取设备路径。 - LAS
2个回答

2
你需要使用UDev而不是libusb。Libusb仅告诉您系统上有哪些USB设备,但不会告诉您它们被挂载在哪里。UDev处理它们的挂载。
这里有libudev,文档应该在这里:http://www.freedesktop.org/software/systemd/libudev/,但它似乎暂时无法访问。这里有一个关于libudev的教程:教程:如何在Linux中使用libudev和SysFS 还有一个基于GLib的libudev包装器,文档在这里:http://ftp.osuosl.org/pub/linux/utils/kernel/hotplug/gudev/,并且似乎有一个c#的libgudev包装器。
但最后,你可能会发现使用GLib的GIO比深入到udev级别更容易:卷和驱动器 API参考。

-1

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

/dev/bus/usb

在那个文件夹中将会有子目录,应该与上面的总线编号相匹配。如果USB设备不是直接连接到计算机,例如通过集线器或其他外部设备,则情况会变得复杂。别忘了要进行十六进制转换。

我该如何将在/dev/bus/usb下找到的设备与系统将要挂载的设备名称进行链接?例如,我连接了两个USB设备,它们的总线地址均为1,设备地址分别为5和6;被挂载的设备分别是/dev/sdb1和/dev/sdc1。 - LAS
文件名与 USB 总线信息完全独立。它们由 udev 分配。 - artless noise
@LAS - 我不理解你的评论,以及它如何与使用libusb相关?如果你正在寻找/dev/sd*设备(文件系统),你不需要使用libusb来进行通信。我自己使用libusb与各种类型的调制解调器进行通信。通过libusb,我直接打开通道到/dev/bus/usb/...设备,而不是Linux级别的字符设备。 - Jim Black
@JimBlack 他需要通过libusb检测设备的插入/拔出,并且一旦设备插入通知被触发,他需要知道它的挂载点。 - Zaid Amir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接