menu TimeBlog时光轴
首页  »  随意杂谈  »  探索一下Internet Printing Protocol(IPP)
探索一下Internet Printing Protocol(IPP)
2022-03-13   随意杂谈   1 条评论   138 次阅读
时光
author

前言

整了一台米家一体打印机,能扫描能彩印舒服的很,而且墨盒限制没有那么死,我自己加墨、网上卖的改装墨盒都能正常用(某宝还出现了连供加墨系统)
不用跑到老远的打印店去磨蹭,而且还能花时间满满调格式。目前就是给自己、朋友打印一些东西,偶尔接批量打印,但是量都不大。正巧刷到一个自助打印机的视频,突发奇想,能不能利用打印机的协议整一个自助打印机?

协议

探索

iShot2022-03-09 13.22.51.png
如果你添加过打印机,就应该知道系统允许你手动添加找不到的打印机,而这时候你只需要输入局域网地址就行。

不过也得分情况,像打印机本身不联网插在一台设备上用网络共享之类的功能共享出来,原理上就不是那么回事了

而在Mac上,除了支持傻瓜式的AirPrint之外,也支持IPP协议,中文名叫互联网打印协议
搜索了一番,又上Wireshark抓了一下:
iShot2022-03-09 13.26.04.png
HTTP套壳
这个协议基于http/1.1开发的,那既然这样是不是可以整一个Web服务器来返回相应的内容让设备识别,再在服务端侧做打印鉴权让用户付费呢!?

解析

既然抓到包那肯定是要想办法自己能制造出一个包来的,可惜的是网上大部分是关于客户端的例程,不过好在在IETF找到了IPP协议的规范,那就让我们开始解读吧。

0000   01 01 00 0b 00 00 00 00 01 47 00 12 61 74 74 72
0010   69 62 75 74 65 73 2d 63 68 61 72 73 65 74 00 05
0020   75 74 66 2d 38 48 00 1b 61 74 74 72 69 62 75 74
0030   65 73 2d 6e 61 74 75 72 61 6c 2d 6c 61 6e 67 75
0040   61 67 65 00 02 65 6e 45 00 0b 70 72 69 6e 74 65
0050   72 2d 75 72 69 00 19 69 70 70 3a 2f 2f 31 39 32
0060   2e 31 36 38 2e 33 31 2e 32 32 35 3a 36 33 31 2f
0070   03

这是我用ipptool弄出来的一个简单的包,根据规范以及Wireshark对包的解析,我们可以得知如下信息:

名称大小备注
版本号2b1.1版本固定为01 01
操作id或者状态码2b00 0b应该是请求,04 00就是返回的状态了
请求id4b这个服务端会原封返回客户端一样的内容
参数数组不定长可以没有
参数数组结束标志1b03
数据计算长度前头没说

这就是介绍整体包的结构了,具体的,你可以参考Wireshark来直观的查看:
iShot2022-03-09 13.54.26.png

制造测试环境

因为之后是想能扩展成服务,同时也是HTTP协议,那就直接用PHP来完成这件事吧。
为了方便,接下来都用php代码表示结构。

参数包结构

$tag_pack = [
            $tag_type,//标签的定义码
            $tag_len, //2b
            $tag_name,//ascii
            $value_len,//2b
            $value,//ascii
            ];

参数由标志头(01)和尾(03)包括起来。

试着让设备能识别我这台“打印机”

跟着Wireshark抓一遍打印机的包,陆陆续续处理了类型识别,组包等问题,
38981647142733_.pic.jpg
基本实现了交互,但是搞到这里发现,例如墨水余量,纸张支持等功能,是另外用SNMP实现的,瞬间打退堂鼓了(又菜又怕麻烦)

源代码

​‌‌‌​‌​​​​​‌‌​‌​‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​​‌‌​​​‌​​‌‌​‌​‍​‌‌‌‌‌‌​​​​‌​‌​‌‍‌​‌​‌​‌‌‍‌​​‌​‌‌​‍‌​​‌​​‌​‍‌​​‌‌​‌​‍‌​‌‌‌‌​‌‍‌​​‌​​‌‌‍‌​​‌​​​​‍‌​​‌‌​​​‍​​‌‌​‌​​​​​‌​​‌‍​‌​‌‌‌​‌​‌‌​‌‌​‍​‌‌‌​​​​‌​​​‌​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍​​‌‌‌​​​‌​‌‌‌​‌‍​​​​​‌​‌‌​‌‌‌​‌‍​‌‌​​​‌‌‌‌‌‌‌‌‌‍​‌‌​​​‌‌‌‌‌​‌​​‍‌​‌‌​‌‌​‍‌​​‌​​​‌‍‌​​​‌​‌‌‍‌​​‌‌​‌​‍‌​​​‌‌​‌‍‌​​‌​​​‌‍‌​​‌‌​‌​‍‌​​​‌​‌‌‍‌‌​‌‌‌‌‌‍‌​‌​‌‌‌‌‍‌​​​‌‌​‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌​​​‌​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌​​‌‌​​​‍‌‌​‌‌‌‌‌‍‌​‌​‌‌‌‌‍‌​​​‌‌​‌‍‌​​‌​​​​‍‌​​​‌​‌‌‍‌​​‌​​​​‍‌​​‌‌‌​​‍‌​​‌​​​​‍‌​​‌​​‌‌‍‌‌​‌​‌‌‌‍‌​‌‌​‌‌​‍‌​‌​‌‌‌‌‍‌​‌​‌‌‌‌‍‌‌​‌​‌‌​‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​​‌​​​​‍‌​​​‌​‌​‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​‌​‌‌​‍‌​​‌​​‌​‍‌​​‌‌​‌​‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​​‌‌​‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌‌​​‍‌‌​‌​​‌​‍‌‌​​‌‌‌​‍‌‌​​‌‌​​‍​​‌‌‌​‌‌​‌‌‌‌‌‌‍​‌​‌‌‌​​‌‌​​‌‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌​​​‌‌​​‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​‌​‌‌​‍‌​​‌​​‌​‍‌​​​‌‌​‌‍‌​​‌‌‌​‌‍‌​​​‌‌‌​‍‌‌​‌​​​‌‍‌​​‌‌‌​​‍‌​​‌​​​‌‍‌​‌​​​‌‌‍‌​​​‌​‌‌‍‌​​‌‌‌‌​‍‌​​‌​​‌‌‍‌​​‌​‌​​‍‌​‌​​​‌‌‍‌​​‌​‌‌​‍‌​​​‌‌‌‌‍‌​​​‌‌‌‌‍‌‌​‌​​‌​‍‌​​​‌‌​​‍‌​​​‌​‌‌‍‌​​​‌​‌​‍‌​​‌‌​‌‌‍‌​​​​‌‌​‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

写好的代码丢在Github上了,AirPrint才是坠屌的!!
https://github.com/outtimes/printer
就权当我畏难摆烂了呜呜呜

本篇文章未指定许可协议。

转载或引用本文时请遵守许可协议,注明出处。

发表评论
已有 1 条评论
textsms
account_circle
email
link