无法打开 /dev/bus/usb/001/007:USB 设备权限被拒绝
Failed to open /dev/bus/usb/001/007: Permission denied for usb device
我正在尝试使用 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 cannot open usb after paired
根据这个问题的标题,您似乎在 Linux 上 运行ning 并且未设置设备节点 /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(十六进制)。
知道这些信息后,您可以在 /etc/udev/rules.d/
中创建一个文件,在插入您在上述步骤中发现的 ID 后包含以下行。
SUBSYSTEM=="usb", ATTRS{idVendor}=="VVVV", ATTR{idProduct}=="PPPP", MODE="0660", GROUP="plugdev"
这将使 plugdev
组中的用户可以访问具有给定供应商和产品 ID 的任何设备。这是一个隐约适用于可移动设备权限的组 according to the Debian documentation。
从您的代码看来已经知道供应商 ID 2352,它将以十六进制形式作为“0930”输入到规则中。
我正在尝试使用 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 cannot open usb after paired
根据这个问题的标题,您似乎在 Linux 上 运行ning 并且未设置设备节点 /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(十六进制)。
知道这些信息后,您可以在 /etc/udev/rules.d/
中创建一个文件,在插入您在上述步骤中发现的 ID 后包含以下行。
SUBSYSTEM=="usb", ATTRS{idVendor}=="VVVV", ATTR{idProduct}=="PPPP", MODE="0660", GROUP="plugdev"
这将使 plugdev
组中的用户可以访问具有给定供应商和产品 ID 的任何设备。这是一个隐约适用于可移动设备权限的组 according to the Debian documentation。
从您的代码看来已经知道供应商 ID 2352,它将以十六进制形式作为“0930”输入到规则中。