黃雅菁 上海市貿易學校計算機教研部
嵌入式系統以其可裁剪、可靠性和高性價比贏得了市場青睞,可接入Internet的嵌入式設備使得未來的生活更加自動化,智能化和人性化。在嵌入式設備的管理與交互中,客戶端可以通過Web瀏覽器對嵌入式設備進行管理和監控。嵌入式Web服務器(EWS ,Embedded Web Server)是專門針對嵌入式設備設計,目的是在于擴展式設備功能,為遠程監控提供有力支持,使傳統的測試和控制設備轉變為具備了以TCP/IP為底層通信協議,Web技術為核心的基于互聯網的網絡測試和控制設備。
目前,常用的Web服務器,有GoAhead、thttdpd和Boa。
GoAhead Web服務器是開源的,體積小,性能高,支持需要在基于瀏覽器管理模式的設備上傳遞動態信息。同時,GoAhead Web服務器支持多種操作系統和開發平臺,具有很強的可移植性。缺點是對ASP的支持意味著要依靠微軟平臺,在安全方面的沒有過多的考慮。
Thttpd服務器代碼少,占用內存少,缺點是只能運行在類Linux操作系統上,對所有文件都是一次讀取完畢,同時緩存下來,因此在運行過程中占用資源多。
Boa是單任務的Web服務器,通過建立 HTTP 請求列表來處理多路 HTTP 連接請求,只為 CGI 程序創建新的進程,占用資源少。同時它還具有自動生成目錄、自動解壓文件等功能,具有很高的HTTP 請求處理速度和效率。

表一 幾種嵌入式WEB服務器性能比較
由表一可見,對于程序性能指標沒有很高要求的需求,建議選擇輕量級的Thttpd;對于安全性沒有很高要求而且對跨平臺要求的需求,建議采用GoAhead;對于安全性和軟件性能指標有高要求的需求,建議采用Boa。相比較而言,Boa的功能強,速度快,安全性高,占用資源少,適合資源相對有限的嵌入式系統。
在嵌入式Web 服務器的設計方法中,多進程并發結構為了響應客戶機的請求創建多個進程,而創建子進程會占用系統較多的資源。Boa Web服務器中的多路復用I/O模型解決了多進程并發結構中創建子進程帶來的系統資源消耗問題。它允許把進程本身掛起來,而同時使系統內核監聽所要求的一組文件描述符的任何活動,主要確認在任何被監控的文件描述符上出現活動,select()調用將返回指示該文件描述符已準備好的消息,從而實現了為進程選出隨機的變化,而不必由進程本身對輸入進行測試而浪費CPU開銷。文件描述符有兩種工作方式:阻塞與非阻塞。阻塞方式是指,當試圖對該文件描述符進行讀寫時,如果當時沒有東西可讀或者暫時不可寫,程序就進入等待狀態,直到有東西可讀或者可寫為止。非阻塞方式是指,如果沒有東西可讀,或者不可寫,讀寫函數馬上返回,而不會等待。使用select判斷一組文件描述符中是否有一個可讀或可寫,如果沒有就阻塞,直到有一個的時候就被喚醒。只要設置好select的各個參數,那么當文件可以讀寫的時候select會“通知”。select模式服務器端構架如下:


多路復用I/O解決了多進程并發結構中創建子進程帶來的資源問題,此模型實際上是將UDP循環模型用在了TCP上面。這也會帶來一些問題,如由于服務器依次處理客戶的請求,所以可能導致有的客戶會等待很久,多線程并發結構的代價很小,但另一方面由于線程間共享內存,增加了編程的復雜性。
本次主要利用嵌入式Web服務器完成車輛檢測系統的遠程查看和設置工作。原則上要方便管理人員對系統的管理和維護,并且滿足對數據的高效管理,保證用戶通過瀏覽器將配置信息下發,并將需要查看的數據及時迅速的顯示給用戶,所有的數據結果存儲在本地配置文件中,當客戶端使用Web瀏覽器訪問嵌入式Web服務器時,需要進行身份驗證,以確保系統的安全性和防止非法用戶的訪問。
3.3.1 移植 Boa
建立Boa服務器的安裝配置步驟如下:
(1)下載boa源代碼。boa Web服務器的源代碼可以從http://www.boa.org下載。我們采用的是 boa-0.94.13 這個版本,下載然后解壓縮。
# tar zxvf boa-0.94.13.tar.gz
將其重命名為boa。
(2)安裝并編譯boa源代碼。我們將boa源代碼解壓到/home目錄下,編譯安裝源:
#cd /home/boa/src
在安裝之前我們需要設置boa安裝的主目錄
# cd src
在 src/defines.h中添加
# define SERVER_ROOT “/home/boa”
然后編譯
#./configure
修改Makefile文件
找到CC=gcc,將其改成CC = arm-linux-gcc,
找到CPP = gcc E,將其改成CPP = arm-linux-gcc E,
并保存退出。
然后運行make進行編譯,得到的可執行程序為boa,將調試信息剝去,得到的最后
程序只有約60KB大小。
# make
# arm-linux-strip boa
在boa/src目錄下將生成boa文件,該文件即為Boa服務器執行文件。
3.3.2 配置 Boa 服務器
boa啟動時將加載一個配置文件boa.conf,在boa程序運行前,必須首先編輯該文件,并將其放置于src/defines.h文件中SERVER_ROOT宏定義所定義的缺省目錄,或者在啟動boa時使用參數“-c”指定boa.conf的加載目錄。
將User root 改為User nobody
將Group root 改為Group 0
將DocumentRoot/var/www 改為DocumentRoot/home/boa
將 MimeTypes/etc/mime.types 改 為 MimeTypes /home/boa/mime.types
將ScriptAlias /cgi-bin/ 改為/home/boa/cgi-bin/
將 ScriptAlias /index.html/ 改 為 /home/boa/index.html/
用戶可以根據自己需要,對 boa.conf 進行修改,但必須要保證其他的輔助文件和設置必須和 boa.conf 里的配置相符,不然 Boa就不能正常工作。將所有的.cgi文件拷貝到/home/boa/cgi-bin/目錄下,將所有 HTML 文件拷貝到/home/boa/html文件夾下面,將 boa.conf 拷貝到/home/boa 下面。CGI 腳本測試很容易發生權限不夠的問題,要保證 Boa 訪問的主目錄、CGI腳本目錄以及臨時文件目錄(如果沒有設置 TMP 環境變量時,缺省值是/tmp 目錄)都必須能被 Boa 運行時所代表的用戶完全訪問,該用戶由 boa.conf 中的 user指出。
3.3.3 測試 Boa 服務器
測試 Boa 能否正常工作,靜態 HTML 頁面能否正常訪問,CGI 腳本能否正常運行。index.html為測試主頁面,images為存放各種圖片的子目錄,cgi-bin為CGI腳本的存放目錄。根據boa.conf的配置,目前HTML文檔的主目錄為/home/html,CGI腳本目錄為/home/boa/cgi-bin。在PC機上運行瀏覽器進行測試,在地址欄輸入目標系統 IP,即 http://10.24.1.121,可以看到相關頁面,表示靜態HTML頁面測試通過。
根據需求我們主要是用Web對嵌入式停車檢測系統中的數據進行遠程的設置和查看,管理員通過瀏覽器選擇要設置查看底層車輛信息采集器收集的的車輛信息,通過HTML表單將所選內容提交給CGI程序,CGI腳本獲取用戶發的信息并解碼,然后執行相應的數據庫程序,通過約定的路徑訪問數據庫,并將訪問結果通過HTML送回給用戶端瀏覽器。
在測試規范和目的明確的情況下,設計了測試方案,根據選擇的測試用例對系統功
能以及穩定性、可靠性進行了測試和分析。本次測試計劃為嵌入式Web服務器功能測試。其具體內容為:通過嵌入式Web服務器是否能實現對嵌入式車輛檢測系統進行遠程管理,即完成遠程用戶對信息的的訪問查詢與設置等功能。
(1)車位實時上報狀態:
a) 占用情況 正確
b) 在線情況 正確
c) 電量報警 正確
d) 通信超時報警 正確
(2)車位信息查詢
e) 占用情況 正確
f) 在線情況 正確
g) 電量情況 正確
h) 通信超時報警 正確
(3)車位信息配置
i) 上報周期 正確
j) 報警周期 正確
k) 網絡參數 正確
測試表明該系統具有界面友好、低成本、設計簡單、操作方便等優點,完全滿足對嵌入式車輛檢測系統遠程設置和查看的要求。
本文主要對比了幾種現有的嵌入式Web服務器,將Boa Web服務器應用到車輛檢測系統,基本實現了通過客戶端來遠程監控車輛信息的功能。我們使用了開源的Boa Web Server,在使用的過程中也發現Boa的不足,我們可以通過采用以下措施來提高系統性能,以此作為未來改進Web服務器的方法:
(1)減小Web服務器中請求的生命周期。
請求的生命周期指的是當Web服務器收到客戶的一個HTTP請求并發出所請求的文件之前,Web服務器必須執行一系列指令。請求的生命周期直接影響到服務器的響應時間。所以將系統調用和其他處理開銷最小化是十分重要,可以通過減少文件緩存來達到。
(2)采用瘦服務器、胖客戶機的應用模式。
胖客戶端模式意味著在應用結構上相當數量的應用邏輯都在客戶端執行。不產生與服務器往返通信的過程,減少了網絡通信量、延遲等,減少了Web服務器的負擔。
(3)增加多用戶認證
目前的Boa是單用戶機制,對于多用戶不支持,這樣限制了多用戶的訪問和管理,我們可以引入多用戶認證機制,既實現了多用戶登錄的基本需求,也可以增加安全性。