开发POS打印机,买了硬件设备,基于Ethernet的网口版



搜索Stackoverflow看到类似的代码:


stackoverflow.com/questions/4…
提取关键词:TCP/IP, Socket,Ip Address, Port,Connect, Disconnect! 这些词都听说过,但是放到一起都是些什么鬼??为什么要connect和disconnect呢,到底是通过什么原理打印的呢?
要明白如上关键词,先看看整个互联网的机制。网上的图片大多类似,看的云里雾里,线框图看起来简单,其实等于什么都没有说,还是不明白是什么意思,如图:




这些图没有任何意义。多方查证,找到英文版的描述:www.quora.com/What-is-the…
简而言之,互联网构架有4大部分组成,从底层逐步往上走:
第一层: 物理层-Physical layer。即电信号传输,你家里的电脑跟网线和路由器之间的电信号传输,包括高低电平等物理传输过程。
第二层: 网络层-Network layer。即IP和路由功能,这是虚拟的概念。简单理解,即通过数字的概念,来标识每个计算机位于网络中的位置,同时通过这个协议(IP Address)来构建一个虚拟的网络。
第三层: 传输层-Transport layer。知道了计算机的位置,那么如何在两个计算机之间传输数据呢,比如如何解码,复原码,丢包处理等。另外计算机上有多个端口port怎么知道传输给哪个端口呢,这就是TCP协议,通过该协议可以实现两个设备或者计算机直接的直接数据packet传输,这个协议通过三重握手协议来实现数据解码,复原等操作。
第四层:应用层Application layer。知道了两个设备之间怎么传输,传输的内容很多,计算机上安装的程序很多,传输的内容也不同,比如图片,文字,二进制Raw等等,于是在此基础上规定了各种文件资源传输,如果是互联网传输访问,则需要遵循http/ftp等协议,即需要按照范式(POST.GET等)来操作访问资源。即可以把浏览器看成计算机上安装的多个软件的其中一个,这个软件可以通过http访问特定的资源。 于是下面的图片应运而生。

看到这里,基本上应该明白,如果我访问一个端对端打印机需要什么协议了,应该在第三层,即Transport layer,即TCP。事实证明也如此,看打印机设置过程:





那么Socket又是怎么回事呢?Socket其实就是为了方便处理TCP传输,为了编程方便,抽象封装了一次而已:如图

Socket因为是对TCP的封装,因此需要Connnect 和disconnect具体如下


因为TCP是端对端的传输,因此socket可以实现实时聊天,即websoket应运而生。扯远了,话再回到打印机上面,如果通过websocket能直接在浏览器上访问打印机吗?即通过网页直接调用IP地址上的打印机。注意:这里不是点击浏览器上的打印按钮,直接打印哦,这种方式是浏览器作为本地软件访问本地打印机,而不是通过websock直接访问,区别是一个需要打印确认窗口,一个不需要直接打印!!

越扯越远,继续谈一个终极的问题:
上面这个例子是网络打印机的例子,如果现在有一种情况怎么解决:本地电脑连接的是多个打印机:一个是USB的不干胶面单zebra打印机,一个是蓝牙的小票epson POS打印机,还有一个是brother IP的激光打印机,还有一个是串口的集美针式发票打印机。请问如何通过浏览器直接打印,不要告诉我是通过点击浏览器上面的打印按钮打印哦!我说的而是通过websocket。
解决方案:
- 需要在本地安装一个one for all以一当百的集成了所有打印驱动(或者说是打印协议的)软件
- 开放某个端口可以访问该软件
- 然后通过websocket访问该端口即可调用该软件实现发现并调用某个打印机的功能
当然你可以自己开发这个软件,难度不低,你需要熟悉各种打印协议,市面上有类似的软件吗?有,Neodynamic,但是付费$199美金一套软件! www.neodynamic.com/products/pr…

等一会,还没有完。
沿着这个思路出发,能否实现云打印服务呢?考虑如下场景:小李为自家的餐厅开发了点餐app,需要打印POS小票,这个app是ios版的,同时小李买了一个POS打印机,通过网口Ethernet连接到网上,小李如何通过app打印面单呢?别告诉我直接蓝牙连接打印机,这不是我说的场景。
云解决方案:
- 我们定制一个POS打印机,开放端口
- 联网成功后,让小李登录,获取该打印机的IP和端口
- 让小李的app访问Rest Api发送到打印命令到我们服务器
- 我们服务器知道我们的打印机是什么类型的,比如是ZPL,或者ESC指令集的打印机,因此通过TCP把转译过得打印原生命令发送至打印机
- 打印机打印
这个云服务商就是飞鹅打印!
等一会,还没有完。上面说的是我们作为云提供商,自己提供打印机,我们知道自己的打印机是什么型号,什么指令集,能否提供一个终极的方案呢?即,用户自己购买打印机,任意打印机哦!!好好想想,这个难度在哪里。下面揭晓答案!!!!
考虑如下场景:小王买了一台打印机(任何类型任何品牌,热敏,POS随便你),通过USB(或者网络)插在windows电脑上,现在小王也开发了一个APP(可以是iOS或者web或者windows),需要在这台打印机上打印订单,请问怎么办?考虑到APP可能是iOS,APP没有安装在打印机所在的电脑上,所以只能通过网络(云)打印。
云解决方案:
- 打印机连接电脑,电脑联网则有了IP,安装一个万能打印软件(Neodynamic),该万能打印软件需要登录,登录后,该软件把发现的打印机关联到云账号中(也包括该台电脑)
- 然后小王的app通过调用Rest APi去访问关联的打印机和电脑,因为万能软件可以发送原生的native的打印命令,从而实现云打印功能。
这个终极的万能解决方案有人在做吗????不幸的是,有!人!在!做!应该是具有Neodynamic的软件。
他们是:NodePrint

