【问题标题】:Failed to open /dev/bus/usb/001/007: Permission denied for usb device无法打开 /dev/bus/usb/001/007:usb 设备的权限被拒绝
【发布时间】:2017-12-07 10:22:36
【问题描述】:

我正在尝试使用 webusb api 从网页连接 USB 设备,但我无法使用以下代码打开配对设备。

<!DOCTYPE html>
<html>
<head allow="usb"></head>
    <body>
   <input type="submit" onclick="connect()" value="connect"/>

    <script>
    var device;
    function setup(device) {
        alert(device.productName+" open");
        return device.open()

        .then(() => device.selectConfiguration(1))
        .then(() => device.claimInterface(0))
    }

    function connect() {
        if (device == null) {
            navigator.usb.requestDevice({ filters: [{ vendorId : 2352 }] })
            .then(selectedDevice => {
                device = selectedDevice;
                console.log(device);
                return setup(device);
            })

            .catch(error => { console.log(error); })
        }


    }
    navigator.usb.getDevices()
    .then(devices => {
        if (devices.length > 0) {
            device = devices[0];
            return setup(device);
        }
    })
    .catch(error => { console.log(error); });
    </script>
    </body>
</html>

它的节目

DOMException Access denied 配对后无法打开usb

【问题讨论】:

标签: javascript google-chrome webusb


【解决方案1】:

根据此问题的标题,您似乎在 Linux 上运行,并且未设置设备节点 /dev/bus/usb/001/007 的权限,以便运行 Chrome 的用户可以打开它。

您需要做的是添加一个 udev 规则,该规则将设置此设备节点的权限,以便可以打开它。首先,您需要确定设备的供应商和产品 ID。如果你运行lsusb,它会以这样的格式列出你系统上的设备,

Bus BBB Device NNN: ID VVVV:PPPP Manufacturer Product

在哪里,

BBB:总线编号(通常每个控制器一个,USB 3.0 控制器两个)。
NNN:该总线上的设备编号。
VVVV:供应商 ID(十六进制)。
PPPP:产品 ID(十六进制)。

知道此信息后,您可以在插入您在上述步骤中发现的 ID 后,在 /etc/udev/rules.d/ 中创建一个包含以下行的文件。

SUBSYSTEM=="usb", ATTRS{idVendor}=="VVVV", ATTR{idProduct}=="PPPP", MODE="0660", GROUP="plugdev"

这将使plugdev 组中的用户可以访问具有给定供应商和产品 ID 的任何设备。这是一个隐约适合可移动设备权限的组according to the Debian documentation

从您的代码看来已经知道供应商 ID 2352,它将以十六进制形式作为“0930”输入到规则中。

【讨论】:

  • 谢谢 Reilly Grant,它工作正常,但我无法声明它显示错误的 USB 接口([11:33:42] 未能声明接口 0:设备或资源繁忙 (16))
  • 在 Stack Overflow 上有很多关于此错误的答案,但是出于安全原因,使用 WebUSB 无法通过 API 分离现有内核驱动程序的选项。如果您可以修改系统设置,使其他驱动程序不被加载或手动解除绑定,那么您应该能够认领该接口。
  • 我解绑了 USB。之后我试图声明接口然后我得到了类似的错误。 "Failed to claim interface 0: No such file or Directory (2)" 。当我重新启动 chrome 时,操作系统再次默认绑定 USB,我收到错误 Failed to claim interface 0: Device or resource busy (16) 。有什么解决办法吗?
  • 我找到了您对link 问题的答案,我得到了与该人提出的相同结果。取消绑定设备后,我执行命令/sys/bus/usb/devices/1-2$ cat bConfigurationValue,但我没有得到任何值,bInterfaceNumber 也是如此。如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 2021-09-12
  • 1970-01-01
  • 2014-05-07
  • 2016-09-15
相关资源
最近更新 更多