AirPrint – 手机也能驱动USB打印机

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