
曾经,电脑通过串口、并口、U口等方式连接到打印机上。用户们觉得这样的连接方式非常不便,不仅受到数据线的长度限制,而且多台电脑无法方便地共享打印机资源。为了解决这个问题,人们开始探索如何利用现有的强大通讯基础设施,如网线和WiFi,来传输打印内容到打印机上。为此,各种网络打印协议应运而生。
网络打印的过程可以概括为三个步骤。电脑需要与打印机约定一种描述打印内容的方式,输出相应的打印指令。电脑需要通过网络找到打印机的位置。将打印内容以指令的形式传输到打印机。
步骤一:将打印内容转换为指令
由于存在各种各样的打印设备,如PC、Mac、手机以及各种嵌入式设备,同时打印机品牌众多,兼容性成为一个大问题。需要一种与具体操作系统和硬件无关的描述性语言来清晰地表达打印内容和样式,确保打印效果的一致性。这种语言被称为“页面描述语言”(Page description language,简称PDL)。
市面上存在许多页面描述语言,例如Adobe的PostScript(及其延伸的PDF)、爱普生的ESC系列、惠普的PCL等。在与打印机厂商合作时,通常称之为“打印指令”或“仿真模式”。
电脑上的打印驱动的核心功能是将打印内容转换为打印指令。许多打印机厂商还提供SDK,使手机APP能够生成打印指令。如果具备足够的技能,甚至可以自行编写代码输出指令,不受驱动的限制。
步骤二:寻找打印机
电脑需要在网络上找到打印机的位置,这需要通过各种方法实现。例如,SNMP(Simple Network Management Protocol)可以监控网络打印机是否在线。打印机也会提供定制化的方案,如通过广播upd消息,收到消息后回复udp包以告知自己的ip和端口。还有一种简单有效的方法:扫描子网的所有ip,尝试建立tcp连接,以找到打印机的位置。
步骤三:传输打印指令
网络打印的通信需要协议,常见的网络打印协议包括LPD、IPP和AppSocket。
LPD协议(Line Printer Daemon Protocol)是一种早期形成的标准,在Unix系统上广泛使用。该协议使用TCP连接,发送方的端口从721到731,接收方端口是515。建立连接后,可以通过LPD协议控制打印队列,队列中的作业包含了打印的内容。
IPP协议(Internet Printing Protocol)是另一种常见的网络打印协议。它默认使用TCP 631端口,基于http1.1实现。虽然该协议包含认证和加密的流程,但在实际使用中,由于打印机的硬件性能通常较差,许多低端设备并未实现这些功能。IPP协议使用POST请求,通过printer-uri操作打印机设备,job-uri操作打印作业。
AppSocket(又名JetDirect或RAW)是一种直接传输打印指令的协议。它默认使用9100端口,数据传输方式简单快捷。由于它无法获取打印作业的详细信息,使用时可能面临一些挑战。实际开发中,我们可以依赖TCP协议的可靠性、顺序、流量控制等特性来实现数据的稳定传输。如果网络波动或数据传输过程现故障,可能会导致打印指令被截断。针对这种情况,我们可以控制数据包的传输速率并适当延迟来提高传输的稳定性。
从前,电脑通过不同的接口连接到打印机上,比如串口、并口和U口等。用户们觉得这样的连接方式不够便捷,不仅受到数据线的长度限制,而且多台电脑之间共享打印机资源也变得非常困难。于是人们开始探索利用强大的通讯基础设施(如网线和WiFi),将打印内容传输到打印机上。为此目的而诞生的网络打印协议成为了一种解决方案。网络打印主要包括三个步骤:首先是描述打印内容并将其转换为指令;其次是
