2013-02-20 56 views
4

我一直在尋找一種跨平臺的方式來在C#中獲取usb到達和刪除事件,並且我找到了「LibUsbDotNet C#USB Library」(http://sourceforge.net/projects/libusbdotnet/?source=navbar)。如何在Linux中使用libusb獲取設備路徑

它的工作原理應該如此,但在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]"); 
    } 
} 

,這裏是輸出的一個示例:

[設備類型:設備接口] [的EventType:DeviceArrival]名稱: usbdev1.17 BusNumber:1 DeviceAddress:17長度:18描述符類型:設備 BcdUsb:0200類別:PerInterface亞類:0×00協議:0×00 MaxPacketSize0:64廠商ID:0x059F產品編號:0x1014 BcdDevice:0×0000 ManufacturerStringIndex:1個ProductStringIndex:2 SerialStringIndex:3 ConfigurationCount:1

[按任意鍵退出] [設備類型:設備接口] [的EventType:DeviceRemoveComplete]名稱:usbdev1.17 BusNumber:1 DeviceAddress:17長度:18描述符類型:設備BcdUsb:0200 類別:PerInterface亞類:0×00協議:0×00 MaxPacketSize0:64 廠商ID:0x059F產品編號:0x1014 BcdDevice:0×0000 ManufacturerStringIndex:1 ProductStringIndex:2 SerialStringIndex:3 ConfigurationCount:1

我曲estion是如何獲得附加或移除設備的路徑,或者如何將libusb返回的信息與實際設備路徑綁定?

+0

請注意,如果連接的設備不代表已安裝。 – wRAR 2013-02-20 13:26:59

+0

是的,我意識到這一點,但事情是我無法獲得設備路徑 – LAS 2013-02-20 13:48:27

回答

-1

USB設備文件通常存放的路徑:

/dev/bus/usb 

在該文件夾將成爲子目錄,應與上述的巴士號碼。如果USB設備沒有直接連接到計算機,例如通過集線器或其他外部設備,情況就會變得複雜。不要忘記從十六進制轉換。

+0

如何將/ dev/bus/usb中找到的設備鏈接到將由系統掛載的dev名稱。例如,我連接了兩個usb設備,它們都有總線地址1,設備地址分別爲5,6。安裝的設備是/ dev/sdb1和/ dev/sdc1 rescrictively – LAS 2013-03-04 06:50:10

+0

文件名稱是完全獨立於USB總線信息。他們由'udev'分配。 – 2013-03-05 01:26:09

+0

@LAS - 我不明白你的評論以及這與使用libusb有什麼關係?如果您正在尋找/ dev/sd *設備(文件系統),則不需要libusb與這些設備進行通信。我使用libusb自己與各種類型的調制解調器進行通信。使用libusb,我直接打開通道到/ dev/bus/usb/...設備,而不是Linux級別的字符設備。 – 2013-03-05 15:22:03

1

您需要使用UDev而不是libusb。 Libusb只會告訴你係統上有哪些USB設備,但不會告訴你任何有關它們安裝的位置。 UDev處理安裝它們。

有libudev和文檔應該在這裏:http://www.freedesktop.org/software/systemd/libudev/但它似乎是在目前下降。這裏有libudev教程:這裏Tutorial: How to use libudev and SysFS in Linux

還爲libudev能說會道基於包裝,文檔:http://ftp.osuosl.org/pub/linux/utils/kernel/hotplug/gudev/有似乎是libgudev一個C#包裝。

但最後你可能會發現使用GLib的GIO比簡化到udev級別更容易:Volumes and Drives API參考。