朱 錦,雷娟娟,陳福才
(國(guó)家數(shù)字交換系統(tǒng)工程技術(shù)研究中心 河南 鄭州450000)
基于CGI的嵌入式W eb服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)
朱 錦,雷娟娟,陳福才
(國(guó)家數(shù)字交換系統(tǒng)工程技術(shù)研究中心 河南 鄭州450000)
為了在資源有限的嵌入式設(shè)備上能夠有效地實(shí)現(xiàn)動(dòng)態(tài)Web,本文比較了幾種Web服務(wù)器的優(yōu)缺點(diǎn),選擇了性能優(yōu)異的Boa作為嵌入式Web服務(wù)器,闡述了CGI技術(shù)的相關(guān)原理以及SQLite數(shù)據(jù)庫(kù)的定義。本文所設(shè)計(jì)的查詢(xún)數(shù)據(jù)系統(tǒng)以嵌入式Linux操作系統(tǒng)為軟件平臺(tái),以PowerPC8548為硬件平臺(tái),利用HTML表單和CGI技術(shù)完成了對(duì)后端數(shù)據(jù)庫(kù)SQLite的數(shù)據(jù)信息查詢(xún),實(shí)現(xiàn)Web客戶(hù)端與Web服務(wù)器的動(dòng)態(tài)交互。
嵌入式Web服務(wù)器;Boa;CGI;SQLite
隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的發(fā)展和嵌入式Web應(yīng)用越來(lái)越廣泛,需要接入Internet網(wǎng)的信息化產(chǎn)品越來(lái)越多。在嵌入式系統(tǒng)中可以通過(guò)Web頁(yè)面進(jìn)行遠(yuǎn)程訪問(wèn)和控制,查看或修改遠(yuǎn)程設(shè)備的數(shù)據(jù)信息。為了滿足嵌入式設(shè)備接入互聯(lián)網(wǎng)的需求以及實(shí)現(xiàn)嵌入式Web服務(wù)器與Web頁(yè)面的動(dòng)態(tài)交互[1],很多系統(tǒng)引入了CGI技術(shù)[2]。
CGI是實(shí)現(xiàn)動(dòng)態(tài)Web的基礎(chǔ)。文中對(duì)嵌入式Web服務(wù)器Boa以及CGI技術(shù)的相關(guān)原理進(jìn)行了研究,利用CGI技術(shù)實(shí)現(xiàn)Boa服務(wù)器和Web頁(yè)面的動(dòng)態(tài)交互,實(shí)驗(yàn)結(jié)果成功證明了其可行性。
嵌入式Web服務(wù)器(Embedded Web Server,EWS)指的是在現(xiàn)場(chǎng)測(cè)試和控制設(shè)備中嵌入的Web服務(wù)器。EWS是以TCP/IP協(xié)議棧為基礎(chǔ)進(jìn)行設(shè)計(jì)的,在此基礎(chǔ)上要構(gòu)建HTTP、TCP以及UDP等協(xié)議。由于嵌入式設(shè)備的處理器能力有限,存儲(chǔ)容量也小得多,傳統(tǒng)的Web服務(wù)器很難運(yùn)行在嵌入式設(shè)備上,必須考慮使用體積更小、功能相對(duì)簡(jiǎn)單、消耗資源更少的簡(jiǎn)單Web服務(wù)器來(lái)解決這一問(wèn)題,嵌入式Web服務(wù)器便應(yīng)運(yùn)而生。
衡量嵌入式Web服務(wù)器的性能取決于以下幾個(gè)方面[3]:1)可移植性,即能方便地在多種目標(biāo)平臺(tái)上進(jìn)行移植;2)可裁減性,使用戶(hù)可以根據(jù)實(shí)際需求,裁減掉那些冗余的功能,降低嵌入式Web服務(wù)器對(duì)資源的需求;3)可交互性,即服務(wù)器與目標(biāo)系統(tǒng)間的交互性越好,說(shuō)明它的使用越方便,對(duì)目標(biāo)系統(tǒng)的控制越靈活。
常見(jiàn)的嵌入式Web服務(wù)器有httpd、apache、goAhead和Boa等。httpd是最簡(jiǎn)單的一種Web服務(wù)器,它的功能最弱,不支持認(rèn)證,不支持CGI,僅能提供一些靜態(tài)頁(yè)面;apache是重量級(jí)服務(wù)器,成熟穩(wěn)定,但體積較大,適合復(fù)雜的嵌入式應(yīng)用,在高負(fù)載的情況下,沒(méi)有單進(jìn)程的服務(wù)器性能高;goAhead和Boa都支持CGI,但是goAhead是個(gè)比較專(zhuān)用的Web服務(wù)器,大部分功能都在服務(wù)它自己提供的goform功能和ASP功能,而B(niǎo)oa是一個(gè)非常小巧且高效的嵌入式服務(wù)器,開(kāi)放源代碼,可執(zhí)行代碼大約只有60 kB,它運(yùn)行在Linux或Unix下,支持CGI和HTTP,響應(yīng)請(qǐng)求的速度快,最多可以同時(shí)響應(yīng)50個(gè)請(qǐng)求。Boa的設(shè)計(jì)目標(biāo)是速度和安全,非常適合于嵌入式系統(tǒng)。為了實(shí)現(xiàn)動(dòng)態(tài)Web技術(shù),本文也正是采用了Boa。
2.1CGI工作原理
用戶(hù)通過(guò)Web瀏覽器進(jìn)行URL訪問(wèn),形成的HTTP請(qǐng)求通過(guò)瀏覽器發(fā)送到Web服務(wù)器,Web服務(wù)器守護(hù)進(jìn)程接收到該請(qǐng)求后會(huì)創(chuàng)建一個(gè)CGI的子進(jìn)程,該子進(jìn)程將CGI請(qǐng)求的有關(guān)數(shù)據(jù)設(shè)置成環(huán)境變量,然后根據(jù)鏈接啟動(dòng)指定的CGI處理程序從環(huán)境變量中讀取數(shù)據(jù),經(jīng)過(guò)處理后,最后使用STDOUT輸出HTML形式的結(jié)果文件,經(jīng)Web服務(wù)器送回瀏覽器顯示給用戶(hù)。
2.2CGI的傳送數(shù)據(jù)方式
CGI傳送方式[4]是使用HTML表單向Web服務(wù)器發(fā)送信息?;菊Z(yǔ)法如下:
其中method屬性定義了程序如何將數(shù)據(jù)傳送到Web服務(wù)器,傳送方式有兩種:
1)GET方法
使用GET方法時(shí),表單數(shù)據(jù)會(huì)附加在所指向CGI腳本的URL后一起發(fā)送給Web服務(wù)器,Web服務(wù)器將收到的表單數(shù)據(jù)賦予環(huán)境變量QUERY-STRING,CGI程序?qū)⒁宰址男问綇沫h(huán)境變量QUERY_STRING中獲取數(shù)據(jù)。
2)POST方法
POST方法通過(guò)使用標(biāo)準(zhǔn)輸入(STDIN)將表單數(shù)據(jù)傳送給Web服務(wù)器。將數(shù)據(jù)的長(zhǎng)度存放在環(huán)境變量CONTENT_ LENGTH中,CGI程序先從CONTENT_LENGTH中讀出數(shù)據(jù)的長(zhǎng)度,然后再?gòu)臉?biāo)準(zhǔn)輸入STDIN中獲取數(shù)據(jù)。
2.3CGI環(huán)境變量
CGI環(huán)境變量[5]是CGI的重要內(nèi)容,所有的信息都是通過(guò)環(huán)境變量和CGI聯(lián)系,服務(wù)器與CGI程序交換信息的工作方式也是通過(guò)環(huán)境變量來(lái)實(shí)現(xiàn)的。當(dāng)通過(guò)瀏覽器訪問(wèn)Web服務(wù)器時(shí),利用環(huán)境變量來(lái)保存所發(fā)出的請(qǐng)求,CGI程序再訪問(wèn)這些環(huán)境變量,換句話說(shuō),環(huán)境變量是Web服務(wù)器和CGI腳本進(jìn)行數(shù)據(jù)傳遞的橋梁。
2.4CGI的調(diào)用方法
在Web網(wǎng)頁(yè)中調(diào)用CGI程序有兩種方法[5]:表單(FORM)和超鏈接(URL)。
1)表單(FORM)調(diào)用方法
當(dāng)Web頁(yè)面以表單的方式向Web服務(wù)器提交數(shù)據(jù)時(shí),把CGI程序存放的相對(duì)路徑放在
2)超鏈接(URL)調(diào)用方法
當(dāng)Web頁(yè)面以超鏈接的形式調(diào)用CGI程序時(shí),將CGI處理程序存放的相對(duì)路徑放在標(biāo)簽的href屬性中,作為鏈接對(duì)象。默認(rèn)GET提交方式,其調(diào)用形式如下:
由于這種調(diào)用方法具有一定的局限性,只能靜態(tài)傳遞數(shù)據(jù),所以大多數(shù)情況下更多采用表單 (FORM)調(diào)用的方式。
SQLite是D.RichardHipp用C語(yǔ)言編寫(xiě)的開(kāi)源嵌入式數(shù)據(jù)庫(kù)引擎。它是完全獨(dú)立的,不具有外部依賴(lài)性。SQLite支持多數(shù)SQL92標(biāo)準(zhǔn),可以運(yùn)行在所有的操作系統(tǒng)上,并且支持大多數(shù)計(jì)算機(jī)語(yǔ)言。它不同于其它大部分的SQL數(shù)據(jù)庫(kù)引擎,因?yàn)樗氖滓O(shè)計(jì)目標(biāo)就是盡量的簡(jiǎn)單化,以達(dá)到易于管理、易于使用、易于嵌入到其它的大型程序中、易于維護(hù)和配置的目的。
SQLite的特征[6]如下:零配置、無(wú)服務(wù)器、精簡(jiǎn)性、簡(jiǎn)單的訪問(wèn)、可變長(zhǎng)度的記錄。SQLite不僅小、快,而且簡(jiǎn)單、可靠,對(duì)于嵌入式系統(tǒng),其管理、執(zhí)行、維護(hù)的簡(jiǎn)單化比企業(yè)數(shù)據(jù)庫(kù)引擎提供的許多復(fù)雜應(yīng)用更重要,因此SQLite數(shù)據(jù)庫(kù)廣受開(kāi)發(fā)者歡迎。
4.1嵌入式W eb服務(wù)器軟件構(gòu)成及工作原理
嵌入式Web服務(wù)器采用Boa服務(wù)器,其系統(tǒng)架構(gòu)如圖1所示。當(dāng)服務(wù)器Boa接收到客戶(hù)端的HTTP請(qǐng)求消息后,服務(wù)器對(duì)消息進(jìn)行解析。將解析后得到的各種參數(shù)傳遞給CGI,CGI應(yīng)用程序通過(guò)環(huán)境變量讀取從Web服務(wù)器解析到的數(shù)據(jù),并對(duì)客戶(hù)端的請(qǐng)求進(jìn)行解釋和處理,然后使用SQL語(yǔ)句來(lái)檢索或者更新數(shù)據(jù)庫(kù),最后CGI應(yīng)用程序?qū)⑻幚斫Y(jié)果按照CGI規(guī)范返回給Web服務(wù)器,Web服務(wù)器會(huì)對(duì)CGI應(yīng)用程序的處理結(jié)果進(jìn)行解析,并在此基礎(chǔ)上生成HTTP響應(yīng)信息返回至Web前臺(tái)頁(yè)面,呈現(xiàn)給用戶(hù),完成動(dòng)態(tài)交互。
圖1 嵌入式Web服務(wù)器系統(tǒng)架構(gòu)
4.2動(dòng)態(tài)測(cè)試
下面以查詢(xún)表信息為例,介紹利用CGI處理程序?qū)崿F(xiàn)系統(tǒng)的表信息查詢(xún)驗(yàn)證,其實(shí)現(xiàn)流程圖如圖2所示:
圖2 數(shù)據(jù)查詢(xún)流程圖
當(dāng)用戶(hù)點(diǎn)擊查詢(xún)按鈕時(shí),程序?qū)⑦M(jìn)入Web瀏覽器查詢(xún)頁(yè)面,在該頁(yè)面下,用戶(hù)可以查詢(xún)系統(tǒng)的表信息。當(dāng)查詢(xún)表單提交給Boa服務(wù)器后,CGI程序?qū)⒈徽{(diào)用,程序首先打開(kāi)用戶(hù)信息數(shù)據(jù)庫(kù),判斷管理員的輸入是否合法,若不合法,則瀏覽器刷新當(dāng)前頁(yè)面要求重新輸入;若合法,則執(zhí)行SQL語(yǔ)句SELECT查詢(xún)數(shù)據(jù)庫(kù)。若表單存在的話,則瀏覽器顯示表單信息給用戶(hù);若表單不存在的話,則程序退出。
頁(yè)面具體操作:在瀏覽器地址欄輸入嵌入式服務(wù)器的IP地址及端口號(hào):xx.xx.xx.xx:xx,進(jìn)入查詢(xún)系統(tǒng)的登陸界面,進(jìn)行身份驗(yàn)證后,可開(kāi)始數(shù)據(jù)查詢(xún)操作,下面以插入一條數(shù)據(jù)記錄項(xiàng)為例:
執(zhí)行插入操作前進(jìn)行查詢(xún)數(shù)據(jù)項(xiàng),見(jiàn)圖3:
圖3 操作前數(shù)據(jù)查詢(xún)顯示頁(yè)面
插入操作完成后,再次進(jìn)行查詢(xún)數(shù)據(jù)項(xiàng),結(jié)果見(jiàn)圖4:
圖4 操作后數(shù)據(jù)查詢(xún)顯示頁(yè)面
文中基于項(xiàng)目的實(shí)際需求選擇了Boa服務(wù)器,在嵌入式系統(tǒng)中結(jié)合C語(yǔ)言編寫(xiě)CGI程序,完成了客戶(hù)端與嵌入式Web服務(wù)器之間的動(dòng)態(tài)交互,從而通過(guò)瀏覽器實(shí)現(xiàn)對(duì)后端數(shù)據(jù)庫(kù)SQLite的數(shù)據(jù)信息查詢(xún)。這種方案運(yùn)行效率高,通用性強(qiáng),有著廣泛的應(yīng)用前景,為用戶(hù)后續(xù)對(duì)嵌入式設(shè)備的遠(yuǎn)程監(jiān)控奠定基礎(chǔ)。
[1]李勇.CGI在嵌入式WEB服務(wù)器中的應(yīng)用和實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2008,24(10):110-111.
[2]WANG Zhen-xi,REN Xian-yi.Astudyon CGI ofembedded Webserver[J].International Symposiumon Computer Science and Computational Technology,2008,(1):480-483.
[3]施忠華.基于嵌入式Linux和Sqlite的Web服務(wù)器的研究及應(yīng)用[D].南昌:南昌大學(xué),2012.
[4]王俊,郭書(shū)君.嵌入式Web服務(wù)器的實(shí)現(xiàn)及其CGI應(yīng)用[J].電子設(shè)計(jì)工程,2011,19(21):152-154.
[5]王寶忠,馬成.基于CGI技術(shù)的嵌入式動(dòng)態(tài)Web的研究與實(shí)現(xiàn)[J].電子設(shè)計(jì)工程,2012,20(18):162-163.
[6]楊洋.SQLite數(shù)據(jù)庫(kù)在嵌入式系統(tǒng)中的應(yīng)用實(shí)踐[J].柳鋼科技,2013,(5):41-43.
Design and implementation of embedded W eb server based on CGI
ZHU Jin,LEIJuan-juan,CHEN Fu-cai
(National Digital Switching System Engineering&Technological Research Center,Zhengzhou 450000,China)
In order to achieve the purpose of dynamic Webeffectively in the limited resources of embedded devices,by comparing the advantagesand disadvantagesof severalWeb servers,this paperselects the excellent Boa as an embedded Web server,and illustratestheoperationalprincipleofCGItechnology andSQLite database.The design of data query system in this paper takesembedded Linux operating system as software platform,and takes PowerPC8548 as the hardware platform,realizes data information query of the back-end SQLite database by usingHTML forms and CGI technology,and complete dynamicinteractivitybetweentheWeb clientandtheWeb server.
embedded Web server;Boa;CGI;SQLite
TN915
A
1674-6236(2016)19-0191-03
2015-10-08稿件編號(hào):201510017
朱 錦(1991—),男,江蘇高郵人,碩士。研究方向:信息通信網(wǎng)技術(shù)。