[計(jì)算機(jī)]Java實(shí)例:Java實(shí)現(xiàn)POS打印機(jī)無(wú)驅(qū)打印_第1頁(yè)
[計(jì)算機(jī)]Java實(shí)例:Java實(shí)現(xiàn)POS打印機(jī)無(wú)驅(qū)打印_第2頁(yè)
[計(jì)算機(jī)]Java實(shí)例:Java實(shí)現(xiàn)POS打印機(jī)無(wú)驅(qū)打印_第3頁(yè)
[計(jì)算機(jī)]Java實(shí)例:Java實(shí)現(xiàn)POS打印機(jī)無(wú)驅(qū)打印_第4頁(yè)
[計(jì)算機(jī)]Java實(shí)例:Java實(shí)現(xiàn)POS打印機(jī)無(wú)驅(qū)打印_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.Java實(shí)例:Java實(shí)現(xiàn)POS打印機(jī)無(wú)驅(qū)打印 (1) 發(fā)布時(shí)間:2009.07.03 07:43     來(lái)源:賽迪網(wǎng)    作者:于丙超【賽迪網(wǎng)-IT技術(shù)報(bào)道】Java對(duì)硬件的控制一直以來(lái)都不是其強(qiáng)項(xiàng),特別是打印,Java很難實(shí)現(xiàn)對(duì)POS打印機(jī)的直接控制,并判斷打印是否成功。 本文將探討一種方法,講述如何使用Java技術(shù)與網(wǎng)口的POS打印機(jī)連接,通過(guò)Socket技術(shù)直接將愛(ài)普生指令寫(xiě)入打印機(jī)端口,打印出相應(yīng)的內(nèi)容或者條形碼,并實(shí)現(xiàn)字體的放大,打印完畢自動(dòng)走紙等功能。 行業(yè)需求 我們是一家專業(yè)做酒店餐飲軟件的公

2、司,餐飲軟件一個(gè)重要的功能就是后廚打印問(wèn)題,前臺(tái)點(diǎn)菜完畢,后廚立刻打印出單子,這樣就減少人工遞單的麻煩,節(jié)省時(shí)間,提高翻臺(tái)率。這種信息化解決方案對(duì)打印技術(shù)要求很高,理論上最好 100% 不丟單,也就是每次點(diǎn)菜后廚都會(huì)相應(yīng)出單子,但是實(shí)際上行不通,為什么呢?因?yàn)榫W(wǎng)線、打印機(jī)、網(wǎng)卡等都有可能有問(wèn)題,別說(shuō)打印機(jī)等硬件因?yàn)閺N房油煙問(wèn)題損壞,我們甚至碰到過(guò)網(wǎng)線被老鼠咬斷的情況,總之硬件網(wǎng)絡(luò)故障防不勝防,所以只能退而求其次,就是有問(wèn)題不可怕,程序能夠判斷是否出了問(wèn)題,并能給出提示,便于服務(wù)員處理,及時(shí)補(bǔ)單。 如果我們用安裝 Windows 驅(qū)動(dòng)的方法來(lái)實(shí)現(xiàn)后廚打印,那么肯定是不行的,因?yàn)槲覀冎荒軉蜗蛳蝌?qū)動(dòng)

3、程序拋包,不能從驅(qū)動(dòng)程序獲得任何返回值,沒(méi)有辦法了解是否打印成功。而且更為嚴(yán)重的是,有時(shí)候因?yàn)楹髲N打印機(jī)過(guò)多,Windows 驅(qū)動(dòng)甚至?xí)驗(yàn)榫W(wǎng)絡(luò)堵塞自作主張將包丟棄,沒(méi)有任何提示。 這在行業(yè)應(yīng)用中是不行的,會(huì)給用戶帶來(lái)?yè)p失,所以想到了繞過(guò) Windows 驅(qū)動(dòng),直接寫(xiě)端口的方法。 無(wú)驅(qū)打印的可行性 所謂直接寫(xiě)端口的方法,就是不用安裝打印機(jī)驅(qū)動(dòng),不使用 PrinterJob 獲得打印機(jī)的名字的方法進(jìn)行打印。 眾所周知,之所以安裝打印機(jī)驅(qū)動(dòng),一個(gè)重要的原因就是打印機(jī)廠商千差萬(wàn)別,不同的打印機(jī)往往都有各自的驅(qū)動(dòng),很難實(shí)現(xiàn)萬(wàn)能驅(qū)動(dòng)。但是,在 POS 打印機(jī)行業(yè)卻有一條捷徑,就是現(xiàn)在市面上的 POS 打

4、印機(jī)基本上都支持愛(ài)普生指令,也就是說(shuō),只要將程序和打印機(jī)聯(lián)通,直接向端口里面寫(xiě)愛(ài)普生指令就可以控制打印機(jī)。 打印機(jī)接受到愛(ài)普生指令以后,自行進(jìn)行解析,然后打印出相應(yīng)的內(nèi)容。 愛(ài)普生指令 日本的 EPSON 公司在目前的 POS 打印機(jī)市場(chǎng),尤其是針式打印機(jī)市場(chǎng)占有很大一部分份額。它所推行的 ESC 打印控制命令 (EPSON StandardCode for Pr5nter) 已經(jīng)成為了針式打印機(jī)控制語(yǔ)言事實(shí)上的工業(yè)標(biāo)準(zhǔn),ESC/POS 打印命令集是 ESC 打印控制命令的簡(jiǎn)化版本,現(xiàn)在大多數(shù) POS 打印都采用 ESC/POS 指令集。絕大多數(shù)打印機(jī)都有 EPSON ESC 的軟件命令仿真功

5、能,而且其它打印控制命令的格式和功能也都與 ESC 代碼集類似。 由于早期的操作系統(tǒng) DOS 與現(xiàn)在 Windows 的結(jié)構(gòu)不同,在打印機(jī)內(nèi)部軟件和應(yīng)用軟件之間沒(méi)有由硬件廠商提供的打印驅(qū)動(dòng)程序,必須由應(yīng)用軟件直接通過(guò)硬件接口來(lái)控制打印機(jī),所以從 ESC 指令出現(xiàn)開(kāi)始,它就是公開(kāi)的,否則沒(méi)有應(yīng)用軟件可以使用它,而除了標(biāo)準(zhǔn)的 ESC 指令外,每種型號(hào)的打印機(jī)其指令又不太一樣,所以在 DOS 軟件中,你可以看到每個(gè)應(yīng)用軟件都只是支持為數(shù)不多的幾種常用打印機(jī)。 ESC 指令在形式上分為兩種格式,一種是文本方式控制碼,一種是 Escape 轉(zhuǎn)義序列碼。文本方式控制碼由一字節(jié)字符碼表示,實(shí)現(xiàn)的是與打印機(jī)硬

6、件操作有關(guān)的指令,Escape 序列碼由轉(zhuǎn)義字符和參數(shù)字符或打印數(shù)據(jù)組成。 建立打印連接 通過(guò)上面的介紹,了解了實(shí)現(xiàn)無(wú)驅(qū)打印原來(lái)只是一層窗戶紙,具體的方法就是首先建立打印機(jī)連接,然后寫(xiě)入愛(ài)普生指令即可。那么如何建立打印機(jī)連接?以網(wǎng)口 POS 打印機(jī)舉例。 第一步,首先要給網(wǎng)口打印機(jī)賦一個(gè) IP 地址,例如叫做 192.168.0.18 。 第二步,編寫(xiě)連接代碼。 Socket client=new .Socket(); PrintWriter socketWriter; client.connect(new InetSocketAddress("192.168.0.18"

7、, 9100),1000); / 創(chuàng)建一個(gè) socket socketWriter = new PrintWriter(client.getOutputStream(); / 創(chuàng)建輸入輸出數(shù)據(jù)流看起來(lái)跟一般的 socket 連接沒(méi)有很大的區(qū)別,就是賦一個(gè) IP 地址和一個(gè)端口號(hào),并設(shè)置一下超時(shí)時(shí)間即可,只需要說(shuō)明的是,一般 POS 打印機(jī)的端口都是 9100 。寫(xiě)入打印內(nèi)容 連接建立完畢,寫(xiě)入內(nèi)容就非常容易,只要使用 write 或者 println 方法寫(xiě)入即可,其中 write 方法是寫(xiě)入數(shù)字或字符,println 寫(xiě)入一行字符串。 例如:寫(xiě)入數(shù)字 socketWriter.write(0

8、); 寫(xiě)入一行字符串 socketWriter.println( “巧富餐飲軟件后廚單據(jù)” ); 再入一行字符串 socketWriter.println( “桌位 14 桌,人數(shù) 3 ” ); 再入一行字符串 socketWriter.println( “跺腳魚(yú)頭 1 份” ); 您或許有疑問(wèn)??jī)?nèi)容已經(jīng)成功寫(xiě)入,好像我們還沒(méi)有用到愛(ài)普生指令。是的,如果只是普通的寫(xiě)入內(nèi)容,不需要用到愛(ài)普生指令,愛(ài)普生指令主要幫助實(shí)現(xiàn)放大字體,自動(dòng)走紙,打印條形碼等功能。 放大字體 放大字體需要用到愛(ài)普生的 0x1c 指令,使用愛(ài)普生指令的方法很簡(jiǎn)單,只要向端口寫(xiě)入指令即可,例如: socketWriter.w

9、rite(0x1c);注意 0x1c,是 16 進(jìn)制的數(shù)字,當(dāng)然也可以轉(zhuǎn)換成 10 進(jìn)制來(lái)寫(xiě)。需要說(shuō)明的是,使用愛(ài)普生指令放大字體不能隨意放大,因?yàn)樗皇菆D形化打印,而是文本化打印,所以縱向或者橫向只能按照倍數(shù)放大,不能矢量放大。例如在 POS58 打印機(jī)上將“巧富餐飲軟件”幾個(gè)字放大打印,可以有如下放大方法。 /* 橫向放大一倍 */ socketWriter.write(0x1c); socketWriter.write(0x21); socketWriter.write(4); /* 縱向放大一倍 */ socketWriter.write(0x1c); socketWriter.wri

10、te(0x21); socketWriter.write(8); /* 橫向縱向都放大一倍 */ socketWriter.write(0x1c); socketWriter.write(0x21); socketWriter.write(12);一般情況下,我們傾向采用縱向放大一倍的方法,放大后的字體看起來(lái)有點(diǎn)像仿宋體,視覺(jué)效果還不錯(cuò)。 兼容多種類型打印機(jī) 現(xiàn)在知道了使用愛(ài)普生指令的方法,所以只要有一本愛(ài)普生指令手冊(cè)在手里,就可以用 Java 控制打印機(jī)進(jìn)行無(wú)驅(qū)打印。但是現(xiàn)在問(wèn)題是,同樣是愛(ài)普生指令,不同的 pos 打印機(jī)可能不一樣,就拿放大字體來(lái)說(shuō),pos58 打印機(jī)和 pos80 打印機(jī)

11、指令就不盡相同。這時(shí)候怎么辦呢?如何兼容多種類型打印機(jī)? 比如說(shuō),有的打印機(jī)并不是使用 0x1c 作為放大指令,而是使用 0x1b 作為放大指令,怎么辦?容易。 /* 橫向放大一倍 */ socketWriter.write(0x1c); socketWriter.write(0x21); socketWriter.write(4); socketWriter.write(0x1b); socketWriter.write(0x21); socketWriter.write(4); /* 縱向放大一倍 */ socketWriter.write(0x1c); socketWriter.writ

12、e(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);看明白了嗎?就是寫(xiě)兩遍就行,因?yàn)槿绻?0x1b 指令

13、若不存在,打印機(jī)自動(dòng)將其拋棄。 實(shí)現(xiàn)自動(dòng)走紙 POS 打印機(jī)因?yàn)槌黾埧谟幸恍┥疃?,打印完畢為了避免撕裂文字?nèi)容,一般需要適當(dāng)走紙才行,當(dāng)然可以使用愛(ài)普生指令來(lái)走紙,但是這樣并不穩(wěn)妥,為什么呢 ? 因?yàn)橐紤] POS 機(jī)的兼容性,所以一般采用打印空行的方式實(shí)現(xiàn)走紙。 for(int i=0;i<10;i+) socketWriter.println(" ");/ 打印完畢自動(dòng)走紙顯然,打印空行的方式有更好地兼容性。 打印條形碼 條形碼在各個(gè)行業(yè)中現(xiàn)在有廣泛的應(yīng)用,所以讓打印機(jī)打印條形碼是非常重要的功能,不過(guò)你不需要費(fèi)好多精力去研究條形碼知識(shí),因?yàn)閻?ài)普生指令中有一個(gè)打印條

14、形碼指令,例如我們要打印條形碼“ 091955826335 ”,只要使用如下命令即可。 socketWriter.write(0x1d); socketWriter.write(0x68); socketWriter.write(120); socketWriter.write(0x1d); socketWriter.write(0x48); socketWriter.write(0x01); socketWriter.write(0x1d); socketWriter.write(0x6B); socketWriter.write(0x02); socketWriter.println &q

15、uot;091955826335" ); socketWriter.write(0x00);完整的代碼 好了,下面舉一個(gè)完整的例子,我們來(lái)建立一個(gè)叫做 print 的方法,向某個(gè)打印機(jī)打印一個(gè)字符和條形碼,并實(shí)現(xiàn)自動(dòng)走紙,代碼如下: private boolean print(String ip, int port, String str,String code,int skip) throws Exception Socket client=new .Socket(); PrintWriter socketWriter; client.connect(new InetSocketA

16、ddress(ip,port),1000); / 創(chuàng)建一個(gè) socket socketWriter = new PrintWriter(client.getOutputStream();/ 創(chuàng)建輸入輸出數(shù)據(jù)流 /* 縱向放大一倍 */ socketWriter.write(0x1c); socketWriter.write(0x21); socketWriter.write(8); socketWriter.write(0x1b); socketWriter.write(0x21); socketWriter.write(8); socketWriter.println(str); / 打印條形碼 socketWriter.write(0x1d); socketWriter.write(0x68); socketWriter.write(120); socketWriter.write(0x1d); socketWriter.write(0x48); socketWriter.write(0x01); socketWriter.write(0x1d); socketWriter.write(0x6B); socketWriter.write(0x02); socket

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論