Это действительно поздно, но если вы не нашли решение или кто-то другой хочет это сделать, это было мое решение. Должен отметить, что я не очень разбираюсь в этом, поэтому некоторые детали могут отсутствовать, но общая картина есть.
UsbDeviceConnection.controlTransfer
требуется 7 переменных:
- Тип запроса
- Запрос
- Значение запроса
- Индекс запроса
- Выходной буфер
- Размер буфера
- Время ожидания
Тип запроса описывает направление, тип и получателя перевода. В этом случае мы хотим прочитать (1), используя стандартную (00) передачу, и мы хотим запросить интерфейс (00001). Мы хотим запросить интерфейс, потому что HID - это интерфейс устройства. Итак, 0b10000001
или 0x81
.
Запрос описывает наш конкретный запрос. Мы ищем HID отчет Дескриптор и GET_DESCRIPTOR
определяется как 0x06
спецификацией.
Значение запроса состоит из типа дескриптора в качестве старшего байта и индекса интерфейса в качестве младшего байта. Тип дескриптора в нашем случае - HID Report или 0x22
(это из спецификации HID, а именно дескрипторов классов). Индекс интерфейса такой же, как индекс запроса ниже. В моем случае это было 0x00
, но ваш может быть другим. Комбинируя старший и младший бит, мы получаем 0x2200
для нашего значения запроса.
Индекс запроса указывает, какой интерфейс вы запрашиваете. Если HID является единственным интерфейсом устройства, то это будет 0x00
. В противном случае вам придется проверить дескриптор конфигурации на предмет доступных типов интерфейсов и их индексов.
Выходной буфер - это пространство, выделенное для возврата транзакции, и его размер должен быть определен размером буфера, как описано ниже.
Размер буфера описывает количество байтов в дескрипторе отчета. Это значение указывается в дескрипторе конфигурации в дескрипторе класса HID (bDescriptorType
= 0x21
) и является значением 8-го байта (wDescriptorLength
) из общего количества 9. В моем случае это значение было 104.
Тайм-аут - это количество миллисекунд, после которого нужно сдаться. Я использовал 2000
.
Соединяя это, UsbDeviceConnection.controlTranfer(0x81, 0x06, 0x2200, 0x00, byte[] buffer, 104, 2000)
.
https://www.beyondlogic.org/usbnutshell/usb6.shtml дает превосходный обзор битовых полей, используемых в controlTransfer
, проверьте его, если хотите больше контекста.
https://eleccelerator.com/usbdescreqparser/ - чрезвычайно полезный инструмент для понимания дескрипторов USB и HID, и он может быть более проницательным, чем чтение спецификаций и только API.