王靈芝,蘭善燦
(閩南師范大學物理與信息工程學院,福建漳州 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