龙空技术网

网络打印协议入门

淮爸 23

前言:

眼前你们对“internet上采用的网络协议”都比较关注,姐妹们都需要学习一些“internet上采用的网络协议”的相关知识。那么小编在网摘上网罗了一些有关“internet上采用的网络协议””的相关资讯,希望兄弟们能喜欢,大家快快来了解一下吧!

从前,电脑通过串口、并口、USB口等连到打印机上。大家觉得用起来不爽,不仅被这些数据线的长度禁锢,还不方便多台电脑共享。为了利用强大通讯基础设施(网线、WiFi),把打印内容传输到打印机上,制定出了各种网络打印协议。

通过网络打印,可以分为三个步骤。步骤一:跟打印机约定好如何描述打印样式,输出打印指令。步骤二:顺着网线找到打印机。步骤三:把打印内容传输给打印机。

步骤一:把打印内容转为指令

发起打印的设备各式各样,PC、mac、手机、还有各种嵌入式设备等等。打印机也有很多品牌,它们之间的兼容性是个大问题。所以需要一种跟具体操作系统和硬件无关的描述性语言,用这种语言把要打印的内容和样式表达清楚,保证打印出来的效果是一样的。这就是“页面描述语言”(Page description language,简称 PDL)。

常见的页面描述语言很多,比如Adobe的PostScript(以及延伸而来的PDF)、爱普生的ESC系列、惠普的PCL、台积电的TSPL,等等。跟打印机厂商打交道的时候,通常称之为“打印指令”或“仿真模式”。

安装在电脑上的打印驱动,核心功能就是把打印内容翻译为打印指令。很多打印机厂商也提供SDK,可以在手机APP上生成打印指令。心灵手巧的话,甚至可以自己写代码输出指令,不受驱动的限制。

步骤二:找到打印机

电脑得在网上找到打印机,才知道往什么ip和端口发数据。方法有很多,比如SNMP(Simple Network Management Protocol),可以监控网络打印机是否在线。一些打印机也会提供定制化的方案,比如往局域网广播一个upd消息,打印机收到消息回复一个udp包,用来告知自己的ip和端口,这些跟打印机厂商对接的时候根据厂商提供的文档来开发即可。

还有一种方法简单粗暴很好用:扫码子网所有ip。比如9100端口通常是AppSocket协议默认端口,那么只需要扫描整个子网的所有ip,分别尝试创建tcp连接,哪个端口发现9100端口可以连上,大概率就是台打印机。

步骤三:传输打印指令

网络通信需要协议,网络打印也需要协议,常见的有LPD、IPP、AppSocket三种:

LPD协议(Line Printer Daemon Protocol,行式打印机协议),也叫LPR(Line Printer Remote protocol)。很早就形成的标准,在Windows还没诞生的年代就已经在Unix系统上广泛使用。LPD使用TCP连接,发送方的端口从721到731,接收方端口是515。建立连接后,通过LPD协议可以控制打印队列(queue),队列中有打印作业(jobs),任务里面包含了打印的内容(data file),即上文步骤一的打印指令。

IPP协议(Internet Printing Protocol,互联网打印协议)。默认使用TCP 631端口,基于http1.1实现。最初设计是用来取代传真的,但把一个http服务开放到网上,无疑会带来许多安全性的问题。虽然协议中包含了认证和加密的流程,后来的标准也引入了https支持,但是打印机的硬件性能通常较差,ROM有限的低端设备压根就没有实现。IPP协议使用POST请求,Content-Type为application/ipp,使用printer-uri来操作打印机设备,job-uri操作打印作业。

AppSocket又名JetDirect,因为来源于惠普公司推出的HP JetDirect协议;也叫RAW,因为它直接传输的打印指令,都是raw数据;有时候也直接叫它9100,因为默认使用9100端口。别看它名字这么多,其实跟打印机厂商对接的时候压根不用问,都是AppSocket(至少我对接十几家国内打印机厂家无一例外)。比起LPD和IPP需要控制打印队列和作业,AppSocket显得简单又高效,啥都不控制。找到打印机ip之后,跟打印机的9100端口建立一个TCP连接,然后把打印指令一股脑传输过去就行了。

详解AppSocket

RAW是大部分打印机的默认协议,所以单独拎出来讲。比起其他的打印协议,Raw直接投喂数据的方式更简单、更快,但同时也带来缺点一个,无法获取打印作业的详细信息。按照规范的资料,使用PJL(Printer Job Language)可以跟打印机交互,获取打印机的基本信息。不过我尝试了各种国产品牌的打印机,均无法收到打印机的响应。实际开发的时候,可以默认数据传输是单向的,数据的发送方不用管打印机的状态。

网络传输的过程,依赖TCP协议来实现可靠性、顺序、流量控制、拥塞处理等等。数据送达打印机之后,打印机先写到缓冲区,再驱动硬件打印出来。使用Wifi传输的时候,有时候会有网络波动,断线了再重连;数据写入缓冲区的过程,也有可能出现故障,这时候很可能导致打印指令被截断。表现为打印机到某一行就停止了,或者后面接着打印的都是乱码。由于发送方无法获取打印作业的状态,我们目前也没找到较好解决方案,只能是控制数据包传入的速率,适当做一些延迟,来提高传输的稳定性。

有些打印机并没有提供网线接口,利用带USB接口的路由器接入,这时候路由器只是转发作用,跟打印机内置的网络通信功能没有区别。虽然默认是9100端口,但也能支持其他的端口,直接在路由器的iptable做一个REDIRECT即可。有些多个USB接口的路由器,不同的端口还能对应各自的USB接口(一般是9100、9101、9102...)。把IP和端口开放到互联网上,甚至支持通过互联网来打印。毕竟IP和端口都只是通信双方的一个约定,只要能把数据传送到打印机,就能把内容打印出来。

打印机作为TCP的服务端,支持同时跟多个客户端连接。也就是说,多台设备是可以同时连接打印机的9100端口。不过,打印机只有一个,只要有一个任务正在打印中,后续的数据就传不进来了。我自己用AB两台设备测试:A设备正在传输的过程中,B设备发起打印,这时候会等到A任务打印完成之后,B设备的连接才开始传输数据。所以当打印多页任务的时候,需要一次性把所有任务数据都发送完成,再断开连接,这样可以避免其他设备在打印过程中连上,导致多个打印任务串页。

总结

比起日新月异的互联网技术,打印技术的生态显得陈旧、繁杂、不统一。

一方面,上世纪大部分关键专利都被国外厂商所垄断,国内都是代工厂,自研水平有限;而如今无纸化大行其道,打印又逐渐沦为夕阳产业,厂商纷纷谋求转型之路。所以打印协议的中文文档很少。

另一方面,打印机硬件的生命周期非常长。Win 11都出来了,有些厂商官网上还挂着Win95驱动的下载链接。陈旧的硬件作为事实标准,限制了技术的发展。

本文转自:网络打印协议入门 (oonne.com)

标签: #internet上采用的网络协议