初探Android系统打印功能
在Android平台上对激光打印机和喷墨式打印机进行了连接共享和打印效果测试。并对比Windows平台上的打印测试,分析其中的打印协议,现记录总结如下。
一、网络共享打印机
用户请求打印操作,会产生一个打印任务。系统把这个打印job放在打印队列中,有打印服务器从打印队列中一个个取走。因为打印机是独占设备,每个进程只能一次次的访问打印节点。
打印服务把打印队列中的打job转化成打印机认识的格式,主流是Postscript格式,转化这个工作是由打印机驱动程序来完成的。即打印服务会调用具体的打印机驱动程序。
如何把普通打印机变成网络打印机
- 需要两个硬件设备:一个是打印机,一个是作为打印机服务器的主机。若打印机本身带有网络功能,可不用主机,打印机本身就是另一形式的主机。
- 需要两层软件设备:一个是打印机驱动(底层用来驱动打印机工作的),一个就是打印机服务器,用来协调用户对打印机的需求,并最终调用打印机驱动进行打印工作。
网络共享测试
惠普激光式打印机(HP LaserJet Pro P1606dn):使用NP330网络打印服务器,打印机usb线连接NP330,NP330网线连接路由器。
结果:使用第三方趣打印apk,打印普通pdf正常,打印点阵pdf很慢且效果差,达不到识别标准。
联想激光式打印机(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端打印机连接
如何测试连接:
- 关于ip连接和端口使用情况,可使用ping命令和nmap工具扫描端口。
- Android通过NSD网络发现服务搜索并匹配附近可进行通信的设备。
- ping网络助手:https://www.cr173.com/soft/1334119.html
连接测试实验:
小米喷墨式打印机(Mi All-in-one Inkjek Printer):平板系统打印服务能发现并能连接上IPP,默认使用IPP协议的631端口。
联想激光式打印机(Lenovo LJ2206W):使用平板默认打印机服务不能显示该打印机,通过log看出平板系统打印服务能发现但IPP请求失败。查看电脑主机连接的打印机属性默认设置的是LPD协议515端口,可设定成RAW协议的9100端口。
四、打印协议分析
分别对Android 10和Windows 10平台连接的小米喷墨打印机打印属性进行设置,对比并分析两个平台的打印协议(主要关注传输层和应用层的协议)。
- Android端tcpdump工具:
https://blog.csdn.net/w695050167/article/details/100083069?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-100083069-blog-126607097.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=3 - Windows端Wireshark工具:https://www.bilibili.com/read/cv15076127?from_wecom=1
协议抓包过程:
- Android端:
- 使用米家喷墨打印助手APP,设置该APP打印参数,例如黑白、A4、普通纸、1份、1页、中等质量。
- 抓包过程:Android端使用命令抓取特定IP的网络数据包并保存pcap文件:tcpdump -v host 10.10.0.110 -w /sdcard/capture_mi.pcap
- 使用Wireshark工具分析pcap文件。
- 设置过滤器、筛选列表,以一行报文IPP Request (Create-Job)为例 ,跟踪其数据流。
- Windows端:
- 在Windows 10 web浏览器上设置打印参数:彩色、A4、合适区域大小、1份,双面、600dpi
- 点击开始打印时,使用Wireshark工具开始捕获,打印完毕时,停止捕获。
- 刷选列表,http、ipp、printer等关键字,跟踪其数据流。
- 可保存为pcapng格式文件便于后续分析。
初探Android系统打印功能相关推荐
- Unity3d 集成 Android 系统打印功能
研究了一段时间Android 系统打印功能,看到早在Android 4.0 也就是API Level>=19版本中就不需要再额外的安装打印驱动了,通过各种网站发现都是用同一种方法包括Androi ...
- android系统打印功能实现,Android实现系统打印功能
本文实例为大家分享了Android实现系统打印的具体代码,供大家参考,具体内容如下 一.打印图片 使用PrintHelper类,如: private void doPhotoPrint() { Pri ...
- android 打印机服务,Android系统打印服务插件printservice开发
一 简介 从Android4.4开始,系统加入了打印相关的API,可以通过系统打印服务实现打印.对于需要使用打印功能的APP可参考官方教程接入打印服务. 这不是本文的内容,本文介绍打印机厂商如何使自己 ...
- Android通过系统打印功能实现PDF预览打印
一. 简介 Android4.4(KitKat,api-19)系统内置了打印框架,通过安装对应打印机的打印插件,就可以容易实现打印功能: 关于 图片.webview.layout及截屏相关的打 ...
- 百富POS机A920安卓系统打印功能的实现
由于打印demo中只有一些参数设置和基础打印,也无法实现排版功能,后采用 com.pax.gl.imgprocessing中的接口 IImgProcessing.IPage 生成bitmap实现打印, ...
- android系统应用功能,Android系统应用(12)
如何成为系统应用 方法一:在Manifest中声明android:sharedUserId的值为:android.uid.system,android.uid.phone,android.uid.lo ...
- android 实现打印功能,Android通过OTG线连接打印机实现打印功能
一.创建demo调用PrinterShare服务,虽然能找到相应的类和方法但调用后没有反应 //打印图片,进入PrinterShare打印图片预览界面 public static void print ...
- android系统定制功能:定时重启
不积跬步无以至千里 首先接到这个功能(定时重启)的时候有点茫然,为什么要做这个功能啊?不是已经有一个定时开关机了吗?把定时关机和定时开机设置有个小间隔不就是定时开关机了吗?哈哈,当然有的可能没 ...
- 华为设置android系统提醒功能,华为手机短信不提醒怎么办?华为手机短信提醒设置方法...
华为手机短信提醒设置方法 1)检查当前设置的默认短信应用是哪个应用. ①点击桌面"设置"图标②找到"应用程序管理" ③选择"默认应用设置"④ ...
最新文章
- sqlplus连接时出现错误:shared memory realm does not exist 解决
- [转]Android UI 自动化测试
- CSS基础必备盒模型及清除浮动
- 2017广东工业大学程序设计竞赛决赛 题解源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)...
- jmeter 入门操作
- FreeRTOS源码分析与应用开发09:低功耗Tickless模式
- 微信联合苹果探索iOS系统的暗黑模式;iPhone SE 2于3月31日发布;Kotlin 1.3.70发布 | 极客头条...
- 关于win7系统中所有exe文件都被以word方式打开的解决方法
- python redis 订阅发布_【Python之旅】第七篇(三):使用Redis订阅服务
- 【渝粤题库】陕西师范大学300009 考古学概论
- 计算机辅助 齿轮怎么做,ug怎么画齿轮_UG齿轮画法 UG绘制圆柱型齿轮的方法
- 好看的android动画效果
- turtle库的一些基本函数
- 创建一个动态空间存储未知大小的二维数组
- 3dMax 灯光(街道的白天与夜晚)
- 怎样给计算机设置屏幕锁,怎么给电脑设置锁屏密码
- 无障碍设计_我通过无障碍设计中学到的5课
- solidworks导出obj模型和mtl材质
- 双一流大学计算机专业月薪拿2000?网友:我裂开
- sklearn的分层抽样
热门文章
- 《出版专业基础》2015年版(初级)思考与练习 第五章
- 中国软件开发者(研究生)的人生规划(转自天涯虚拟社区)
- ctf入门第一篇——如来十三掌
- 【2D游戏制作笔记】给游戏战斗增加一点打击感
- 电子政务软件系统公众服务的研究
- 天干地支算年份的C语言算法,天干地支对照表及算法
- 易观分析:2022年Q2中国网络零售B2C市场交易规模达23444.7亿元
- Coles客澳市携高品质明星食品第三年亮相中国国际进口博览会
- 默克高性能材料业务正式更名为“电子科技(Electronics)”
- 机器学习/深度学习入门资料汇总