You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome 67使用WebUSB API调用claimInterface触发受保护类错误求助

解决WebUSB调用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直接拦截了请求。

可行的解决方案

  1. 检查设备接口的类属性
    用工具查看接口的实际类代码:

    • Chrome里可以打开chrome://device-log/,连接设备后查看USB设备的详细信息
    • 或者用系统工具:Windows设备管理器→查看设备属性→详细信息→选择“硬件ID”;Linux用lsusb -v命令
      如果接口0的bInterfaceClass是上述受保护值,那就是问题根源。
  2. 切换到非受保护的接口
    如果你的设备有多个接口,试试claim其他接口(比如接口1)。从你的代码看,你是往接口1做transferIn,那说不定接口1才是供WebUSB使用的非受保护接口,而接口0是系统占用的HID类接口。

  3. 修改设备固件(如果是自定义设备)
    如果你是自己开发的硬件,可以修改固件,把需要WebUSB访问的接口设置为厂商自定义类(接口类代码0xFF),这样Chrome就不会限制访问了。

  4. 优化代码避免资源泄漏
    你的代码用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:01:02