Является ли USB4Java оболочкой для libusb 1.0 или 0.1? Рекомендуется ли это для новых разработок Java?

Я пытаюсь найти правильный способ использования USB-устройства с java. Большинство сообщений из StackOverflow рекомендуют использовать usb4java, для которого последняя активность, по-видимому, была в начале 2014 года, поэтому я не уверен, активен ли он до сих пор.

В любом случае, немного покопавшись в этом, на странице написано: «Он основан на родной библиотеке libusb 1.0». Затем, пытаясь установить драйвер устройства, я использовал Zadig в соответствии с рекомендациями (https://github.com/libusb/libusb/wiki/Windows#How_to_use_libusb_on_Windows).

Я заставил usb4java работать с помощью драйвера «libusb-win32». Но когда вы переходите на веб-сайт «libusb-win32», там упоминается, что «libusb-win32 — это порт USB-библиотеки libusb-0.1», и даже больше здесь http://libusb.org/wiki/APIs#libusb-0.1legacyAPI в упоминает, что «Статус разработки: libusb-0.1 устарел и будет иметь никаких дальнейших изменений или релизов»

Все это очень запутанно, поэтому сначала я хотел бы знать, использует ли USB4Java libusb 1.0 или 0.1. А также рекомендуется ли это для какой-либо новой разработки или того, что было бы возможным, похоже, не слишком много поддержки USB-устройств при использовании JAVA.

ОБНОВЛЕНИЕ:

Спасибо сухому. Отличное объяснение. Моя проблема с usb4java в сочетании с libusb-win32 - задержка. Мои транзакции происходят каждые 10 мс, и я не могу позволить себе потерю данных, поэтому мне пришлось начать буферизацию, а у меня 15 буферов, поэтому моя максимальная задержка составит 150 мс. ), я вижу, что время от времени у меня есть задержки более 1 с. Я пробовал WinUSB, но по какой-то причине получаю:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006b6051c2, pid=6284, tid=6836
#
# JRE version: Java(TM) SE Runtime Environment (8.0_45-b14) (build 1.8.0_45-b14)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.45-b02 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [libusb-1.0.dll+0x51c2]

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

Кстати: нарушение прав доступа происходит, когда я пытаюсь отправить перевод (LibUsb.submitTransfer(transfer);) в коде ниже.

  public static void write(DeviceHandle handle, byte[] data,
        TransferCallback callback)
    {
        ByteBuffer buffer = BufferUtils.allocateByteBuffer(data.length);
        buffer.put(data);
        Transfer transfer = LibUsb.allocTransfer();
        LibUsb.fillBulkTransfer(transfer, handle, OUT_ENDPOINT, buffer,
            callback, null, TIMEOUT);
//        System.out.println("Sending " + data.length + " bytes to device");
        int result = LibUsb.submitTransfer(transfer);
        if (result != LibUsb.SUCCESS)
        {
            throw new LibUsbException("Unable to submit transfer", result);
        }
    }

person Camilo Guevara    schedule 09.08.2016    source источник
comment
Что вы используете в качестве режима передачи? Для надежной пропускной способности и времени отклика следует использовать изохронные передачи. Разумеется, устройство должно это поддерживать.   -  person dryman    schedule 10.08.2016
comment
А по поводу Access Violation: я не знаю, что там происходит. Можете ли вы опубликовать пример кода, который вызывает эту ошибку?   -  person dryman    schedule 10.08.2016
comment
Я использую изохронные массовые передачи. И нарушение прав доступа происходит в коде, который я только что добавил в исходный вопрос.   -  person Camilo Guevara    schedule 10.08.2016
comment
Вы используете асинхронный массовый перенос. Изохронный — это совершенно другой тип передачи. Суть массовой передачи в том, что она использует только доступную полосу пропускания. Если есть какие-либо другие данные по шине, приходится ждать. Если вы хотите, чтобы полоса пропускания была зарезервирована для вашей связи, вы должны использовать исинхронную передачу (fillIsoTransfer), но устройство должно ее поддерживать. С вашим кодом я не вижу ошибки (это из примеров, так что все должно быть в порядке), должна быть ошибка в dll или аргументах.   -  person dryman    schedule 10.08.2016
comment
Если вы не можете решить проблему с WinUSB, а libusb0 работает для вас, я бы выбрал это решение, а не часами искал ошибку, которая может заключаться в libusb1.0.   -  person dryman    schedule 10.08.2016
comment
Драйман, в твоих словах есть смысл. Я только что проверил, и мое устройство, похоже, поддерживает изохронную передачу. Мне остается только реализовать. Полностью стоит попробовать. Сообщит вам, если работает, как только будет реализовано   -  person Camilo Guevara    schedule 10.08.2016


Ответы (1)


Сначала кое-что о разных библиотеках. Дело в том, что существовала изрядная доля различных реализаций и драйверов. Оригинал libusb был разветвлен до libusbx. Оригинальная libusb потерпела неудачу, и libusbx принял libusb в качестве имени. Так что путаницы еще больше. Есть 3 разных драйвера для Windows, работающих с libusb1 (в хроническом порядке): libusb0 (libusb-win32), libusbK и WinUSB.

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

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

person dryman    schedule 10.08.2016
comment
Я только что нашел это на исходной странице libusbx: libusbx УСТАРЕВШИЙ - используйте libusb.info и указывает на библиотеку libusb - person Camilo Guevara; 10.08.2016
comment
Да именно это я и написал. libusbx разветвил libusb, libusb потерпел неудачу, и после этого libusbx переименовал себя в libusb. Обратите внимание на разницу между libusb.org и libusb.info. - person dryman; 10.08.2016