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

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

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

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

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

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

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

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