6

接続されている USB デバイスの名前だけを取得するために Java から呼び出すことができるシステム コールや OS 固有の関数はありませんか?

ここだけでおそらく 6 ~ 7 件の質問を見てきましたが、誰もが C++ 関数GetRawInputDeviceList()などについて言及しており、それらはクロスプラットフォームに準拠していません。C# または C++ の Windows の場合、または Linux の場合のみ。

しかし、私はJavaで働いています。また、これはクロスプラットフォームである必要があります。少なくとも、Windows、Linux、および Mac で動作する必要があります。ターミナル/シェル/コマンド プロンプト コマンドも使用できます。Javaで実行できると思います。

私は試してみましgetFileSystemViewlistRoots。しかし、彼らはすべてのドライブ [DVD、HDD パーティション、フロッピーなど] の名前を教えてくれます。

USB デバイスのみを取得する必要があります。

jUSB や JSR080 については言及しないでください。どうして:

jUSB: 現在、USB デバイスにアクセスするには、GNU/Linux ホスト システムに接続する必要があります。

javax.usb: プレアルファの Windows 実装は認定されておらず、カーネル ドライバーが必要です。

usb4java: 基本的には、もう少し抽象化して JSR80 を実装するだけです。

正直なところ、libusb は C++ であるため、試したことはありません。

API について言及する場合は、Linux、Windows、および Mac で動作する、完全にテストおよび試行済みの API について言及してください。そうでなかったら、この質問は出さなかったでしょう。他の多くの投稿で、jUSB、javax.usb などについての言及を見てきました。

4

3 に答える 3

4

Linux用のjUsb APIを使用できます。

または、クラスterminalを使用して Linux で を起動し、 を実行してキャッチし、結果を確認することもできます。Process ls -la /dev/disk/by-id/usb-*stdout

Windows の場合、これを試すことができます: How to find my USB flash drive's path with PowerShell

編集:

Windows の場合、もう 1 つの便利なユーティリティはdevcon.exe.

詳細については、これを確認してください。

EDIT 2: Macの場合、クラスterminalを使用して起動し、実行できますProcesssystem_profiler SPUSBDataType

于 2012-12-24T08:02:55.760 に答える
2

Yoy はjavahidapiを試すことができます。c/c++ コードと JNI だと思います。宣言された Linux、Mac、および Windows のサポート。仮想ボックスのクリーンウィンドウでLinux(OK)で試しました(OKではありません、UnsatisfiedLinkError、MSVSライブラリが見逃されたと思います)。ソースからコンパイルすれば、うまくいくはずです。

ここに例があります:

import com.codeminders.hidapi.HIDDeviceInfo;
import com.codeminders.hidapi.HIDManager;

public class TestHid {

    public static void main(String[] args) throws Exception {
        try {
            com.codeminders.hidapi.ClassPathLibraryLoader.loadNativeHIDLibrary();
            HIDManager hidManager = HIDManager.getInstance();
            HIDDeviceInfo[] infos = hidManager.listDevices();
            for (HIDDeviceInfo info : infos) {
                System.out.println("info: " + info.toString());
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

EDIT の出力には、接続された USB デバイス genius レーザー マウスが 1 つだけ表示されます。

[grigory@gr testRSA]$ pwd
/home/grigory/testRSA/out/production/testRSA
[grigory@gr testRSA]$ whoami 
grigory
[grigory@gr testRSA]$ java -cp ".:hidapi-1.1.jar" Test
libusb couldn't open USB device /dev/bus/usb/003/002: Permission denied.
libusb requires write access to USB device nodes.
info:HIDDeviceInfo [path=0003:0002:00, vendor_id=1112, product_id=58, serial_number=null, release_number=0, manufacturer_string=null, product_string=null, usage_page=0, usage=0, interface_number=0]
[grigory@gr testRSA]$ sudo java -cp ".:hidapi-1.1.jar" Test
[sudo] password for grigory: 
info:HIDDeviceInfo [path=0003:0002:00, vendor_id=1112, product_id=58, serial_number=null, release_number=0, manufacturer_string=Genius, product_string=Laser Mouse, usage_page=0, usage=0, interface_number=0]
[grigory@gr testRSA]$ 

そして、新しいWindows XPでは機能しません(見つけることができるウィンドウは1つだけです。ソースからlibをコンパイルするためのVisual Studioはありません):

E:\testRSA\out\production\testRSA>java -cp ".;hidapi-1.1.jar" -Djava.library.pat
h="e:\testRSA\out\production\testRSA" Test
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.codeminders.hidap
i.HIDManager.init()V
        at com.codeminders.hidapi.HIDManager.init(Native Method)
        at com.codeminders.hidapi.HIDManager.<init>(HIDManager.java:53)
        at com.codeminders.hidapi.HIDManager.getInstance(HIDManager.java:121)
        at Test.main(Test.java:14)
于 2012-12-24T13:16:40.293 に答える