王 俊,郭書(shū)軍
(北方工業(yè)大學(xué) 信息工程學(xué)院,北京 100144)
隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展與普及,人們的生活越來(lái)越密切地與網(wǎng)絡(luò)聯(lián)系在一起。嵌入式技術(shù)已普遍應(yīng)用于各個(gè)領(lǐng)域,有越來(lái)越多的信息化產(chǎn)品需要接入Internet網(wǎng)。用戶將可以通過(guò)Web頁(yè)面進(jìn)行遠(yuǎn)程訪問(wèn)和控制,進(jìn)而查看和修改所關(guān)注的遠(yuǎn)程設(shè)備的相關(guān)信息。嵌入式Web服務(wù)器和CGI的結(jié)合使用可以很好地實(shí)現(xiàn)這個(gè)需求,這種方案不僅可以滿足嵌入式設(shè)備接入互聯(lián)網(wǎng)的需求,也可以實(shí)現(xiàn)客戶端與Web服務(wù)器之間的動(dòng)態(tài)數(shù)據(jù)交互[1]。
文中主要分析嵌入式Web服務(wù)器技術(shù),研究了Shttpd在嵌入式系統(tǒng)下的移植,并借助于CGI技術(shù)實(shí)現(xiàn)了客戶端與服務(wù)端的動(dòng)態(tài)數(shù)據(jù)交互與訪問(wèn)。本文實(shí)驗(yàn)部分的硬件平臺(tái)是華恒科技的HHARM6410開(kāi)發(fā)板,它采用了三星公司的基于ARM11內(nèi)核的S3C6410處理器。軟件平臺(tái)是基于Linux 2.4.2內(nèi)核的Red Hat Linux操作系統(tǒng)。
傳統(tǒng)意義上的Web服務(wù)器是以具有高運(yùn)算處理能力和大容量存儲(chǔ)空間的工作站或PC機(jī)為硬件工作平臺(tái),以非實(shí)時(shí)操作系統(tǒng)為軟件工作平臺(tái),它通常被設(shè)計(jì)用來(lái)處理大量用戶對(duì)普通網(wǎng)站的同時(shí)并發(fā)訪問(wèn)。但嵌入式設(shè)備處理器能力有限、存儲(chǔ)容量小,只能采用功能相對(duì)簡(jiǎn)單、體積小、消耗資源少的Web服務(wù)器,嵌入式Web服務(wù)器由此產(chǎn)生。
嵌入式Web服務(wù)器通常采用Browse/Server的工作方式,在這種工作方式下,客戶端僅需要一個(gè)瀏覽器程序,而服務(wù)器端則需要一個(gè)嵌入式Web服務(wù)器??蛻舳丝梢允褂脼g覽器來(lái)訪問(wèn)Web服務(wù)器,并可通過(guò)網(wǎng)頁(yè)來(lái)進(jìn)行相應(yīng)的設(shè)置和操作。嵌入式Web服務(wù)器監(jiān)聽(tīng)客戶端的服務(wù)請(qǐng)求,并根據(jù)客戶請(qǐng)求的類(lèi)型來(lái)提供相應(yīng)的服務(wù),返回相應(yīng)的處理結(jié)果[2]。
典型的嵌入式Web服務(wù)器有Httpd、Boa以及Shttpd等。Httpd是最簡(jiǎn)單的一個(gè)Web服務(wù)器,它的功能最弱,不支持認(rèn)證,不支持CGI。Shttpd和Boa都支持認(rèn)證、CGI等,功能都比較全。Boa是一個(gè)單任務(wù)的小型Web服務(wù)器,只能依次完成用戶的請(qǐng)求,而不會(huì)創(chuàng)建新的進(jìn)程來(lái)處理并發(fā)連接請(qǐng)求。Shttpd是一個(gè)輕量級(jí)的Web服務(wù)器,具有更豐富的功能特性,支持CGI,SSL,cookie,MD5認(rèn)證,還能嵌入到現(xiàn)有的軟件里,更為方便的是它不需要配置文件。因此本文選用Shttpd作為嵌入式Linux下的Web服務(wù)器。
步驟如下:
1)下載并解壓源碼包
下載 Shttpd 源碼包(Shttpd-1.39.tar.gz):http://shttpd.sourceforge.net/
解壓源碼包:#tar zxvf shttpd-1.39.tar.gz
2)交叉編譯
#cd shttpd-1.39
#cd src/
#vi Makefile
修改交叉編譯器路徑:
CC=/opt/arm-2008q3/bin/arm-none-linux-gnueabi-gcc
AR=/opt/arm-2008q3/bin/arm-none-linux-gnueabi-ar
交叉編譯,得到可執(zhí)行程序shttpd:
#make unix
3)運(yùn)行 shttpd
將編譯好的程序拷到開(kāi)發(fā)板的文件系統(tǒng)下:
#cp shttpd/sbin
在開(kāi)發(fā)板的/var目錄下建立www文件夾:
#mkdir/var/www
啟動(dòng)shttpd服務(wù)器:
#shttpd-root/var/www-ports 80&
4)靜態(tài)網(wǎng)頁(yè)測(cè)試
在開(kāi)發(fā)板的/var/www目錄下放入測(cè)試網(wǎng)頁(yè):index.html
在客戶端瀏覽器中輸入開(kāi)發(fā)板的IP地址,即可打開(kāi)測(cè)試網(wǎng)頁(yè)。
CGI(Common Gateway Interface)是外部擴(kuò)展應(yīng)用程序與Web服務(wù)器交互的一個(gè)標(biāo)準(zhǔn)接口。它規(guī)定了Web服務(wù)器調(diào)用其它可執(zhí)行程序(CGI程序)的接口協(xié)議標(biāo)準(zhǔn)。Web服務(wù)器通過(guò)調(diào)用CGI程序?qū)崿F(xiàn)和Web瀏覽器的交互,也就是CGI程序接受Web瀏覽器發(fā)送給Web服務(wù)器的信息,進(jìn)行處理,將響應(yīng)結(jié)果再回送給Web服務(wù)器及Web瀏覽器。按照CGI標(biāo)準(zhǔn)編寫(xiě)的外部擴(kuò)展程序能夠處理來(lái)自客戶端瀏覽器輸入的數(shù)據(jù),從而完成客戶端與服務(wù)器的交互,實(shí)現(xiàn)動(dòng)態(tài)Web技術(shù)[3]。
其工作原理如圖1所示。
圖1 CGI的工作原理Fig.1 Dperating principle of CGI
客戶端用戶通過(guò)瀏覽器將用戶輸入數(shù)據(jù)傳遞給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)境變量,并啟動(dòng)URL指定的CGI程序,CGI程序從環(huán)境變量中讀取所需要的數(shù)據(jù),經(jīng)過(guò)處理后,最后使用STDOUT輸出HTML形式的結(jié)果文件,經(jīng)Web服務(wù)器送回瀏覽器顯示給用戶。
CGI的傳送方法即Web服務(wù)器調(diào)用CGI程序的途徑。HTML向CGI提交請(qǐng)求都是通過(guò)表單來(lái)實(shí)現(xiàn)的。在表單元素FORM中,有一個(gè)METHOD屬性,它定義了程序如何接收所傳遞的數(shù)據(jù)。CGI方法有主要有GET和POST兩種方法[4]。
1)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方法時(shí),Web服務(wù)器的STDOUT反饋到CGI程序的STDIN,并且腳本的STDOUT反饋到服務(wù)器的STDIN,從而完成一個(gè)完整的操作過(guò)程。
操作系統(tǒng)為用戶提供了許多環(huán)境變量,它們定義了程序的執(zhí)行環(huán)境,應(yīng)用程序可以存取它們。Web服務(wù)器和CGI接口又另外設(shè)置了自己的一些環(huán)境變量,用來(lái)向CGI程序傳遞一些重要的參數(shù)。服務(wù)器與CGI程序交換信息的協(xié)作方式都是通過(guò)環(huán)境變量來(lái)完成的[5]。
C語(yǔ)言是一種使用廣泛的編程語(yǔ)言,它完全可以勝任CGI程序的編寫(xiě),在完成復(fù)雜的CGI程序時(shí),一定要選擇合適的庫(kù)。CGIC是一個(gè)支持CGI開(kāi)發(fā)的開(kāi)源C庫(kù),它封裝了一些用C語(yǔ)言開(kāi)發(fā)CGI程序時(shí)的常用函數(shù),給CGI的開(kāi)發(fā)帶來(lái)了極大的方便。
1)下載并解壓源碼包
從CGIC的官方項(xiàng)目網(wǎng)站http://www.boutell.com/cgic下載源碼,當(dāng)前版本為2.05。解壓并進(jìn)入源碼目錄:
#tar xzf cgic205.tar.gz
#cd cgic205
2)修改Makefile文件
#vi Makefile
修改CC=gcc為CC=/opt/arm-2008q3/bin/arm-none-linuxgnueabi-gcc
修改AR=ar為 AR=/opt/arm-2008q3/bin/arm-none-linuxgnueabi-ar
修改RANLIB=ranlib為RANLIB=/opt/arm-2008q3/bin/arm-none-linux-gnueabi-ranlib
修改 gcc cgictest.o-o cgictest.cgi${LIBS}為$(CC)$(CFLAGS)ttycgic.o-o ttycgic.cgi${LIBS}
修改 gcc capture.o-o capture${LIBS}為$(CC)$(CFLAGS)capture.o-o capture${LIBS}
3)交叉編譯
#make
編譯成功后得到CGIC庫(kù)文件libcgic.a
整個(gè)CGIC函數(shù)庫(kù)實(shí)際上就是cgic.c一個(gè)文件,非常的精簡(jiǎn)。用CGIC進(jìn)行C語(yǔ)言的CGI程序開(kāi)發(fā)時(shí),可以將CGIC編譯為模塊,也可以直接將自己編寫(xiě)的CGI程序和cgic.c及cgic.h一起編譯。從cgic.c的代碼可以看出,它已經(jīng)定義了main函數(shù),對(duì)于使用CGIC編寫(xiě)的CGI程序,都是從cgic.c中的代碼進(jìn)入,在庫(kù)函數(shù)完成了一系列初始化操作之后,比如解析參數(shù)、獲取系統(tǒng)環(huán)境變量,它才會(huì)調(diào)用用戶編寫(xiě)的代碼。所以我們?cè)谡{(diào)用CGIC庫(kù)開(kāi)發(fā)自己的CGI程序時(shí),不能再使用main(),而要使用CGIC提供的cgimain()開(kāi)始程序。另外CGI程序輸出HTML頁(yè)面的方式都是使用printf把頁(yè)面一行一行地打印出來(lái),這就需要我們對(duì)HTML網(wǎng)頁(yè)的格式及編寫(xiě)方法有所了解[6]。
下面通過(guò)一個(gè)簡(jiǎn)單的串口程序來(lái)展示通過(guò)CGIC開(kāi)發(fā)CGI程序的過(guò)程??蛻舳嗽谔峤槐韱沃械臄?shù)據(jù)后,CGI程序?qū)⒈韱蝺?nèi)的數(shù)據(jù)取出并發(fā)送至串口,通過(guò)連接到開(kāi)發(fā)板數(shù)據(jù)串口端的另一臺(tái)PC機(jī)的超級(jí)終端即可看到發(fā)送到串口的數(shù)據(jù)。
CGI串口程序部分源代碼如下:
圖2 串口程序發(fā)送界面Fig.2 Sending interface of serial port program
嵌入式Web服務(wù)器和CGI技術(shù)的結(jié)合可以很方便地實(shí)現(xiàn)客戶端瀏覽器與Web服務(wù)器的動(dòng)態(tài)數(shù)據(jù)交互,進(jìn)而實(shí)現(xiàn)用戶對(duì)嵌入式設(shè)備的遠(yuǎn)程監(jiān)控。本文詳細(xì)闡述了Web服務(wù)器Shttpd在S3C6410開(kāi)發(fā)板下的移植,介紹了CGI的工作原理,并采用C語(yǔ)言編寫(xiě)了基于CGI的串口程序,實(shí)現(xiàn)了客戶端瀏覽器與Web服務(wù)器間的動(dòng)態(tài)數(shù)據(jù)交互。用戶可以根據(jù)功能需求編寫(xiě)出自己的CGI應(yīng)用程序,采用這種方案的嵌入式Web服務(wù)器可以廣泛應(yīng)用于工業(yè)控制、智能家居等多個(gè)領(lǐng)域,具有十分廣闊的前景。
[1]李勇.CGI在嵌入式WEB服務(wù)器中的應(yīng)用和實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2008,10(3):110-111.LI Yong.Application and realization of CGI in embedded WEB server[J].Micro-computer information,2008,10(3):110-111.
[2]劉偉,李小武,羅明.CGI技術(shù)全面接觸[M].北京:清華大學(xué)出版社,2001.
[3]張曦煌,柴志雷.嵌入式Web服務(wù)器中CGI的特點(diǎn)及實(shí)現(xiàn)[J].小型微型計(jì)算機(jī)系統(tǒng),2003,24(11):2046-2047.ZHANG Xi-huang,CHAI Zhi-lei.Properties and Implementationsof CGI in embedded web Server[J].Mini-micro systems,2003,24(11):2046-2047.
[4]WANG Zhen-xi,REN Xian-yi.A study on cgi of embedded webserver[J].International Symposium on Computer Science and Computational Technology,2008(1):480-483.
[5]CHEN Tian-huang,HUANG Jia-xi.Design and realization of CGI in embedded dynamic web technology[J].International Conference on Network and Parallel Computing-Workshops,2007(39):774-777.
[6]曹建,李文斌,張劍峰,等.Perl5、PHP4與CGI實(shí)例教程[M].北京:電子工業(yè)出版社,2000.