Я использовал usbmon для анализа USB-пакетов и реализовал его в webusb, однако мне не удалось найти для этого решения. Вот что Sane отправляет на usb:
S Co:1:074:0 s 02 01 0000 0081 0000 0
C Co:1:074:0 0 0
S Co:1:074:0 s 02 01 0000 0002 0000 0
C Co:1:074:0 0 0
Это похоже на команду controlTransferOut () с requestType = Standard, получатель: 'конечная точка', запрос: 1, индекс: 0x00, значение: 129
'Значение' здесь очень сложно, поскольку все остальные параметры должны быть правильными согласно документации, однако отправка значения: 129 должна отправлять что-то вроде:
S Co:1:074:0 s 02 01 0081 0000 0000 0
Однако вместо этого я получил:
Uncaught (in promise) DOMException: The specified endpoint number is out of range.
В то время как значение представляет собой короткое беззнаковое сокращение, максимальное значение 0xffff! Таким образом, очевидно, что значение должно быть 0, а следующий полубайт 0x0081. Мой вопрос в том, как вызвать контрольный выход (Co) со значением во втором полубайте?
Код выглядит примерно так:
navigator.usb.requestDevice({ filters: [{ vendorId: 0x1083}] })
.then(selectedDevice => {
device = selectedDevice;
return device.open(); // Begin a session.
})
.then(() => device.selectConfiguration(1))
.then(() => device.claimInterface(0))
.then(() => device.controlTransferOut({
requestType: 'standard',
recipient: 'endpoint',
request: 0x00,
value: 129,
index: 0x00}))
Все остальные комбинации отправляются с ответом, например, «Сбой» (класс, интерфейс: 21 - поставщик, устройство: 40 ... и т. Д.).
Описание устройства и дескриптор конечной точки доступны здесь
Спасибо