Java usb4java在Windows 10平台上从USB设备读取

标签 java windows usb libusb usb4java

我正在尝试从通过 USB 连接到 Windows 10pro 机器的 RFID 读取器读取消息 usb4java图书馆。

我已成功声明接口(interface)、打开管道并注册数据监听器,但监听器从未被触发。阅读器充当键盘,它读取的任何内容最终都会出现在 Activity 应用程序中,例如我打开的 IDE,而不是监听器

UsbInterface usbInterface = activeInteface(device);
// there is only one endpoint in the list
UsbEndpoint endpoint = (UsbEndpoint)usbInterface.getUsbEndpoints().get(0);
UsbPipe pipe = endpoint.getUsbPipe();
try {
     usbInterface.claim();
     // true
     System.out.println("claimed usb interface: " + usbInterface.isClaimed());
     pipe.open();
     // true
     System.out.println("pipe open: " + pipe.isOpen());
     pipe.addUsbPipeListener(new MessageListener());
     // true
     System.out.println("pipe active: " + pipe.isActive());
     // keep main thread alive, async call should be done from another thread i guess
     Thread.sleep(15000);
    }
   catch (Exception any) {System.out.println(any);}
 }

听众:

private static class MessageListener implements UsbPipeListener {

    @Override
    public void errorEventOccurred(UsbPipeErrorEvent event) {
        System.out.println(event.toString() + " , " +event.getUsbException());
    }

    @Override
    public void dataEventOccurred(UsbPipeDataEvent event) {
        // this code block never triggers
        System.out.println("listener ...);
        int actualLength = event.getActualLength();
        System.out.println("length: " + actualLength);
        byte[] data = event.getData();
        System.out.println("data length " + data.length);
    }
}

我还在上面的 block 中尝试了同步读取而不是异步读取,如下所示:

byte[] buffer = new data[8];
// this fails on its own, don't even need to read something with RFID reader
int received = pipe.syncSubmit(buffer);

失败:

USB error1: Transfer error on interrupt endpoint: Input/Output error

库支持一些 Windows 特定属性:org.usb4java.javax.useUSBDK = true 但是当我尝试设置异常时,这会失败。

我对 USB 设备没有 0 经验,所以不知道如何从这里继续。代码有问题吗?我需要 USBDK 还是设备不支持 libUSB 驱动程序?遗憾的是,这不是我的设备,我无权访问该设备的文档,因此无法确定这是否是设备驱动程序问题。

最佳答案

我知道这已经有 2 年历史了,但我也遇到过类似的问题,这是我在寻找解决方案时遇到的第一个问题之一,这花了我几个小时。

所以,基本上,Windows 不允许直接读取/写入键盘设备,为此,您必须覆盖它的驱动程序(这就是您收到输入/输出错误的原因,并且它写在hid4java's FAQ)中。

第一种覆盖设备驱动程序的方法在libusb wiki中描述。 。 据我所知,每次将设备连接到新的 USB 端口时,您都必须安装新的驱动程序,这就是为什么我建议您进一步阅读。

第二种方式就是您已经提到的,即使用 UsbDk (适用于 Windows 的 USB 驱动程序开发套件)。它使您可以通过分离内核驱动程序并在使用完毕后将其重新连接回来来访问该设备。

为了使用它,您需要做两件事:

  1. 按照 manual 中的说明,在 javax.usb.properties 文件中设置 org.usb4java.javax.useUSBDK = true (这也可以在低级usb4java中手动完成,请参阅 OPTION_USE_USBDKsetOption(Context, int) )。
  2. 下载并安装 UsbDk在你的系统上(最简单的方法是下载 x64 或 x86 版本的 msi 安装程序,它有 GUI 并且是完全自动化的),遗憾的是手册中没有(也许这对某些人来说是显而易见的,但花了我很多时间,我并不自豪)的实现)。

我猜测缺少第二步是 OP 出现异常的原因。

希望这会对某人有所帮助,两天前知道这一切会让我省去很多头痛。

关于Java usb4java在Windows 10平台上从USB设备读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57241363/

相关文章:

ubuntu - 尝试运行 2 个 Kinect 时在 ubuntu 中出现 libusb 错误

java - 使用java自动打开Android设备的usb Debug模式

java - 为 android 自定义选项卡标题中的文本

java - 如何使用递归将对象添加到已知路径的父级中

php - USB key 中的Linux测试环境(apache + php + git)?

c# - 用 C# 编写的 Windows IoT 控制台应用程序?

windows - 深入理解二进制文件

java - Java中的重复注册

java - 如何在 Swing 中更新 Jlabel 文本

c++ - Visual Studio 2015 C++ 应用程序需要客户端客户端上的 api-ms-win-crt-runtime-l1-1-0.dll