`

Java 实现 POS 打印机无驱打印

    博客分类:
  • java
阅读更多
Java 实现 POS 打印机无驱打印 于 丙 超 (44116178@qq.com), 总经理, 北京周服科技有限公司 2009 年 6 月 29 日 Java 对硬件的控制一直以来都不是其强项,特别是打印,Java 很难实现对 POS 打印机的直接控制,并判断打印是否成功。本文将探讨一种方法,讲述如何使用 Java 技术与网口的 POS 打印机连接,通过 Socket 技术直接将爱普生指令写入打印机端口,打印出相应的内容或者条形码,并实现字体的放大,打印完毕自动走纸等功能。 行业需求 我们是一家专业做酒店餐饮软件的公司,餐饮软件一个重要的功能就是后厨打印问题,前台点菜完毕,后厨立刻打印出单子,这样就减少人工递单的麻烦,节省时间,提高翻台率。这种信息化解决方案对打印技术要求很高,理论上最好 100% 不丢单,也就是每次点菜后厨都会相应出单子,但是实际上行不通,为什么呢?因为网线、打印机、网卡等都有可能有问题,别说打印机等硬件因为厨房油烟问题损坏,我们甚至碰到过网线被老鼠咬断的情况,总之硬件网络故障防不胜防,所以只能退而求其次,就是有问题不可怕,程序能够判断是否出了问题,并能给出提示,便于服务员处理,及时补单。 如果我们用安装 Windows 驱动的方法来实现后厨打印,那么肯定是不行的,因为我们只能单向向驱动程序抛包,不能从驱动程序获得任何返回值,没有办法了解是否打印成功。而且更为严重的是,有时候因为后厨打印机过多,Windows 驱动甚至会因为网络堵塞自作主张将包丢弃,没有任何提示。 这在行业应用中是不行的,会给用户带来损失,所以想到了绕过 Windows 驱动,直接写端口的方法。 无驱打印的可行性 所谓直接写端口的方法,就是不用安装打印机驱动,不使用 PrinterJob 获得打印机的名字的方法进行打印。 众所周知,之所以安装打印机驱动,一个重要的原因就是打印机厂商千差万别,不同的打印机往往都有各自的驱动,很难实现万能驱动。但是,在 POS 打印机行业却有一条捷径,就是现在市面上的 POS 打印机基本上都支持爱普生指令,也就是说,只要将程序和打印机联通,直接向端口里面写爱普生指令就可以控制打印机。 打印机接受到爱普生指令以后,自行进行解析,然后打印出相应的内容。 爱普生指令 日本的 EPSON 公司在目前的 POS 打印机市场,尤其是针式打印机市场占有很大一部分份额。它所推行的 ESC 打印控制命令 (EPSON StandardCode for Pr5nter) 已经成为了针式打印机控制语言事实上的工业标准,ESC/POS 打印命令集是 ESC 打印控制命令的简化版本,现在大多数 POS 打印都采用 ESC/POS 指令集。绝大多数打印机都有 EPSON ESC 的软件命令仿真功能,而且其它打印控制命令的格式和功能也都与 ESC 代码集类似。 由于早期的操作系统 DOS 与现在 Windows 的结构不同,在打印机内部软件和应用软件之间没有由硬件厂商提供的打印驱动程序,必须由应用软件直接通过硬件接口来控制打印机,所以从 ESC 指令出现开始,它就是公开的,否则没有应用软件可以使用它,而除了标准的 ESC 指令外,每种型号的打印机其指令又不太一样,所以在 DOS 软件中,你可以看到每个应用软件都只是支持为数不多的几种常用打印机。 ESC 指令在形式上分为两种格式,一种是文本方式控制码,一种是 Escape 转义序列码。文本方式控制码由一字节字符码表示,实现的是与打印机硬件操作有关的指令,Escape 序列码由转义字符和参数字符或打印数据组成。 建立打印连接 通过上面的介绍,了解了实现无驱打印原来只是一层窗户纸,具体的方法就是首先建立打印机连接,然后写入爱普生指令即可。那么如何建立打印机连接?以网口 POS 打印机举例。 第一步,首先要给网口打印机赋一个 IP 地址,例如叫做 192.168.0.18 。 第二步,编写连接代码。 Socket client=new java.net.Socket(); PrintWriter socketWriter; client.connect(new InetSocketAddress("192.168.0.18" , 9100),1000); // 创建一个 socket socketWriter = new PrintWriter(client.getOutputStream());// 创建输入输出数据流 看起来跟一般的 socket 连接没有很大的区别,就是赋一个 IP 地址和一个端口号,并设置一下超时时间即可,只需要说明的是,一般 POS 打印机的端口都是 9100 。 写入打印内容 连接建立完毕,写入内容就非常容易,只要使用 write 或者 println 方法写入即可,其中 write 方法是写入数字或字符,println 写入一行字符串。 例如:写入数字 socketWriter.write(0); 写入一行字符串 socketWriter.println( “巧富餐饮软件后厨单据” ); 再入一行字符串 socketWriter.println( “桌位 14 桌,人数 3 ” ); 再入一行字符串 socketWriter.println( “跺脚鱼头 1 份” ); 您或许有疑问?内容已经成功写入,好像我们还没有用到爱普生指令。是的,如果只是普通的写入内容,不需要用到爱普生指令,爱普生指令主要帮助实现放大字体,自动走纸,打印条形码等功能。 放大字体 放大字体需要用到爱普生的 0x1c 指令,使用爱普生指令的方法很简单,只要向端口写入指令即可,例如: socketWriter.write(0x1c); 注意 0x1c,是 16 进制的数字,当然也可以转换成 10 进制来写。需要说明的是,使用爱普生指令放大字体不能随意放大,因为它不是图形化打印,而是文本化打印,所以纵向或者横向只能按照倍数放大,不能矢量放大。例如在 POS58 打印机上将“巧富餐饮软件”几个字放大打印,可以有如下放大方法。 /* 横向放大一倍 */ socketWriter.write(0x1c); socketWriter.write(0x21); socketWriter.write(4); /* 纵向放大一倍 */ socketWriter.write(0x1c); socketWriter.write(0x21); socketWriter.write(8); /* 横向纵向都放大一倍 */ socketWriter.write(0x1c); socketWriter.write(0x21); socketWriter.write(12); 一般情况下,我们倾向采用纵向放大一倍的方法,放大后的字体看起来有点像仿宋体,视觉效果还不错。 兼容多种类型打印机 现在知道了使用爱普生指令的方法,所以只要有一本爱普生指令手册在手里,就可以用 Java 控制打印机进行无驱打印。但是现在问题是,同样是爱普生指令,不同的 pos 打印机可能不一样,就拿放大字体来说,pos58 打印机和 pos80 打印机指令就不尽相同。这时候怎么办呢?如何兼容多种类型打印机? 比如说,有的打印机并不是使用 0x1c 作为放大指令,而是使用 0x1b 作为放大指令,怎么办?容易。 /* 横向放大一倍 */ socketWriter.write(0x1c); socketWriter.write(0x21); socketWriter.write(4); socketWriter.write(0x1b); socketWriter.write(0x21); socketWriter.write(4); /* 纵向放大一倍 */ socketWriter.write(0x1c); socketWriter.write(0x21); socketWriter.write(8); socketWriter.write(0x1b); socketWriter.write(0x21); socketWriter.write(8); /* 横向纵向都放大一倍 */ socketWriter.write(0x1c); socketWriter.write(0x21); socketWriter.write(12); socketWriter.write(0x1b); socketWriter.write(0x21); socketWriter.write(12); 看明白了吗?就是写两遍就行,因为如果 0x1b 指令若不存在,打印机自动将其抛弃。 实现自动走纸 POS 打印机因为出纸口有一些深度,打印完毕为了避免撕裂文字内容,一般需要适当走纸才行,当然可以使用爱普生指令来走纸,但是这样并不稳妥,为什么呢 ? 因为要考虑 POS 机的兼容性,所以一般采用打印空行的方式实现走纸。 for(int i=0;i
分享到:
评论

相关推荐

    Java实现POS打印机无驱打印

    ### Java实现POS打印机无驱打印的关键技术点 #### 一、背景及行业需求 随着信息技术的发展,越来越多的企业开始采用数字化管理方案,特别是在餐饮业中,从前台点餐到后厨打印出单,整个流程的自动化程度直接影响着...

    Java 实现 POS 打印机无驱串口打印(解决中文乱码)

    ### Java 实现 POS 打印机无驱串口打印(解决中文乱码) #### 背景介绍 在日常工作中,POS 打印机是非常常见的设备之一,它被广泛应用于零售业、餐饮业等场景中进行小票打印。通常情况下,POS 打印机与计算机之间...

    Java 实现POS打印机无驱串口打印(解决中文乱码)修改版

    java串口通信通过静态的CommPortIdentifer.getPortIdentifiers()获得端口列表;再从这个端口列表中选择所需要的端口,并调用CommPortIdentifer对象的Open( )方法,这样,就能得到一个CommPort对象。当然,还要将这个...

    Java实现网络小票打印机自定义无驱打印

    Java实现无驱打印的步骤如下: 1. **创建ESC/P指令**: 使用Java编写代码,根据需求生成ESC/P指令字符串。例如,可以通过ASCII码来构造这些指令,比如ESC(27) + "@"用于初始化打印机,ESC(27) + "L" + 字符高度 + ...

    java实现pos58小票打印机功能

    java实现pos58小票打印机功能,直接设置纸张大小是58*290 大小的纸张,以供参考

    JAVA连接打印机打印小票

    本主题聚焦于使用JAVA连接打印机打印小票,通过三种不同的方法:POS命令、TSCLIB类库以及JAVA自带的类库来实现。下面将详细介绍这三种方式,并给出相关示例。 1. **POS命令**: POS(Point of Sale)命令是一种...

    ESC_POS无驱动USB打印机

    总结来说,ESC/POS无驱动USB打印机通过USB接口与电脑连接,依赖于USB设备的枚举和ESC/POS协议来实现打印功能。开发者可以通过编写程序直接发送ESC/POS指令,无需安装额外的驱动程序,使得打印操作更为便捷。

    Java实现无驱动POS机打印

    ### Java实现无驱动POS机打印 #### 背景与目的 在现代零售业和服务业中,POS(Point of Sale)系统扮演着极其重要的角色。它不仅能够帮助商家快速完成商品销售,还能提供丰富的数据统计分析功能,对于提高运营效率、...

    Java调用小票打印机打印小票

    在IT行业中,尤其是在开发零售或餐饮系统的背景下,Java调用小票打印机打印购物清单是一项常见的任务。这个过程涉及到几个关键的技术点,包括打印机驱动的处理、串口通信、文本格式化以及与硬件设备的交互。以下是对...

    java esc/pos 打印

    开发者通常会使用第三方库如`escpos-printer-db`或`javapos-adaptor`来简化这个过程,它们封装了ESC/POS命令和网络通信,提供更友好的API。`lib`目录可能包含这些库的JAR文件,可以引入到Java项目中。 5. **示例...

    ESC_POS无驱动USB打印机(已应用到项目)

    总结来说,ESC/POS无驱动USB打印机以其便捷的连接方式、通用的控制协议和经济的打印方式,在各种业务场景中表现出色。理解和掌握这些技术对于IT专业人士,尤其是那些从事嵌入式系统或物联网应用开发的人来说,是非常...

    芯烨POS小票打印机驱动

    芯烨POS小票打印机驱动就是这样一个软件,它使Windows操作系统能够识别并管理芯烨品牌的POS打印机,提供必要的指令以完成小票的打印任务。 芯烨POS小票打印机通常采用热敏技术,这种技术无需墨水或色带,通过加热...

    TSC打印机驱动下载

    TSC打印机驱动是针对TSC品牌的打印机所设计的专业软件,用于确保打印机与计算机之间的通信顺畅,从而实现高质量的打印效果。TSC打印机以其耐用性和高效性能在工业、商业及零售领域广泛应用,尤其在标签、条形码和...

    java-热敏打印机-二维码

    在本文中,我们将深入探讨如何使用Java来生成二维码,并与热敏打印机进行交互,实现文字和二维码的打印。 首先,让我们关注“java生成文字二维码”这一知识点。在Java中,我们可以利用第三方库如ZXing(Zebra ...

    POS打印机相关资料

    POS打印机,全称为Point of Sale(销售点)打印机,是商业交易中不可或缺的设备,用于打印销售收据、发票或订单等。在本压缩包文件中,重点涉及到两个品牌——佳博(GaoBao)和新北洋(SNBC),它们都是知名的POS...

    thermal_printer:Java实现网络小票打印机自定义无驱打印

    Java实现POS打印机自定义无驱打印热敏打印机使用越来越广泛,而安装驱动相当复杂,万幸的是,几乎所有的热敏打印机都支持ESC/P指令,参考网络上一些资料后,在此整理了一份自定义打印的方案• 打印模板为了增强打印...

    JAVA熱敏打印POS

    本文将围绕“JAVA热敏打印POS”这一主题,结合描述和标签,深入探讨Java如何与热敏打印机进行交互,实现高效的小票打印功能。 首先,我们了解什么是POS(Point of Sale)系统。POS系统是商业交易中使用的硬件和软件...

    Epson javapos adk113驱动

    Epson JavaPOS ADK 113驱动是一个针对Epson品牌的Java Point Of Sale(JavaPOS)设备的软件开发工具包,主要用于帮助开发者构建和管理与Epson POS硬件设备交互的应用程序。这个驱动程序包含了全面的功能,确保了在...

    pos机 票据打印 java

    本项目涉及的是利用Java编程语言通过USB接口与票据打印机进行交互,实现票据的打印功能。以下是对这个主题的详细说明: 1. **Java编程语言**:Java是一种广泛使用的面向对象的编程语言,具有跨平台特性,能够在多种...

Global site tag (gtag.js) - Google Analytics