李煥麗,李月香
(山西大學(xué) 計(jì)算機(jī)與信息技術(shù)學(xué)院,太原 030006)
基于Android手機(jī)的藍(lán)牙票據(jù)打印機(jī)API開發(fā)
李煥麗,李月香
(山西大學(xué) 計(jì)算機(jī)與信息技術(shù)學(xué)院,太原 030006)
本文針對(duì)微型票據(jù)打印機(jī)的應(yīng)用特點(diǎn),解析了ZJ-5802藍(lán)牙微型票據(jù)打印機(jī)的底層功能,用Java語(yǔ)言開發(fā)了基于Android手機(jī)的API。此API具有文本編輯和打印、快速曲線打印、表格打印、圖片打印等功能,與打印機(jī)生產(chǎn)商提供的接口函數(shù)相比較,功能更豐富,對(duì)打印機(jī)的操控更為方便、靈活。本文開發(fā)硬件設(shè)備底層功能的方法對(duì)于軟件開發(fā)者具有重要的參考價(jià)值。
Android手機(jī);藍(lán)牙熱敏票據(jù)打印機(jī);文本編輯;曲線打印
隨著智能手機(jī)的普及,手機(jī)APP的數(shù)量急速上升,同時(shí)一些便攜式藍(lán)牙設(shè)備的面市也更加拓寬了手機(jī)APP的應(yīng)用領(lǐng)域[1],因此手機(jī)APP開發(fā)已經(jīng)成為當(dāng)前一項(xiàng)很熱門的技術(shù)。但是要在手機(jī)APP中實(shí)現(xiàn)對(duì)藍(lán)牙設(shè)備的操控[2],靈活方便地使用這些設(shè)備的功能,則需要根據(jù)設(shè)備的底層操作命令進(jìn)行二次開發(fā)。因?yàn)榇蟛糠衷O(shè)備廠商所提供的最基本的接口函數(shù)很難滿足各種用戶的功能需求,這就給手機(jī)APP開發(fā)者帶來(lái)了一定的困難,增加了開發(fā)的工作量。
本文在華為MT7-TL10手機(jī)上,針對(duì)ZJ-5802藍(lán)牙微型熱敏票據(jù)打印機(jī)[3-4]開發(fā)了一個(gè)API,為用戶提供了功能豐富的對(duì)打印機(jī)操控更靈活、更方便的接口函數(shù)。
ZJ-5802藍(lán)牙熱敏票據(jù)打印機(jī)體積小、待機(jī)時(shí)間長(zhǎng),作為移動(dòng)打印設(shè)備,使用量很大,廠商為用戶提供了文本打印和圖片打印接口函數(shù),但是這些功能非常簡(jiǎn)單,僅僅能夠打印字符串、.txt文本文件和.png、.jpg圖片文件,并且還需要根據(jù)文件所在路徑修改函數(shù)中的相關(guān)語(yǔ)句,因此要滿足用戶各種打印需求,二次開發(fā)工作量還是很大的。本文通過(guò)解析打印機(jī)底層命令,在Android智能手機(jī)上設(shè)計(jì)開發(fā)了更加方便用戶二次開發(fā)的API。本API由文本編輯、文本打印、圖片打印、曲線打印、表格打印函數(shù)組成。
① 文本編輯函數(shù)提供了一個(gè)文本格式函數(shù)和一個(gè)文本編輯界面函數(shù)。文本格式函數(shù)是將打印機(jī)的底層命令集成在一個(gè)函數(shù)中;文本編輯界面函數(shù)提供了一個(gè)可視化的格式編輯操作環(huán)境。
② 文本打印函數(shù)可以打印字符串、.txt文件。
③ 圖片打印函數(shù)是調(diào)用了廠商提供的圖片打印函數(shù),可以打印.png、.jpg圖片文件。
④ 曲線打印函數(shù)可以將excel表格文件或.txt文本文件中的數(shù)據(jù)以曲線的形式打印出來(lái)。
⑤ 表格打印函數(shù)可以打印excel表格文件,但是設(shè)計(jì)excel表格時(shí)要考慮打印紙寬度的限制,ZJ-5802打印機(jī)紙的有效打印寬度為48 mm。
以上函數(shù)中圖片打印、字符串打印和.txt文件打印功能是調(diào)用了廠商提供的函數(shù),下面介紹本API中新開發(fā)函數(shù)的設(shè)計(jì)方法。
ZJ-5802打印機(jī)默認(rèn)的文本打印格式是普通小五號(hào)字體,若需要調(diào)整字符格式,需要向打印機(jī)發(fā)送字符串及設(shè)置字符串格式的命令[5]。當(dāng)打印的文本格式變化較多時(shí),編寫打印輸出代碼就比較繁瑣。API中設(shè)計(jì)了兩個(gè)文本編輯函數(shù),一個(gè)是文本格式函數(shù),將打印機(jī)所有文本格式底層命令集成到set_format函數(shù)中,調(diào)用函數(shù)時(shí)將打印輸出字符串及其格式放入輸入?yún)?shù)中即可,無(wú)需再查看格式命令表;另一個(gè)是文本編輯界面函數(shù)ui_edit,該函數(shù)提供了一個(gè)可視化文本編輯界面,編輯格式時(shí)只要點(diǎn)擊相應(yīng)的格式按鈕即可,不需要考慮格式命令或參數(shù)的定義。
2.1 文本格式函數(shù)設(shè)計(jì)
文本格式函數(shù)set_format(String printString,int downline,int font,int size,int aglin,int upsidedown,int white)中共有7個(gè)參數(shù),第1個(gè)參數(shù)是要打印的字符串,其余6個(gè)都是設(shè)置文本格式的參數(shù),每一個(gè)參數(shù)和一種打印機(jī)底層字符格式命令相對(duì)應(yīng)。字符格式命令見表1,函數(shù)輸入?yún)?shù)定義見表2。
表1 打印機(jī)底層字符格式命令表
表2 函數(shù)set_format中的參數(shù)定義表
表2中的參數(shù)2~7分別和表1中的命令1~6相對(duì)應(yīng),在函數(shù)set_format中這些參數(shù)都有相應(yīng)的文本格式定義語(yǔ)句,如參數(shù)2的文本格式定義語(yǔ)句如下:
if(downline == 1){ //downline值為1時(shí),加下劃線格式
byte[] down_line = {0x1D,0x21,0x11};
//將加下劃線命令放入數(shù)組down_line 中
mService.write(down_line);
//將數(shù)組down_line中的命令發(fā)送給打印機(jī)
}else{ //downline值為0時(shí),不發(fā)送格式命令
}
所有的格式定義完成后,最后輸出字符串到打印機(jī),這個(gè)字符串的打印格式由函數(shù)前面的格式定義語(yǔ)句所設(shè)置,打印輸出語(yǔ)句在函數(shù)的最后,其代碼為:
mService.sendMessage(printString);
//將字符串輸出到打印機(jī)
2.2 文本編輯界面函數(shù)設(shè)計(jì)
文本編輯界面函數(shù)ui_edit提供了圖1所示的界面,其中包含了所有文本編輯操作按鈕、打開文件、保存文件和打印按鈕。通過(guò)這個(gè)界面可以輸入文字,也可以點(diǎn)擊打開文件按鈕,將已有的.txt文件導(dǎo)入到文本框內(nèi)。對(duì)文本進(jìn)行格式編輯時(shí),只需要將光標(biāo)放置在某一行的任意位置,然后點(diǎn)擊編輯操作按鈕即可完成。例如要將圖2中第一行的漢字“溫度記錄表”設(shè)置為加粗、字體長(zhǎng)寬放大一倍及居中格式時(shí),將光標(biāo)放在這一行中,然后分別點(diǎn)擊上方的加粗、居中按鈕,點(diǎn)擊字號(hào)下拉框選擇“倍高倍寬”選項(xiàng)即可完成,如圖3所示。完成文本格式編輯后點(diǎn)擊打印按鈕可以直接打印輸出,也可以將編輯后的文件保存。
圖1 文本編輯界面
ui_edit函數(shù)是用Java語(yǔ)句編寫了圖1所示的界面,界面內(nèi)文本輸入框中的字符、下劃線、加粗、字號(hào)等操作按鈕分別與2.1節(jié)描述的set_format函數(shù)中對(duì)應(yīng)參數(shù)相關(guān)聯(lián),點(diǎn)擊某個(gè)按鈕,相當(dāng)于設(shè)置了set_fotmat函數(shù)的某個(gè)輸入?yún)?shù)值。文本框中的每一行都要生成一個(gè)List
圖2 導(dǎo)入文本后界面
圖3 文本編輯后界面
在很多應(yīng)用中需要打印數(shù)據(jù)曲線,但是調(diào)用廠商提供的接口函數(shù)或根據(jù)底層命令編程都無(wú)法實(shí)現(xiàn)這個(gè)功能,如果用截屏的方式將顯示的曲線保存為圖片再進(jìn)行打印,則會(huì)存在以下問(wèn)題:
① 打印速度較慢,因?yàn)榇蛴C(jī)要先將圖片轉(zhuǎn)換為位圖信息,然后再將逐行輸出打印像素點(diǎn)。
② 用不同手機(jī)打印效果會(huì)有不同,可能出現(xiàn)曲線較為模糊的情況。其原因主要有兩個(gè),一是打印機(jī)的DPI(Dots Per Inch,每英寸打印的點(diǎn)數(shù))和手機(jī)的PPI(Pixels Per Inch,每英寸顯示的像素個(gè)數(shù))不匹配;二是接口函數(shù)功能的局限性,如ZJ-5802打印機(jī)提供的圖片打印接口函數(shù)只能解析.png、.jpg格式的圖片,而對(duì)于.jpeg或其他格式的圖片解析效果較差。
③ 如果數(shù)據(jù)很多,數(shù)據(jù)曲線在手機(jī)屏上就需要滾動(dòng)顯示,多次截屏然后打印曲線顯然是件很麻煩的事情,實(shí)際應(yīng)用中可操作性差。
因此本文API中設(shè)計(jì)了曲線打印函數(shù)print_line(String uriString),將數(shù)據(jù)存放在excel表格文件或.txt文本文件中,調(diào)用本函數(shù)就可以將數(shù)據(jù)以曲線的形式快速打印出來(lái),函數(shù)的輸入?yún)?shù)String uriString是由“文件路徑/文件名”組成的字符串。
3.1 設(shè)計(jì)原理
打印機(jī)底層命令中有打印位圖命令,該命令多被應(yīng)用于打印自定義字符[6]。命令格式是0x1B,0x2A,m,nL,nH,d1,d2,…,dk。其中“0x1B,0x2A”為命令碼,m為位圖模式,取值為0、1、32、33,分別表示8點(diǎn)單密度模式、8點(diǎn)雙密度模式、24點(diǎn)單密度模式、24點(diǎn)雙密度模式;nL、nH用于計(jì)算水平方向打印點(diǎn)的個(gè)數(shù),計(jì)算公式為nL+nH×256,nL取值為0~255之間的整數(shù),nH取值為0、1、2、3,d1,d2,…,dk是打印點(diǎn)的位圖數(shù)據(jù),di是一個(gè)8位的二進(jìn)制數(shù),對(duì)應(yīng)打印紙上1列8個(gè)點(diǎn)中要打印那些點(diǎn)的二進(jìn)制值,k小于等于一行中最多打印點(diǎn)的個(gè)數(shù)。
打印曲線時(shí)要先確定一行打印點(diǎn)的個(gè)數(shù),然后從文件中讀取數(shù)據(jù),根據(jù)數(shù)據(jù)中最大值和最小值計(jì)算出曲線上每一個(gè)打印點(diǎn)位置值的范圍,并依次按比例計(jì)算出每一個(gè)數(shù)據(jù)在打印紙上的位置值,并將這個(gè)位置值轉(zhuǎn)換成位圖數(shù)據(jù)d1,d2,…,dk,然后向打印機(jī)發(fā)送打印位圖命令即可。
本API中選擇了8點(diǎn)單密度位圖模式,即m取值為0,該模式下打印機(jī)的最小出紙單位為8×192,即一次完成打印8行192列點(diǎn)陣。在打印曲線時(shí),如果只打印數(shù)據(jù)對(duì)應(yīng)的點(diǎn),就會(huì)出現(xiàn)曲線不連續(xù)的現(xiàn)象,為了打印出連續(xù)的曲線,則要在某些數(shù)據(jù)點(diǎn)附近插入一定的數(shù)值,使打印的曲線變得連續(xù)但又不改變曲線的輪廓。圖4所示的是打印紙上8×16點(diǎn)陣的打印點(diǎn),圖中標(biāo)記為Ai的黑點(diǎn)是數(shù)據(jù)在曲線上的點(diǎn)。從圖中可以看出,A2、A3、A4、A5之間和A7、A8之間不連續(xù),所以需要在它們之間插入打印點(diǎn),處理后的效果如圖5所示。
3.2 曲線打印結(jié)果對(duì)比
將同樣一組數(shù)據(jù)分別用圖片打印方法和本節(jié)描述的快速曲線打印方法進(jìn)行打印。
圖6、圖7分別是在索愛LT18i 手機(jī)和華為MT7-TL10手機(jī)上用截屏的方式將屏幕上顯示的曲線保存為圖片,然后再調(diào)用廠商提供的圖片打印接口函數(shù)輸出打印的曲線。索愛 LT18i手機(jī)屏幕的分辨率較低,且截屏圖片是.png格式,ZJ-5802打印機(jī)對(duì)這種格式的圖片解析效果較好,所以打印出的曲線圖片清晰,打印耗時(shí)約43 s;華為MT7-TL10手機(jī)屏幕的分辨率較高,且截屏圖片是.jpeg格式,ZJ-5802打印機(jī)對(duì)這種格式的圖片解析效果較差,打印的曲線較模糊,打印耗時(shí)約51 s。而近年上市的手機(jī)大多屏幕分辯率都較高,截屏的圖片多為.jpeg格式,所以用截屏的方式打印曲線不是一種好的選擇。在華為MT7-TL10手機(jī)和索愛 LT18i手機(jī)上用快速曲線打印的方法,直接讀取數(shù)據(jù)進(jìn)行打印,打印效果相同,如圖8所示,打印耗時(shí)約7 s。
圖4 只打印數(shù)據(jù)點(diǎn)的曲線
圖5 插入打印點(diǎn)后的連續(xù)曲線
圖6 索愛手機(jī)打印曲線圖
圖7 華為手機(jī)打印曲線圖
從圖中可以看出,圖8的清晰效果比圖6略差,主要是因?yàn)閳D8選用的是較為簡(jiǎn)單的8點(diǎn)單密度位圖模式,而圖6選用了更高密度的位圖模式。而在實(shí)際應(yīng)用需求中,打印曲線主要是用于觀察數(shù)據(jù)的變化趨勢(shì),圖8的曲線能夠滿足應(yīng)用需求,而且用不同的手機(jī)打印出的效果都一樣,也容易實(shí)現(xiàn)快速打印。
圖8 快速打印曲線
打印表格也是很多應(yīng)用中所需要的功能,但同樣無(wú)法直接調(diào)用廠商提供的接口函數(shù)或底層命令實(shí)現(xiàn),通過(guò)截屏的方式將表格保存為圖片再打印也同樣存在第3節(jié)中描述的問(wèn)題。本文API中設(shè)計(jì)了表格打印函數(shù)print_table(String uriString,int format),可實(shí)現(xiàn)快速打印excel表格的功能。函數(shù)print_table有2個(gè)輸入?yún)?shù),String uriString參數(shù)是由excel表格“文件路徑/文件名”組成的字符串,int format參數(shù)是對(duì)表格邊框格式的定義,取值為0、1、2、3,0表示不打印邊框,1表示打印表格四周邊框,2表示只打印橫邊框,3表示只打印豎邊框。
4.1 設(shè)計(jì)原理
將表格的內(nèi)容分為文字和邊框兩部分,再根據(jù)邊框的位置劃分為3種類型線段,如圖9所示。
圖9 表格邊框線段分類示意圖
類型1:橫邊框線,如圖9中①所示,線段①代表表格中所有的橫邊框線。
類型2:豎邊框線,如圖9中③所示,線段③代表表格中所有的豎邊框線。
類型3:如圖9中②、④、⑤所示的線段,②是連接表最上面橫線和它下面各條豎線的線段;④是上下單元格豎線之間的連接線;⑤是連接表最下面橫線和它上面各條豎線的線段。這些線段的使用是為了讓表格打印出來(lái)更美觀。
當(dāng)表格邊框格式設(shè)定為不打印邊框時(shí),所有邊框線段都不打??;設(shè)定為打印四周邊框時(shí),①~⑤線段均要打??;設(shè)定為打印橫向邊框時(shí),只打印線段①;設(shè)定為打印豎邊框時(shí),只打印線段③。
線段①、②、④、⑤都是以自定義字符形式輸出打印,線段③使用的是字庫(kù)中的字符“|”。
用戶要根據(jù)打印紙的寬度調(diào)整表格一行中的字符個(gè)數(shù),不能超出打印紙的寬度。本文以GB2312標(biāo)準(zhǔn)字庫(kù)中12×24 ASCII字符格式為例,ZJ-5802打印機(jī)一行最多可以打印384/12=32個(gè)字符,其中包括表示邊框中豎線線段的字符。
4.2 表格打印結(jié)果對(duì)比
將同樣的表格數(shù)據(jù)分別用圖片打印方法和本節(jié)描述的快速表格打印方法進(jìn)行打印。
圖10是在索愛 LT18i手機(jī)上使用截屏的方式將屏幕上顯示的表格保存為圖片,然后再調(diào)用廠商提供的圖片打印接口函數(shù)輸出打印的表格,打印時(shí)間約51 s。如果在華為MT7-TL10手機(jī)上使用這種方法打印表格,打印機(jī)無(wú)法解析.jpeg格式圖片,打印出來(lái)的是一張全部為黑色的圖片。在華為MT7-TL10手機(jī)和索愛 LT18i手機(jī)上用快速表格打印的方法,直接讀取表格數(shù)據(jù)進(jìn)行打印,打印效果相同,如圖11所示。
圖10 索愛手機(jī)打印表格圖
打印時(shí)間約5 s。通過(guò)比較可以看出,使用本文的表格打印函數(shù)打印出的表格更清晰,比用圖片打印方法打印速度快了10倍,而且也無(wú)需考慮Android智能手機(jī)的型號(hào),同時(shí)也不受手機(jī)屏幕大小的限制,可以打印有大量數(shù)據(jù)的表格。
[1] 羅富財(cái).基于Android平臺(tái)的藍(lán)牙通信系統(tǒng)的研究與實(shí)現(xiàn)[D].保定:華北電力大學(xué),2013.
[2] 張拓.基于Android平臺(tái)的藍(lán)牙應(yīng)用開發(fā)[J].信息與電腦,2015(18):64-67.
[3] 曲小龍,喬國(guó)凱,黃正茂.一種集成藍(lán)牙功能的卷式發(fā)票打印機(jī)[J].信息技術(shù)與信息化,2013(6):149-151.
[4] 劉生第.基于低功耗藍(lán)牙的針式打印機(jī)系統(tǒng)設(shè)計(jì)[D].大連:大連理工大學(xué),2013.
[5] 馮靜,庫(kù)少平,李捷.微型打印機(jī)打印技術(shù)分析[J].電子工程師,2006(11):56-58.
[6] 張偉東,許向南.微型打印機(jī)如何打印特殊字符[J].現(xiàn)代教育科學(xué),2010(S1):111-112.
李煥麗(碩士研究生)、李月香(教授),主要研究方向?yàn)榍度胧较到y(tǒng)應(yīng)用。
[9] 滿莎, 楊恢先, 彭友,等. 基于ARM9的嵌入式無(wú)線智能家居網(wǎng)關(guān)設(shè)計(jì)[J]. 計(jì)算機(jī)應(yīng)用, 2010, 30(9):2541-2544.
[10] 郝真鳴,趙男,梁鐵,等. 基于WiFi的智能樓宇監(jiān)控系統(tǒng)[J]. 測(cè)控技術(shù),2013(10):87-89,92.
[11] 王朝華, 陳德艷, 黃國(guó)宏,等. 基于Android的智能家居系統(tǒng)的研究與實(shí)現(xiàn)[D]. 廣州:廣東工業(yè)大學(xué), 2012.
[12] 莫太平,胡俊波,趙佩斯. 基于Android的智能家居系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 自動(dòng)化與儀表,2015(1):33-36.
[13] 邵鵬飛,王喆,張寶儒. 面向移動(dòng)互聯(lián)網(wǎng)的智能家居系統(tǒng)研究[J]. 計(jì)算機(jī)測(cè)量與控制,2012(2):474-476,479.
[14] 臧大進(jìn),劉增良,高干,等. 基于物聯(lián)網(wǎng)的智能家居系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J]. 襄樊學(xué)院學(xué)報(bào),2010(11):37-39,49.
戴宇培(碩士在讀),主要從事傳感器與控制研究;張鈺(本科在讀),主要從事計(jì)算機(jī)與通信研究;劉云飛(教授),主要從事信號(hào)處理方向的研究工作。
(責(zé)任編輯:楊迪娜 收稿日期:2016-08-24)
API Development of Bluetooth Receipt Printer Based on Android Mobile Phone
Li Huanli,Li Yuexiang
(School of Computer and Information Technology,Shanxi University,Taiyuan 030006,China)
With the practical advantages of receipt printer,the APIs are developed for Andorid mobile phone using Java language based on the fundamental functions of ZJ-5802 bluetooth receipt printer.The APIs have realized the functions,such as text editing and printing,fast printing of curve tables and images printing.Compared with the interface functions provided by the printer manufacturer,these APIs provide richer functions and better flexibility for operation.The development method shows a valuable scope for the similar software development.
Android mobile phone;Bluetooth thermal printer;text editing;curve printing
TP334.8
A
?士然
2016-08-22)