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

通过 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 检测工具获取。
用户需明确授权后才能访问设备,确保安全性。
监听设备的 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 或重连)。
使用 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 格式,确保设备能正确解析。
浏览器兼容性WebHID API 仅支持现代浏览器(如 Chrome、Edge)。可通过以下代码检查兼容性:
if (!navigator.hid) { alert("当前浏览器不支持 WebHID API,请使用 Chrome 或 Edge。");}安全性
用户授权是强制性的,未授权无法访问设备。
建议在请求权限时明确说明用途(如“需要访问 HID 设备以控制硬件”)。
错误处理
捕获 requestDevice()、sendReport() 等操作的异常,避免程序崩溃。
处理设备断开后的重连逻辑或状态更新。
通过以上三个核心方法,JavaScript 可实现与 HID 设备的完整交互流程,包括权限管理、数据收发和异常处理。