老式打印机的现代化改造纪实

前言

很久不见,甚是想念,也是许久未更新文章了,大部分时间去拓展其他的兴趣爱好了,那就来说说这一次我们所研究的打印机的一个情况吧。

夏普AR-A208,非常老的一台机子了,自打有印象起估计也有十多二十年了,一直是吃着灰的状态,也是因为最近U盘坏了要吃保修,需要打印一些发票(居然不给纸质发票!),所以就开始琢磨上了打印机,不折腾还不要紧,一上来就火大了,找资料,找驱动,这些都还好,说了这么多,其实目的就一个—实现无线打印

开始

最开始的思路是不走常规流派,也就是大家常说的直接对接Windows电脑,在此处这是比较简单的一个方法,因为官网给出的驱动是直接可以在Windows安装的,甚至还保持更新到了Win10系统的支持。(但是!!!没有Linux的驱动,在此有了些许不安)

官网驱动

经过实测,Win11是可以正常安装的,且没有BUG。

驱动安装

所以姑且先安装上保持可以使用的状态,那么下面为你介绍我手头所拥有的设备,以方便我进行划分过程,

  1. 小米R3G(已刷入Openwrt,设备自带一个USB3.0的口,其他信息可以自行寻找)

  2. 玩客云初代老母鸡(已刷入Armbian)

  3. Win 7系统主机(作为保底方案)

  4. 一颗心灵手巧,不恼不怒的大脑🧠

当然,给大家省个流,方便大家直接跳转到成功的部分即可。

关于小米R3G与玩客云的部分:

死胡同一:p910nd 端口透传。 p910nd 只是单向传输数据。而 GDI 打印机需要高频的双向握手(查纸、查墨、查状态)。路由器底层芯片(如 MT7621)在处理复杂的 USB 双向中断时存在 Bug,直接导致硬件级死机(error -71)。

死胡同二:CUPS 打印服务。 受限于小米R3G羸弱的性能,在处理文件传输方面,5张测试页能出一张就是胜利,所以虽然我懒得实践了,我可以保证玩客云是可以实现的,但小米R3G是聊胜于无的打印机服务器。

所以,这个方案的最终一定是Windows电脑能达成目的(啊,那有人说了:博主博主,你就告诉我这个结论我还看你这篇文章干什么),有道理,可以退出文章了

小米R3G

没错,这玩意居然有USB口,非常令人震惊(对比同时期,二手价里最便宜的3.0路由器),甚至还是个3.0的接口,这玩意买十个都不心疼

小米R3G背面

到手后老步骤刷入Openwrt,由于几年没碰过这台路由器了,也不清楚咋又拉取不上软件源了,重新配置一下OKPG软件源

1
2
3
4
5
6
src/gz openwrt_base https://mirror.nju.edu.cn/immortalwrt/releases/23.05.3/packages/mipsel_24kc/base
src/gz openwrt_packages https://mirror.nju.edu.cn/immortalwrt/releases/23.05.3/packages/mipsel_24kc/packages
src/gz openwrt_luci https://mirror.nju.edu.cn/immortalwrt/releases/23.05.3/packages/mipsel_24kc/luci
src/gz openwrt_routing https://mirror.nju.edu.cn/immortalwrt/releases/23.05.3/packages/mipsel_24kc/routing
src/gz openwrt_telephony https://mirror.nju.edu.cn/immortalwrt/releases/23.05.3/packages/mipsel_24kc/telephony
src/gz openwrt_core https://mirror.nju.edu.cn/immortalwrt/releases/23.05.3/targets/ramips/mt7621/packages

由于比较懒得拉网线,打印机在厅里单独隔离了一个小空间,离主路由器也远,所以选择了无线中继的方式组网,这里有个细节,需要以5GHz频段以上的WIFI进行中继,因为早期接随身WIFI总是掉网速的缘故,才得知USB3.0的接口会严重扰乱2.5GHz频段的WIFI,这个结论可以在随身WIFI外接路由的线材外包锡纸相关内容可以得知,也拆开后才发现屏蔽手段也比较一般,可能受限于早期工艺。

子路由的对付手法

像我比较怕麻烦,决定将它们先归为一个网段,全部合并到主路由下,不需要网段隔离,所以先安装luci-proto-relayd—中继桥插件,同时我的操作在上游路由器Mac地址和192.168.10.26地址绑定,以免跑后台找不到地址

第一种思路

先进行老套路,比较出名的几个打印机插件—p910nd(本质是端口转发)和**CUPS**(功能完整,支持 AirPrint,但较臃肿)

考虑到路由器R3G的性能太捞了,只能先从p910nd入手,打开SSH终端工具,输入以下命令

  1. 打印机内核和USB支持
1
opkg install kmod-usb-core kmod-usb-printer kmod-usb2 kmod-usb3 kmod-usb-ohci kmod-usb-uhci
  1. p910nd和图形化管理界面
1
opkg install p910nd luci-app-p910nd luci-i18n-p910nd-zh-cn

重启路由器和打印机,将打印机的连接线(USB2.0公口B型转A型)插入到路由器的USB口

幸运的你过了第一关,

  1. 使用以下指令识别打印机是否读取到
1
dmesg | grep printer

如果顺利,你会看到类似 usblp0: USB Bidirectional printer dev... 的回显。

  1. 检查设备节点是否生成:
1
ls /dev/usb/

正常能看到一个名为 lp0 的设备。如果没有看到,尝试重启路由器或重新插拔打印机。

如果以上均没有读取不到打印机的问题,那么就恭喜你顺利通过第一关,你可以进入Openwrt的后台去设置防火墙的放行了(实际上我在上一步卡了很久,经常掉驱动,再重新强制挂回去,原因见后)

  1. 防火墙放行

网络防火墙通信规则添加

如图所示配置

然后,你以为就会有然后了嘛,nonono,接下来就是无穷无尽的掉驱动(忘记截图报错了),但是最后不耐烦我直接去查看日志了(各位以后报错请保持先查日志的习惯)

1
dmesg | tail -n 30

先查阅最近三十条报错,大致我的报错如下:

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
[  902.858065] usb 1-1: device not accepting address 14, error -71

[ 902.864283] usb usb1-port1: unable to enumerate USB device

[ 924.288374] usb 1-1: new full-speed USB device number 15 using xhci-mtk

[ 929.628980] usblp 1-1:1.1: usblp0: USB Bidirectional printer dev 15 if 1 alt 0 proto 2 vid 0x04DD pid 0x9201

[ 1677.917079] usb 1-1: USB disconnect, device number 15

[ 1677.922951] usblp0: removed

[ 1678.797485] usb 1-1: new full-speed USB device number 16 using xhci-mtk

[ 1678.947626] xhci-mtk 1e1c0000.xhci: ERROR: unexpected setup address command completion code 0x11.

[ 1679.167508] xhci-mtk 1e1c0000.xhci: ERROR: unexpected setup address command completion code 0x11.

[ 1679.387476] usb 1-1: device not accepting address 16, error -22

[ 1679.757423] usb 1-1: new full-speed USB device number 17 using xhci-mtk

[ 1680.916505] usblp 1-1:1.1: usblp0: USB Bidirectional printer dev 17 if 1 alt 0 proto 2 vid 0x04DD pid 0x9201

[ 1680.927548] usb 1-1: USB disconnect, device number 17

[ 1680.933633] usblp0: removed

[ 1685.047043] usb 1-1: new full-speed USB device number 18 using xhci-mtk

[ 1956.756153] usb 1-1: new full-speed USB device number 21 using xhci-mtk

[ 1962.106797] usblp 1-1:1.1: usblp0: USB Bidirectional printer dev 21 if 1 alt 0 proto 2 vid 0x04DD pid 0x9201

[ 2079.556141] usb 1-1: USB disconnect, device number 21

[ 2079.561987] usblp0: removed

[ 2114.369181] usb 1-1: new full-speed USB device number 29 using xhci-mtk

[ 2308.770511] usb usb1-port1: Cannot enable. Maybe the USB cable is bad?

[ 2310.040525] usb usb1-port1: Cannot enable. Maybe the USB cable is bad?

[ 2310.047358] usb usb1-port1: attempt power cycle

[ 2311.850542] usb usb1-port1: Cannot enable. Maybe the USB cable is bad?

[ 2553.921319] usb usb1-port1: Cannot enable. Maybe the USB cable is bad?

[ 2555.191354] usb usb1-port1: Cannot enable. Maybe the USB cable is bad?

[ 2555.198186] usb usb1-port1: attempt power cycle

[ 2557.001313] usb usb1-port1: Cannot enable. Maybe the USB cable is bad?

[ 2558.261697] usb usb1-port1: Cannot enable. Maybe the USB cable is bad?

[ 2558.268609] usb usb1-port1: unable to enumerate USB device

虽然我对代码的解读并不是很懂,但是洋文还是能看懂的,其中有几项我估计是和打印机的不识别有关系的

1
2
3
4
5
6
7
[ 2079.561987] usblp0: removed

[ 2114.369181] usb 1-1: new full-speed USB device number 29 using xhci-mtk

[ 1679.167508] xhci-mtk 1e1c0000.xhci: ERROR: unexpected setup address command completion code 0x11.

[ 1679.387476] usb 1-1: device not accepting address 16, error -22

关于**new full-speed USB device ... using xhci-mtkerror -22**所附带的报错,大体上可以解释为打印机带的线协议太老了—USB1.1,同时,0x11的报错是兼容性问题。

usb 1-1: device not accepting address 14, error -71error -22,关于-71的报错我见过一次可能是指线材被干扰了,不过Gemini给出的解释更偏向于指不识别芯片

总而言之呢,我做过一次挣扎,换了一个低协议(USB2.0)的拓展坞接入,仍然如此,至此我也不明白是线材的问题还是压根是硬件的兼容问题?

第二种思路

事实上,在没确定是硬件问题时,还试过一个比较野的方案,我先认定是软件的问题,那假如说我换成虚拟USB模拟共享呢,会不会有奇效?

Linux下安装VirtualHere

1
2
3
4
5
6
7
cd /tmp
# 下载服务端程序
wget https://www.virtualhere.com/sites/default/files/usbserver/vhusbdmipsel
# 赋予执行权限
chmod +x ./vhusbdmipsel
# 后台运行它
./vhusbdmipsel -b

Windows下安装

安装包非常简洁,只有一个可执行文件

客户端的可执行文件

因为忘记截图运行时的样子了,但是大致可以描述出会发生啥,

  1. 软件会自动在局域网内扫描(如果没扫到,右键 USB Hubs -> Specify Hubs,输入你路由器的 IP 192.168.10.26:7575)。

  2. 扫描到之后,你会看到列表里出现了 SHARP AR-A208

  3. 右键点击这个打印机,选择“使用此设备” (Use this device)。

电脑随后会响一声设备自动接入提示声,效果上就是约等于将打印机接到另一台电脑上

当然,因为硬件的问题,这里仍然是不成立的,打印机的症状与p910nd接入的打印机症状相同—无任何反应

第三种思路

与路由器相爱相杀的最终方案—CUPS

到这一步,其实我已经有点心憔悴了,所以在安装的时候上没有敲终端,

CUPS

  1. 启动服务

    1
    2
    /etc/init.d/cupsd start
    /etc/init.d/cupsd enable
  2. 编辑/etc/cups/cupsd.conf,请务必修改到同一个局域网网段,比方我这里是192.168.10.x

根据划线处修改配置

  1. 赋权
1
chmod 700 /usr/lib/cups/backend/usb
  1. 重启**CUPS**服务
1
/etc/init.d/cupsd restart
  1. 进入Web页面

浏览器输入http://192.168.10.26:631(修改为你的路由IP+端口631),点击 Administration 选项卡.输入Openwrt的用户名与密码

如果你能顺利的登录成功,将会无比的顺畅,点击**Add Printer**,跟着以下图片继续

1

2

3

4

添加完后会来到以下页面:

最终效果

没错,没有想到,没有驱动的我们居然能走到这一步,剩下的事情就是非常简单了

  1. 在Windows电脑下添加网络打印机

回到这个页面下,我们需要复制一下这里的网址,浏览器地址

请务必记得带上打印机型号,回到Windows系统,按照名称添加共享打印机

共享打印机

无情的点击打印测试页吧!

当然就和我开头所说的结论一样,5张里能有一张打印出来就是成功,大部分情况是打印机有反应,但是被后端处理的性能卡住了,所以我断言玩客云的方案是可行的

为了讨个结果补图

在自我实践的同时,有三篇优秀的图文可以供大家解决,这些资料可以解决大家大部分的问题

受限于篇幅,更具体的优秀文我就不细细罗列出来了

玩客云

玩客云的方案也是很浅显的了,对于晶晨芯片的性能是怎么说也能拿下打印的处理,所以受限于篇幅,我绝对不写关于这方面的了,你可以参考以下这一篇内容

当然机子我是有的,haha,有点懒,迟早有一天会亲自实验的

Windows电脑作为打印服务器

Windows添加网络打印机的方式就不需要我多说了,主要在Windows上需要解决的是关于手机如何读取到打印机的问题

试过许多的方案,大部分并没有免费的服务,比如**Printshare,OPrint,AirPrint**

以上的方案都替你们试过了,我只能说在我的使用用途里(家用),能远离它们就远离它们。或许过几年后我再反思给他们付钱可能还来得及,下面隆重介绍—PaperCut Mobility Print,我已打包成压缩包,可以自取,不过并非所有时候都可以访问,等后续再补常规的网盘。

依次安装

从左至右依次安装,并注册好此应用的本地账户,随后标记需要共享出去的打印机,从此刻开始,只要你在局域网内,不论你是iPhone还是Android均可以使用原生的打印发送打印请求到打印机,并且PaperCut Mobility Print个人使用是免费的,何乐而不为。

在客机这边还可以使用一个Github小工具来实现打印,不过我不知道为什么我这边不能使用扫描,搞得有点像摆设

总结

大体上,这一篇不足以作为一幅合格的教程文,另一方面并没有很仔细的写完所有的内容,这一篇以图充文的水分很高(有三层楼那么高),那么,下一次更新是什么时候呢,又想修博客的BUG又想重构好多东西,又想写点文章,当然我这水文就算了,总体上是既要又要,不知道是懒还是没空,今年反而没那么多时间更新内容了和修复博客的一些东西了。

那么,祝君好运与快乐健康吧!!!

下一次见,see you soon~