初探Android系统打印功能

在Android平台上对激光打印机和喷墨式打印机进行了连接共享和打印效果测试。并对比Windows平台上的打印测试,分析其中的打印协议,现记录总结如下。

一、网络共享打印机

用户请求打印操作,会产生一个打印任务。系统把这个打印job放在打印队列中,有打印服务器从打印队列中一个个取走。因为打印机是独占设备,每个进程只能一次次的访问打印节点。
打印服务把打印队列中的打job转化成打印机认识的格式,主流是Postscript格式,转化这个工作是由打印机驱动程序来完成的。即打印服务会调用具体的打印机驱动程序。

  • 如何把普通打印机变成网络打印机
  1. 需要两个硬件设备:一个是打印机,一个是作为打印机服务器的主机。若打印机本身带有网络功能,可不用主机,打印机本身就是另一形式的主机。
  2. 需要两层软件设备:一个是打印机驱动(底层用来驱动打印机工作的),一个就是打印机服务器,用来协调用户对打印机的需求,并最终调用打印机驱动进行打印工作。
  • 网络共享测试
  1. 惠普激光式打印机(HP LaserJet Pro P1606dn):使用NP330网络打印服务器,打印机usb线连接NP330,NP330网线连接路由器。

    结果:使用第三方趣打印apk,打印普通pdf正常,打印点阵pdf很慢且效果差,达不到识别标准。

  2. 联想激光式打印机(Lenovo LJ2206W): 使用CentOS系统搭建的CUPS网络打印服务器,打印机usb线连接虚拟机CentOS,虚拟机网络设置成桥接模式。开放防火墙端口631,搭建完毕后局域网内平板可访问http://192.168.3.52:631/printers/

    结果:使用第三方打印apk连接时未找到该设备,主机无法打印,缺少该设备对应的linux驱动。

二、Android系统打印功能

Android默认实现了基于CUPS打印的框架,CUPS可以提供打印协议来让用户使用打印机,提供Web界面让用户设置和管理打印机。

开发者可使用PrintManager+PrintDocumentAdapter 接入系统打印API方式实现打印功能,使用指南请参考:https://developer.android.google.cn/training/printing/custom-docs

  • 打印处理服务PrintSpooler

系统打印通过一个系统apk[包名com.android.printspoole]实现的,源码位置:frameworks/base/packages/PrintSpooler
该apk接收来自用户app的打印请求。用户app的打印请求先被PrintManger通过PrintJob方式封装,然后通过Intent唤起PrintSpooler的PrintActivity进行预览。如果打印机设备厂商实现了Print Plugin并提供apk安装到系统,那么PrintSpooler就可以找到对应打印机驱动进行打印。

  • 默认打印服务BuiltInPrintService

AOSP系统默认集成的打印插件服务,源码位于packages/services/BuiltInPrintService。BuiltInPrintService启动后会去查找MDNS、P2P类型的打印机,如果发现了具体打印机则将该打印机的信息提交给系统,打印处理服务PrintSpooler将会显示该打印机。BuiltInPrintService还包括pdf渲染、处理ipp协议请求等基于CUPS实现的打印服务。其中默认ipp协议端口631,打印分辨率dpi默认300。

三、Android端打印机连接

  • 如何测试连接:
  1. 关于ip连接和端口使用情况,可使用ping命令和nmap工具扫描端口。
  2. Android通过NSD网络发现服务搜索并匹配附近可进行通信的设备。
  3. ping网络助手:https://www.cr173.com/soft/1334119.html
  • 连接测试实验:
  1. 小米喷墨式打印机(Mi All-in-one Inkjek Printer):平板系统打印服务能发现并能连接上IPP,默认使用IPP协议的631端口。

  2. 联想激光式打印机(Lenovo LJ2206W):使用平板默认打印机服务不能显示该打印机,通过log看出平板系统打印服务能发现但IPP请求失败。查看电脑主机连接的打印机属性默认设置的是LPD协议515端口,可设定成RAW协议的9100端口。

四、打印协议分析

分别对Android 10和Windows 10平台连接的小米喷墨打印机打印属性进行设置,对比并分析两个平台的打印协议(主要关注传输层和应用层的协议)。

协议抓包过程:
  • Android端:
  1. 使用米家喷墨打印助手APP,设置该APP打印参数,例如黑白、A4、普通纸、1份、1页、中等质量。
  2. 抓包过程:Android端使用命令抓取特定IP的网络数据包并保存pcap文件:tcpdump -v host 10.10.0.110 -w /sdcard/capture_mi.pcap
  3. 使用Wireshark工具分析pcap文件。
  4. 设置过滤器、筛选列表,以一行报文IPP Request (Create-Job)为例 ,跟踪其数据流。
  • Windows端:
  1. 在Windows 10 web浏览器上设置打印参数:彩色、A4、合适区域大小、1份,双面、600dpi
  2. 点击开始打印时,使用Wireshark工具开始捕获,打印完毕时,停止捕获。
  3. 刷选列表,http、ipp、printer等关键字,跟踪其数据流。
  4. 可保存为pcapng格式文件便于后续分析。

猜你喜欢

转载自blog.csdn.net/qq_23069607/article/details/127492226