Чтение Java usb4java с USB-устройства на платформе Windows 10

Я пытаюсь прочитать сообщение от считывателя RFID, подключенного через USB к компьютеру с Windows 10pro, с usb4java библиотека.

Мне удалось запросить интерфейс, открыть канал и зарегистрировать прослушиватель данных, однако прослушиватель никогда не запускается. Читатель действует как клавиатура, и все, что он читает, попадает в активное приложение, такое как 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);
    }
}

я также пробовал синхронное чтение вместо асинхронного в блоке выше, например:

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-устройствами, поэтому я не знаю, что делать дальше. Что-то не так с кодом, нужен ли мне USBDK или устройство не поддерживает драйвер libUSB? К сожалению, это не мое устройство, и у меня нет доступа к документации устройства, поэтому я не могу быть уверен, что это проблема с драйвером устройства.


person John    schedule 28.07.2019    source источник


Ответы (1)


Я знаю, что этому 2 года, но у меня была похожая проблема, и это был один из первых вопросов, с которыми я столкнулся в поисках решения, что заняло у меня несколько часов.

Таким образом, в основном Windows не позволяет напрямую читать/записывать клавиатурные устройства, для этого вам нужно переопределить его драйвер (поэтому вы получаете Input/Output error, и это написано в Часто задаваемые вопросы о Hid4java).

Первый способ переопределения драйвера устройства описан в вики libusb. Насколько я знаю, вам придется устанавливать новый драйвер каждый раз, когда вы подключаете устройство к новому USB-порту, поэтому я рекомендую вам читать дальше.

Второй способ, о котором вы уже упоминали, это использование UsbDk (Комплект разработки драйверов USB для Windows). Это делает устройство доступным для вас, отсоединяя драйвер ядра и снова подключая его после того, как вы закончите играть с ним.

Чтобы использовать его, вам нужно сделать две вещи:

  1. Установите org.usb4java.javax.useUSBDK = true в файле javax.usb.properties, как указано в руководстве (это также можно сделать вручную в низкоуровневом usb4java, см. OPTION_USE_USBDK и setOption(Context, int)).
  2. Загрузите и установите UsbDk в своей системе (самый простой способ — загрузить установщик msi версии x64 или x86, который имеет графический интерфейс и полностью автоматизирован), чего, к сожалению, нет в руководстве (может быть, это очевидно для некоторых людей, но мне потребовалось столько времени, что я не горжусь тем, что осознал).

Я предполагаю, что отсутствие второго шага является причиной того, что ОП получает исключение.

Надеюсь, что это поможет кому-то, знание всего этого два дня назад избавило бы меня от головной боли.

person Kamil Bęben    schedule 03.10.2019