Открыть Ca sh Ящик через WebUSB JavaScript - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть приложение c#, которое может открыть ящик ca sh с установленным драйвером Windows. Довольно просто, так как драйвер заставляет USB-устройство выглядеть как последовательный порт:

 SerialPort rsPort = new SerialPort(textBox1.Text);
 byte[] openCmd = new byte[5];
 openCmd[0] = 27;
 openCmd[1] = 112;
 openCmd[2] = 0;
 openCmd[3] = 60;
 openCmd[4] = 255;
 rsPort.Open();
 Thread.Sleep(100);
 rsPort.Write(openCmd, 0, 5);
 Thread.Sleep(100);
 rsPort.Close();

Я сейчас пытаюсь открыть тот же самый USB-ящик примерно на 1018 * через WebUSB. Я использовал ZaDig для установки стандартного c USB-накопителя, и Chrome может видеть USB-устройство; можете открыть устройство; Однако я изо всех сил пытаюсь отправить правильные команды.

Вот изображение конфигурации:

enter image description here

Вот мой текущий код:

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript WebUSB</h2>

<button id="myBtn">Try it</button>

<script>
document.getElementById("myBtn").addEventListener("click", talkToDrawer);

async function talkToDrawer() {
  try {
    let device = await navigator.usb.requestDevice({ filters: [{ vendorId: 1659 }] });
    console.log(device);
    await device.open(); // Begin a session.
    await device.selectConfiguration(1); // Select configuration #1 for the device.
    await device.claimInterface(0); // Request exclusive control over interface #2.
    result = await device.controlTransferOut({
        requestType: 'standard', // tried all combinations: standard / class / vendor
        recipient: 'endpoint', // tried all combinations: device / interface / endpoint / other
        request: 0x27,
        value: 0,
        index: 1
     });
     result = await device.controlTransferOut({
        requestType: 'standard', // tried all combinations: standard / class / vendor
        recipient: 'endpoint', // tried all combinations: device / interface / endpoint / other
        request: 0x112,
        value: 0,
        index: 1
     });
     result = await device.controlTransferOut({
        requestType: 'standard', // tried all combinations: standard / class / vendor
        recipient: 'endpoint', // tried all combinations: device / interface / endpoint / other
        request: 0x0,
        value: 0,
        index: 1
     });
     result = await device.controlTransferOut({
        requestType: 'standard', // tried all combinations: standard / class / vendor
        recipient: 'endpoint', // tried all combinations: device / interface / endpoint / other
        request: 0x60,
        value: 0,
        index: 1
     });
         result = await device.controlTransferOut({
        requestType: 'standard', // tried all combinations: standard / class / vendor
        recipient: 'endpoint', // tried all combinations: device / interface / endpoint / other
        request: 0x255,
        value: 0,
        index: 1
     });

  } catch (error) {
    console.log(error);
  }
}


</script>

</body>
</html> 

1 Ответ

0 голосов
/ 28 февраля 2020

Не зная больше об устройстве, в коде я вижу две ошибки:

  1. В примере C# команда [27, 112, 0, 60, 255] со значениями, указанными в десятичном виде, а в Javascript пример значения даны в виде шестнадцатеричных констант. Соответствующий код для построения буфера команд в Javascript:
const cmd = new Uint8Array([27, 112, 0, 60, 255]);
Вместо использования controlTransferOut() для отправки данных, скорее всего, правильно использовать transferOut() и выбрать конечную точку № 3. Микросхемы преобразователя USB-последовательного интерфейса Prolifi c реализуют протокол, аналогичный стандартному последовательному порту USB. класс, который использует пару конечных точек массива IN и OUT для потока последовательных данных,
result = await device.transferOut(3, cmd);

Остается открытым вопрос, нужно ли выполнять какие-либо управляющие передачи, прежде чем вы сможете отправить эту команду. Передачи управления используются для настройки устройства, а для чипа USB-to-serial это обычно включает в себя такие вещи, как установка скорости передачи данных или установка бита DCE на высокий уровень. При обратном проектировании связи с USB-устройством я рекомендую использовать Wireshark для просмотра USB-трафика c из работающего драйвера.

Обратите внимание, что если вы работаете с последовательным портом устройство, которое вы должны взять Serial API . Существует экспериментальная реализация, доступная в Chrome за флагом chrome: // flags / # enable-эксперимент-web-platform-features. Этот API предназначен для приложений, специально предназначенных для последовательных устройств, и позволяет избежать необходимости повторной реализации драйвера для чипа USB-to-serial.

...