如何从node-webkit访问USB设备
Node-webkit 是一种使用Web技术(如 HTML 、 CSS 、 JavaScript )创建桌面应用程序的流行工具。然而,从node-webkit应用程序访问USB设备可能是具有挑战性的。在这个背景下,我们将探讨从node-webkit应用程序访问USB设备的不同方法。
要从node-webkit中访问USB设备,您可以使用Node.js的usb包,该包提供了与USB设备通信的Node.js API。
方法1:Node.js usb包: 要使用Node.js usb包,您需要先通过运行以下命令进行安装:
npm install usb
为了访问USB设备,语法如下:
const usb = require('usb');
const device = usb.findByIds(vid, pid);
device.open();
device.controlTransfer(bmRequestType,
bRequest, wValue, wIndex, data, callback);
device.close();
访问USB设备需要在某些操作系统(如macOS和Linux)上获得特殊权限。您可能需要在Linux上添加udev规则或在macOS上创建自定义的Info.plist文件,以授权您的Node-webkit应用程序访问USB设备。
下面给出了一个详细的示例,以便正确理解使用此方法。
示例1: 列出所有已连接的USB设备。
const usb = require('usb');
const devices = usb.getDeviceList();
devices.forEach((device) => {
console.log(`Device: {device.deviceDescriptor.idVendor}:
{device.deviceDescriptor.idProduct}`);
console.log(` Type: {device.deviceDescriptor.iProduct}`);
console.log(` Bus:{device.busNumber}`);
console.log(` Address: {device.deviceAddress}`);
console.log(` Ports:{device.portNumbers}`);
console.log(` Manufacturer:
{device.deviceDescriptor.iManufacturer}`);
console.log(` Serial Number:
{device.deviceDescriptor.iSerialNumber}`);
});
说明: 此代码使用 usb 包使用 getDeviceList() 方法获取所有连接的 USB 设备的列表。然后,它迭代列表中的每个设备,并将每个设备的信息记录到控制台中,包括供应商ID、产品ID、设备类型、总线号、设备地址、端口号、制造商和序列号。
输出:

该输出显示了关于三个连接的USB设备的信息:一个OpenAI设备,一个无线鼠标和一个USB3.0集线器。
示例2: 向USB设备发送控制传输请求
const usb = require('usb');
const VENDOR_ID = 0x1234;
const PRODUCT_ID = 0x5678;
const bmRequestType = 0x40;
const bRequest = 0x01;
const wValue = 0x0100;
const wIndex = 0x0000;
const data = Buffer.from([0x01, 0x02]);
const device = usb.findByIds(VENDOR_ID, PRODUCT_ID);
device.open();
device.controlTransfer(bmRequestType, bRequest,
wValue, wIndex, data,
(error, response) => {
if (error) {
console.log(`Error: {error}`);
} else {
console.log(`Response:{response}`);
}
device.close();
});
解释: 此代码使用usb包中的findByIds()方法来查找具有特定供应商ID和产品ID的USB设备。然后,它使用open()方法打开设备,并使用controlTransfer()方法向设备发送控制传输请求。控制传输请求具有请求类型为0x40,请求代码为0x01,值为0x0100,并包含字节[0x01, 0x02]的数据缓冲区。控制传输请求的响应记录在控制台上。最后,使用close()方法关闭设备。
输出:

这个输出显示了控制传输请求的响应,它是一个包含字节[0x01, 0x02]的缓冲区。
方法2: 使用JavaScript库
要使用像usb.js或webusb.js这样的JavaScript库。usb.js是一个JavaScript库,为从Web应用程序访问USB设备提供了API。它是WebUSB API的包装器,并提供了一个简单和一致的接口来与USB设备交互。
使用此代码来包含js库。
<script src="https://cdnjs.cloudflare.com/ajax/libs/usb/1.4.0/usb.js"></script>
显示所有已连接的USB设备的代码。
usb.getDeviceList().then((devices) => {
const deviceList = document.getElementById('devices');
devices.forEach((device) => {
const deviceItem = document.createElement('li');
deviceItem.textContent = `{device.deviceDescriptor.idVendor}:
{device.deviceDescriptor.idProduct}`;
deviceList.appendChild(deviceItem);
});
}).catch((error) => {
console.log(`Error: ${error}`);
});
示例: 现在,在您的HTML文件中添加以下代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>List USB Devices</title>
<script src=
"https://cdnjs.cloudflare.com/ajax/libs/usb/1.4.0/usb.js">
</script>
</head>
<body>
<h1>List USB Devices</h1>
<ul id="devices"></ul>
<script>
usb.getDeviceList().then((devices) => {
const deviceList = document.getElementById('devices');
devices.forEach((device) => {
const deviceItem = document.createElement('li');
deviceItem.textContent = `{device.deviceDescriptor.idVendor}:
{device.deviceDescriptor.idProduct}`;
deviceList.appendChild(deviceItem);
});
}).catch((error) => {
console.log(`Error: ${error}`);
});
</script>
</body>
</html>
输出:

结论: usb.js为从web应用程序访问USB设备提供了一个简单而一致的API。它使得查找设备、打开设备、申请接口以及使用端点发送和接收数据变得简单。
极客教程