孫萬源,戴聲奎,張冰冰
(華僑大學 信息科學與工程學院,福建 廈門 361021)
在Web參數(shù)傳遞的過程中需要解決2個問題,其一是選擇一個適合系統(tǒng)的嵌入式服務器;其二是選擇一種動態(tài)Web[2-4]頁面的實現(xiàn)機制。目前在嵌入式系統(tǒng)中常用的服務器有3種:Boa、thttpd和httpd,其中httpd只支持靜態(tài)頁面,而thttpd在運行過程中所耗費的系統(tǒng)資源要遠大于 Boa,因此本文采用Boa[5]作為 DM365的 Web服務器。實現(xiàn)動態(tài) Web頁面一般有3種技術可供選擇:CGI、ASP和PHP。因為目前嵌入式linux對ASP,PHP等動態(tài)Web頁面技術支持還不完善,而 CGI技術已較為成熟,,本文采用了CGI[6-7]實現(xiàn)動態(tài)Web頁面。
在DM365系統(tǒng)中,用傳統(tǒng)的CGI運行機制傳遞參數(shù)會導致頁面跳轉使得客戶端無法穩(wěn)定的瀏覽監(jiān)控頁面,本文改進了CGI的運行機制,從而使頁面能夠實時監(jiān)控。
在DM365達芬奇系統(tǒng)中,TI已經設計出完整的方案使得視頻圖像能夠實時的采集并且播放,但是簡單的采集和播放顯然不能滿足當前視頻監(jiān)控的需要。在很多實際應用中,客戶需要在客戶端通過Web參數(shù)傳遞控制遠端的DM365設備(例如云臺的控制),以及一些視頻智能分析和處理(例如人臉識別,車牌識別,越界報警等等)。
由圖1能夠看到動態(tài)Web在系統(tǒng)中的作用,它承擔著主機端(DM365)向客戶端傳輸視頻流以及客戶端向主機端傳遞動態(tài)參數(shù)的任務。

圖1 嵌入式Web在監(jiān)控系統(tǒng)中的作用
嵌入式Web服務器以TCP/IP協(xié)議為基礎,給客戶端瀏覽器和主機端硬件提供一個統(tǒng)一的接口,使得客戶端瀏覽器能夠像在本地一樣透明的管理和監(jiān)視設備的運行情況。嵌入式Web服務器主要功能有:響應多個客戶的實時HTTP請求,并為每個客戶建立連接;設備的實時管理和參數(shù)配置;對設備訪問的安全控制機制,包括SSL、用戶口令等;實現(xiàn)設備的故障智能報警。
Boa服務器是一個能夠運行在 linux[8-9]操作系統(tǒng)下,支持CGI、特別是嵌入式設備中的單任務Web服務器,源代碼公開、性能高,現(xiàn)將其移植到DM365系統(tǒng)中,具體步驟如下:
1)從http://www.Boa.org/下載Boa源碼、解壓到工作目錄。
2)進入 Boa/src目錄,修改 defines.h文件中SERVER_ROOT參數(shù)值:
馬連長把全連的班長、副班長排在了“敢死隊”前面,倪二泉自告奮勇,排在了第一,排在第三位的則是四班長陳山利。
#define SERVER_ROOT "/etc/Boa"。
3)在終端輸入#./configure得到makefile文件,修改makefile中編譯器的選項:
CC =gcc,改成: CC= arm_v5t_le-gcc;CPP = gcc-E,改成:CPP=arm_v5t_le-g++ -E。
4)在終端輸入#make編譯出可執(zhí)行程序Boa;輸入#arm_v5t_le-strip Boa去除調試信息,最終得到發(fā)布版本Boa,將其放入DM365文件系統(tǒng)中的/bin目錄下。
在 Boa服務器移植成功后需對其做相應的設置,將 workspace/Boa/目錄下的配置文件 Boa.conf復制到DM365文件系統(tǒng)中的/etc/Boa目錄下(和移植中第2步的SERVER_ROOT 保持一致),該文件重要配置如下:

CGI程序與Web服務器的通信、參數(shù)的傳遞是根據(jù)環(huán)境變量(QueryString)、命令行參數(shù)的設置和標準輸入輸出(stdin/stdout)來進行的。Web服務器提供客戶端瀏覽器和CGI程序數(shù)據(jù)交換的通道。交互過程如圖2所示。

圖2 Web服務器和CGI程序的交互
CGI程序幾乎可以用任何的編程語言來實現(xiàn),例如linux的Shell、Perl、C語言等。但是由于C語言的跨平臺性,以及C語言程序設計的方便,本文采用C語言來作為CGI的開發(fā)語言,并采用CGIC函數(shù)庫開發(fā)CGI程序(CGIC庫是一種開源可以免費使用的 CGI庫函數(shù),它封裝了一些 C語言開發(fā)CGI程序所常用的操作)。
在 Web頁面數(shù)據(jù)交互中常用的方式是表單提取,表單提取有3種方法:GET、POST和URL附上鏈接。GET方式一般用于獲取數(shù)據(jù),URL附上鏈接方式不安全,而POST方式是用于傳遞數(shù)據(jù),Web數(shù)據(jù)傳遞是客戶端向主機端傳遞數(shù)據(jù),故采用POST方式。以最簡單的在DM365中實現(xiàn)云臺協(xié)議中的右轉作為范例,編寫網頁[10],核心代碼如下:

其中form action定義表單提取時候進行的動作是訪問DM365文件系統(tǒng)中right.cgi,method定義表單提取方法是post,input type是定義提取的方式是submit,name定義表單的名字right,value定義表單的值right。當客戶端瀏覽器點擊submit提取表單的時候事實上是向 CGI程序傳入 name=value的值即“right=RIGHT”。
CGIC函數(shù)庫從 www.boutell.com/cgic下載。CGIC函數(shù)庫包含了cgic.c,cgic.h等文件,由于所有的CGI程序都需要進行一些必要的初始化操作,比如分析數(shù)據(jù)檢查環(huán)境變量,這些都是在 cgic.c文件中定義,所以 CGIC庫提供了自己的 main()。在用 CGIC來開發(fā)自己的 CGI程序時就不能再使用main(),而只能使用 CGIC提供的 cgiMain()來開始自己的程序。現(xiàn)以4.1節(jié)所要訪問的right.cgi為例編寫CGI程序:

修改cgic目錄下makefile中的編譯器選項(同2.1節(jié)所用方法一樣),在終端下輸入#make將生成的right.cgi放入文件系統(tǒng)的/www/httpd/cgi-bin/目錄下,并將4.1節(jié)編寫的網頁放入/www/httpd/目錄下。啟動DM365開發(fā)板,在客戶端輸入DM365開發(fā)板的IP:192.168.1.168,在點擊表單right后,和DM365相連的云臺開始右轉,但是頁面會跳轉至http://192.168.1.168/cgi-bin/right.cgi,而在實時視頻監(jiān)控中,需要頁面始終保持在監(jiān)控頁面http://192.168.1.168中,不能發(fā)生跳轉。
要使頁面始終保持在監(jiān)控頁面中,有兩種方法可以實現(xiàn):
1)在cgi程序中加入頁面跳轉語句,使得頁面在跳轉后能夠自動跳轉回監(jiān)控頁面。
具體代碼是在4.2編寫的CGIC程序中添加語句:

這段代碼設置cgi向HTML頁面打印的刷新時間為0秒,跳轉IP是192.168.1.168(監(jiān)控頁面IP)。但是具體測試的時候無法達到 0秒跳轉回監(jiān)控頁面,這是因為網絡傳輸和 cgi程序的運行會占用一部分時間,所以頁面會發(fā)生停頓現(xiàn)象,達不到實時監(jiān)控的效果。
2)在網頁編程中加入后臺運行的語句,使得頁面在訪問cgi程序的時候,開辟一個新線程使cgi程序以后臺方式運行,,具體需在4.1節(jié)的關鍵代碼處進行相應的修改:

和4.1節(jié)比較,多定義了一個標簽iframe,iframe元素會創(chuàng)建包含另外一個文檔的內聯(lián)框架。上述代碼是在form中定義一個外部打開的target=right,當表單提取的時候不會立即鏈接到form action所指向的地址中,而是在iframe中找到對應name=right,執(zhí)行 iframe對其定義的操作 style="display:none",即在執(zhí)行form action的時候不發(fā)生頁面跳轉。經過測試頁面不再發(fā)生跳轉,消除了頁面停頓的現(xiàn)象,符合實時監(jiān)控的要求。
本文對Web參數(shù)傳遞中2個關鍵的環(huán)節(jié)(Web服務器的選取和Web動態(tài)頁面實現(xiàn)機制)進行了深入的分析,最終采用Boa服務器作為Web服務器,CGI作為實現(xiàn)的動態(tài)頁面機制。在文章的最后還以實現(xiàn)云臺右轉為例改進了傳統(tǒng)的動態(tài)頁面實現(xiàn)的方式,實驗結果表明,在動態(tài)參數(shù)進行傳遞時,頁面不發(fā)生任何變化,DM365監(jiān)控系統(tǒng)能夠實時監(jiān)控。
[1] 圣錢生,張桂英,吳有俊.基于 DaVinci的自動對焦算法研究及實現(xiàn)[J].通信技術,2012,45(01):56-58.
[2] 楊林,楊鵬,李長齊.Web 應用漏洞分析及防御解決方案研究[J].信息安全與通信保密,2011(02):58-63.
[3] 倪奕.基于 JBoss 實現(xiàn) Web 服務與通信業(yè)務整合[J].通信技術,2011,44(12):121-124.
[4] 韓鯤,薛輝.Web 數(shù)據(jù)庫的安全審計機制[J].信息安全與通信保密,2011(06):92-94.
[5] BENTHAM J.嵌入式系統(tǒng)Web服務器[M].北京:機械工業(yè)出版社,2003:256.
[6] 李磊.利用CGI程序實現(xiàn)動態(tài)W eb的方法[J].計算機科技與工程,2009,9(06):1611-1613.
[7] BERLIN D J.精通 CGI編程[M].北京:清華大學出版社,1998:1.
[8] 華清遠見嵌入式培訓中心.嵌入式 Linux應用程序開發(fā)標準教程[M].北京:人民郵電出版社,2009:1.
[9] 吳士力,劉奇,朱蘭.嵌入式 Linux應用開發(fā)全程解析與實踐[M].北京:機械工業(yè)出版社,2010:2.
[10] 祁大鵬.Dreamweaver CS4實用教程[M].北京:電子工業(yè)出版社,2010:1.