首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在windows 10平台上从usb设备读取usb4java

在windows 10平台上从usb设备读取usb4java
EN

Stack Overflow用户
提问于 2019-07-28 13:29:15
回答 2查看 3.7K关注 0票数 3

我正在尝试阅读一条信息,从射频识别读取器通过USB连接到Windows10pro机器与usb4java库。

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

代码语言:javascript
复制
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);}
 }

听众:

代码语言:javascript
复制
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);
    }
}

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

代码语言:javascript
复制
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);

在以下方面失败:

代码语言:javascript
复制
USB error1: Transfer error on interrupt endpoint: Input/Output error

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-03 22:00:15

我知道这是2年前的事,但我也有过类似的问题,这是我第一次遇到的问题之一,这是我花了几个小时才找到的解决方案。

因此,基本上,windows不允许直接读写键盘设备,要做到这一点,就必须重写它的驱动程序(这就是为什么您要获得Input/Output error,并且它是用HID4java的FAQ编写的)。

第一种覆盖设备驱动程序的方法用libusb wiki描述。据我所知,每次您将设备连接到新的USB端口时,都需要安装一个新的驱动程序,这就是我建议您进一步阅读的原因。

第二种方式就是您已经提到的,它使用UsbDk ()。它通过分离内核驱动程序并在玩完之后重新连接它,使设备对您来说是可访问的。

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

  1. org.usb4java.javax.useUSBDK = true中所述,在您的javax.usb.properties文件中设置手册 (这也可以在低级别usb4java中手动完成,参见USBDKsetOption(上下文,int))。
  2. 在您的系统上下载并安装UsbDk (最简单的方法是下载x64或x86版本的msi安装程序,该安装程序具有GUI,并且是完全自动化的),遗憾的是,手册中没有这一点(也许对某些人来说这是显而易见的,但却花费了我不为之自豪的大量时间)。

我猜想,缺少第二步是OP获得异常的原因。

希望这能帮到一个人,两天前知道这一切会帮我省去很多头痛。

票数 3
EN

Stack Overflow用户

发布于 2022-11-24 02:21:12

默认情况下,RFID读写器在键盘模拟模式下工作。您通常可以从制造商的网站获得一个工具来配置RFID阅读器。这将允许您将读取器更改为HID模式。这应该能解决你的问题。很抱歉反应得太晚,但我希望它能帮助到其他人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57241363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档