为 USB 打印机分配静态 ID

为 USB 打印机分配静态 ID

我有三台来自同一供应商的 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

相关内容