为旧打印机添加无线打印和扫描支持

前言

虽然现在市面上的无线打印机种类繁多,但我认为存在以下几个痛点:

  • 打印机并非快消品,一般用坏了才会考虑买一台新的,三四年前或更久之前购买的打印机很多不具备无线打印功能,为了无线打印功能专门购买一台新的也不划算。
  • 大部分标榜具有无线功能的打印机只能通过厂商专有的软件实现无线有关的功能,有些甚至用的是微信小程序喜欢我打印前先看5秒广告吗。借助这些软件打印时设计的隐私问题让我有所顾虑,同时,每台设备都要下载软件并进行配置,十分麻烦。
    尤其是第二点,几乎所有的手机和电脑操作系统都自带无线打印协议(IPP)的支持,但很多厂商却仍然采用自己研发的私有协议,甚是奇怪。

为了解决这些痛点,我们可以在投入较少资金(100元以下)的前提下,让旧打印机也能实现无线打印,同时调用系统自带功能进行无线打印,无需安装第三方软件。
与先前的文章一样,本文主要在Linux系统上操作,需要具备一定的Linux基础。

准备工作

首先你需要一台打印机

整体的思路如下:我们需要一台24小时开机的设备,将打印机连接到这台设备上,在这台设备上安装打印机驱动,并通过这台设备将打印机共享至局域网内,只要连接到与设备相同的局域网即可使用无线打印和扫描功能。

购买硬件

如果你已经是NAS或Homelab玩家那直接利用现有的服务器即可。但对于手头没有硬件设备的人来说,有没有一种设备,它功耗低,噪音小,价格便宜,同时还不占地方呢?
在经过简单的对比后,我最终选择了目前热度依然不低的斐讯N1盒子。它拥有上述说到的所有优点。同时,它还有一个有线网口以及支持5GHz WiFi的无线网卡。闲鱼搜索发现价格低至70(这个卖家还送电源线和网线),果断拿下。

由于社区的热情,N1盒子从一个原本只能用来挖矿的设备变成了可以刷openWRT,istoreOS,OpenMediaVault,Armbian,Android TV等多种系统,可玩性超强的设备。本人接触N1盒子也才一个月左右,更多玩法有待我慢慢挖掘。

购买的时候不必追求全新未拆封或是带不带遥控器(通电自动开机),在功能一切正常的情况下,买便宜的即可。

系统安装

系统方面,我选择的是轻量化的Linux发行版armbian。由于N1盒子是arm架构的设备,因此不能像x86设备那样使用通用镜像进行安装。这里我们使用ophub大佬适配的镜像进行安装,以下是仓库地址:https://github.com/ophub/amlogic-s9xxx-armbian
如果你的设备到手就是Armbian,你可以跳过这节直接进入软件安装部分,我的设备到手是istoreOS,所以需要刷成Armbian,以下是较为简略的操作步骤:
README中包含了设备与镜像名称的对应表格,查表可知设备CPU具体型号是s905d,应该使用amlogic_s905d.img结尾的镜像

接下来就可以去release中选择镜像了。不过需要注意一点的是:Armbian系统对于N1盒子的无线网卡的支持似乎欠佳,根据我自己的使用体验以及issue区的搜索结果,部分版本可能会出现无线网卡无法扫描和连接WiFi的问题。根据这条issue,我最终选择了2024年9月发布的,基于Ubuntu 24.04,内核版本号为6.6.50的系统镜像,文件名为Armbian_24.11.0_amlogic_s905d_noble_6.6.50_server_2024.09.10.img,使用下来也确实没发现什么问题。如果你对无线功能有需求,可以下载这个镜像。

根据上面提到的issue区的评论,10月份发布的版本又有无线方面的问题,所以安装完系统后记得不要升级内核。(其实我就是从10月份版本降级下来的)

下载好镜像后,使用rufusetcher等工具将镜像文件刷入U盘,不多赘述。

接下来,将刷写好镜像的U盘插入HDMI接口左侧第一个USB接口,插电,机器会自动从U盘中加载系统。
等待一段时间后,在路由器后台查看机器分配到的IP地址,使用ssh root@ip连接到机器,默认密码是1234,登录后会自动进入系统初始化流程,自行设置用户名和密码等设置项即可。
完成后即可连接到shell

但此时系统还在U盘中,我们需要输入以下指令安装系统:

1
armbian-install

机器型号选择101,文件系统随意,接下来等待一段时间,系统会被安装到内置的EMMC闪存芯片中。

安装完成后,拔掉电源和U盘,再插回电源,机器就会进入新安装的系统。最后一步,我们需要连接到WiFi以便接下来进行无线共享,在终端输入:

1
armbian-config

选择network-WiFi,选择想要连接到的WiFi并激活即可。

如果network菜单里没有WiFi选项,则很有可能是无线网卡驱动存在问题,可以更换镜像试试。但需要注意一点:如果U盘中的系统与EMMC中的系统一样,机器不会从U盘启动。因此,如果你想降级到先前的版本,你需要先刷入另一个系统,再刷回低版本的系统(例如你想从10月的Ubuntu降级到9月的Ubuntu,你需要先刷入另一个发行版,再刷回9月的Ubuntu)

软件安装

驱动

与Windows上的打印机共享不同,CUPS使用IPP协议共享打印机,这意味着只有负责共享的设备需要安装打印机驱动,其他设备只要支持IPP打印协议即可直接打印,无需重复安装驱动。
所以接下来我们需要在armbian上安装驱动。这一步可能比较困难,虽然大部分打印机厂商都会提供Linux驱动,但绝大多数只会提供x86架构下的驱动。如果你的打印机厂商提供了arm架构的Linux驱动,那这段可以不用看了。我使用的打印机是爱普生的,Linux下的驱动只有.deb.rpm的x86架构安装包,既没有arm架构的安装包也没有源代码供用户编译。如果你遇到了相同的问题,可以参考以下两种解决思路:

  1. 从“国产操作系统”拿:随着国产化的逐步推进,许多硬件厂商也都推出了支持“国产操作系统”的驱动程序,除了x86架构以外,一般还会适配arm,mips甚至loongarch架构。通过搜索可知,爱普生对UOS操作系统进行了适配,其中就有arm架构的驱动程序。UOS本身基于Debian,Ubuntu也是Debian系的,因此直接安装这个驱动即可。

    虽然“国产操作系统”也是Linux发行版,但以我的打印机型号EPSON L3210为例,直接搜类似epson L3210 linux arm drivers是得不到任何结果的,只有在爱普生中国官网搜索打印机型号才能找到“国产操作系统”的驱动安装包。

    安装这类驱动并不容易,以爱普生的驱动为例,软件包中有一个依赖项deepin-elf-verify。这个依赖项只能在deepin/UOS的软件仓库中找到。让人气愤的是,这个依赖项没有任何实际作用,仅仅是为了确认安装这个软件包的平台是deepin/UOS。更详细的内容可以参见这篇博客。所以接下来我们要去除这个依赖项,方法来自于这里

    1
    2
    3
    4
    5
    6
    sudo mkdir epson  
    sudo dpkg-deb -R signed_epson-inkjet-printer-202101w_1_0_1_arm64.deb epson #解包
    sudo vim epson/DEBIAN/control
    # 去除 Depend: deepin-elf-verify (>= 0.0.16.7-1) 一行,保存退出
    sudo dpkg-deb -b epson/ epson.deb
    sudo dpkg -i epson.deb

    注意这里使用root用户进行解包和打包很重要,否则安装时驱动程序文件的权限会变成打包时的用户,CUPS调用时会报错:File \"/usr/lib/cups/filter/epson-inkjet-printer-202101w\" has insecure permissions (0100755/uid=1000/gid=1000).
    最后,还需要安装一个依赖项:

    1
    sudo apt install libjpeg62

    否则打印时会出现error while loading shared libraries: libjpeg.so.62: cannot open shared object file: No such file or directory的报错,WebUI会提示Filter Error

  2. 试着在软件源里找找:如果上面的方法没有解决问题的话,你还可以尝试在软件源里找找有没有适用于你所使用的打印机的驱动。以Ubuntu为例:

    1
    apt search "printer driver"

    应该会列出一堆打印机驱动,看看有没有与你的型号相符的,或者有没有与你打印机厂商相符的
    部分搜索结果
    还是以我的打印机型号EPSON L3210为例,可以安装搜索结果中的printer-driver-escpr软件包,里面包含了许多爱普生喷墨打印机的驱动,其他品牌的打印机同理。
    apt info输出的结果

CUPS

我们使用CUPS管理与共享打印机。首先安装CUPS:

1
sudo apt install cups avahi-daemon

接下来我们要调整CUPS的配置文件,否则无法进入管理页面,打开配置文件/etc/cups/cupsd.conf并作出以下修改:

  • Listen localhost:631改为Listen 0.0.0.0:631
  • 1
    2
    3
    4
    5
    6
    7
    8
    <Location />
    Order allow,deny
    </Location>
    <Location /admin>
    AuthType Default
    Require user @SYSTEM
    Order allow,deny
    </Location>
    改为
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <Location />
    Order allow,deny
    Allow all
    </Location>
    <Location /admin>
    AuthType Default
    Require user @SYSTEM
    Order allow,deny
    Allow all
    </Location>

在CUPS网页端管理打印机时,需要输入root的账号密码。如果你想让自己也可以管理打印机,或者你压根就没配置root账户的密码,你可以将自己添加到lpadmin组,这样在管理打印机时输入自己的账号密码即可:

1
sudo usermod -aG lpadmin $(whoami)

考虑到我们仅仅是在内网使用,这里权限放的比较开,如果你想更加精细地调整访问权限,可以看看RedHat手册

最后重启CUPS服务

1
sudo systemctl restart cups.service

局域网内浏览器打开http://IP:631即可
CUPS WebUI

考虑到CUPS在半个月前爆出的严重RCE漏洞,强烈建议不要将CUPS服务开放至公网。

添加打印机并设置共享

完成了上面两部之后,这一步就非常简单了,在CUPS的webUI一步一步操作就行了。
点击Administration,网页会自动跳转至HTTPS,忽略证书警告(因为是一张自签证书),输入root账户和密码(如果做了上文的配置,输入自己的账号密码也行)

点击Add Printer,选择你的打印机,点击Continue。下一页中的NameDescription可以随意修改,记得把Share This Printer勾选上

下一页需要选择打印机驱动,如果你的驱动安装正确应该会显示在Model中,直接选择正确的型号即可

如果你是按照上文所说的第二种思路安装的驱动,又没有找到完全符合型号的驱动,可以试试名称相近的驱动。以我的打印机为例,虽然型号是L3210,但根据我的实测,选择L3110的驱动也可以正常进行打印。

点击Add Printer,打印机就添加成功了。

接下来,你可以去Printers页面,点击刚刚添加的打印机,选择Print Test Page,如果配置正确,应该会打印出测试页。

至此,打印机添加完成,并且已经共享至局域网。对于Windows系统,打开系统设置-蓝牙与其他设备-打印机和扫描仪,点击“添加设备”按钮,应该立刻就能看到共享出来的打印机,添加即可。
显示类型是IPP打印机
Android系统,任意应用打开文档后,选择应用内自带的打印即可,会自动发现打印机

原生打印页面UI
HyperOS适配的UI

iOS/iPadOS同理(其实Airprint就是基于IPP的

配置无线扫描

比起打印,无线扫描的配置要简单得多。没有繁琐的驱动安装与配置流程,只需要安装SANE和通过AirScan/eSCL协议共享的服务端即可。听上去有点复杂?Github上已经有现成的项目整合了这两部分,仓库地址:https://github.com/SimulPiscator/AirSane
安装流程很简单,就是安装依赖+拉取源代码+编译,跟着README走就可以了,以下是安装流程的搬运,更详细的配置和troubleshooting请参见README。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 编译与安装
sudo apt-get install libsane-dev libjpeg-dev libpng-dev
sudo apt-get install libavahi-client-dev libusb-1.*-dev
sudo apt-get install git cmake g++
git clone https://github.com/SimulPiscator/AirSane.git
mkdir AirSane-build && cd AirSane-build
cmake ../AirSane
make && sudo make install
# 设置权限,最简单的办法是安装sane-utils包
sudo apt-get install sane-utils
# 测试能否列出扫描仪
sudo -u saned scanimage -L
# 启动服务并设置开机自启
sudo systemctl enable airsaned --now

有一点需要注意,armbian似乎将systemd的启动超时配置成了10秒(我还额外确认了Homelab上安装的Debian系统,是默认的90秒),对于N1盒子这种性能孱弱的机器,最后一步可能会因为超时而启动失败。
有两种解决方法,一是直接将默认的超时时间改回90秒,打开/etc/systemd/system.conf并将DefaultTimeoutStartSec=10s改为DefaultTimeoutStartSec=90s

二是修改airsanedsystemd文件,sudo systemctl edit airsaned.service --full打开配置文件,再在[Service]下加入一项TimeoutStartSec=900

无论是哪一种方法,最后都不要忘记:

1
2
sudo systemctl daemon-reload  
sudo systemctl restart airsaned.service

至此安装完成,现在你就可以用浏览器打开http://IP:8090,在网页端进行扫描了。Windows和macOS系统也可以在系统设置中添加扫描仪之后,通过系统自带的APP进行扫描。
Windows上的扫描应用,没有预装,需要自行去Microsoft Store里装一下

总结

现在,你应该能有一个很舒服的打印与扫描体验了。只花了70块钱就实现了无线打印和扫描功能,还得到了一个十分能折腾的N1盒子。

本文于10/11动工,两周之后的10/25终于完成了,真是具有松弛感的更新频率呢


为旧打印机添加无线打印和扫描支持
https://blog.kenxu.top/post/wireless-support-for-printers/
作者
Ken
发布于
2024年10月11日
许可协议