收起左侧

飞牛NAS系统Docker搭建HP LaserJet 1020打印服务器(支持手机直连)

3
回复
2114
查看
[ 复制链接 ]

8

主题

36

回帖

0

牛值

初出茅庐

2025-4-7 10:40:13 显示全部楼层 阅读模式

<h1>飞牛NAS系统Docker搭建HP LaserJet 1020打印服务器(支持手机直连)</h1> <p>最近更换了一台HP LaserJet 1020激光打印机。实在无法忍受之前那台喷墨打印机——每次需要打印时,不是喷头堵塞就是墨水干了。最终在海鲜市场淘到这台HP经典款1020打印机来解决问题。原本计划通过USB将打印机接入NAS实现网络共享,但实际操作后发现<strong>自己</strong>还是太天真,遭遇了各种问题。现在基本解决完毕,特此记录踩坑经验。</p> <h2>基础环境搭建</h2> <p>首先需要在飞牛系统上安装CUPS打印机服务。经过测试,驱动支持最全面的镜像是 <code>anujdatar/cups</code>,可通过SSH一键部署:</p> <pre><code>docker run -d --name cups --restart unless-stopped -p 631:631 -v /dev/:/dev/ -v /var/run/dbus:/var/run/dbus -e CUPSADMIN=admin -e CUPSPASSWORD=adminadmin -e TZ="Asia/Shanghai" anujdatar/cups </code></pre> <p>访问 <code>http://NAS-IP:631</code>进入管理界面(用户名/密码为预设的 <code>admin/adminadmin</code>):</p> <p><img src="data/attachment/forum/202504/07/104006txcb9a7zfxcaj8ac.png" alt="CUPS管理界面" title="CUPS管理界面" /></p> <ol> <li>点击【Administration】添加打印机</li> <li>选择已识别的HP1020打印机型号</li> <li><strong>务必勾选</strong>"共享打印机"选项</li> <li><strong>必须选择</strong>"HP LaserJet 1020 Foomatic/foo2zjs-z1"驱动(其他驱动均有兼容性问题)</li> <li>添加完成后记录打印机URL(后续步骤需要)</li> </ol> <p><img src="data/attachment/forum/202504/07/104006u8ecb1tnvttpipye.png" alt="驱动选择界面" title="驱动选择界面" /></p> <h2>疑难问题排查</h2> <p>看似顺利的流程背后暗藏玄机,主要遇到三大问题:</p> <ol> <li><strong>设备识别异常</strong>:Docker内的CUPS服务在打印机重启后丢失设备连接</li> <li><strong>间歇性打印失败</strong>:测试页时好时坏,CUPS日志无报错</li> <li><strong>网络发现失效</strong>:必须手动输入URL添加打印机(导致iOS设备无法使用)</li> </ol> <h3>根本原因分析</h3> <p>经查证发现HP1020存在<strong>两个特殊设计</strong>:</p> <ul> <li>专为Windows设计的驱动架构,Linux支持不完善</li> <li><strong>无内置闪存</strong>,每次开机需通过 <code>/dev/usb/lp0</code>接口写入固件</li> </ul> <p><strong>飞牛系统的额外问题</strong>:<br /> USB接口会不定期释放 <code>/dev/usb/lp0</code>设备节点</p> <h3>解决方案</h3> <p>通过监控脚本实现自动化处理(需提前下载固件文件 <code>sihp1020.dl</code>):</p> <p><a href="https://blog.200333.xyz/index.php/archives/124/assets/printer_monitor-20250407102547-6z9r7di.sh">printer_monitor.sh</a></p> <pre><code>#!/bin/bash

打印机数据文件路径

PRINTER_DATA_FILE="/vol3/1000/docker/cups/sihp1020.dl"

监控检查间隔时间(秒)

CHECK_INTERVAL=30

设置日志文件路径

LOG_FILE="/var/log/printer_monitor.log"

创建日志函数

lo**essage() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" }

检查日志文件是否存在,不存在则创建

if [ ! -f "$LOG_FILE" ]; then touch "$LOG_FILE" lo**essage "日志文件已创建" fi

lo**essage "打印机监控服务启动"

记录上一次设备状态

LAST_DEVICE_STATUS=0

while true; do

检查打印机设备文件是否存在

if [ -c "/dev/usb/lp0" ]; then
    # 如果是设备首次出现(状态从不存在变为存在)
    if [ "$LAST_DEVICE_STATUS" -eq 0 ]; then
        lo**essage "检测到打印机设备连接"

        # 重启cups容器
        if docker restart cups >> "$LOG_FILE" 2>&1; then
            lo**essage "cups容器重启成功"
        else
            lo**essage "cups容器重启失败"
        fi

        # 检查源文件是否存在
        if [ -f "$PRINTER_DATA_FILE" ]; then
            lo**essage "开始执行打印任务"

            # 尝试执行打印命令
            if cat "$PRINTER_DATA_FILE" > "/dev/usb/lp0" 2>> "$LOG_FILE"; then
                lo**essage "打印任务执行成功"
            else
                lo**essage "打印任务执行失败"
            fi
        else
            lo**essage "错误:源文件不存在 ($PRINTER_DATA_FILE)"
        fi

        # 更新设备状态
        LAST_DEVICE_STATUS=1
    fi
else
    # 如果设备刚刚消失(状态从存在变为不存在)
    if [ "$LAST_DEVICE_STATUS" -eq 1 ]; then
        lo**essage "打印机设备已断开连接"
        LAST_DEVICE_STATUS=0
    fi
fi

# 等待指定的检查间隔时间
sleep $CHECK_INTERVAL

done </code></pre> <p>部署步骤:</p> <ol> <li>将脚本和固件上传至NAS,并记录下实际位置(如 <code>/vol3/1000/docker/cups/</code>)<br /> <img src="data/attachment/forum/202504/07/104006vpeetetuuav2nowt.png" alt="image" title="image" /><br /> 直接在飞牛系统里面双击编辑<a href="https://blog.200333.xyz/index.php/archives/124/assets/printer_monitor-20250407094429-2bfr42u.sh">printer_monitor.sh</a>脚本<br /> <img src="data/attachment/forum/202504/07/104006zf0bvd1h5tj1nd5j.png" alt="image" title="image" /></li> <li>创建systemd服务 <code>/etc/systemd/system/printer_monitor.service</code>:<br /> ssh下直接 <code>vim /etc/systemd/system/printer_monitor.service</code><br /> <img src="data/attachment/forum/202504/07/104006ien76fpt841bttk3.png" alt="image" title="image" /></li> </ol> <pre><code>[Unit] Description=Printer monitoring service After=network.target

[Service] Type=simple ExecStartPre=/bin/sleep 10 ExecStart=/vol3/1000/docker/cups/printer_monitor.sh User=root Restart=always

[Install] WantedBy=multi-user.target </code></pre> <ol start="3"> <li>执行以下命令激活服务:</li> </ol> <pre><code>systemctl daemon-reload systemctl enable printer_monitor chmod +x /vol3/1000/docker/cups/printer_monitor.sh </code></pre> <h2>遗留问题</h2> <p>目前仍存在<strong>网络打印机自动发现失效</strong>的情况,需通过以下方式手动添加:</p> <ul> <li>Android/iOS:通过IPP协议手动输入 <code>http://NAS-IP:631/printers/HP_LaserJet_1020</code></li> <li>Windows/macOS:添加网络打印机时指定上述地址</li> </ul>

收藏
送赞 5
分享

4

主题

20

回帖

0

牛值

江湖小虾

2025-4-13 10:13:32 显示全部楼层

admin/adminadmin进不去,以下无法完成lol

docker run -d --name cups --restart unless-stopped -p 631:631 -v /dev/:/dev/ -v /var/run/dbus:/var/run/dbus -e CUPSADMIN=admin -e CUPSPASSWORD=adminadmin -e TZ="Asia/Shanghai" anujdatar/cups 用这个命  详情 回复
2025-4-14 16:57

8

主题

36

回帖

0

牛值

初出茅庐

2025-4-14 16:57:38 楼主 显示全部楼层
流放三千里 发表于 2025-4-13 10:13
admin/adminadmin进不去,以下无法完成

docker run -d --name cups --restart unless-stopped -p 631:631 -v /dev/:/dev/ -v /var/run/dbus:/var/run/dbus -e CUPSADMIN=admin -e CUPSPASSWORD=adminadmin -e TZ="Asia/Shanghai" anujdatar/cups

用这个命令的时候 变量里面配置你自己的用户名密码就行了

4

主题

20

回帖

0

牛值

江湖小虾

2025-4-15 09:20:11 显示全部楼层

多谢,已成功修改

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则