我一直在寻找一种跨平台的方式来获取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]");
}
}
以下是输出的示例:
[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 ManufacturerStringIndex:1 ProductStringIndex:2 SerialStringIndex:3 ConfigurationCount:1
[按任意键退出] [DeviceType:DeviceInterface] [EventType:DeviceRemoveComplete]名称:usbdev1.17 BusNumber:1 DeviceAddress:17长度:18 DescriptorType:Device BcdUsb:0x0200 类:PerInterface子类:0x00协议:0x00 MaxPacketSize0:64 VendorID:0x059F ProductID:0x1014 BcdDevice:0x0000 ManufacturerStringIndex:1 ProductStringIndex:2 SerialStringIndex:3 ConfigurationCount:1
我的问题是如何获取设备的路径,或者如何将libusb返回的信息与实际的设备路径绑定?
答案 0 :(得分:2)
您需要使用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参考。
答案 1 :(得分:-1)
USB设备文件通常存储在路径中:
/dev/bus/usb
在该文件夹中将是与上面的总线编号匹配的子目录。如果USB设备没有直接连接到计算机,例如通过集线器或其他外部设备,事情就会变得复杂。不要忘记从十六进制转换。