USB打印机变身无线打印机可以通过openwrt的打印机模块实现。这种实现在PC上没有任何问题,但是手机就不好使了,因为手机不像PC机可以安装打印机驱动程序。AirPrint是个协议,实现的就是在没有驱动的环境下打印。支持AirPrint的打印机无非就是把驱动和AirPrint集成到了打印机里面,然后卖个好价钱。至于什么才是AirPrint,不是本文的重点,自己baidu。
USB无线打印过程:
PC –> printer driver –> network –> openwrt printer device –> USB printer
AirPrint的打印过程:
Phone/PC –> network –> openwrt CUPS –> openwrt printer device –> USB printer
在路由器的openwrt上,需要安装CUPS和Avahi。
CUPS – Unix的通用打印服务
Avahi – AirPrint相关的开源实现
CUPS在openwrt的官方版本已经去掉了。 官方的说法是,CUPS占用太多的资源进行打印的pooling,与openwrt主要用在资源有限的路由器上是冲突的。我用的软路由本身就是一个PC机,不存在资源不足的问题,而且github上还是能找到可以编译的CUPS的源码配置。我开始尝试用openwrt的SDK去编译CUPS的ipk,改了一个小的编译错误后,ipk可以正常安装到openwrt上,而且运行正常。Avahi的本身就有,直接安装。最大的问题来了, 我的打印机没有openwrt的驱动,多次尝试后发现,适配打印机的驱动门槛比较高,搞不定。
https://github.com/fengchen-github/openwrt-cups.git
第二个方法是利用docker,有高人已经把这两个服务和绝大部分的打印机驱动集成到一个ubuntu的docker里面。只要把docker开启,就可以直接用了,基本无难度。我就是用这个方法搞定了AirPrint。
https://hub.docker.com/r/tigerj/cups-airprint
可能遇到的坑:
1. 驱动不在docker image中。 去打印机官网下载deb格式的驱动程序,手动安装到docker 的container中。
2. USB打印机下电后,docker可能会出错,设备丢失。 我的解决方法是usb 插入/拔出时分别启动/停止 docker的container,代码如下。(根据实际情况修改!)
/etc/hotplug.d/usb/10-usb_printer #!/bin/sh # Copyright (C) 2005-2014 NowRush Studio # Author: hackpascal <hackpascal@gmail.com> if [ x"$INTERFACE" = x"7/1/1" ] || [ x"$INTERFACE" = x"7/1/2" ]; then /usr/bin/usb_printer_hotplug "$PRODUCT" "$ACTION" fi #Add by lxs for restart cups if [ -n "$DEVNAME" ] && [ x"$PRODUCT" = x"4a9/2795/0" ] ; then if [ x"$ACTION" = x"bind" ]; then echo "start docker cups..." > /dev/kmsg docker start cups fi if [ x"$ACTION" = x"unbind" ]; then echo "stop docker cups..." > /dev/kmsg docker stop cups fi fi