为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

www说 2023-04-26 16:19:03
我正在尝试从通过 USB 连接到带有usb4java库的 Windows 10pro 机器的 RFID 阅读器读取消息。我已经设法声明了接口、打开了管道并为数据注册了侦听器,但是从未触发过侦听器。阅读器充当键盘,它读取的任何内容最终都会出现在活动应用程序中,例如我打开的 IDE,而不是在listener中。UsbInterface usbInterface = activeInteface(device);// there is only one endpoint in the listUsbEndpoint 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 readerint received = pipe.syncSubmit(buffer);失败:USB error1: Transfer error on interrupt endpoint: Input/Output error有一些库支持的特定于 Windows 的属性:org.usb4java.javax.useUSBDK = true 但是当我尝试将它设置为异常时,这失败了。我对 USB 设备没有任何经验,所以不确定如何从这里开始。代码有问题吗,我需要 USBDK 还是设备不支持 libUSB 驱动程序?遗憾的是,这不是我的设备,我无法访问该设备的文档,因此无法确定它是否是设备驱动程序问题。
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

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

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

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

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

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

  1. 按照手册org.usb4java.javax.useUSBDK = true中的说明设置javax.usb.properties文件

  2. 在您的系统上下载并安装 UsbDk(最简单的方法是下载具有 GUI 且完全自动化的 x64 或 x86 版本的 msi 安装程序),遗憾的是手册中没有(对于某些人来说这可能是显而易见的,但花了我很多时间我并不以意识到这一点为荣)。

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

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


查看完整回答
反对 回复 2023-04-26
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

默认情况下,RFID 阅读器以键盘仿真模式运行。您通常可以从制造商的网站获取工具来配置 RFID 阅读器。这将允许您将阅读器更改为 HID 模式。这应该可以解决您的问题。抱歉回复晚了,但我希望它能帮助其他人。



查看完整回答
反对 回复 2023-04-26
  • 2 回答
  • 0 关注
  • 762 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信