0%

基于树莓派的打印机/扫描仪服务器

前几天看到沃尔玛有20刀的all-in-one打印机(Canon PIXMA MG2522,可以搜搜附近能不能自提),于是我一脚油门就去提了回来。买回来之后发现这破打印机只能插到电脑上打印,想到自己还有一个闲置的树莓派B+,遂决定插到树莓派上共享这个打印机。经过一番搜索之后我发现并且实现了如下的网络打印机解决方案。

update 2020/2/17:增加了看门狗和墨水查看ß

前期准备

需求分析

将一台普通的三合一打印机变成网络打印机。

思路非常简单,linux上提供了lp和scanimage命令来分别操作打印机和扫描仪,那么只要将打印机连接到一台长期在线的linux电脑上,解决一下驱动问题,再将这台电脑作为服务器,然后写一个小网站提供调用lp/scanimage命令的交互页面就ok了。

解决方案肯定是要基于手头已经有的东西的。我有一个树莓派B+还有一个树莓派zero WH。这两个东西的性能半斤八两,但是树莓派zero WH使用了micro usb接口,如果插usb设备就要插otg,然而我并不想付额外的接口税(我的otg也找不着了),所以最后我选择了古老的树莓派B+,再找了个古老的8g的sd卡插了进去。

搜了一圈之后我发现这东西居然有非常现成的解决方案了,一个是CUPS(打印机的解决方案),另一个是SANE(扫描仪的解决方案)。于是我就犯了懒,直接用就行了,并没有必要自己再写个小网站,再说B+跑nginx也不太跑得动。。

原来还想再做个内外穿透远程使用打印机和扫描仪,不过后来想了想并没有必要。

硬软件要求

硬件

  • 一台打印机/扫描仪。我的是Canon PIXMA MG2522,是一台all-in-one的打印机,集成了扫描打印和复印
  • 一台能联网的、用于控制打印机的运行linux系统的设备。理论上是个能长期在线的设备就行。我使用了树莓派B+和一张8g sd卡作为了系统盘。
  • (Optional)随身wifi,插到树莓派上给树莓派联网用的。新版本的树莓派已经集成了wifi和蓝牙,不需要这玩意了

软件

  • 树莓派的操作系统我选择了最新版的Raspbian Lite,不带桌面环境,这样可以节约很多资源。
  • CUPS。为打印机提供了驱动和网络共享功能。这样你可以在局域网内发现这个打印机。
  • SANE。为扫描仪提供了驱动和内网的共享功能。但是它的网络协议似乎比较小众,并不是基于TCP或者UDP的,所以用ss/frp内网穿透回来的话也用不了。不过为啥要远程使用扫描仪呢?

系统搭建

初步设置

首先确保树莓派可以成功连上网,并且你可以使用ssh来连接树莓派。然后将打印机插上树莓派并打开打印机。具体过程不再赘述。

给树莓派分配固定ip

本文中固定ip以192.168.114.51为例。分配固定ip除了方便操作树莓派之外,也同样给打印机分配了一个固定ip。

你可以在路由器的后台根据mac地址给树莓派分配一个ip,也可以通过修改树莓派系统boot分区的配置文件来让树莓派自己申请一个固定ip,此处不再赘述。

网络打印机

CUPS安装和配置

首先当然要安装CUPS啦

1
2
sudo apt update
sudo apt install cups

然后你需要把当前用户(raspbian默认是pi)添加到linux打印机的管理员用户组lpadmin

1
sudo usermod -a -G lpadmin pi

接着需要确保cups允许所有的流量请求,然后重启cups

1
2
sudo cupsctl --remote-any
sudo /etc/init.d/cups restart

现在访问192.168.114.51:631,应该可以看到CUPS的后台页面了。

在CUPS中添加打印机

这里的操作就比较straightforward了。点击CUPS后台页面菜单栏的Administration - Printers - Add Printer,你应该可以在Local Printers一项后面看到你插上的打印机,接着点continue到添加驱动页面,通过厂家和型号来搜索你的打印机驱动。CUPS居然内置了我这个辣鸡打印机的驱动,这让我非常激动。如果没有你的打印机驱动也不要紧,上网搜搜PPD文件来告诉CUPS如何配置你的打印机即可。选择正确驱动之后点Add Printer,然后填写打印机的名字和描述(请记住打印机的名字,后面windows上有用),并确保Share This Printer打上钩,这样你就可以在网络中共享你的打印机了。最后,配置你的打印设置,比如纸张大小,分辨率等,这里根据个人需求来即可。

此步结束之后,打开你的mac/linux,按照正常的步骤用ip地址添加打印机再进行打印即可,这里也不再赘述。如果是windows用户,还需要再树莓派上开启samba服务,并在windows上通过samba搜索添加打印机。

在树莓派中开启samba

1
2
sudo apt update
sudo apt install samba

使用如下命令修改配置文件

1
sudo nano /etc/samba/smb.conf

在配置文件中修改/添加如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# CUPS printing.  
[printers]
comment = All Printers
browseable = no
path = /var/spool/samba
printable = yes
guest ok = yes
read only = yes
create mask = 0700

# Windows clients look for this share name as a source of downloadable
# printer drivers
[print$]
comment = Printer Drivers
path = /var/lib/samba/printers
browseable = yes
read only = no
guest ok = no

重启samba服务并设置开机启动

1
2
sudo systemctl start smbd
sudo systemctl enable smbd

在windows中添加打印机

以win10为例。先打开资源管理器,在地址栏中输入树莓派samba服务器的地址\\192.168.114.54,如果一切顺利的话,你会看到你的打印机的图标和你打印机的名字(即你刚刚在CUPS中设置的名字),这里以MG2522为例。你可以尝试双击打印机图标 - (提示找不到驱动程序)确定 - 选择驱动程序 - 完成来添加打印机。如果不行,请尝试下面的方法:

打开所有设置 - 设备 - 打印机和扫描仪 - 添加打印机或扫描仪 - (等两秒)我需要的打印机不在列表中 - 按名称选择共享打印机。

在下面的文本框中输入打印机的地址\\192.168.114.54\MG2522,点击下一步 - (找不到驱动程序)确定 - 选择驱动程序 - (已成功添加192.168.114.54上的MG2522)下一步 - 完成或者打印测试页。

这样,你的打印机就成功添加到win系统中了,你可以在任何应用中点击打印,并且使用这个打印机了。

网络扫描仪

SANE安装

第一步当然也是安装SANE啦

1
2
sudo apt update
sudo apt install sane

测试扫描仪

然后检查SANE能不能找到你的打印机

1
sudo sane-find-scanner

我的输出如下所示,可以看到已经识别出了扫描仪found USB scanner (vendor=0x04a9 [Canon], product=0x176d [MG2500 series]) at libusb:001:008

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  # sane-find-scanner will now attempt to detect your scanner. If the
# result is different from what you expected, first make sure your
# scanner is powered up and properly connected to your computer.

# No SCSI scanners found. If you expected something different, make sure that
# you have loaded a kernel SCSI driver for your SCSI adapter.
# Also you need support for SCSI Generic (sg) in your operating system.
# If using Linux, try "modprobe sg".

found USB scanner (vendor=0x04a9 [Canon], product=0x176d [MG2500 series]) at libusb:001:008
found USB scanner (vendor=0x2717 [MediaTek], product=0x4106 [MI WLAN Adapter]) at libusb:001:004
found USB scanner (vendor=0x0424, product=0xec00) at libusb:001:003
# Your USB scanner was (probably) detected. It may or may not be supported by
# SANE. Try scanimage -L and read the backend's manpage.

# Not checking for parallel port scanners.

# Most Scanners connected to the parallel port or other proprietary ports
# can't be detected by this program.

然后使用如下命令进一步尝试

1
sudo scanimage -L

应该会看到如下输出

1
device \`pixma:04A9176D_8E3A57\' is a CANON Canon PIXMA MG2500 Series multi-function peripheral

现在你可以尝试扫描一些东西了

1
scanimage > ~/test.pnm

接着通过scp或者FTP把文件取出来瞅瞅,可以直接用一个查看图片的软件(比如GIMP)打开试试。

通过scp传回文件:

1
scp pi@192.168.114.51:~/test-scan-file.pnm ~/test-scan-file.pnm

如果没得问题,我们就可以来配置SANE了。

配置SANE

打开/etc/default/saned,修改/添加如下内容来配置打开SANE的守护进程

1
RUN=yes

打开/etc/sane.d/saned.conf并添加如下内容,让SANE接收192.168.114.1~192.168.114.255这个地址段的ip。请根据你的实际情况更改。如果你的局域网ip地址是192.168.1.x,那么添加192.168.1.0/24即可。

1
192.168.114.0/24

同时取消这行的注释

1
data_portrange = 10000 - 10100

此外,我们还需要解决SANE的权限问题。我这里识别出的扫描仪是found USB scanner (vendor=0x04a9 [Canon], product=0x176d [MG2500 series]) at libusb:001:008libusb:001:008/dev/bus/usb/001/008,使用如下命令查看权限

1
ls -l /dev/bus/usb/001

会获得如下输出

1
2
3
4
5
6
7
pi@rpi-printer:~ $ ls -l /dev/bus/usb/001
total 0
crw-rw-r-- 1 root root 189, 0 Sep 7 03:40 001
crw-rw-r-- 1 root root 189, 1 Sep 4 05:10 002
crw-rw-r-- 1 root root 189, 2 Sep 4 05:10 003
crw-rw-r-- 1 root root 189, 3 Sep 7 03:40 004
crw-rw-r-- 1 root lp 189, 9 Sep 7 21:45 008

可以看到打印机归lp group的root所有,所以我们要把运行SANE守护进程的用户saned加到lp group

1
sudo add user saned lp

重启sane,将sane添加到启动项并检查它的status

1
2
3
sudo systemctl start saned.socket
sudo systemctl enable saned.socket
sudo systemctl status saned.socket

你会看到如下输出,可以看到6566端口是给SANE用的

1
2
3
4
5
6
7
8
9
● saned.socket - saned incoming socket
Loaded: loaded (/lib/systemd/system/saned.socket; enabled; vendor preset: enabled)
Active: active (listening) since Sat 2019-09-07 03:49:14 BST; 3 days ago
Listen: [::]:6566 (Stream)
Accepted: 5; Connected: 0;
Memory: 0B
CGroup: /system.slice/saned.socket

Sep 07 03:49:14 rpi-printer systemd[1]: Listening on saned incoming socket.

使用SANE客户端进行扫描

你可以从官方的SANE frontends中选择一个你喜欢的程序作为客户端。我随便用SANEWinDS在windows上测试了一下,只要打开之后填写上树莓派的ip地址,即可开始扫描。记得修改resolution,最大可以到600ppi,默认的分辨率实在是太低了。

优化

防止树莓派卡死

太长不看:保证充足供电;上看门狗。

一开始我使用了5V1A的adapter给树莓派供电,每过几天树莓派就会卡死一次。经查发现是供电不足导致的,换了一个5V2.1A的adapter之后解决问题,能跑几十天不卡死,并且内存占用一直很低(Raspbian Lite,使用的RAM < 60M)。2020年寒假回来之后我发现树莓派还是卡死了,我猜测可能和家电压不稳定有关(例如空调启动的时候家里的电灯会明显的暗一下)。遂决定上看门狗解决。

看门狗的开启比较简单,网上的教程也比较多,我直接参考了这篇教程.

查询墨水使用情况

如果你的打印机是HP,EPSON或者CANON,直接安装ink并使用。

1
2
sudo apt install ink
sudo ink -p usb

会得到类似的如下输出:

1
2
3
4
5
6
7
pi@printer:~ $ sudo ink -p usb
ink 0.5.3 (c) 2018 Markus Heinz

Canon MG2500 series

Black: 0%
Color: 0%

我的墨水量显示为0是因为前几天朱大佬去refill了墨盒,我们装回去之后打印机的墨水指示灯还是黄色的,暂时还没有解决这个问题,但是打印机是可以正常打印的。

总结

techinically

使用CUPS配置了网络打印机,它的端口是631,你需要通过http来访问CUPS的管理界面(即通过http://192.168.114.51:631访问)。在MAC/Linux中添加打印机的话,只需要192.168.114.51这个ip就够了。如果要给windows用,需要额外的配置,请参考这一章节

使用SANE配置了网络扫描仪,它的端口是6566,你需要一个SANE客户端来访问扫描仪,参考这一章节或直接访问这里选择你需要的SANE客户端来进行扫描。

优点

超级便宜的解决方案,当然,仅仅限于能用。

$20的all-in-one打印机和祖传吃灰的树莓派b+组成的网络打印机,要什么自行车?反正学校有扫描仪和打印机,家里有个凑合用我觉得ok。

缺点

这打印机不能双面打印,并且网络打印非常的慢,不过好在打印从来都不是什么urgent的活,take it easy。

Reference