0

我正在尝试使用 WebUSB API 从 USB 条码设备读取数据。

(具体来说,我使用的是 Datalogic QuickScan Lite qw2100。我已将扫描仪配置为使用 USB-COM-STD 接口。)

使用下面的代码,我实际上可以从设备中读取数据。但只能逐个字符。即transferIn调用只返回 1 个字符。所以要读取整个条形码,我需要循环。

我的问题:

  1. 这是 transferIn 的预期行为吗?还是我使用了错误的界面?或者可以使用 controlTransferOut 配置传输模式吗?

  2. 此外,其他 USB 接口设置均基于 interfaceClass 10 (HID)。但是我没有运气在这个设备上使用 WebHID。NotAllowedError: Failed to open the device.当我尝试调用open()HIDDevice 对象时出现错误。

  3. 最后但同样重要的是,使用 WebUSB(或 WebHID)是构建条形码应用程序的实用途径。我见过很多使用 WebUSB 的 USB 设备示例,但很少有条码阅读器的示例。这让我觉得我走错了路。

亲切的问候!


    try {

      const filters = [{
        vendorId: 1529,    // Datalogic ADC, Inc
        productId: 16900   // Handheld Barcode Scanner
      }];
      const device = await navigator.usb.requestDevice({ filters })

      const configuration_number = 1  // device.configuration.configurationValue
      const interface_number = 1      // device.configuration.interfaces[1].interfaceNumber
      const interface_class = 10      // device.configuration.interfaces[1].alternates[0].interfaceClass
      console.log(device);
      console.log(`configuration number :  ${configuration_number}`);
      console.log(`interface number : ${interface_number} `);
      console.log(`interface class : ${interface_class} `);

      await device.open();
      await device.selectConfiguration(configuration_number);
      await device.claimInterface(interface_number);
      await device.controlTransferOut({
        requestType: 'class',
        recipient: 'interface',
        request: 0x22,
        value: 0x10,
        index: interface_number
      });

      const read = async (device) => {
        const result = await device.transferIn(2, 64);
        const decoder = new TextDecoder();
        const message = decoder.decode(result.data);
        return message
      }

      var m
      do {
        m = await read(device)
        console.log(m);
      } while (m.charCodeAt(0) !== 13)

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

2 回答 2

1

我没有使用您正在使用的条形码扫描仪,但我对条形码扫描仪的体验是它们被配置为像键盘一样工作,并且不需要任何特定于 USB 的代码即可工作。

尝试将鼠标光标放在文本编辑器中并扫描条形码 - 与条形码相关的数字应显示在编辑器中。

于 2021-04-20T13:17:08.487 回答
1

在每次传输中从设备(条形码扫描仪)发送到主机(笔记本电脑)的数据量完全由设备控制。对于还可以选择模拟键盘的设备,它一次发送一个字符的数据对我来说并不奇怪。正如您所建议的,这可能是通过发送控制传输来配置的。我会要求设备制造商提供它支持的任何控制传输的文档。

使用 WebHID 从条码扫描仪读取数据可能不切实际,因为在 HID 模式下,设备可能看起来与键盘无法区分,而 API 实现不允许这些操作。

于 2021-04-21T21:29:21.083 回答