【问题标题】:just get the names of USB devices attached to a system?只是获取连接到系统的 USB 设备的名称?
【发布时间】:2014-05-05 17:59:18
【问题描述】:

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

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

但我正在使用 Java。此外,这需要跨平台。 至少,它需要适用于 Windows、Linux 和 Mac。我也可以使用终端/shell/命令提示符命令。我想我可以用 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,它们可以在 Linux、Windows 和 Mac 上运行。 如果不是这样,我不会提出这个问题。我在许多其他帖子中看到过提到 jUSB、javax.usb 等。

【问题讨论】:

  • 你自己试过了吗?曾经跨平台吗?如果你们这么用力,那我今天就试试。
  • 澄清一件事:javax.usb(JSR80)只是一个标准的API(就像Tomcat实现的Servlet API)。 usb4java 与您提到的非常古老的参考实现无关,即“pre-alpha Windows 实现”。 usb4java 只是实现了 javax.usb API 并使用 libusb 作为后端。但这对你来说并不有趣,因为即使没有 Java,libusb 库也无法为你提供 USB 设备名称,因为在 Windows 上,它还需要一个特殊的驱动程序来处理你想要与之通信的所有设备。

标签: java usb


【解决方案1】:

对于 Linux,您可以使用 jUsb API

或者您可以使用Process 类在Linux 中启动terminal,然后运行 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,您可以使用 Process 类启动 terminal,然后运行 ​​system_profiler SPUSBDataType

【讨论】:

  • 换句话说,针对 OP 问题的解决方案是 OS specific =\.
  • 目前看来是这样。等待其他可能与操作系统无关的解决方案。
  • 抱歉,无法使用 devcon。它不适用于 vista,也不适用于 2000 或 XP 等早期版本。此外,它需要在客户端系统上安装 devcon,尤其是对于 windows。
【解决方案2】:

你可以试试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();
        }
    }
}

编辑 输出显示只有一个插入 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)

【讨论】:

  • 你能分享一下结果的快照吗?
【解决方案3】:

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

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

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

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

【讨论】:

  • 在我自己的探索中,我发现我的 Mac 自动认领了我尝试与之通信的设备。幸运的是,我找到了解决方案here。基本上,您创建一个“虚拟驱动程序”作为文本 plist 文件,这会阻止 OSX 在启动时分配自己的驱动程序。
猜你喜欢
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2017-01-07
相关资源
最近更新 更多