王 俊,郭書軍
(北方工業大學 信息工程學院,北京 100144)
隨著互聯網技術的發展與普及,人們的生活越來越密切地與網絡聯系在一起。嵌入式技術已普遍應用于各個領域,有越來越多的信息化產品需要接入Internet網。用戶將可以通過Web頁面進行遠程訪問和控制,進而查看和修改所關注的遠程設備的相關信息。嵌入式Web服務器和CGI的結合使用可以很好地實現這個需求,這種方案不僅可以滿足嵌入式設備接入互聯網的需求,也可以實現客戶端與Web服務器之間的動態數據交互[1]。
文中主要分析嵌入式Web服務器技術,研究了Shttpd在嵌入式系統下的移植,并借助于CGI技術實現了客戶端與服務端的動態數據交互與訪問。本文實驗部分的硬件平臺是華恒科技的HHARM6410開發板,它采用了三星公司的基于ARM11內核的S3C6410處理器。軟件平臺是基于Linux 2.4.2內核的Red Hat Linux操作系統。
傳統意義上的Web服務器是以具有高運算處理能力和大容量存儲空間的工作站或PC機為硬件工作平臺,以非實時操作系統為軟件工作平臺,它通常被設計用來處理大量用戶對普通網站的同時并發訪問。但嵌入式設備處理器能力有限、存儲容量小,只能采用功能相對簡單、體積小、消耗資源少的Web服務器,嵌入式Web服務器由此產生。
嵌入式Web服務器通常采用Browse/Server的工作方式,在這種工作方式下,客戶端僅需要一個瀏覽器程序,而服務器端則需要一個嵌入式Web服務器。客戶端可以使用瀏覽器來訪問Web服務器,并可通過網頁來進行相應的設置和操作。嵌入式Web服務器監聽客戶端的服務請求,并根據客戶請求的類型來提供相應的服務,返回相應的處理結果[2]。
典型的嵌入式Web服務器有Httpd、Boa以及Shttpd等。Httpd是最簡單的一個Web服務器,它的功能最弱,不支持認證,不支持CGI。Shttpd和Boa都支持認證、CGI等,功能都比較全。Boa是一個單任務的小型Web服務器,只能依次完成用戶的請求,而不會創建新的進程來處理并發連接請求。Shttpd是一個輕量級的Web服務器,具有更豐富的功能特性,支持CGI,SSL,cookie,MD5認證,還能嵌入到現有的軟件里,更為方便的是它不需要配置文件。因此本文選用Shttpd作為嵌入式Linux下的Web服務器。
步驟如下:
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
交叉編譯,得到可執行程序shttpd:
#make unix
3)運行 shttpd
將編譯好的程序拷到開發板的文件系統下:
#cp shttpd/sbin
在開發板的/var目錄下建立www文件夾:
#mkdir/var/www
啟動shttpd服務器:
#shttpd-root/var/www-ports 80&
4)靜態網頁測試
在開發板的/var/www目錄下放入測試網頁:index.html
在客戶端瀏覽器中輸入開發板的IP地址,即可打開測試網頁。
CGI(Common Gateway Interface)是外部擴展應用程序與Web服務器交互的一個標準接口。它規定了Web服務器調用其它可執行程序(CGI程序)的接口協議標準。Web服務器通過調用CGI程序實現和Web瀏覽器的交互,也就是CGI程序接受Web瀏覽器發送給Web服務器的信息,進行處理,將響應結果再回送給Web服務器及Web瀏覽器。按照CGI標準編寫的外部擴展程序能夠處理來自客戶端瀏覽器輸入的數據,從而完成客戶端與服務器的交互,實現動態Web技術[3]。
其工作原理如圖1所示。

圖1 CGI的工作原理Fig.1 Dperating principle of CGI
客戶端用戶通過瀏覽器將用戶輸入數據傳遞給Web服務器,Web服務器守護進程接收到該請求后,會創建一個CGI的子進程。該子進程將CGI請求的有關數據設置成環境變量,并啟動URL指定的CGI程序,CGI程序從環境變量中讀取所需要的數據,經過處理后,最后使用STDOUT輸出HTML形式的結果文件,經Web服務器送回瀏覽器顯示給用戶。
CGI的傳送方法即Web服務器調用CGI程序的途徑。HTML向CGI提交請求都是通過表單來實現的。在表單元素FORM中,有一個METHOD屬性,它定義了程序如何接收所傳遞的數據。CGI方法有主要有GET和POST兩種方法[4]。
1)GET 方法
使用此方法時,表單數據會附加在所指向CGI程序的URL后一起發送給Web服務器,Web服務器將收到的表單數據賦予環境變量QUERY-STRING,CGI程序將以字符串的形式從環境變量QUERY_STRING中獲取數據。
2)POST 方法
使用POST方法時,Web服務器的STDOUT反饋到CGI程序的STDIN,并且腳本的STDOUT反饋到服務器的STDIN,從而完成一個完整的操作過程。
操作系統為用戶提供了許多環境變量,它們定義了程序的執行環境,應用程序可以存取它們。Web服務器和CGI接口又另外設置了自己的一些環境變量,用來向CGI程序傳遞一些重要的參數。服務器與CGI程序交換信息的協作方式都是通過環境變量來完成的[5]。
C語言是一種使用廣泛的編程語言,它完全可以勝任CGI程序的編寫,在完成復雜的CGI程序時,一定要選擇合適的庫。CGIC是一個支持CGI開發的開源C庫,它封裝了一些用C語言開發CGI程序時的常用函數,給CGI的開發帶來了極大的方便。
1)下載并解壓源碼包
從CGIC的官方項目網站http://www.boutell.com/cgic下載源碼,當前版本為2.05。解壓并進入源碼目錄:
#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庫文件libcgic.a
整個CGIC函數庫實際上就是cgic.c一個文件,非常的精簡。用CGIC進行C語言的CGI程序開發時,可以將CGIC編譯為模塊,也可以直接將自己編寫的CGI程序和cgic.c及cgic.h一起編譯。從cgic.c的代碼可以看出,它已經定義了main函數,對于使用CGIC編寫的CGI程序,都是從cgic.c中的代碼進入,在庫函數完成了一系列初始化操作之后,比如解析參數、獲取系統環境變量,它才會調用用戶編寫的代碼。所以我們在調用CGIC庫開發自己的CGI程序時,不能再使用main(),而要使用CGIC提供的cgimain()開始程序。另外CGI程序輸出HTML頁面的方式都是使用printf把頁面一行一行地打印出來,這就需要我們對HTML網頁的格式及編寫方法有所了解[6]。
下面通過一個簡單的串口程序來展示通過CGIC開發CGI程序的過程。客戶端在提交表單中的數據后,CGI程序將表單內的數據取出并發送至串口,通過連接到開發板數據串口端的另一臺PC機的超級終端即可看到發送到串口的數據。
CGI串口程序部分源代碼如下:



圖2 串口程序發送界面Fig.2 Sending interface of serial port program
嵌入式Web服務器和CGI技術的結合可以很方便地實現客戶端瀏覽器與Web服務器的動態數據交互,進而實現用戶對嵌入式設備的遠程監控。本文詳細闡述了Web服務器Shttpd在S3C6410開發板下的移植,介紹了CGI的工作原理,并采用C語言編寫了基于CGI的串口程序,實現了客戶端瀏覽器與Web服務器間的動態數據交互。用戶可以根據功能需求編寫出自己的CGI應用程序,采用這種方案的嵌入式Web服務器可以廣泛應用于工業控制、智能家居等多個領域,具有十分廣闊的前景。
[1]李勇.CGI在嵌入式WEB服務器中的應用和實現[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技術全面接觸[M].北京:清華大學出版社,2001.
[3]張曦煌,柴志雷.嵌入式Web服務器中CGI的特點及實現[J].小型微型計算機系統,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實例教程[M].北京:電子工業出版社,2000.