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

6
有没有系统调用或操作系统特定的函数可以由Java调用以获取连接的USB设备的名称?
我在这里看到了大约6-7个问题,但每个人都提到了C++函数GetRawInputDeviceList()等,它们不符合跨平台标准。无论是Windows中的C#还是C++,还是仅适用于Linux。
但我正在使用Java。此外,这需要跨平台。至少,它需要在Windows、Linux和Mac上工作。我也可以使用终端/ shell /命令提示符命令。我想我可以用Java运行它们。
我已经尝试过getFileSystemView和listRoots。但它们会输出所有驱动器的名称[dvd、hdd分区、软盘等]。
我只需要获取USB设备。
请不要提及jUSB或JSR080。为什么:
jUSB:访问USB设备目前需要将它们连接到GNU/Linux主机系统。

javax.usb: 预先-alpha版的Windows实现未经认证,需要内核驱动程序。

usb4java: 基本上,它只是使用更多抽象实现了JSR80,也许会更好一些。

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

如果您要提到API,请提到已经完全测试和尝试过的API,可以在Linux、Windows和Mac上运行。 如果不是这样,我就不会提出这个问题了。我在许多其他帖子中看到了对jUSB、javax.usb等的提及。


1
它是否适用于http://www.ibm.com/developerworks/library/j-usb/index.html? - user1516873
你自己试过了吗?跨平台吗? 如果你们这么着急,那我今天就试试。 - bad_keypoints
只是为了澄清一件事情:javax.usb(JSR80)只是一个标准API(就像Tomcat实现的Servlet API一样)。usb4java与您提到的“预阿尔法Windows实现”没有任何关系。usb4java只是实现了javax.usb API并使用libusb作为后端。但对您来说也不重要,因为即使没有Java,libusb库也无法为您提供USB设备名称,因为在Windows上,它还需要针对您想要通信的所有设备的特殊驱动程序。 - kayahr
3个回答

4
您可以使用Linux下的jUsb API
或者您可以使用Process类在Linux中启动terminal,并运行 ls -la /dev/disk/by-id/usb-*,并捕获stdout以了解结果。
对于Windows,您可以尝试这个:如何使用PowerShell查找我的USB闪存驱动器路径 编辑: 对于Windows,另一个有用的实用程序是devcon.exe
有关更多信息,请参见此处编辑2: 对于Mac,您可以使用Process类启动terminal,并运行system_profiler SPUSBDataType

换句话说,针对 OP 的问题的解决方案是特定于操作系统的 =. - Luiggi Mendoza
目前看来是这样的。等待其他可能与操作系统无关的解决方案。 - Kazekage Gaara
抱歉,无法与devcon一起使用。它不能与Vista以及早期版本如2000或XP一起使用。此外,它还需要在客户端系统上安装devcon,特别是对于Windows系统。 - bad_keypoints

2
您可以尝试使用javahidapi。我认为它包含一些C / C ++代码和JNI。声明支持Linux,Mac和Windows。我已经在Linux上尝试过它(可以正常工作),在虚拟机中的干净的Windows上尝试过(不行,出现了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();
        }
    }
}

编辑 输出仅显示一个插入的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,它不起作用(我只能找到一个窗口。我没有 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)

你能分享一下结果的快照吗? - bad_keypoints

0
也许从你第一次提出这个问题以来情况有所改善。我最近在 Mac 上开始探索 usb4java,似乎它可以工作。有可用的示例代码,包括低级别(类似于 libusb 的)API 和高级别(javax)API。
要列出所有 USB 设备,请看 examples
我直接从 usb4java.org 下载了所有库和从 Github 下载了示例。我没有设法使 maven 构建工作,但是我可以将库和示例导入 Eclipse 中并运行它们。 usb4java 中包含相同的本机代码,但是该库将它们全部封装得非常漂亮,并隐藏所有混乱的细节,只在需要时提取和部署本机代码。

在我的探索中,我发现我的 Mac 自动声明了我试图通信的设备。幸运的是,我在这里找到了解决方案(http://www.proxmark.org/forum/viewtopic.php?id=986)。基本上,您需要创建一个“虚拟驱动程序”作为文本 plist 文件,这可以防止 OSX 在启动时分配自己的驱动程序。 - lenborje

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接