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 ManufacturerStringIndex:1 ProductStringIndex:2 SerialStringIndex:3 ConfigurationCount: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

libusb の代わりに UDev を使用する必要があります。libusb は、システム上にある USB デバイスについてのみ通知しますが、それらがどこにマウントされているかについては何も通知しません。UDev はそれらのマウントを処理します。

libudev があり、ドキュメントはhttp://www.freedesktop.org/software/systemd/libudev/にありますが、現在はダウンしているようです。libudev に関するチュートリアルは次のとおりです。チュートリアル: Linux で libudev と SysFS を使用する方法

libudev 用の GLib ベースのラッパーもあります。ドキュメントはこちら: http://ftp.osuosl.org/pub/linux/utils/kernel/hotplug/gudev/であり、libgudev 用の ac# ラッパーがあるようです。

しかし最後に、udev レベルに到達するよりも GLib の GIO を使用する方が簡単であることに気付くかもしれません: Volumes and Drives API リファレンス。

于 2013-03-06T17:34:18.110 に答える
-1

USB デバイス ファイルは通常、次のパスに保存されます。

/dev/bus/usb

そのフォルダには、上記のバス番号と一致するサブディレクトリがあります。USB デバイスがハブやその他の外部デバイスなどを介してコンピュータに直接接続されていない場合、事態は複雑になります。16 進数からの変換を忘れないでください。

于 2013-03-04T03:15:50.357 に答える