6

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

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

但我正在使用 Java。此外,这需要跨平台。至少,它需要适用于 Windows、Linux 和 Mac。我也可以使用终端/shell/命令提示符命令。我想我可以用 Java 运行它们。

我试过getFileSystemViewlistRoots。但他们给出了所有驱动器的名称 [dvd、hdd 分区、软盘等]。

我只需要获取 USB 设备。

请不要提及 jUSB 或 JSR080。为什么:

jUSB: 目前访问 USB 设备需要将它们连接到 GNU/Linux 主机系统

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

usb4java: 基本上,它只是实现了更多抽象的 JSR80,也许

虽然老实说我没有尝试过 libusb,因为它是 C++ 语言。

如果您要提及 API,请提及经过全面测试和尝试的 API,它们适用于 Linux、Windows 和 Mac。如果不是这样,我不会提出这个问题。我在许多其他帖子中看到过提到 jUSB、javax.usb 等。

4

3 回答 3

4

您可以使用jUsb API,用于 Linux。

或者您可以terminal使用该类在 Linux 中启动Process,然后运行 ls -la /dev/disk/by-id/usb-*并捕获stdout以了解结果。

对于 Windows,您可以试试这个:如何使用 PowerShell 找到我的 USB 闪存驱动器的路径

编辑:

对于 Windows,另一个有用的实用程序是devcon.exe.

有关更多信息,请查看此。

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

于 2012-12-24T08:02:55.760 回答
2

Yoy可以试试javahidapi。我认为它是一些 c/c++ 代码和 JNI。声明 linux、mac 和 windows 支持。我已经在 linux 上尝试过(好的),在虚拟框中使用干净的窗口(不好,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,它不起作用(我只能找到一个窗口。我没有 Visual Studio 用于从源代码编译 lib):

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 回答
0

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

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

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

usb4java 中包含相同的本机代码,但该库将它们全部包装得非常漂亮,并隐藏了所有杂乱的细节,只在需要时提取和部署本机代码。

于 2014-05-05T09:59:18.547 回答