基于Android手机的蓝牙票据打印机API开发
2017-04-19李焕丽李月香
李焕丽,李月香
(山西大学 计算机与信息技术学院,太原 030006)
基于Android手机的蓝牙票据打印机API开发
李焕丽,李月香
(山西大学 计算机与信息技术学院,太原 030006)
本文针对微型票据打印机的应用特点,解析了ZJ-5802蓝牙微型票据打印机的底层功能,用Java语言开发了基于Android手机的API。此API具有文本编辑和打印、快速曲线打印、表格打印、图片打印等功能,与打印机生产商提供的接口函数相比较,功能更丰富,对打印机的操控更为方便、灵活。本文开发硬件设备底层功能的方法对于软件开发者具有重要的参考价值。
Android手机;蓝牙热敏票据打印机;文本编辑;曲线打印
引 言
随着智能手机的普及,手机APP的数量急速上升,同时一些便携式蓝牙设备的面市也更加拓宽了手机APP的应用领域[1],因此手机APP开发已经成为当前一项很热门的技术。但是要在手机APP中实现对蓝牙设备的操控[2],灵活方便地使用这些设备的功能,则需要根据设备的底层操作命令进行二次开发。因为大部分设备厂商所提供的最基本的接口函数很难满足各种用户的功能需求,这就给手机APP开发者带来了一定的困难,增加了开发的工作量。
本文在华为MT7-TL10手机上,针对ZJ-5802蓝牙微型热敏票据打印机[3-4]开发了一个API,为用户提供了功能丰富的对打印机操控更灵活、更方便的接口函数。
1 API设计概述
ZJ-5802蓝牙热敏票据打印机体积小、待机时间长,作为移动打印设备,使用量很大,厂商为用户提供了文本打印和图片打印接口函数,但是这些功能非常简单,仅仅能够打印字符串、.txt文本文件和.png、.jpg图片文件,并且还需要根据文件所在路径修改函数中的相关语句,因此要满足用户各种打印需求,二次开发工作量还是很大的。本文通过解析打印机底层命令,在Android智能手机上设计开发了更加方便用户二次开发的API。本API由文本编辑、文本打印、图片打印、曲线打印、表格打印函数组成。
① 文本编辑函数提供了一个文本格式函数和一个文本编辑界面函数。文本格式函数是将打印机的底层命令集成在一个函数中;文本编辑界面函数提供了一个可视化的格式编辑操作环境。
② 文本打印函数可以打印字符串、.txt文件。
③ 图片打印函数是调用了厂商提供的图片打印函数,可以打印.png、.jpg图片文件。
④ 曲线打印函数可以将excel表格文件或.txt文本文件中的数据以曲线的形式打印出来。
⑤ 表格打印函数可以打印excel表格文件,但是设计excel表格时要考虑打印纸宽度的限制,ZJ-5802打印机纸的有效打印宽度为48 mm。
以上函数中图片打印、字符串打印和.txt文件打印功能是调用了厂商提供的函数,下面介绍本API中新开发函数的设计方法。
2 文本编辑函数设计
ZJ-5802打印机默认的文本打印格式是普通小五号字体,若需要调整字符格式,需要向打印机发送字符串及设置字符串格式的命令[5]。当打印的文本格式变化较多时,编写打印输出代码就比较繁琐。API中设计了两个文本编辑函数,一个是文本格式函数,将打印机所有文本格式底层命令集成到set_format函数中,调用函数时将打印输出字符串及其格式放入输入参数中即可,无需再查看格式命令表;另一个是文本编辑界面函数ui_edit,该函数提供了一个可视化文本编辑界面,编辑格式时只要点击相应的格式按钮即可,不需要考虑格式命令或参数的定义。
2.1 文本格式函数设计
文本格式函数set_format(String printString,int downline,int font,int size,int aglin,int upsidedown,int white)中共有7个参数,第1个参数是要打印的字符串,其余6个都是设置文本格式的参数,每一个参数和一种打印机底层字符格式命令相对应。字符格式命令见表1,函数输入参数定义见表2。
表1 打印机底层字符格式命令表
表2 函数set_format中的参数定义表
表2中的参数2~7分别和表1中的命令1~6相对应,在函数set_format中这些参数都有相应的文本格式定义语句,如参数2的文本格式定义语句如下:
if(downline == 1){ //downline值为1时,加下划线格式
byte[] down_line = {0x1D,0x21,0x11};
//将加下划线命令放入数组down_line 中
mService.write(down_line);
//将数组down_line中的命令发送给打印机
}else{ //downline值为0时,不发送格式命令
}
所有的格式定义完成后,最后输出字符串到打印机,这个字符串的打印格式由函数前面的格式定义语句所设置,打印输出语句在函数的最后,其代码为:
mService.sendMessage(printString);
//将字符串输出到打印机
2.2 文本编辑界面函数设计
文本编辑界面函数ui_edit提供了图1所示的界面,其中包含了所有文本编辑操作按钮、打开文件、保存文件和打印按钮。通过这个界面可以输入文字,也可以点击打开文件按钮,将已有的.txt文件导入到文本框内。对文本进行格式编辑时,只需要将光标放置在某一行的任意位置,然后点击编辑操作按钮即可完成。例如要将图2中第一行的汉字“温度记录表”设置为加粗、字体长宽放大一倍及居中格式时,将光标放在这一行中,然后分别点击上方的加粗、居中按钮,点击字号下拉框选择“倍高倍宽”选项即可完成,如图3所示。完成文本格式编辑后点击打印按钮可以直接打印输出,也可以将编辑后的文件保存。
图1 文本编辑界面
ui_edit函数是用Java语句编写了图1所示的界面,界面内文本输入框中的字符、下划线、加粗、字号等操作按钮分别与2.1节描述的set_format函数中对应参数相关联,点击某个按钮,相当于设置了set_fotmat函数的某个输入参数值。文本框中的每一行都要生成一个List
图2 导入文本后界面
图3 文本编辑后界面
3 曲线打印函数设计
在很多应用中需要打印数据曲线,但是调用厂商提供的接口函数或根据底层命令编程都无法实现这个功能,如果用截屏的方式将显示的曲线保存为图片再进行打印,则会存在以下问题:
① 打印速度较慢,因为打印机要先将图片转换为位图信息,然后再将逐行输出打印像素点。
② 用不同手机打印效果会有不同,可能出现曲线较为模糊的情况。其原因主要有两个,一是打印机的DPI(Dots Per Inch,每英寸打印的点数)和手机的PPI(Pixels Per Inch,每英寸显示的像素个数)不匹配;二是接口函数功能的局限性,如ZJ-5802打印机提供的图片打印接口函数只能解析.png、.jpg格式的图片,而对于.jpeg或其他格式的图片解析效果较差。
③ 如果数据很多,数据曲线在手机屏上就需要滚动显示,多次截屏然后打印曲线显然是件很麻烦的事情,实际应用中可操作性差。
因此本文API中设计了曲线打印函数print_line(String uriString),将数据存放在excel表格文件或.txt文本文件中,调用本函数就可以将数据以曲线的形式快速打印出来,函数的输入参数String uriString是由“文件路径/文件名”组成的字符串。
3.1 设计原理
打印机底层命令中有打印位图命令,该命令多被应用于打印自定义字符[6]。命令格式是0x1B,0x2A,m,nL,nH,d1,d2,…,dk。其中“0x1B,0x2A”为命令码,m为位图模式,取值为0、1、32、33,分别表示8点单密度模式、8点双密度模式、24点单密度模式、24点双密度模式;nL、nH用于计算水平方向打印点的个数,计算公式为nL+nH×256,nL取值为0~255之间的整数,nH取值为0、1、2、3,d1,d2,…,dk是打印点的位图数据,di是一个8位的二进制数,对应打印纸上1列8个点中要打印那些点的二进制值,k小于等于一行中最多打印点的个数。
打印曲线时要先确定一行打印点的个数,然后从文件中读取数据,根据数据中最大值和最小值计算出曲线上每一个打印点位置值的范围,并依次按比例计算出每一个数据在打印纸上的位置值,并将这个位置值转换成位图数据d1,d2,…,dk,然后向打印机发送打印位图命令即可。
本API中选择了8点单密度位图模式,即m取值为0,该模式下打印机的最小出纸单位为8×192,即一次完成打印8行192列点阵。在打印曲线时,如果只打印数据对应的点,就会出现曲线不连续的现象,为了打印出连续的曲线,则要在某些数据点附近插入一定的数值,使打印的曲线变得连续但又不改变曲线的轮廓。图4所示的是打印纸上8×16点阵的打印点,图中标记为Ai的黑点是数据在曲线上的点。从图中可以看出,A2、A3、A4、A5之间和A7、A8之间不连续,所以需要在它们之间插入打印点,处理后的效果如图5所示。
3.2 曲线打印结果对比
将同样一组数据分别用图片打印方法和本节描述的快速曲线打印方法进行打印。
图6、图7分别是在索爱LT18i 手机和华为MT7-TL10手机上用截屏的方式将屏幕上显示的曲线保存为图片,然后再调用厂商提供的图片打印接口函数输出打印的曲线。索爱 LT18i手机屏幕的分辨率较低,且截屏图片是.png格式,ZJ-5802打印机对这种格式的图片解析效果较好,所以打印出的曲线图片清晰,打印耗时约43 s;华为MT7-TL10手机屏幕的分辨率较高,且截屏图片是.jpeg格式,ZJ-5802打印机对这种格式的图片解析效果较差,打印的曲线较模糊,打印耗时约51 s。而近年上市的手机大多屏幕分辩率都较高,截屏的图片多为.jpeg格式,所以用截屏的方式打印曲线不是一种好的选择。在华为MT7-TL10手机和索爱 LT18i手机上用快速曲线打印的方法,直接读取数据进行打印,打印效果相同,如图8所示,打印耗时约7 s。
图4 只打印数据点的曲线
图5 插入打印点后的连续曲线
图6 索爱手机打印曲线图
图7 华为手机打印曲线图
从图中可以看出,图8的清晰效果比图6略差,主要是因为图8选用的是较为简单的8点单密度位图模式,而图6选用了更高密度的位图模式。而在实际应用需求中,打印曲线主要是用于观察数据的变化趋势,图8的曲线能够满足应用需求,而且用不同的手机打印出的效果都一样,也容易实现快速打印。
图8 快速打印曲线
4 表格打印函数设计
打印表格也是很多应用中所需要的功能,但同样无法直接调用厂商提供的接口函数或底层命令实现,通过截屏的方式将表格保存为图片再打印也同样存在第3节中描述的问题。本文API中设计了表格打印函数print_table(String uriString,int format),可实现快速打印excel表格的功能。函数print_table有2个输入参数,String uriString参数是由excel表格“文件路径/文件名”组成的字符串,int format参数是对表格边框格式的定义,取值为0、1、2、3,0表示不打印边框,1表示打印表格四周边框,2表示只打印横边框,3表示只打印竖边框。
4.1 设计原理
将表格的内容分为文字和边框两部分,再根据边框的位置划分为3种类型线段,如图9所示。
图9 表格边框线段分类示意图
类型1:横边框线,如图9中①所示,线段①代表表格中所有的横边框线。
类型2:竖边框线,如图9中③所示,线段③代表表格中所有的竖边框线。
类型3:如图9中②、④、⑤所示的线段,②是连接表最上面横线和它下面各条竖线的线段;④是上下单元格竖线之间的连接线;⑤是连接表最下面横线和它上面各条竖线的线段。这些线段的使用是为了让表格打印出来更美观。
当表格边框格式设定为不打印边框时,所有边框线段都不打印;设定为打印四周边框时,①~⑤线段均要打印;设定为打印横向边框时,只打印线段①;设定为打印竖边框时,只打印线段③。
线段①、②、④、⑤都是以自定义字符形式输出打印,线段③使用的是字库中的字符“|”。
用户要根据打印纸的宽度调整表格一行中的字符个数,不能超出打印纸的宽度。本文以GB2312标准字库中12×24 ASCII字符格式为例,ZJ-5802打印机一行最多可以打印384/12=32个字符,其中包括表示边框中竖线线段的字符。
4.2 表格打印结果对比
将同样的表格数据分别用图片打印方法和本节描述的快速表格打印方法进行打印。
图10是在索爱 LT18i手机上使用截屏的方式将屏幕上显示的表格保存为图片,然后再调用厂商提供的图片打印接口函数输出打印的表格,打印时间约51 s。如果在华为MT7-TL10手机上使用这种方法打印表格,打印机无法解析.jpeg格式图片,打印出来的是一张全部为黑色的图片。在华为MT7-TL10手机和索爱 LT18i手机上用快速表格打印的方法,直接读取表格数据进行打印,打印效果相同,如图11所示。
图10 索爱手机打印表格图
打印时间约5 s。通过比较可以看出,使用本文的表格打印函数打印出的表格更清晰,比用图片打印方法打印速度快了10倍,而且也无需考虑Android智能手机的型号,同时也不受手机屏幕大小的限制,可以打印有大量数据的表格。
结 语
[1] 罗富财.基于Android平台的蓝牙通信系统的研究与实现[D].保定:华北电力大学,2013.
[2] 张拓.基于Android平台的蓝牙应用开发[J].信息与电脑,2015(18):64-67.
[3] 曲小龙,乔国凯,黄正茂.一种集成蓝牙功能的卷式发票打印机[J].信息技术与信息化,2013(6):149-151.
[4] 刘生第.基于低功耗蓝牙的针式打印机系统设计[D].大连:大连理工大学,2013.
[5] 冯静,库少平,李捷.微型打印机打印技术分析[J].电子工程师,2006(11):56-58.
[6] 张伟东,许向南.微型打印机如何打印特殊字符[J].现代教育科学,2010(S1):111-112.
李焕丽(硕士研究生)、李月香(教授),主要研究方向为嵌入式系统应用。
[9] 满莎, 杨恢先, 彭友,等. 基于ARM9的嵌入式无线智能家居网关设计[J]. 计算机应用, 2010, 30(9):2541-2544.
[10] 郝真鸣,赵男,梁铁,等. 基于WiFi的智能楼宇监控系统[J]. 测控技术,2013(10):87-89,92.
[11] 王朝华, 陈德艳, 黄国宏,等. 基于Android的智能家居系统的研究与实现[D]. 广州:广东工业大学, 2012.
[12] 莫太平,胡俊波,赵佩斯. 基于Android的智能家居系统的设计与实现[J]. 自动化与仪表,2015(1):33-36.
[13] 邵鹏飞,王喆,张宝儒. 面向移动互联网的智能家居系统研究[J]. 计算机测量与控制,2012(2):474-476,479.
[14] 臧大进,刘增良,高干,等. 基于物联网的智能家居系统设计与实现[J]. 襄樊学院学报,2010(11):37-39,49.
戴宇培(硕士在读),主要从事传感器与控制研究;张钰(本科在读),主要从事计算机与通信研究;刘云飞(教授),主要从事信号处理方向的研究工作。
(责任编辑:杨迪娜 收稿日期: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)