You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Ubuntu中将USB HID条码扫描器输出重定向至/dev/tty设备?

嘿,这个需求我之前帮朋友折腾过,其实核心是把模拟键盘的USB-HID扫描器输入重定向到指定tty设备,下面分步骤给你讲清楚怎么实现:

第一步:定位你的USB-HID扫描器对应的输入设备

这类扫描器本质是个虚拟键盘,系统会把它识别为一个输入事件设备,先找到它的路径:

  • 运行 ls /dev/input/by-id/,找带kbdusb关键字的设备(比如usb-XXX-event-kbd),这个就是扫描器对应的事件设备。
  • 或者装个evtest工具(sudo apt install evtest),运行后会列出所有输入设备,逐个选择测试,扫描条码时能看到事件输出的就是目标设备,记下它的路径(比如/dev/input/eventX)。
第二步:将扫描器输入重定向到目标tty

这里有几种实用方法,根据你的场景选:

方法1:用evemu工具(推荐,稳定可靠)

evemu专门用来处理输入事件的转发,能完美把扫描器的键盘事件转换成字符流输出到tty:

  1. 先安装evemu:sudo apt install evemu
  2. 确认目标tty设备存在(比如/dev/ttyUSB0/dev/ttyS0),如果权限不够,临时给读写权限:sudo chmod 666 /dev/ttyXXX,或者把当前用户加入dialout组(sudo usermod -aG dialout $USER,需重新登录)。
  3. 运行转发命令:
    sudo evemu-record /dev/input/eventX | evemu-play /dev/ttyXXX
    
    eventX换成你找到的扫描器设备路径,ttyXXX换成目标tty路径就行。

方法2:直接重定向字符流(适合简单场景)

如果你的扫描器会直接输出ASCII字符到stdout(部分扫描器支持这种模式),可以直接用cat重定向:

sudo cat /dev/input/eventX > /dev/ttyXXX

⚠️ 注意:/dev/input/eventX是原始事件流,不是直接的ASCII字符,所以这种方法可能需要额外转码工具(比如input-event-codes配合脚本),不如evemu省心。

方法3:用udev规则实现自动转发(开机/插设备自动生效)

如果需要扫描器一插入就自动重定向,写个udev规则:

  1. 创建规则文件:sudo nano /etc/udev/rules.d/99-barcode-scanner.rules
  2. 写入以下内容(替换成你的扫描器厂商ID、产品ID和目标tty):
    SUBSYSTEM=="input", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="YYYY", RUN+="/usr/bin/evemu-record /dev/input/%k | evemu-play /dev/ttyUSB0 &"
    
    厂商ID和产品ID可以用lsusb命令查到(比如Bus 001 Device 005: ID XXXX:YYYY ...)。
  3. 重新加载udev规则:sudo udevadm control --reload-rules && sudo udevadm trigger
第三步:验证重定向效果

用阻塞模式打开目标tty(比如cat /dev/ttyXXX,或者你的程序),然后扫描条码,应该能看到条码内容正常出现在tty的输出里。

额外注意事项
  • 如果扫描器同时输出到终端和tty,你可以禁用它作为系统键盘的功能:在X环境下用xinput disable <device-id>xinput list找设备ID),或者在udev规则里添加ENV{ID_INPUT_KEYBOARD}="0"来阻止系统识别它为键盘。
  • 无GUI的服务器环境下,evemu的转发效果最稳定,不需要处理X窗口的输入事件干扰。

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

火山引擎 最新活动