3

我正在尝试从通过 USB 连接到带有usb4java库的 Windows 10pro 机器的 RFID 阅读器读取消息。

我设法声明了接口,打开了管道并为数据注册了监听器,但是监听器从未被触发。阅读器充当键盘,它读取的任何内容最终都会出现在活动应用程序中,例如我打开的 IDE,而不是在listener中。

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);
    }
}

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

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 驱动程序?遗憾的是,这不是我的设备,我无权访问设备的文档,因此无法确定是否是设备驱动程序问题。

4

1 回答 1

2

我知道这已经 2 岁了,但我遇到了类似的问题,这是我遇到的第一个寻找解决方案的问题,这花了我几个小时。

所以,基本上,windows 不允许直接读/写键盘设备,要这样做,你必须覆盖它的驱动程序(这就是你得到的原因Input/Output error,它写在hid4java 的常见问题解答中)。

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

第二种方法是您已经提到的,即使用UsbDk适用于 Windows 的 Usb 驱动程序开发工具包)。它通过分离内核驱动程序并在您完成使用后重新连接它来使您可以访问该设备。

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

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

我猜缺少第二步是为什么 OP 得到了例外。

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

于 2019-10-03T22:00:15.990 回答