浏览器HID API允许网页在HTTPS或localhost安全上下文中,通过用户手势触发requestDevice()获取授权后与HID设备通信,仅Chromium系浏览器支持,需过滤设备、打开连接、监听inputreport事件处理数据,并管理连接状态与资源释放。

浏览器 HID API 允许网页直接与支持 HID 协议的设备(如游戏手柄、自定义键盘、传感器、USB 指纹模块等)通信,但需满足安全和权限条件。它不是“即插即用”,需要用户主动授权、设备兼容且页面运行在安全上下文(HTTPS 或 localhost)中。
确保环境满足前提条件
HID API 仅在现代 Chromium 内核浏览器(Chrome 89+、Edge 89+、Opera 75+)中可用,Firefox 和 Safari 尚未支持。页面必须通过 HTTPS 提供服务(开发阶段可使用 localhost),且需由用户手势(如点击按钮)触发请求,不能自动执行。
- 检查浏览器支持:
navigator.hid !== undefined - 确认协议:访问地址栏显示 https:// 或 http://localhost
- 避免在 iframe 中调用(除非显式声明
allow="hid"属性)
请求用户授权并选择设备
调用 navigator.hid.requestDevice() 弹出系统级设备选择框,用户手动勾选目标设备。可传入 filters 缩小范围(如指定 vendorId/productId 或 usagePage/usage),避免列出无关设备。
- 基础用法:
const devices = await navigator.hid.requestDevice({ filters: [] }); - 按厂商型号过滤:
{ filters: [{ vendorId: 0x1234, productId: 0x5678 }] } - 按 HID 功能分类过滤:
{ filters: [{ usagePage: 0x01, usage: 0x06 }] }(例如通用桌面控制类) - 返回的是
HIDDevice实例数组,每个含productId、vendorId、productName等信息
连接设备并监听输入报告
获取设备后需调用 device.open() 建立连接(返回 Promise),之后可通过 device.addEventListener('inputreport', ...) 接收设备上报的原始字节数据。注意:输入报告格式由设备固件定义,需查阅其 HID 报告描述符或厂商文档。
立即学习“Java免费学习笔记(深入)”;
- 打开设备:
await device.open();(首次调用会触发权限确认) - 监听报告:
device.addEventListener('inputreport', e => { console.log(e.data); }); -
e.data是ArrayBuffer,常用new Uint8Array(e.data)转为可读字节数组 - 若设备支持输出报告(如 LED 控制),可用
device.sendReport(reportId, data)
处理连接状态与权限管理
用户可能拔掉设备、拒绝权限或关闭标签页。应监听 connect / disconnect 事件,并在页面卸载前调用 device.close() 释放资源。权限状态可通过 navigator.permissions.query({ name: 'hid' }) 查询,但实际设备访问仍依赖 requestDevice() 的显式授权。
- 监听连接变化:
navigator.hid.addEventListener('connect', e => { /* 设备接入 */ }); - 监听断开:
navigator.hid.addEventListener('disconnect', e => { /* 设备移除 */ }); - 清理资源:
device.close()应在组件卸载、用户登出或页面关闭前调用 - 注意:同一设备多次连接时,
requestDevice()可能返回已授权设备,无需重复弹窗


















