Chrome 67使用WebUSB API调用claimInterface触发受保护类错误求助
我来帮你拆解这个问题——你碰到的DOMException: The requested interface implements a protected class.错误,本质是Chrome的安全限制在起作用:它会阻止WebUSB API访问属于受保护设备类的接口,避免干扰系统原生的设备功能或带来安全风险。
为什么会触发这个错误?
Chrome默认禁止访问以下几类USB接口:
- HID类(接口类代码
0x03,比如键盘、鼠标这类输入设备) - USB音频类(
0x01) - USB视频类(
0x0E) - 其他系统依赖的设备类
你的设备vendorId是0x0b67(属于Cypress半导体的设备),很可能你尝试claim的接口0正好属于上述受保护类之一,所以Chrome直接拦截了请求。
可行的解决方案
检查设备接口的类属性
用工具查看接口的实际类代码:- Chrome里可以打开
chrome://device-log/,连接设备后查看USB设备的详细信息 - 或者用系统工具:Windows设备管理器→查看设备属性→详细信息→选择“硬件ID”;Linux用
lsusb -v命令
如果接口0的bInterfaceClass是上述受保护值,那就是问题根源。
- Chrome里可以打开
切换到非受保护的接口
如果你的设备有多个接口,试试claim其他接口(比如接口1)。从你的代码看,你是往接口1做transferIn,那说不定接口1才是供WebUSB使用的非受保护接口,而接口0是系统占用的HID类接口。修改设备固件(如果是自定义设备)
如果你是自己开发的硬件,可以修改固件,把需要WebUSB访问的接口设置为厂商自定义类(接口类代码0xFF),这样Chrome就不会限制访问了。优化代码避免资源泄漏
你的代码用了setInterval频繁调用设备操作,但没有释放接口和关闭设备,容易导致设备被系统或之前的调用占用。建议在每次操作完成后释放接口并关闭设备,比如:
window.setInterval(async function() { try { const devices = await navigator.usb.getDevices({ filters: [{ vendorId: 0x0b67 }] }); if (!devices[0]) { console.log('未找到目标设备'); return; } const device = devices[0]; await device.open(); await device.selectConfiguration(1); // 尝试claim接口1而非接口0 await device.claimInterface(1); const transferResult = await device.transferIn(1, 6); console.log('接收数据:', transferResult); // 操作完成后释放资源 await device.releaseInterface(1); await device.close(); } catch (error) { console.error('USB操作失败:', error); } }, 1000);
额外提醒
虽然你说之前Chrome 67运行正常,但可能是设备连接状态变化(比如系统重新占用了接口),或者固件更新导致接口类属性改变。可以尝试重新插拔设备,关闭其他可能占用该设备的程序后再测试。
内容的提问来源于stack exchange,提问作者Jon

