朱嶸濤,徐愛鈞,肖榮華
(1.長江大學(xué)工程技術(shù)學(xué)院信息系,荊州434020;2.長江大學(xué)電信學(xué)院;3.中石油川慶測井公司)
隨著Internet技術(shù)的成熟和嵌入式技術(shù)的不斷發(fā)展,利用網(wǎng)絡(luò)實現(xiàn)遠(yuǎn)程控制已成為一種發(fā)展趨勢。在嵌入式設(shè)備的管理與交互中,基于網(wǎng)絡(luò)方式的應(yīng)用開發(fā)是目前嵌入式系統(tǒng)開發(fā)的主流,這種應(yīng)用程序的結(jié)構(gòu)采用的是B/S結(jié)構(gòu),即在嵌入式設(shè)備上運(yùn)行一個支持腳本或具有CGI功能的WEB服務(wù)器,能夠生成動態(tài)交互頁面。在遠(yuǎn)程監(jiān)控的過程中,通常會產(chǎn)生和處理很多的動態(tài)數(shù)據(jù),而對數(shù)據(jù)的存取一般采取兩種方式:一種是基于文件方式,另一種是基于數(shù)據(jù)庫方式?;谖募绞絹泶嫒?shù)據(jù)的缺點(diǎn)是顯而易見的,而基于數(shù)據(jù)庫方式的SQLite則可以通過事務(wù)進(jìn)行調(diào)度與并發(fā)控制,可有效地對數(shù)據(jù)進(jìn)行存取、查詢等操作,從而提高系統(tǒng)的開發(fā)效率和系統(tǒng)的可移植性。
嵌入式WEB服務(wù)器通過交換機(jī)或調(diào)制解調(diào)器與Internet連接,用戶只需通過瀏覽器訪問該遠(yuǎn)程服務(wù)器的IP地址,即可使用該服務(wù)器并實現(xiàn)對設(shè)備的訪問。嵌入式WEB服務(wù)器的工作過程,如圖1所示。
圖1 嵌入式WEB服務(wù)器的工作過程
圖2為硬件系統(tǒng)結(jié)構(gòu)框圖。嵌入式WEB服務(wù)器采用S3C2410作為整個系統(tǒng)的處理器。S3C2410是Samsung公司的一款基于ARM920T內(nèi)核的16/32位RISC嵌入式微處理器,主要面向手持設(shè)備以及高性價比、低功耗的應(yīng)用。網(wǎng)絡(luò)控制部分選用CS8900A作為以太網(wǎng)控制器。Flash選用Samsung公司的容量為64MB的NAND Flash型K9F1208存儲器,SDRAM選用容量為64MB的HY57V561620AT存儲器。
圖2 硬件系統(tǒng)結(jié)構(gòu)框圖
軟件設(shè)計包括系統(tǒng)引導(dǎo)加載程序Bootloader、配置裁減過的Linux操作系統(tǒng)內(nèi)核和CRAMFS根文件系統(tǒng)。
典型的嵌入式WEB服務(wù)器有BOA和THTTPD等。這里選用BOA作為嵌入式WEB服務(wù)器,BOA是一個非常小巧的WEB服務(wù)器,可執(zhí)行的代碼大約60KB。它是一個單任務(wù)的WEB服務(wù)器,只能一次完成用戶的請求,而不會創(chuàng)建(fork)出新的進(jìn)程來處理并發(fā)連接請求,但BOA支持CGI,并且能為CGI程序創(chuàng)建出一個新的進(jìn)程來執(zhí)行。BOA服務(wù)器的設(shè)計目標(biāo)是速度快和安全性好,在其站點(diǎn)公布的性能測試中,BOA的性能要好于Apache服務(wù)器的性能。
嵌入式WEB服務(wù)器BOA和普通WEB服務(wù)器一樣,能夠完成接收客戶端請求、分析請求、響應(yīng)請求、向客戶端返回請求結(jié)果等任務(wù)。嵌入式WEB服務(wù)器工作原理如圖3所示。
圖3 嵌入式WEB服務(wù)器工作原理
嵌入式WEB服務(wù)器主要功能包括:
①完成WEB服務(wù)器的初始化工作,如建立TCP套接字、綁定端口、開始偵聽以及等待接收WEB瀏覽器的連接請求;
②當(dāng)有請求連接時,WEB服務(wù)器接收來自客戶端請求;
③接收到客戶端的連接請求之后,分析客戶端請求,解析出請求的方法、URL目標(biāo)、可選的查詢信息及表單信息,同時根據(jù)請求進(jìn)行相應(yīng)的處理;
④WEB服務(wù)器完成相應(yīng)處理后,向WEB瀏覽器發(fā)送響應(yīng)信息;
⑤關(guān)閉與客戶端的連接。
嵌入式BOA服務(wù)器的構(gòu)建過程如下:
①從www.boa.org下載BOA源碼,BOA的版本為0.94.13。
②解壓。
#tar-xzvfboa-0.94.13.tar.gz
③進(jìn)入源代碼目錄。
#cdboa-0.94.13/src
④運(yùn)行configure文件,會生成Make-file文件。
#./configure
⑤修改Makefile文件,將
CC=gcc,CPP=gcc-E改成
CC=arm-linux-gcc,CPP=arm-linux-gcc-E
⑥進(jìn)行交叉編譯。
#make
⑦去除調(diào)試信息,減小文件大小。
#arm-linux-strip boa
SQLite是由D.Richard Hipp用C語言開發(fā)的輕量級嵌入式數(shù)據(jù)庫,它是應(yīng)用最廣泛的嵌入式數(shù)據(jù)庫之一。SQLite的源代碼完全開放,可以免費(fèi)用于任何用途,包括商業(yè)目的。SQLite提供了對SQL92的大多數(shù)支持,如多表和索引、事務(wù)、視圖、觸發(fā)和一系列的用戶接口及驅(qū)動。
SQLite的體系結(jié)構(gòu)如圖4所示。對數(shù)據(jù)庫進(jìn)行的各種操作都是按照此順序執(zhí)行的。頂層是標(biāo)記處理器(tokenize)和分析器(parser)。底部是經(jīng)過優(yōu)化的B樹,這樣有助于運(yùn)行在可調(diào)整頁面緩沖時將對磁盤的查找降到最低。再往下是頁面高速緩存,它作用在OS抽象層之上。該體系結(jié)構(gòu)的核心是虛擬數(shù)據(jù)引擎(VDBE),完成與數(shù)據(jù)相關(guān)的全部任務(wù),并且是客戶和存儲之間信息交換的中間單元。當(dāng)SQL語句被分析后,虛擬數(shù)據(jù)庫引擎就開始工作。代碼生成器將分析樹翻譯成一個袖珍程序,隨后又被組合成虛擬機(jī)器語言表示的一系列指令。
圖4 SQLite的體系結(jié)構(gòu)
SQLite的主要接口函數(shù)有3個,分別是sqlite_open()、sqlite_close()和sqlite_exec()。其中,sqlite_open()用于打開一個SQLite數(shù)據(jù)庫,如果成功打開則返回數(shù)據(jù)庫的句柄,否則返回FALSE;sqlite_close()用于關(guān)閉SQLite數(shù)據(jù)庫,無返回值;sqlite_exec()執(zhí)行相應(yīng)的SQL命令。
SQLite的移植過程如下:
①從www.sqlite.org下載sqlite-2.8.17.tar.gz源碼,并解壓。
②在文件sqlite.h中指定SQLITE_PTR_SZ的值為4,使B樹有正確的變量大小。
③修改配置文件configure,注釋掉$cross_compiling相關(guān)的代碼。
④配置以生成Makefile。
#./configure--disable-tcl--h(huán)ost=arm-linux
⑤進(jìn)入Makefile文件,將BCC=arm-linux-gcc-g-O2改成BCC=gcc-g-O2。由于編譯生成的可執(zhí)行文件要在ARM開發(fā)板上運(yùn)行,為了方便,將后面指定生成的庫libsqlite.la改成libsqlite.a,即編譯成靜態(tài)鏈接的形式。
⑥使用#make命令進(jìn)行編譯,以生成可執(zhí)行文件sqlite3。
⑦去除其中的調(diào)試信息,以減小文件的大小。
#arm-linux-strip sqlite3
CGI(Common Gateway Interface,公共網(wǎng)關(guān)接口)定義了WEB服務(wù)器與外部擴(kuò)展程序(CGI程序)之間進(jìn)行交互的接口標(biāo)準(zhǔn)。在WEB環(huán)境下,客戶端瀏覽器將數(shù)據(jù)傳送給WEB服務(wù)器,WEB服務(wù)器通過調(diào)用CGI程序?qū)崿F(xiàn)和WEB瀏覽器的交互。也就是說,CGI程序負(fù)責(zé)接收來自客戶端的信息并進(jìn)行相應(yīng)的處理,將相應(yīng)的結(jié)果再發(fā)送給WEB瀏覽器。CGI程序主要是從環(huán)境變量中獲取相關(guān)信息并處理,最后的結(jié)果以HTML的格式輸出返回給瀏覽器。通過編寫不同的CGI外部擴(kuò)展程序,可以完成對WEB網(wǎng)頁中表單(Form)數(shù)據(jù)的處理、數(shù)據(jù)庫的查詢及現(xiàn)場設(shè)備數(shù)據(jù)的采集任務(wù),因此客戶端用戶通過CGI程序和嵌入式WEB服務(wù)器就可以完成對動態(tài)數(shù)據(jù)的訪問。
嵌入式WEB服務(wù)器要訪問SQLite,CGI是一個非常不錯的選擇。CGI是外部擴(kuò)展應(yīng)用程序(例如用C語言編寫的C腳本語言)與WEB服務(wù)器交互的一個標(biāo)準(zhǔn)接口。而CGI標(biāo)準(zhǔn)可簡單概括為:CGI程序是通過標(biāo)準(zhǔn)輸入(STDIN)或環(huán)境變量來得到服務(wù)器的輸入信息,并通過標(biāo)準(zhǔn)輸出(STDOUT)向服務(wù)器輸出信息。按照CGI標(biāo)準(zhǔn)編寫的外部擴(kuò)展應(yīng)用程序可以處理WEB瀏覽器輸入的需要協(xié)同工作的數(shù)據(jù),完成WEB瀏覽器與WEB服務(wù)器的交互操作。
在WEB環(huán)境下,瀏覽器與服務(wù)器之間的數(shù)據(jù)交互,大多是通過HTML中的Form表單實現(xiàn)的。Form提供了兩種數(shù)據(jù)傳輸?shù)姆绞健狦ET與POST。GET方式傳輸?shù)臄?shù)據(jù)受URL長度的限制,因此傳輸?shù)臄?shù)據(jù)量小,且在傳輸數(shù)據(jù)的過程中是不安全的,而POST方式則不存在上述的缺點(diǎn),故選擇用POST來進(jìn)行數(shù)據(jù)的傳輸。根據(jù)CGI規(guī)范,對于POST方式,在WEB服務(wù)器中需要根據(jù)表單提交的數(shù)據(jù)長度,將其重定向為CGI程序的標(biāo)準(zhǔn)輸入,這樣CGI程序就可以通過標(biāo)準(zhǔn)輸入來得到客戶端提交的數(shù)據(jù)。重定向是通過UNIX管道機(jī)制來實現(xiàn)的。
POST方式下CGI的工作原理如圖5所示。WEB服務(wù)器是WEB瀏覽器與CGI程序之間的通道。WEB服務(wù)器接收到CGI請求后,就創(chuàng)建出一個主進(jìn)程,同時也將接收到的數(shù)據(jù)傳遞給主進(jìn)程。主進(jìn)程為了讀取來自WEB服務(wù)器數(shù)據(jù)的長度,fork出一個子進(jìn)程,創(chuàng)建出管道,并將管道的輸入端重定向為CGI的標(biāo)準(zhǔn)輸入。子進(jìn)程通過管道將數(shù)據(jù)長度傳遞給CGI程序,CGI程序通過標(biāo)準(zhǔn)輸出將處理的結(jié)果發(fā)送給服務(wù)器,服務(wù)器再將相應(yīng)信息傳遞給客戶端瀏覽器并顯示出來。
要實現(xiàn)嵌入式遠(yuǎn)程數(shù)據(jù)的采集,先要將嵌入式設(shè)備采集的現(xiàn)場數(shù)據(jù)存儲到服務(wù)器的SQLite數(shù)據(jù)庫上,然后通過編寫相應(yīng)的CGI程序來訪問SQLite數(shù)據(jù)庫。CGI程序必須滿足CGI規(guī)范,CGI程序使用C語言編寫,因此CGI程序可以調(diào)用SQLite提供的接口函數(shù)來訪問數(shù)據(jù)庫,同
圖5 POST方式下CGI的工作原理
樣要使用sqlite3_open()、sqlite3_exec()和sqlite3_close()這3個接口函數(shù)來操作數(shù)據(jù)庫。此外,如果想取回SQL語句訪問數(shù)據(jù)庫的結(jié)果,就要對每一個記錄執(zhí)行回調(diào)函數(shù)callback()。
[1]王海龍,徐曉輝,等.基于嵌入式Web服務(wù)器的遠(yuǎn)程控制系統(tǒng)的實現(xiàn)[J].電子設(shè)計工程,2010(5).
[2]劉瓊,馬海波,姜薇.SQLite在嵌入式Web服務(wù)器中的應(yīng)用研究[J].微計算機(jī)信息,2010(8).
[3]俞輝,李永,等.ARM嵌入式Linux系統(tǒng)設(shè)計與開發(fā)[M].北京:機(jī)械工業(yè)出版社,2010.
[4]歐文盛.嵌入式Linux應(yīng)用實例開發(fā)[M].北京:中國電力出版社,2008.
[5]李艷軍.基于Linux的嵌入式Web服務(wù)器Thttpd的應(yīng)用研究與實現(xiàn)[J].信息化研究,2010,36(2).