5

我正在寻找一种在 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] Name:usbdev1.17 BusNumber:1 DeviceAddress:17 Length:18 DescriptorType:Device BcdUsb:0x0200 Class:PerInterface SubClass:0x00 Protocol:0x00 MaxPacketSize0:64 VendorID:0x059F ProductID:0x1014 BcdDevice: 0x0000 制造商字符串索引:1 产品字符串索引:2 序列字符串索引:3 配置计数:1

[按任意键退出][DeviceType:DeviceInterface] [EventType:DeviceRemoveComplete] Name:usbdev1.17 BusNumber:1 DeviceAddress:17 Length:18 DescriptorType:Device BcdUsb:0x0200 Class:PerInterface SubClass:0x00 Protocol:0x00 MaxPacketSize0:64 VendorID :0x059F ProductID:0x1014 BcdDevice:0x0000 ManufacturerStringIndex:1 ProductStringIndex:2 SerialStringIndex:3 ConfigurationCount:1

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

4

2 回答 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/并且似乎有 ac# 用于 libgudev 的包装器。

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

于 2013-03-06T17:34:18.110 回答
-1

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

/dev/bus/usb

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

于 2013-03-04T03:15:50.357 回答