js怎样操作WebHID设备 HID设备交互的3个核心方法

js怎样操作WebHID设备 HID设备交互的3个核心方法
最新回答
予情

2022-07-13 13:34:58

使用 JavaScript 操作 WebHID 设备,核心在于掌握 WebHID API 的三大核心方法:请求设备访问权限读取设备数据发送数据给设备。以下是具体实现步骤与代码示例:

1. 请求设备访问权限

通过 navigator.hid.requestDevice() 请求用户授权,并指定设备的 vendorId 和 productId 过滤目标设备。授权成功后,打开设备并返回 HIDDevice 对象。

async function requestHIDDevice() { const filters = [{ vendorId: 0x1234, productId: 0x5678 }]; // 替换为实际设备ID try { const devices = await navigator.hid.requestDevice({ filters }); if (devices.length > 0) { const device = devices[0]; await device.open(); // 打开设备 console.log("HID Device connected:", device); return device; } else { console.log("No HID device selected."); return null; } } catch (error) { console.error("Error accessing HID device:", error); return null; }}
  • 关键点

    filters 用于筛选目标设备,vendorId 和 productId 可通过设备管理器或 USB 检测工具获取。

    用户需明确授权后才能访问设备,确保安全性。

2. 读取设备数据

监听设备的 inputreport 事件接收数据,并通过 DataView 转换为 Uint8Array 解析。同时,监听 disconnect 事件处理设备断开。

async function startReading(device) { device.addEventListener("inputreport", (event) => { const { data, reportId } = event; const uint8Array = new Uint8Array(data.buffer); console.log(`Received data (Report ID: ${reportId}):`, uint8Array); // 根据 reportId 解析数据 }); device.addEventListener("disconnect", () => { console.log("HID Device disconnected"); // 清理资源或尝试重连 });}
  • 关键点

    inputreport 事件返回的 data 是 DataView 对象,需转换为 Uint8Array 处理。

    reportId 标识数据类型,需根据协议解析不同报告。

    disconnect 事件用于处理设备断开后的逻辑(如更新 UI 或重连)。

3. 发送数据给设备

使用 sendReport() 或 sendFeatureReport() 发送数据,需指定 reportId 和 Uint8Array 格式的数据。

async function sendData(device, reportId, data) { try { await device.sendReport(reportId, data); // data 需为 Uint8Array console.log("Data sent successfully."); } catch (error) { console.error("Error sending data:", error); }}// 示例:发送配置参数(使用 sendFeatureReport)async function sendConfig(device, reportId, configData) { try { await device.sendFeatureReport(reportId, configData); console.log("Config sent successfully."); } catch (error) { console.error("Error sending config:", error); }}
  • 关键点

    sendReport() 用于普通输出报告,sendFeatureReport() 用于配置类特征报告。

    数据必须转换为 Uint8Array 格式,确保设备能正确解析。

其他注意事项
  1. 浏览器兼容性WebHID API 仅支持现代浏览器(如 Chrome、Edge)。可通过以下代码检查兼容性:

    if (!navigator.hid) { alert("当前浏览器不支持 WebHID API,请使用 Chrome 或 Edge。");}
  2. 安全性

    用户授权是强制性的,未授权无法访问设备。

    建议在请求权限时明确说明用途(如“需要访问 HID 设备以控制硬件”)。

  3. 错误处理

    捕获 requestDevice()、sendReport() 等操作的异常,避免程序崩溃。

    处理设备断开后的重连逻辑或状态更新。

完整示例流程// 1. 请求设备const device = await requestHIDDevice();if (!device) return;// 2. 开始读取数据startReading(device);// 3. 发送数据示例const dataToSend = new Uint8Array([0x01, 0x02, 0x03]);await sendData(device, 0x01, dataToSend);

通过以上三个核心方法,JavaScript 可实现与 HID 设备的完整交互流程,包括权限管理、数据收发和异常处理。