我有三台来自同一供应商的 USB 收据打印机(因此 USB 供应商和产品 ID 相同),它们插入同一台服务器,我需要能够向每台打印机发出单独的打印命令。打印机将自己注册到 /dev/usb/lp*,因此我只需将 ESC/POS 命令写入这些文件,打印机就会打印相应的收据。但问题是,重新启动时,顺序有时会发生变化,例如 /dev/usb/lp0 现在指的是之前的 /dev/usb/lp1 打印机。有没有办法分配每个设备 ID 或至少每个 USB 端口 ID,以便它始终指向同一台打印机?
答案1
我发现了一个丑陋的解决方案,如果您有更优雅的解决方案,请发表您的答案。
我编写了一个脚本,使用正则表达式来解析输出dmesg | grep usblp | grep 0x0416
(0x0416 是我的 USB 打印机的供应商 ID)。
输出如下:
[ 9.875206] usblp 2-2:1.0: usblp0: USB Bidirectional printer dev 2 if 0 alt 0 proto 2 vid 0x0416 pid 0x5011
[ 9.879408] usblp 3-1:1.0: usblp1: USB Bidirectional printer dev 2 if 0 alt 0 proto 2 vid 0x0416 pid 0x5011
[ 9.883841] usblp 3-2:1.0: usblp2: USB Bidirectional printer dev 3 if 0 alt 0 proto 2 vid 0x0416 pid 0x5011
我使用一个简单的正则表达式:/usblp ([0-9]\-[0-9])\:1\.0\: usblp([0-9])/
使用其对应的 usblp id 隔离 usb 端口(2-2、3-1 或 3-2),然后我只需要将每个 usb 端口映射到一个友好名称的哈希图。
它很丑陋,它需要解析 dmesg,但到目前为止它似乎可以工作。
答案2
创建一个符号链接我在 Ubuntu 22.04 5.19.0-32-generic 中的一台机器上完成了此操作,并且能够回显符号链接进行打印。
#! /usr/bin/bash
## checks for symlink and removes it if needed
if [ -L /dev/usb/lp0 ]; then
rm /dev/usb/lp0
fi
# create symlink if it is /dev/usb/lp0 is not present to link printer to /dev/usb/lp0
if ! [ -f /dev/usb/lp0 ]; then
prport=$(ls -l /dev/usb/lp* |awk '{print $10}')
ln -s $prport /dev/usb/lp0
fi