Когда следует использовать WebHID вместо WebUSB?

У меня есть проприетарное USB-устройство с функцией перепрошивки через USB. Я хотел бы воспроизвести эту функцию мигания из браузера, но я не уверен, какой API использовать.

Посещение chrome://usb-internals/ для проверки моего устройства дает мне следующую информацию:

Описание USB-устройства: код класса 8, запоминающее устройство

Устройство рекламирует себя с кодом класса 8: запоминающее устройство большой емкости. Устройство не отображается в моей файловой системе, например это не обычный USB-накопитель. Согласно этому ответу StackOverflow, WebUSB заблокирован для доступа к запоминающим устройствам из соображений безопасности, и вместо этого я должен использовать WebHID.

Однако использование WebHID по-прежнему не позволяло мне подключиться к моему устройству. Это пример кода, который я использовал:

const filter = [
  {
    vendorId: 0xabcd, // correct VID:PID obtained via lsusb
    productId: 0x1234
  }
];

const [device] = await navigator.hid.requestDevice({ filter });

Кроме того, посещение chrome://device-log/ имеет четкое различие между USB- и HID-устройствами. Когда я, например, подключаю мышь, журнал устройства Chrome показывает, что подключено USB HID-устройство. Когда я подключаю USB-накопитель, я получаю две строки в журнале отладки: одно HID-устройство, одно запоминающее устройство. Когда я подключаю свой собственный диск, я получаю одну строку: USB Mass Storage device.

Как мне убедить WebHID подключиться к моему проприетарному запоминающему устройству?


person Maurits van Altvorst    schedule 11.07.2021    source источник


Ответы (2)


Невозможно без серьезных изменений:

USB-хранилище mss использует массовые конечные точки, HID передается через конечные точки управления и прерывания.

Вы можете реализовать и запоминающее устройство большой емкости и HID на одном устройстве USB (с IAD), но код загрузчика для HID будет значительно отличаться от кода запоминающего устройства большой емкости.

USB-накопители обычно не поддерживают HID, если нет светодиода или кнопки.

person Turbo J    schedule 11.07.2021
comment
Означает ли это, что в Google Chrome не существует API, который мог бы взаимодействовать с этим устройством? С WebDFU, WebUSB, WebHID, WebSerial, WebBluetooth это кажется таким странным упущением со стороны Google. Это устройство не востребовано моей операционной системой, это не обычная файловая система. Он просто использует массовые передачи для передачи данных из проприетарного флешера. - person Maurits van Altvorst; 11.07.2021
comment
Это еще хуже с точки зрения безопасности. Возможность доступа к необработанному уровню SCSI может заблокировать оборудование, установить защищенную область хоста или выполнить безопасное стирание данных. Вы действительно не хотите, чтобы браузерное приложение могло это сделать ... - person Turbo J; 12.07.2021
comment
Поскольку устройство рекламируется как запоминающее устройство USB, Chrome должен предположить, что это действительно так. Я не знаю, почему операционная система не распознает его как запоминающее устройство. Возможно, он распознает его как запоминающее устройство, но у него нет поддерживаемой файловой системы. Если это так, вы могли бы использовать API доступа к файловой системе для записи файлов в него. К сожалению, есть ограничения на то, что мы можем сделать для поддержки необычных устройств без нарушения свойств безопасности, которые мы встроили в дизайн. - person Reilly Grant; 12.07.2021

Вы можете установить драйвер WinUSB для устройства (Zadig делает это очень просто), а затем подключиться к устройству с помощью WebUSB.

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

person Gerrit    schedule 12.07.2021
comment
Если устройство предоставляет только интерфейс USB Mass Storage, то этот интерфейс будет заблокирован WebUSB. - person Reilly Grant; 12.07.2021
comment
@ReillyGrant. Невозможно заменить существующий драйвер драйвером WinUSB для этого интерфейса? - person Gerrit; 13.07.2021
comment
Замена драйвера не меняет класс интерфейса. - person Reilly Grant; 14.07.2021
comment
Это прискорбно. Есть ли какой-то разрешительный список, на который мы можем подать заявку, поскольку, похоже, есть ряд устройств, которые используют доступ в блочном режиме, что невозможно с API доступа к файловой системе? - person Gerrit; 20.07.2021