打印机是 HP LaserJet M1005 MFP,打印、复印、扫描功能都有,但是属于比较老的机型,没有网口。最简单的方式是买个小白盒,可以实现无线打印,但是扫描功能就不行了。所以才想到折腾一下。

由于家里硬件条件的限制,打印机放置的地点离软路由较远,同时也没有网络面板,只能通过小米路由器 3 无限中继的方式。小米路由器安装 p910nd 和 sane,软路由 Docker 安装 CUPS 和 scanservjs,实现苹果设备的 AirPrint 和无线扫描。

如果打印机可以直接插在软路由上,会简单很多,所有的软件在软路由上安装即可。

下面是打印机连接示意图:

打印机连接示意图

小米路由器 3 的配置

刷机 OpenWrt,测试打印功能

家里就一个小米路由器 3,固件选择的余地不大。一开始刷的是 Padavan,无法打印。后面换成 X-wrt,自带 p910nd,测试打印成功。

刷 X-wrt 的教程网上很多,按步骤操作即可。但是系统版本的选择,经过测试,先刷 v22.10_b202304222337,然后通过系统升级 v23.10_b202312150123,再高的版本就不行了。

修改 opkg 配置软件源,下面是本人使用的。

1
2
3
4
5
6
src/gz x-wrt_core http://archive.openwrt.org/releases/23.05.5/targets/ramips/mt7620/packages
src/gz x-wrt_base http://archive.openwrt.org/releases/23.05.5/packages/mipsel_24kc/base
src/gz x-wrt_luci http://archive.openwrt.org/releases/23.05.5/packages/mipsel_24kc/luci
src/gz x-wrt_packages http://archive.openwrt.org/releases/23.05.5/packages/mipsel_24kc/packages
src/gz x-wrt_routing http://archive.openwrt.org/releases/23.05.5/packages/mipsel_24kc/routing
src/gz x-wrt_telephony http://archive.openwrt.org/releases/23.05.5/packages/mipsel_24kc/telephony

p910nd 配置

安装扫描驱动程序

安装下方程序,其中的 sane-hpljm1005 是 HP Laserjet M1005 MFP 的扫描驱动程序,若是其它机型,请到 SANE: Backends (Drivers) 这个网站查询。

1
2
opkg update
opkg install sane-daemon sane-frontends sane-hpljm1005 xinetd

运行 scanimage -L 命令,如果显示下面的代码,表示扫描仪已成功驱动。

1
device `hpljm1005:libusb:001:002' is a Hewlett-Packard LaserJet M1005 multi-function peripheral

修改扫描相关程序的配置文件

修改 /etc/xinetd.d/sane-port 文件,disable 的值改成 no

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# default: off
# description: The saned provides scanner service via the network. \
# Applications like kooka, xsane or xscanimage can use the remote \
# scanner.
service sane-port
{
socket_type = stream
protocol = tcp
port = 6566
wait = no
user = root
group = root
server = /usr/sbin/saned
disable = no
}

修改 /etc/sane.d/saned.conf 文件,在最后增加局域网的网段。下面的示例文件增加了两个网段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# saned.conf
# Configuration for the saned daemon

## Daemon options
# Port range for the data connection. Choose a range inside [1024 - 65535].
# Avoid specifying too large a range, for performance reasons.
#
# ONLY use this if your saned server is sitting behind a firewall. If your
# firewall is a Linux machine, we strongly recommend using the
# Netfilter nf_conntrack_sane connection tracking module instead.
#
# data_portrange = 10000 - 10100


## Access list
# A list of host names, IP addresses or IP subnets (CIDR notation) that
# are permitted to use local SANE devices. IPv6 addresses must be enclosed
# in brackets, and should always be specified in their compressed form.
#
# The hostname matching is not case-sensitive.

#scan-client.somedomain.firm
#192.168.0.1
#192.168.0.1/29
#[2001:db8:185e::42:12]
#[2001:db8:185e::42:12]/64

# NOTE: /etc/inetd.conf (or /etc/xinetd.conf) and
# /etc/services must also be properly configured to start
# the saned daemon as documented in saned(8), services(4)
# and inetd.conf(4) (or xinetd.conf(5)).

192.168.1.0/24
192.168.2.0/24

软路由的配置

Docker 安装 CUPS 打印服务器

测试过多个镜像,只有 RagingTiger/cups-airprint 可以驱动,其他镜像需要再在容器内安装 hplip 惠普驱动。

但是使用 RagingTiger/cups-airprint 时 AirPrint 搜不到打印机,需要再安装 avahi 和启动 dbus,具体见下面的代码。

分别创建 docker-compose.ymlcustom-entrypoint.sh,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
### docker-compose.yml

services:
cups:
image: ghcr.io/ragingtiger/cups-airprint:master
container_name: cups
network_mode: host
privileged: true
volumes:
- /var/run/dbus:/var/run/dbus
- ./logs:/var/log/cups
- ./services:/services
- ./config:/config
- ./custom-entrypoint.sh:/usr/local/bin/custom-entrypoint.sh
environment:
TZ: "Asia/Shanghai"
CUPSADMIN: "admin"
CUPSPASSWORD: "admin"
restart: unless-stopped
entrypoint: /usr/local/bin/custom-entrypoint.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
### custom-entrypoint.sh

#!/bin/bash

apt-get update
apt-get install -y avahi-utils
service dbus start
service avahi-daemon start
systemctl enable --now dbus
systemctl enable --now avahi-daemon

# 启动 CUPS 服务
exec /root/run_cups.sh

配置 CUPS

这部分比较简单。点击 Administration -> Add Printer,在 Other Network Printers 选择 AppSocket/HP JetDirect,输入打印机(小米路由器)的地址,如 socket://192.168.1.10:9100。在下一步中输入打印机的名称 Name,务必勾选 Share This Printer

CUPS 添加打印机

主要注意一点,驱动程序请选择 HP LaserJet M1005 MFP Foomatic/foo2xqx (recommended) 。其他驱动程序无效。

CUPS 驱动程序选择

配置完成后,使用苹果设备测试打印。Windosw 电脑添加打印机时也可以自动搜索到,无需再安装驱动。

Docker 安装 scanservjs 扫描服务器

修改 SANED_NET_HOSTS=192.168.1.10 这里为打印机(小米路由器)的地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
services:
scanservjs:
container_name: scanservjs
image: sbs20/scanservjs:latest
ports:
- 8080:8080
environment:
- TZ=Asia/Shanghai
- SANED_NET_HOSTS=192.168.1.10
volumes:
- ./config:/etc/scanservjs
- ./scanned:/var/lib/scanservjs/output
restart: unless-stopped

配置 scanservjs

如需修改默认的配置,下载这个文件 config.default.js 重命名为 config.local.js,复制到 ./config 文件夹下,按需求修改即可。

scanservjs 页面