前几天看到沃尔玛有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 | sudo apt update |
然后你需要把当前用户(raspbian默认是pi)添加到linux打印机的管理员用户组lpadmin
1 | sudo usermod -a -G lpadmin pi |
接着需要确保cups允许所有的流量请求,然后重启cups
1 | sudo cupsctl --remote-any |
现在访问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 | sudo apt update |
使用如下命令修改配置文件
1 | sudo nano /etc/samba/smb.conf |
在配置文件中修改/添加如下内容
1 | # CUPS printing. |
重启samba服务并设置开机启动
1 | sudo systemctl start smbd |
在windows中添加打印机
以win10为例。先打开资源管理器,在地址栏中输入树莓派samba服务器的地址\\192.168.114.54
,如果一切顺利的话,你会看到你的打印机的图标和你打印机的名字(即你刚刚在CUPS中设置的名字),这里以MG2522
为例。你可以尝试双击打印机图标 - (提示找不到驱动程序)确定 - 选择驱动程序 - 完成来添加打印机。如果不行,请尝试下面的方法:
打开所有设置 - 设备 - 打印机和扫描仪 - 添加打印机或扫描仪 - (等两秒)我需要的打印机不在列表中 - 按名称选择共享打印机。
在下面的文本框中输入打印机的地址\\192.168.114.54\MG2522
,点击下一步 - (找不到驱动程序)确定 - 选择驱动程序 - (已成功添加192.168.114.54上的MG2522)下一步 - 完成或者打印测试页。
这样,你的打印机就成功添加到win系统中了,你可以在任何应用中点击打印,并且使用这个打印机了。
网络扫描仪
SANE安装
第一步当然也是安装SANE啦
1 | sudo apt update |
测试扫描仪
然后检查SANE能不能找到你的打印机
1 | sudo sane-find-scanner |
我的输出如下所示,可以看到已经识别出了扫描仪found USB scanner (vendor=0x04a9 [Canon], product=0x176d [MG2500 series]) at libusb:001:008
1 | # sane-find-scanner will now attempt to detect your scanner. If the |
然后使用如下命令进一步尝试
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:008
,libusb:001:008
即/dev/bus/usb/001/008
,使用如下命令查看权限
1 | ls -l /dev/bus/usb/001 |
会获得如下输出
1 | pi@rpi-printer:~ $ ls -l /dev/bus/usb/001 |
可以看到打印机归lp group的root所有,所以我们要把运行SANE守护进程的用户saned加到lp group
1 | sudo add user saned lp |
重启sane,将sane添加到启动项并检查它的status
1 | sudo systemctl start saned.socket |
你会看到如下输出,可以看到6566端口是给SANE用的
1 | ● saned.socket - 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 | sudo apt install ink |
会得到类似的如下输出:
1 | pi@printer:~ $ sudo ink -p usb |
我的墨水量显示为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。