- 浏览: 220798 次
- 性别:
- 来自: 襄樊
文章分类
- 全部博客 (114)
- struts2.x (1)
- spring (3)
- ajax (0)
- js (5)
- jsp (3)
- linux/unix (1)
- windows (1)
- hibernate (0)
- ibatis (7)
- tapestry (0)
- freemarker (0)
- common sense (2)
- oracle (5)
- mysql (1)
- firebird (0)
- dwr (0)
- java (22)
- tomcat (7)
- jboss (1)
- eclipse (2)
- css (1)
- xml (3)
- LIFE (5)
- algorithm (1)
- android (25)
- resion (1)
- webservice (1)
- plsql (1)
- tools (0)
- svn (2)
- telecommunication (4)
- jni/ndk (1)
- servlet (1)
最新评论
-
jin367411763:
[flash=200,200][url][img][list] ...
javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.MXParser -
lxyzxq2008:
这两个包都没有这个类的
javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.MXParser -
bewithme:
HTTP/1.1 407 Proxy Authenticati ...
httpclient4.x配置带用户名和密码的代理 -
bewithme:
我使用这个方法时会报严重: Proxy authenticat ...
httpclient4.x配置带用户名和密码的代理 -
taowayi:
android开发者社区 http://www.juapk. ...
android 开发 经典网站
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
发表评论
-
httpclient4配置带用户名和密码的代理
2011-05-22 11:06 3415公司的网络需要代理,且需要用域、户名、密码。这种方式本人已验证 ... -
listview的item中包含button导致item不能选中
2011-05-18 21:35 1717今天发现程序有个bug,listview的item不能选中,核 ... -
debug时按F8/F5/F6不起作用
2011-05-18 19:41 15673eclipse中在debug模式下调试打断点,按F5/F6/F ... -
生成keystore文件指令
2011-05-05 21:15 1144D:\publish>"C:\Program ... -
httpclient4.x配置带用户名和密码的代理
2011-05-05 09:55 7383package test; import org.apach ... -
for循环使用说明
2011-03-31 17:32 812android中不要使用for中嵌套return来实现逻辑,貌 ... -
接力思想的应用
2011-03-31 17:30 854如多个for循环嵌套时通过break,continue不够用时 ... -
native2ascii的说明
2010-12-23 10:14 793native2ascii的命令行的命名格式:native2as ... -
java中的直接引用和符号引用下JVM的不同处理
2010-12-23 10:05 7164总结:JVM对于直接引用和符号引用的处理是有区别的,可以看到符 ... -
打jar指令
2010-12-04 11:37 810cmd cd 到指定目录 jar cvf 文件名.jar * ... -
socket中的流的关闭原则
2010-11-06 15:15 1002同一个socket的输入流和输出流是有关系的,只要关闭其中的一 ... -
final修饰符
2010-07-29 16:51 9591.0 java中对象本身是不能被修饰为final的,只能 ... -
符号引用与直接引用的区别
2010-06-26 15:04 1694符号引用:虚拟机未给变量分配内存空间,只是一个符号而已。 直 ... -
类名.this
2010-06-18 16:44 2119this指的是当前正在访问这段代码的对象,当在内部类中使用th ... -
debug
2010-06-18 15:47 1081debug模式时,只有可以自行运行的程序段,才可通过断点拦截, ... -
eclipse中看不到项目的jar包
2010-05-11 21:34 1353首先以package explorer模式显示项目,然后点击最 ... -
内网可以访问,外网不能访问
2010-05-06 17:56 1774试试把防火墙关掉。 -
安装svn
2010-04-20 09:29 902推荐站点安装方法。 http://subcl ... -
获取当前路径
2010-02-21 17:44 756String path = System.getPropert ... -
java中处理日期
2010-01-06 16:39 1008Java中提供了丰富的日期表示方式。其中包括Date、Time ...
相关推荐
### Java实现POS打印机无驱打印的关键技术点 #### 一、背景及行业需求 随着信息技术的发展,越来越多的企业开始采用数字化管理方案,特别是在餐饮业中,从前台点餐到后厨打印出单,整个流程的自动化程度直接影响着...
### Java 实现 POS 打印机无驱串口打印(解决中文乱码) #### 背景介绍 在日常工作中,POS 打印机是非常常见的设备之一,它被广泛应用于零售业、餐饮业等场景中进行小票打印。通常情况下,POS 打印机与计算机之间...
java串口通信通过静态的CommPortIdentifer.getPortIdentifiers()获得端口列表;再从这个端口列表中选择所需要的端口,并调用CommPortIdentifer对象的Open( )方法,这样,就能得到一个CommPort对象。当然,还要将这个...
Java实现无驱打印的步骤如下: 1. **创建ESC/P指令**: 使用Java编写代码,根据需求生成ESC/P指令字符串。例如,可以通过ASCII码来构造这些指令,比如ESC(27) + "@"用于初始化打印机,ESC(27) + "L" + 字符高度 + ...
java实现pos58小票打印机功能,直接设置纸张大小是58*290 大小的纸张,以供参考
本主题聚焦于使用JAVA连接打印机打印小票,通过三种不同的方法:POS命令、TSCLIB类库以及JAVA自带的类库来实现。下面将详细介绍这三种方式,并给出相关示例。 1. **POS命令**: POS(Point of Sale)命令是一种...
总结来说,ESC/POS无驱动USB打印机通过USB接口与电脑连接,依赖于USB设备的枚举和ESC/POS协议来实现打印功能。开发者可以通过编写程序直接发送ESC/POS指令,无需安装额外的驱动程序,使得打印操作更为便捷。
### Java实现无驱动POS机打印 #### 背景与目的 在现代零售业和服务业中,POS(Point of Sale)系统扮演着极其重要的角色。它不仅能够帮助商家快速完成商品销售,还能提供丰富的数据统计分析功能,对于提高运营效率、...
在IT行业中,尤其是在开发零售或餐饮系统的背景下,Java调用小票打印机打印购物清单是一项常见的任务。这个过程涉及到几个关键的技术点,包括打印机驱动的处理、串口通信、文本格式化以及与硬件设备的交互。以下是对...
开发者通常会使用第三方库如`escpos-printer-db`或`javapos-adaptor`来简化这个过程,它们封装了ESC/POS命令和网络通信,提供更友好的API。`lib`目录可能包含这些库的JAR文件,可以引入到Java项目中。 5. **示例...
总结来说,ESC/POS无驱动USB打印机以其便捷的连接方式、通用的控制协议和经济的打印方式,在各种业务场景中表现出色。理解和掌握这些技术对于IT专业人士,尤其是那些从事嵌入式系统或物联网应用开发的人来说,是非常...
芯烨POS小票打印机驱动就是这样一个软件,它使Windows操作系统能够识别并管理芯烨品牌的POS打印机,提供必要的指令以完成小票的打印任务。 芯烨POS小票打印机通常采用热敏技术,这种技术无需墨水或色带,通过加热...
TSC打印机驱动是针对TSC品牌的打印机所设计的专业软件,用于确保打印机与计算机之间的通信顺畅,从而实现高质量的打印效果。TSC打印机以其耐用性和高效性能在工业、商业及零售领域广泛应用,尤其在标签、条形码和...
在本文中,我们将深入探讨如何使用Java来生成二维码,并与热敏打印机进行交互,实现文字和二维码的打印。 首先,让我们关注“java生成文字二维码”这一知识点。在Java中,我们可以利用第三方库如ZXing(Zebra ...
POS打印机,全称为Point of Sale(销售点)打印机,是商业交易中不可或缺的设备,用于打印销售收据、发票或订单等。在本压缩包文件中,重点涉及到两个品牌——佳博(GaoBao)和新北洋(SNBC),它们都是知名的POS...
Java实现POS打印机自定义无驱打印热敏打印机使用越来越广泛,而安装驱动相当复杂,万幸的是,几乎所有的热敏打印机都支持ESC/P指令,参考网络上一些资料后,在此整理了一份自定义打印的方案• 打印模板为了增强打印...
本文将围绕“JAVA热敏打印POS”这一主题,结合描述和标签,深入探讨Java如何与热敏打印机进行交互,实现高效的小票打印功能。 首先,我们了解什么是POS(Point of Sale)系统。POS系统是商业交易中使用的硬件和软件...
Epson JavaPOS ADK 113驱动是一个针对Epson品牌的Java Point Of Sale(JavaPOS)设备的软件开发工具包,主要用于帮助开发者构建和管理与Epson POS硬件设备交互的应用程序。这个驱动程序包含了全面的功能,确保了在...
本项目涉及的是利用Java编程语言通过USB接口与票据打印机进行交互,实现票据的打印功能。以下是对这个主题的详细说明: 1. **Java编程语言**:Java是一种广泛使用的面向对象的编程语言,具有跨平台特性,能够在多种...