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

Node.js中如何区分两台ER80二维码扫描器以控制对应门禁

区分两台虚拟键盘式ER80二维码扫描器的Node.js实现方案

核心思路

ER80默认模拟USB HID键盘,无法通过串口/图像扫描仪工具识别,需通过HID设备标识+输入事件监听实现设备区分。以下是具体实现步骤:


1. 依赖准备

使用node-hid库直接与HID设备交互,安装命令:

npm install node-hid

Linux环境需先安装系统依赖:

sudo apt-get install libudev-dev

2. 识别设备标识

先编写脚本枚举所有HID设备,找到两台ER80的vendorId和productId:

const HID = require('node-hid');
console.log(HID.devices());

运行后在输出中找到ER80对应的设备条目,记录下vendorId(十六进制)和productId(十六进制)。


3. 监听设备输入并区分

通过设备标识分别监听两台扫描器的输入,将HID扫描码转换为字符,完成识别后触发对应门禁逻辑:

const HID = require('node-hid');

// 替换为你的两台设备实际标识
const entranceScanner = { vendorId: 0xXXXX, productId: 0xYYYY };
const exitScanner = { vendorId: 0xXXXX, productId: 0xZZZZ };

// HID键盘扫描码到字符的基础映射(需根据需求补充完整)
const scanCodeMap = {
  0x04: 'a', 0x05: 'b', 0x06: 'c', 0x07: 'd', 0x08: 'e', 0x09: 'f',
  0x0A: 'g', 0x0B: 'h', 0x0C: 'i', 0x0D: 'j', 0x0E: 'k', 0x0F: 'l',
  0x10: 'm', 0x11: 'n', 0x12: 'o', 0x13: 'p', 0x14: 'q', 0x15: 'r',
  0x16: 's', 0x17: 't', 0x18: 'u', 0x19: 'v', 0x1A: 'w', 0x1B: 'x',
  0x1C: 'y', 0x1D: 'z', 0x1E: '1', 0x1F: '2', 0x20: '3', 0x21: '4',
  0x22: '5', 0x23: '6', 0x24: '7', 0x25: '8', 0x26: '9', 0x27: '0',
  0x28: '\n' // 扫描结束的回车符
};

function setupScanner(config, doorType) {
  try {
    const scanner = new HID.HID(config.vendorId, config.productId);
    console.log(`已连接${doorType}扫描器`);

    let scannedContent = '';

    scanner.on('data', (data) => {
      // HID键盘数据格式:第2字节为修饰键,第3-8字节为扫描码
      for (let i = 2; i < 8; i++) {
        const code = data[i];
        if (code === 0) continue;
        
        const char = scanCodeMap[code];
        if (!char) continue;

        if (char === '\n') {
          // 扫描完成,执行门禁逻辑
          console.log(`${doorType}扫描到二维码:${scannedContent}`);
          doorType === '入口' ? openEntranceDoor() : openExitDoor();
          scannedContent = '';
        } else {
          scannedContent += char;
        }
      }
    });

    scanner.on('error', (err) => {
      console.error(`${doorType}扫描器异常:`, err);
    });
  } catch (err) {
    console.error(`${doorType}扫描器连接失败:`, err);
  }
}

// 门禁控制示例函数(根据实际硬件替换)
function openEntranceDoor() {
  console.log('触发入口门禁开启');
  // 此处添加门禁控制代码,如串口控制继电器、调用API等
}

function openExitDoor() {
  console.log('触发出口门禁开启');
  // 同理添加出口门禁控制逻辑
}

// 初始化两台扫描器
setupScanner(entranceScanner, '入口');
setupScanner(exitScanner, '出口');

4. Linux权限配置

普通用户默认无HID设备访问权限,需添加udev规则:

  1. 创建规则文件:sudo nano /etc/udev/rules.d/99-scanner.rules
  2. 添加内容(替换为实际的vendorId和productId):
    SUBSYSTEM=="usb", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="YYYY", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="ZZZZ", MODE="0666"
    
  3. 重新加载规则:sudo udevadm control --reload-rules && sudo udevadm trigger

补充说明

  • 若ER80支持自定义前缀输出(需查看设备手册),可给每台扫描器配置唯一前缀(如入口加IN-、出口加OUT-),简化后续识别逻辑。
  • 扫描码映射需根据HID标准补充完整,覆盖二维码可能包含的所有字符。

内容的提问来源于stack exchange,提问作者Sergi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:10:11