隨著(zhù)嵌入式處理器主頻的不斷提高,設計專(zhuān)門(mén)的嵌入式網(wǎng)絡(luò )打印服務(wù)器已經(jīng)成為共識。HP等很少的幾家打印機公司在幾年以前就推出了這樣的嵌入式設備,但基本上都只針對本公司特定的幾種打印機,無(wú)法做到通用。很多文獻,如參考文獻[1]、[2]中提到的設計方案不夠具體?;谶@些情況,設計并實(shí)現了一款基于Linux的嵌入式網(wǎng)絡(luò )打印服務(wù)器,硬件設計簡(jiǎn)單,軟件完全開(kāi)源,只要有Linux下的打印驅動(dòng),就可以支持。
1 總體方案設計
要把USB口打印機連人網(wǎng)絡(luò ),有兩種設計方案,一種是使用USB/以太網(wǎng)協(xié)議轉換器,另一種是設計一個(gè)帶有USB口和以太網(wǎng)網(wǎng)口(包含操作系統)的嵌入式設備。盡管協(xié)議轉換器軟硬件簡(jiǎn)單,但不支持多用戶(hù)同時(shí)并發(fā)打印,也就無(wú)法實(shí)現共享打印的要求。
1.1 硬件設計
筆者是在中科院計算所自主研制基于龍芯1號核的“聚芯SoC”1000C上實(shí)驗的,主頻266 MHz。作為產(chǎn)品,只需要提供電源接口、USB口和以太網(wǎng)口。調試階段,增加串口和JTAG調試接口??紤]到多用戶(hù)并發(fā)打印的負載和實(shí)際測試效果,因為移植的開(kāi)源軟件有很多依賴(lài)庫,所占空間較大,故選用的是1 GB容量的Flash。打印過(guò)程中,打印文件在內存中緩存,為了應對較大的打印文件和提高運行速度,建議選擇256 MB以上的SDRAM。嵌入式網(wǎng)絡(luò )打印服務(wù)器硬件結構框圖如圖1所示。
1.2 軟件設計
軟件設計是整個(gè)系統設計的重點(diǎn),也是難點(diǎn)。在設計思想上,強調盡可能使用開(kāi)源軟件,主要是為了縮短研發(fā)周期并能保證打印系統的可靠性和穩定性。操作系統選擇目前主流的Linux操作系統。Linux操作系統下的打印控制系統根據打印機的命令方式,分為文本打印機、Post-Script打印機和其他種類(lèi)。文本打印機不需要驅動(dòng)程序,就可以直接用cat命令驅動(dòng)打印機,但只能打印英文,已很少使用。PostScript(簡(jiǎn)稱(chēng)PS)是一種繪圖能力很強的解釋性腳本語(yǔ)言,由Adobe公司制定。它因占用系統資源少,處理過(guò)程標準化與設備無(wú)關(guān)而被廣泛應用。直接支持PostScript的打印機通常都是比較高級的辦公打印機,對于這類(lèi)打印機來(lái)說(shuō),PS語(yǔ)言是它們和計算機之間溝通的最簡(jiǎn)便的方式,應用程序可以將生成的PS文檔直接發(fā)給打印機打印。但大多數情況下使用的是各種比較低檔的,不能直接支持PostScript的打印機,這類(lèi)打印機只能識別各廠(chǎng)家自己的指令集
因此,必須采取一種機制,把PostScript格式轉換成打印機能夠識別的命令格式,而GhostScript程序就是用來(lái)完成這個(gè)工作的。Ghostscript將PostScript轉換成各種打印機能夠識別的格式。
打印機驅動(dòng)程序是應用軟件與打印機之間交流的橋梁,它可以將轉化好的打印文件,按照各種打印機不同的格式發(fā)送給打印機,因此不同的打印機都有自己特有的打印驅動(dòng)程序。另外,隨驅動(dòng)程序一起發(fā)布的還有PPD文檔,PPD(PostScript Printer Description)是用來(lái)描述打印機功能的文件,里面包含了字體、打印頁(yè)面等的一些描述。在使用一款打印機之前,必須找到其相應的PPD文件,并正確地安裝到打印管理器程序上。筆者所用打印機為HP 1020plus激光打印機,CUPS不附帶此驅動(dòng),只能另行安裝。
為了讓不同的作業(yè)在打印的時(shí)候不產(chǎn)生沖突,就需要一個(gè)打印管理程序。這類(lèi)管理程序很多,使用最為廣泛的莫過(guò)于CUPS。CUPS接收要打印的文件;通過(guò)文件的類(lèi)型判斷是否需要將其轉換為PostScript,如果需要,則調用相應的應用程序進(jìn)行轉換;通過(guò)PPD文件來(lái)判斷Ghost-Script應使用何種驅動(dòng)處理此PostScript文件;把Ghost-Script處理的結果輸出到打印設備上。
在打印管理程序和Ghostscript之間,通常還安裝一種統一的打印過(guò)濾器程序foomatic-rip。它是用perl編寫(xiě)的腳本程序,打印管理程序通過(guò)它調用Ghostscript程序,從而把PostScript作業(yè)轉換成PPD文件描述的打印機自身能夠識別的格式。
2 幾個(gè)關(guān)鍵問(wèn)題
2.1 軟件的交叉編譯
由前面的分析可知,打印服務(wù)器需要的開(kāi)源軟件支持,為了運行于嵌入式Linux環(huán)境,需要對它們一一進(jìn)行交叉編譯。通常的編譯方法是在宿主機上進(jìn)行,筆者在反復實(shí)驗后不得不放棄,原因在于這些開(kāi)源軟件還依賴(lài)于很多的其他軟件包。建議編譯安裝直接在開(kāi)發(fā)板上進(jìn)行,雖然速度較慢,但可以及時(shí)發(fā)現缺少的包。此編譯過(guò)程大約需要一周的時(shí)間。
①CUPS的編譯與安裝:
2.2 CGI程序的編寫(xiě)
嵌入式網(wǎng)絡(luò )設備通常都提供web管理方式,用以修改配置等。以修改IP地址為例,需要修改源碼目錄下的cgi—bin子目錄下的admin.c文件,參照do_am_printer()函數新增函數do_modify_ip,此函數的功能為讀取IP地址所在的配置文件,將IP地址、子網(wǎng)掩碼、默認網(wǎng)關(guān)等顯示在頁(yè)面文本框中,允許修改,提交修改時(shí)該函數將新的參數覆蓋原配置文件中舊的參數。為實(shí)現這一功能,主要用到了CUPS提供的文件操作函數cupsFileGets、cupsFi-leOpen、cupsFilePrintf,和有關(guān)CGI變量的讀寫(xiě)函數cgiGetVariable、cgiSetVariable和界面的顯示函數cgiStartHTM如IP地址L(title)、cgiCopyTemplateLang("error_ip.tmpl")、cgiEndHTML()。有關(guān)文件的讀寫(xiě)操作,可參照CUPS目錄下的testfile.c文件。
2.3 界面和提示語(yǔ)言漢化
CUPS支持多國語(yǔ)言版本,如果漢化,需要對界面標識、提示、按鈕等全面進(jìn)行漢化,