王灵芝,兰善灿
(闽南师范大学物理与信息工程学院,福建漳州 363000)
基于Android的无线打印系统的设计与实现
王灵芝,兰善灿
(闽南师范大学物理与信息工程学院,福建漳州 363000)
本文以Android为平台构建无线智能打印系统,系统设计包含基于Cortex-A9为控制核心的服务器和APP两部分。移动终端通过WiFi将需要打印的文档发送至服务器端,该服务器通过USB与打印机连接,从而实现无线智能打印。通过移植Ghostscript及Hpijs工具实现了对惠普Deskjet1050打印机的驱动。
Android;Cortex-A9;WiFi;USB;打印机
传统的打印机需借助PC机及相应软件进行驱动打印。随着Android系统及WiFi热点的普及,借助移动终端通过无线局域网的方式,摆脱传统PC直接打印成为新的行业需求[1]。
本文设计了基于嵌入式技术的无线打印终端系统,包含基于Cortex-A9为核心的服务器和APP两部分。打印机通过USB与服务器相连,实现对打印机的控制及数据传送;手机、平板等基于Andorid系统的智能移动终端通过WiFi接入局域网,将需要打印的文档发送至服务器。系统终端通过文本格式转换工具将接收到的文件转换成打印机识别的语言发送给打印机。该设计的实现为局域网上的所有用户提供了方便快捷的共享打印方式,有效地提高了打印效率。
打印机系统终端的设计以三星Exyson4412为核心控制平台。该处理器为基于Cortex-A9的四核处理器,主频可达1.4GHz。系统配备1GB双通道DDR3,4GB固态硬盘EMMC存储空间,可支持Linux 3.5或Android4.2的内核版本。采用S5M8767电源管理芯片为系统提供多种工作电压。采用DM9621以太网控制芯片连接无线路由器接入局域网;使用芯片GM8285C实现RGB信号到LVDS信号的转换;采用USB3503控制芯片与USB打印机相连;打印系统终端将接收的文件经上层应用执行格式转换后发送打印命令至USB打印机执行打印。打印系统终端设计整体框图如图1所示。
Android嵌入式系统开发环境的搭建与标准的Linux开发环境相类似[2],包括交叉编译环境、Linux 3.0.15内核的配置移植、Android 4.0.3系统的编译移植以及Android文件系统的移植[3]。步骤如下:第一,使用交叉编译工具链arm-linux-4.4.1作为交叉编译工具;第二,对u-boot-2010.03版本的源码进行编译移植;第三,配置Linux 3.0.15内核,添加对USB打印机的支持;第四,对Android 4.0.3系统进行编译移植生成system.img、ramdisk.img、userdata.img的镜像文件;第五,对上述四个步骤编译生成的uboot、Linux内核镜像zImage及Android 4.0.3的镜像文件ramdisk、system文件,完成系统开发环境搭建[4];第六,Android系统中使用的是自带的精简Toolbox工具,功能比较简单,在Android底层开发的时候非常不便,需在Android下添加BusyBox对工具命令的支持。采用在Toolbox的基础上新增BusyBox脚本内容的解决方案,可通过安装BusyBox Pro工具箱自动完成脚本的添加[5]。
图1 打印机系统终端设计框图
目前,业界标准的两种打印机语言分别是Adobe公司的PostScript(PS)语言和惠普公司的PCL语言。在Linux中,PS语言主要用于打印的接口,打印文件时,应用程序会把相应的文件转化成PS格式文件。系统终端打印机设备选型为惠普Deskjet1050喷墨打印机,该款打印机支持惠普打印机标准页面描述语言PCL3。但是惠普打印机并不能够直接识别PS文件,因此需使用文件过滤器进行转换[6]。
Ghostscript是一套建基于Adobe、PostScript及可移植文档格式(PDF)的页面描述语言等编译成的免费软件,可用于文件格式转换器,将打印系统终端需要打印的PDF及PS格式的文件转换成打印机能够支持的位图文件。
惠普喷墨打印机驱动程序项目(Hpijs)是基于GNU自由软件开发的打印机驱动程序,可以将RGB等位图格式的文件内容转换成惠普打印机识别的PCL语言。在本设计中采用Ghostscript+Hpijs方案最终实现对打印机语言的转换,打印机驱动层次架构如图2所示。
图2 基于ARM的打印机驱动层次架构图
3.1 Ghostscript 9.04的编译移植
设计方案中采用的是Ghostscript 9.04版本的编译脚本,该版本对文件的处理功能完善,编译出的脚本内存相对于高版本要小,其脚本编译后自带字库,为脚本工具的移植节省了内存空间。由于Android的文件系统没有相应的层次结构标准,因此在移植的过程中需创建/tmp及/usr目录,以下是gs脚本交叉编译过程:
(1)下载Ghostscript 9.04源码,并解压:
#wget http://iweb.dl.sourceforge.net/project/ghostscript
/GPL%20Ghostscript/9.04/ghostscript-9.04.tar.gz
(2)分别复制更名保存为PC版本和ARM版本:
#cp ghostscript-9.04 ghostscript-9.04-arm -r && mv ghostscript-9.04 ghostscript-9.04-pc
(3)编译PC版本:
#cd ghostscript-9.04-pc &&./configure && make XCFLAGS=-DHAVE_SYS_TIME_H=1
修改Makefile.in文件中代码将STDLIBS=@PTHREAD_LIBS@ -lm
修改为STDLIBS=@PTHREAD_LIBS@ -static -lm,
#cd ../ ghostscript-9.04-arm && sed -i’387s/STDLIBS=@PTHREAD_LIBS@ -lm/STDLIBS=@PTHREAD_LIBS@ -static -lm/’ ./Makefile.in
(4)编译Android版本:
手动建立tmp目录:选用/data/misc/printer/tmp/目录作为/tmp目录,更改ghostscript-9.04-arm版本下/base/gp_unifs.c中的tmp/目录。
调整/usr文件夹:在配置ghostscript时添加:--prefix=/system/,命令如下:
#./configure--host=arm-linux--prefix=/system/usr/--disable-fontconfig--disable-gtk--disable-cups
(5)复制PC版本工具:
复制/obj/aux/文件夹中genarch、genconf、echogs、mkromfs工具到ARM版本的/obj/aux/文件夹下。
#mkdir -p obj/aux/
#cp ../ghostscript-9.04-pc/obj/aux/genarch ../ghostscript-9.04-pc/obj/aux/genconf ../ghostscript-9.04-pc/obj/aux/echogs ../ghostscript-9.04-pc/obj/aux/mkromfs ./obj/aux/
(6)交叉编译基于ARM的gs脚本:
#make XCFLAGS=-DHAVE_SYS_TIME_H=1
#DESTDIR=${PWD}/_install
#make install DESTDIR=${DESTDIR}
#rm -rf ${DESTDIR}/system/usr/share/ghostscript/9.04/doc
#rm -rf ${DESTDIR}/system/usr/share/ghostscript/9.04/examples
#cd ${DESTDIR}/system/usr/bin && rm -f !(gs) && cd-
#cd ${DESTDIR}/ && tar cvzf gs904.tar.gz system/
(7)将压缩生成的gs904.tar.gz文件Push到Android系统根目录下解压,自动安装完成gs脚本文件的移植。
3.2 Hpijs的编译移植
移植方案采用Hpijs-2.1.4的源码编译。以下是Hpijs交叉编译过程。
(1)下载Hpijs-2.1.4源码并解压;
(2)配置Hpijs,配置命令如下:
#./configure--host=arm-linux--target=arm-linux--build=i686-linux CC=arm-linux-gcc CXX=arm-linux-g++LD=arm-linux-ld RANLIB=arm-linux-ranlib AR=arm-linux-ar CXXFLAGS="-static-g-O2"--prefix=/system/LDFLAGS=-L../jpeg-8b/.libs
(3)编译并安装:
#DESTDIR=${PWD}/_install
#make && make install DESTDIR=$DESTDIR
#tar cvzf hpijs.tar.gz system/
(4)编译并安装:
将生成的hpijs.tar.gz压缩文件Push到Android系统根目录下,解压自动安装到目标板上,完成hpijs的编译移植。
3.3 测试打印功能
(1)Android中创建设备节点:
在系统插入打印机后会在ueventd中自动创建设备节点/dev/usb/usb1-3.3(usb1-3.3设备名由device path指定)。为了获取访问该设备的权限,需修改/system/core/rootdir下的ueventd.rc文件指定权限,添加:/dev/usb/usb1-3.3 0666 system system.
使用gs脚本工具和hpijs软件将/data目录下的test.pdf文件转换生成test.PCL3GUI格式的打印语言。
(2)将pdf格式文件通push到目标板的/data目录下,进入/data目录,在当前目录下执行文件格式转换命令:
#gs-sDEVICE=ijs-sIjsServer=hpijs-dIjsUseOutputFD-sDeviceManufacturer="HEWLETT-PACKARD"-sDeviceModel="deskjet 5550"-r300x300-dNOPAUSE-dSAFER-sstdout=%stderr-sOutputFile=%stdout/data/test.pdf-c quit>/data/test.PCL3GUI
(3)将上述转换的test.PCL3GUI格式的文件通过命令:
#cat/data/test.PCL3GUI>/dev/usb/usb1-3.3将打印文件发送至设备节点,打印机设备接收到命令执行打印。
test.pdf
tiger.ps
tombstones
user
wifi
/data/test.pdf-c quit > /data/test.PCL3GUI
GPL Ghostscript 9.04 (2011-08-05)
Copyright (c) 2011 Artifex Software,Inc.All rights reserved.
This software comes with NO WARRANTY:see the file PUBLIC for detail.
Processing pages 1 through 1.
Page 1
Substituting font Times-Roman for TimesNewRomanPSMT.
Loading NimbusRomNo9L-Regu font from rom Resource/Font/nimbusRomNo9L-Regu... 2739620 1435700 185
8156 557464 3 done.
resource-cache
system
test.PCL3GUI
test.pdf
tiger.ps
tombstones
图3 文件格式转换过程
应用程序是基于Android开发的,包括服务器端及客户端程序。主要实现客户端到服务器端的文件传输,其次服务器端将接收到的文件进行文件格式转换后再将文件发送给打印机打印。客户端与服务器端基于TCP协议通过Socket通信[7-9]。
客户端APP自动搜索路径“/storage/emulated/0/”下包含的打印文件,输入服务器端IP后就可传输文件。服务器端APP主要实现接入网络、转换文件格式及执行打印。系统可支持的文件类型有.pdf、.txt、.xls、.doc、.ppt等。UI界面如图4和图5所示。
在Android应用层通过调用ProcessBuilder函数执行脚本命令,实现打印操作。具体实现核心代码如下:
private final String shell11 = "gs -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HP"-sDeviceModel="deskjet 5550" -r300x300 -dNOPAUSE -dSAFER -sstdout=%stderr -sOutputFile=- - < "; //执行文件转换的命令
private final String shell12 = "/test.ps > /dev/usb/usb1-3.3";//发送执行打印的命令
private final String shell13 = "/test.pdf > /dev/usb/usb1-3.3"
......
public void startInternet(){
ProcessBuilder pb = new ProcessBuilder("/system/bin/sh");
out.println(netShell1);//执行操作命令
out.println(netShell2);
out.println(netShell3);
out.println("exit");
......
}
图4 客户端界面设计
图5 服务器端界面设计
本文详细介绍了以Android为平台构建的无线智能打印系统,对Cortex-A9为控制核心的服务器的硬件组成与软件设计进行阐述。对惠普Deskjet1050打印机驱动的移植做了详细的说明。最终实现了手机、平板等Android智能设备终端通过WiFi进行无线智能打印的功能。
[1]陈剑,陈华政.基于Android平台的无线打印模块设计[J].单片机与嵌入式系统应用,2013(8):67-69.
[2]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008:29-30.
[3]王超.基于Cortex_A8的Android系统分析与移植[D].太原:太原理工大学,2014.
[4]赵峙岳.基于WiFi无线网络的嵌入式打印终端的设计[D].广州:华南理工大学,2011.
[5]王卫华.为机器人配把瑞士军刀 解说安卓4.0安装BusyBox[J].电脑迷,2012(13):54.
[6]李军.基于ARM的嵌入式网络打印适配器的研制[D].上海:上海交通大学,2007.
[7]陈文,郭一正.深入理解Android网络编程[M].北京:机械工业出版社,2013:39-45.
[8]苗振兴,马幼鸣,周鸣争.基于Android平台的WiFi文件传输系统的设计[J].长江大学学报:自然科学版,2013(7):17-20.
[9]蒋敏,单家芳,孔军.基于Socket的多平台通信研究[J].计算机工程与应用,2005(36):135-141.
USB Printer System Terminal Design Based on Android
WANG Ling-zhi,LAN Shan-can
(Department of Physics and Electronic Information Engineering, Minnan Normal University, Zhangzhou Fujian 363000,China)
Based on Android platform, a wireless smart printing system is developed. The system consists of a Cortex-A9-based on server and an application software (APP). Through WiFi, the mobile terminal sends the documents to the server, which connects with a printer via a USB interface. Then the wireless smart print is realized. By transplanting the Ghostscript and Hpijs tools,HP Deskjet 1050 printer can be drived successfully.
Android; Cortex-A9; WiFi; USB; printer
2016-05-06
福建省中青年教师教育科研项目“基于对数微分法的多电容同步测量系统研究”(JA15319);闽南师范大学教改项目“基于物联网的嵌入式系统课程群建设”(JG2015)。
王灵芝(1981- ),女,讲师,硕士,从事物联网、嵌入式系统研究。
TP334
A
2095-7602(2016)12-0039-05