0

有没有办法使用 WebHID API 只要求输入报告?API似乎有直接读取Feature Report的功能,但我不明白为什么我必须等待一个事件才能监听Input Report。根据我对输入报告的了解,主机 PC 必须触发获取报告的请求,我认为当我编写输出报告时,它可以触发读取。打开设备也应该触发读取。

const dataView = await device.receiveFeatureReport(/* reportId= */ 1);

由于我知道我要读取的 ReportID 不是功能报告类型,因此此功能不起作用。

使用事件侦听方法,我在尝试在打开设备或将报告写入输出报告后触发输入报告时遇到问题。该器件是实现 USB HID 的 STM32L4x 器件。我向它写入输出报告没有问题,但我似乎无法触发读取输入报告事件。该事件似乎永远不会触发。与此处的这篇文章相同的问题(WEBHID API:Inputreport not triggering with barcode scanner)但由于驱动程序安装要求,我不想切换到使用 WebUSB。

这与几个示例使用的事件监听代码相同。

if (!device.opened) await device.open();

device.addEventListener("inputreport", event => {
  const { data, device, reportId } = event;

  if (device.productId !== 0x5751) return;

  const value = data.getUint8(0);
  if (value == 0) return;
 
  console.log(`Data: ${value}.`);
});

我可以通过 device.collections 进行交互以正确获取所有报告类型

for (let collection of device.collections) {
  // An HID collection includes usage, usage page, reports, and subcollections.

  msg += `Usage: ${collection.usage}` + "<br>";
  msg += `Usage page: ${collection.usagePage}`+ "<br>";

  for (let inputReport of collection.inputReports) {
    msg += `Input report: ${inputReport.reportId}`+ "<br>";
    // Loop through inputReport.items
  }

  for (let outputReport of collection.outputReports) {
    msg += `Output report: ${outputReport.reportId}`+ "<br>";
    // Loop through outputReport.items
  }

  for (let featureReport of collection.featureReports) {
    msg += `Feature report: ${featureReport.reportId}`+ "<br>";
    // Loop through featureReport.items
  }
}
showMessage(msg);

这是输出:

Usage: 1
Usage page: 255
Input report: 1
Input report: 3
Output report: 2
Output report: 4

我能找到的示例并不多,可以让我直接获得输入报告而无需执行监听事件。也许我对 USB HID 报告的理解不完整,所以任何帮助将不胜感激。

4

0 回答 0