我正在尝试使用 WebUSB API 从 USB 条码设备读取数据。
(具体来说,我使用的是 Datalogic QuickScan Lite qw2100。我已将扫描仪配置为使用 USB-COM-STD 接口。)
使用下面的代码,我实际上可以从设备中读取数据。但只能逐个字符。即transferIn
调用只返回 1 个字符。所以要读取整个条形码,我需要循环。
我的问题:
这是 transferIn 的预期行为吗?还是我使用了错误的界面?或者可以使用 controlTransferOut 配置传输模式吗?
此外,其他 USB 接口设置均基于 interfaceClass 10 (HID)。但是我没有运气在这个设备上使用 WebHID。
NotAllowedError: Failed to open the device.
当我尝试调用open()
HIDDevice 对象时出现错误。最后但同样重要的是,使用 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);
}