只需获取连接到系统的USB设备的名称?

时间:2012-12-24 07:57:39

标签: java usb

是否有任何系统调用或操作系统特定的功能可以被Java调用以获取所连接的USB设备的名称?

我在这里只看到了6到7个问题,但每个人都提到了C ++函数GetRawInputDeviceList()等,而且它们不符合跨平台的要求。适用于C#或C ++中的Windows或仅适用于Linux。

但我在Java工作。此外,这需要跨平台。 至少,它需要适用于Windows,Linux和Mac。我也可以使用terminal / shell / command-prompt命令。我想我可以用Java运行它们。

我已尝试getFileSystemViewlistRoots。但是它们给出了所有驱动器的名称[dvd,hdd分区,软盘等]。

我只需要USB设备。

请不要提及jUSB或JSR080。原因:

jUSB: access to USB devices currently requires that they be connected to a GNU/Linux host system

javax.usb: pre-alpha Windows implementation is not certified and requires a kernel driver.

usb4java: basically, it just implements JSR80 with little more abstraction, perhaps

虽然老实说我没有尝试过libusb,因为它是用C ++编写的。

如果您要提及API,请提及完全经过测试和尝试过的API,这些API可以在Linux,Windows和Mac上运行。 如果情况并非如此,我不会提出这个问题。我在很多其他帖子上看到了jUSB,javax.usb等的提及。

3 个答案:

答案 0 :(得分: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,另一个有用的实用程序是devcon.exe

有关详情,请查看this.

编辑2: 对于Mac,您可以使用terminal类启动Process,然后运行system_profiler SPUSBDataType

答案 1 :(得分:2)

Yoy可以试试javahidapi。我认为它是一些c / c ++代码和JNI。声明了linux,mac和windows支持。我已经尝试过用linux(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设备,天才激光鼠标。

[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它不起作用(我只能找到一个窗口。我没有从源代码编译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)

答案 2 :(得分:0)

自从你第一次提出这个问题以来,也许情况有所改善。我最近开始在Mac上探索usb4java,它似乎有效。有可用的示例代码,包括低级(类libusb)API和高级(javax)API。

要列出所有USB设备,请查看examples

我直接从usb4java.org下载了所有库,并从github下载了这些示例。我没有设法让maven构建工作,但我可以在Eclipse中导入库和示例并运行它们。

usb4java中包含相同的本机代码,但是库将它们完美地包装起来并隐藏所有杂乱的细节,仅在需要时提取和部署本机代码。