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