Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Linux下使用libusb获取设备路径_C#_Linux_Usb_Libusb - Fatal编程技术网

C# 如何在Linux下使用libusb获取设备路径

C# 如何在Linux下使用libusb获取设备路径,c#,linux,usb,libusb,C#,Linux,Usb,Libusb,我正在寻找一种跨平台的方式来获取C#中的usb到达和删除事件,我发现了“LibUsbDotNet C#usb库”() 它正常工作,但在Linux中,似乎无法获得设备装载点(路径)。在Linux中,它使用“libusb”库,该库没有获取设备路径的方法 以下是检测设备事件的简单代码示例: internal class DeviceNotification { public static IDeviceNotifier UsbDeviceNotifier = DeviceNotifier.Op

我正在寻找一种跨平台的方式来获取C#中的usb到达和删除事件,我发现了“LibUsbDotNet C#usb库”()

它正常工作,但在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 总线号:1设备地址:17长度:18描述符类型:设备 BcdUsb:0x0200类:围接口子类:0x00协议:0x00 MaxPacketSize0:64供应商ID:0x059F产品ID:0x1014 BCD设备:0x0000 ManufacturerStringIndex:1 ProductStringIndex:2 SerialStringIndex:3 配置计数:1

[按任意键退出][设备类型:DeviceInterface] [EventType:DeviceMoveComplete]名称:usbdev1.17总线号:1 设备地址:17长度:18描述符类型:设备BcdUsb:0x0200 类:围接口子类:0x00协议:0x00 MaxPacketSize0:64 供应商ID:0x059F产品ID:0x1014 BCD设备:0x0000 ManufacturerStringIndex:1 ProductStringIndex:2 SerialStringIndex:3 配置计数:1


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

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

/dev/bus/usb

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

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

有libudev,文档应该在这里:但是现在它似乎已经关闭了。以下是关于libudev的教程:

libudev还有一个基于GLib的包装器,这里是docs:libgudev似乎有一个c#包装器


但最后,您可能会发现使用GLib的GIO比使用udev级别更容易:API参考。

请注意,如果连接了设备,并不意味着它已安装。是的,我知道,但问题是我无法获取设备路径,如何将/dev/bus/usb中的设备链接到系统将要安装的dev名称。例如,我连接了两个usb设备,它们都有总线地址1,它们的设备地址分别为5、6;安装的设备分别为/dev/sdb1和/dev/sdc1。文件名完全独立于usb总线信息。它们是由
udev
@LAS分配的-我不明白你的评论以及这与使用libusb有什么关系?如果您正在寻找/dev/sd*设备(文件系统),则不需要libusb与这些设备通信。我自己使用libusb与各种类型的调制解调器通信。使用libusb,我可以直接打开到/dev/bus/usb/…的通道。。。设备,而不是Linux级别的字符设备。@JimBlack他需要通过libusb检测设备到达/删除,一旦设备到达通知被触发,他需要知道其装载点