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

问题描述 投票:0回答:1

我正在尝试从通过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驱动程序?遗憾的是,这不是我的设备,并且我无权访问该设备的文档,因此无法确定是否是设备驱动程序问题。

java windows usb libusb usb4java
1个回答
0
投票

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

因此,基本上,Windows不允许直接读取/写入键盘设备,为此,您必须覆盖它的驱动程序(这就是为什么要获取Input/Output error,并且将其写入hid4java's FAQ的原因)。

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

第二方式已经提到,正在使用UsbDk用于Windows的USB驱动程序开发套件)。通过使用内核驱动程序并在玩完之后将其重新连接,可以使您可以访问该设备。

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

  1. 按照org.usb4java.javax.useUSBDK = true中的说明在javax.usb.properties文件中设置manual(这也可以在低级usb4java中手动完成,请参见OPTION_USE_USBDK和[C0 ])。
  2. 下载并在您的系统上安装setOption(Context, int)(最简单的方法是下载具有GUI且是完全自动化的x64或x86版本的msi安装程序),可惜的是不在手册中(也许对某些人来说是显而易见的,但是却带走了我我不感到自豪的时间量)。

我猜测缺少第二步是OP一直获得例外的原因。

希望这对某人有帮助,两天前都知道这将为我节省很多头痛。

© www.soinside.com 2019 - 2024. All rights reserved.