Как получить дескриптор устройства с помощью WebUSB?

Я использую Wireshark на usbmon3 для анализа пакетов, входящих и исходящих от USB. Поэтому, когда я подключаю свое устройство, Wireshark показывает мне, что отправляется и что принимается.

Отправлено: Отправка запроса описания USB-устройства

Получено: введите здесь описание изображения

Я пытаюсь сделать то же самое, но с помощью Webusb. Вот мой код в javascript:

navigator.usb.requestDevice({ filters: [{ vendorId: 0x0403 }] })
    .then(selectedDevice => {
        device = selectedDevice;
        return device.open(); // Begin a session.
    })
    .then(() => device.selectConfiguration(1)) // Select configuration #1 for the device.
    .then(() => device.claimInterface(0)) // Request exclusive control over interface #0.
    .then(() => device.controlTransferOut({
        requestType: 'standard',
        recipient: 'device',
        request: 0x06,
        value: 0x00,
        index: 0x00}))
    .then(() => device.transferIn(1, 64))
    .then(result => {
        let decoder = new TextDecoder();
        console.log('Received: ' + decoder.decode(result.data));
    })
    .catch(error => {
         console.log(error); 
    });

В своем журнале консоли я получаю следующее: Ничего не получил Что, как я предполагаю, совершенно ничего.

Конечно, я знаю, что если я просто console.log(device) получу описание устройства в своей консоли. Но я пытаюсь понять саму функцию в основном, чтобы узнать, что должно идти в поля requestType, recipient, request, value, index, отправив ту же команду GET DESCRIPTOR (0x06) (как на первом рисунке) и получив обратно описание устройства в разделе console.log('Received: ' + decoder.decode(result.data));. Причина, по которой я пытаюсь сделать что-то настолько простое, заключается в том, что я буду выполнять больше передач на другие устройства, подключенные к этому USB-устройству, в частности, поэтому мне нужно понять, что отправлять в рамках этих параметров.

После того, как я использую эту функцию, я снова проверяю Wireshark, чтобы понять, почему я ничего не получаю, и получаю следующее: введите здесь описание изображения

Я предполагаю, что Broken pipe (-EPIPE) (-32) является причиной того, что я ничего не получил обратно. Я не знаю, где я делаю неправильно, и я полностью потерян.

Спасибо !!


person KZander    schedule 14.11.2019    source источник


Ответы (1)


Ваш код не совсем воспроизводит запрос, который вы видите в Wireshark. Для этого нужно,

device.controlTransferOut({
    requestType: 'standard',
    recipient: 'device',
    request: 0x06,
    value: 0x0100,
    index: 0x0000})).then(result => {
  // Parse the device descriptor from result.data.
});

Для запроса GET_DESCRIPTOR первый байт value — это тип дескриптора, а второй байт — индекс дескриптора. Это описано в спецификациях USB, которые можно загрузить с usb.org:

Скриншот раздела 9.4.3 из спецификации USB 1.1

Вызов transferIn() не нужен. Результат передачи управления представлен в result. Вызов transferIn() инициирует новую передачу на указанную конечную точку.

Данные, возвращаемые запросом дескриптора, не являются текстом, поэтому вы не сможете проанализировать их с помощью TextDecoder. result.data — это DataView, который имеет удобные методы для чтения значений различного размера из любого индекса. Структура дескриптора устройства также включена в спецификации:

Скриншот таблицы 9-7 из спецификации USB 1.1 Скриншот таблицы 9-7 (продолжение) из спецификации USB 1.1

person Reilly Grant    schedule 20.11.2019
comment
Последний вопрос, надеюсь, вы не против. Если я хочу отправить, например: «RQ_GETDEVID» (8-битная CRC для «RQ_GETDEVID» равна 0x66), мне нужно будет указать 0x66 в параметре «запрос», это правильно? - person KZander; 21.11.2019
comment
Это кажется правильным. Если вы хотите задать вопрос об обмене данными с конкретным устройством, пожалуйста, укажите информацию об устройстве и ссылки на любую документацию, которую вы нашли. - person Reilly Grant; 22.11.2019
comment
Я только что заметил, что когда я подключаю устройство, Wireshark показывает мне, что конечная точка «ВХОДИТ». Но когда я запускаю код, конечная точка "OUT". Вместо этого я попытался использовать controlTransferIn, я не получаю информацию о «зависании», которую я обычно получаю сейчас, но конечная точка, на которую он отправляет, по-прежнему 0x00 «OUT» вместо 0x80 «IN» - person KZander; 26.02.2020
comment
Конечная точка управления не находится ни внутри, ни снаружи. Его можно использовать для обоих в зависимости от сделанного запроса. - person Reilly Grant; 27.02.2020