??? 摘? 要: 討論了嵌入式系統(tǒng)" title="嵌入式系統(tǒng)">嵌入式系統(tǒng)中用Wind Web Server進行設(shè)備管理" title="設(shè)備管理">設(shè)備管理接口的開發(fā),敘述了系統(tǒng)的結(jié)構(gòu)和開發(fā)中的關(guān)鍵技術(shù),介紹在ADSL匯接設(shè)備中的應用實例,。?
??? 關(guān)鍵詞: 嵌入式系統(tǒng)? Wind Web Server? 設(shè)備管理
?
隨著互聯(lián)網(wǎng)絡硬件,、軟件的迅猛發(fā)展,嵌入式系統(tǒng)被廣泛應用到工作和生活的各個領(lǐng)域中,如何對這些設(shè)備進行管理成為嵌入式系統(tǒng)軟件開發(fā)中的一個重要方面。用戶只有通過設(shè)備所提供的管理接口對其進行配置、管理和監(jiān)控,因此管理接口的易用程度和效率成為衡量設(shè)備優(yōu)劣的重要標準之一。在嵌入式設(shè)備中加入HTTP服務能將其轉(zhuǎn)化成Web Server,可以向Internet或內(nèi)部網(wǎng)提供基于Web的圖形化管理接口,用戶可以使用瀏覽器作為接口來訪問嵌入式設(shè)備。這樣不僅使設(shè)備的易用性大大提高,而且可以省去專用管理軟件,從而方便地進行統(tǒng)一管理,。?
1 Wind Web Server介紹?
VxWorks是WindRiver公司開發(fā)的具有工業(yè)領(lǐng)導地位的高性能實時操作系統(tǒng)內(nèi)核,它是一個運行在目標機上的高性能、可裁減的嵌入式實時操作系統(tǒng),具有先進的網(wǎng)絡功能,支持市面上逾90%的處理器,。該公司的網(wǎng)絡協(xié)議棧產(chǎn)品Wind Web Server提供了功能強大的基于Web方式的網(wǎng)絡管理系統(tǒng),可以無縫地集成到任何基于VxWorks的嵌入式應用中,。?
Wind Web Server具有以下特性: ?
·完全支持HTTP 1.1標準 ?
·不需要文件系統(tǒng) ?
·支持Java Applets、圖像文件,、聲音文件等 ?
·可通過
·URL處理可定制 ?
·靈活配置的模塊結(jié)構(gòu) ?
·腳本小(7~40KB) ?
·支持用戶/用戶組/密碼認證 ?
·有IP過濾機制 ?
·支持CGI ?
·可記錄日志 ?
·支持別名 ?
·支持服務器推送(Server push)技術(shù),。?
Wind Web Server采用模塊設(shè)計,可以方便地進行裁剪以滿足應用的特殊要求。根據(jù)配置,Wind Web Server需要7~40KB的內(nèi)存,。在嵌入式系統(tǒng)中硬件資源寶貴,有時并不需要文件系統(tǒng),。Wind Web Server提供了一個工具Pagepack,可以在編譯和連接時將Web內(nèi)容放在程序代碼中,從而可以存儲在ROM中。?
2 Wind Web Server結(jié)構(gòu)?
嵌入式系統(tǒng)所能使用的資源是受限的,在許多情況下甚至沒有外部存儲系統(tǒng),這一點要求嵌入式系統(tǒng)的 Web服務器與UNIX和Windows平臺上的Web服務器有很大不同,。Wind Web Server采用模塊化和可伸縮的系統(tǒng)結(jié)構(gòu),允許用戶進行裁剪以滿足資源的不同限制,。Wind Web Server的結(jié)構(gòu)如圖1所示。?
?
?
Wind Web Server由以下關(guān)鍵部分組成:?
·Web服務器核心?
·HTTP請求處理模塊(RPM)?
·RPM調(diào)度程序?
·服務器端符號表?
·API函數(shù)?
2.1 Web服務器核心和RPM調(diào)度程序?
Web服務器核心作為一個任務運行在目標系統(tǒng)中,提供網(wǎng)絡服務綁定,、Socket函數(shù)調(diào)用和初始化參數(shù)的設(shè)置等,。RPM調(diào)度程序決定怎樣響應HTTP請求,即決定了HTTP請求的地址和RPM的對應關(guān)系,。?
2.2 HTTP請求處理模塊(RPM)?
HTTP請求處理模塊分為兩大類:系統(tǒng)RPM和用戶RPM。其中系統(tǒng)RPM執(zhí)行HTTP請求的基本處理,包括:記錄日志,、處理別名與MIME頭,、IP地址檢查、密碼驗證和訪問控制,。而用戶RPM處理具體的頁面請求,包括:文件系統(tǒng)RPM,、SSI(Server Side Include)RPM、CGI RPM,、用戶函數(shù)調(diào)用RPM、服務器推送RPM等,。另外用戶可以使用自定義RPM完成一些特殊的處理過程,。?
2.3 服務器端符號表?
Wind Web Server主要通過符號表來支持Web存取目標機中的變量,每個符號表包含如下屬性:?
·Address???????內(nèi)存地址?
·Name????????? 名稱?
·Descrip???????描述?
·Type????????? 數(shù)據(jù)類型?
·Num Elems???? 變量個數(shù)?
·GET Routine?? 讀回調(diào)" title="回調(diào)">回調(diào)函數(shù)?
·GET Param???? 讀回調(diào)函數(shù)的參數(shù)?
·SET Routine?? 寫回調(diào)函數(shù)?
·SET Param???? 寫回調(diào)函數(shù)的參數(shù)?
·Access ID???? 變量的訪問控制?
將網(wǎng)頁請求和符號表聯(lián)系起來的方法有兩種:擴展SSI和服務器推送。?
(1)擴展SSI的實現(xiàn)?
可以在HTML網(wǎng)頁中使用
Wind Web Server中已經(jīng)包含標準的SSI實現(xiàn),如輸入框、下拉列表,、復選框等,。另外,用戶可以加入自定義的SSI函數(shù)以處理特定的HTTP請求。?
(2)服務器推送的實現(xiàn)?
HTTP是一種請求響應協(xié)議,如果要對服務器端進行持續(xù)的監(jiān)控,必須不斷地發(fā)送請求刷新頁面,這將大大加重服務器的負擔,。Wind Web Server能夠使用內(nèi)嵌的Live Control模塊在頁面中的Java applet與服務器端的符號表之間建立一條持續(xù)的交互鏈路,使服務器端符號表變量的改變無需客戶端請求而直接對客戶端發(fā)布,從而實現(xiàn)了服務器推送的目的,。?
2.4 HTTP請求處理過程?
一個典型的HTTP請求處理包含以下步驟:?
(1)接收到HTTP請求后,服務器取出包含目的URL的請求行字符串,將其存入描述HTTP請求的數(shù)據(jù)結(jié)構(gòu)中;?
(2)如果該請求是頁面提交,即如下形式:http://target/xxx/xxx.htm?para1=xxx?2=xxx,則將提交參數(shù)存入環(huán)境變量QUERY_STRING中;?
(3)調(diào)用所有已配置的系統(tǒng)RPM,如果返回正確,則繼續(xù);?
(4)調(diào)用頁面對應的用戶RPM,如果該頁面中包含SSI標記,則調(diào)用SSI RPM;?
(5)查找
3 開發(fā)中的關(guān)鍵技術(shù)?
3.1 自定義用戶RPM?
通過調(diào)用函數(shù)httpRpmConfAdd(HTTP_M_GET,,″/user_rpm/″,,User_rpm),把形如http://x.x.x.x/user_rpm/*.htm?para1=xxx?2=xxx的請求用函數(shù)User_rpm進行處理和輸出。函數(shù)User_rpm的實現(xiàn)框架如下:?
short User_rpm ( HTTP_REQ_ID reqId ){?
char* para;?
httpStatusSet (reqId,, HTTP_OK);?
httpHeaderGenerate (reqId); ??? /*產(chǎn)生HTTP頭*/?
para=httpGetEnv(reqId,,″QUERY_STRING″); /*得到輸入?yún)?shù)*/?
……??????? /*處理輸入?yún)?shù)及準備輸出結(jié)果*/?
httpStringPut (reqId,″...n″); /*開始輸出*/?
……??????? /*輸出全部HTML語句*/ ?
httpStringPut(reqId,,″...n″); /*結(jié)束輸出*/?
return(RPM_DONE);?
}?
3.2. 自定義SSI處理函數(shù)?
通過調(diào)用函數(shù)httpSsiFnConfAdd (″user_ssi″,, User_ssi)建立自定義SSI處理函數(shù)User_ssi。當頁面中包含如下?
short User_ssi ( HTTP_REQ_ID reqId ,,char * szArg){?
char * para;?
para=szArg;? /*得到輸入?yún)?shù)*/?
……??????? ?? /*處理輸入?yún)?shù)及準備輸出結(jié)果*/?
????httpStringPut (reqId,″...n″); /*輸出全部HTML語句*/?
? return(HTTP_OK);?
??? }?
3.3 用Java applet實現(xiàn)服務器推送?
Live Control模塊的API提供如下Java類的實現(xiàn):?
·DirectRegistry??????? Applet與符號表進行通訊的基本部件?
·DirectReadProxy?????? 從DirectRegistry中獲取符號表變量的改變?
·DirectWriteProxy????? 更新DirectRegistry中符號表變量的值?
·DataObjectChangeListener,、DataObjectStatusListener?用于監(jiān)聽的容器?
用Java applet實現(xiàn)服務器推送的框架如下:?
(1)創(chuàng)建用于連接服務器端的DirectRegistry類的實例:?
myServerURL=new URL(″http://″+getDocumentBase().getHost()+″/lc/″); ?
myRegistry=new DirectRegistry(myServerURL);?
(2)創(chuàng)建用于監(jiān)聽符號表變量的Java部件:?
myWidget=new TextWidget(″0″,,10);?
(3)創(chuàng)建DirectReadProxy和DirectWriteProxy的實例用于讀寫符號表變量mySymbol:?
myReadProxy=new DirectReadProxy(″mySymbol″);?
myWriteProxy=new DirectWriteProxy(″mySymbol″);?
(4)將Java部件myWidget加入myReadProxy和myWrite?
Proxy,成為監(jiān)聽容器:?
myReadProxy.addDataObjectChangeListener(myWidget);?
myWriteProxy.addDataObjectChangeListener(myWidget);?
(5)將已創(chuàng)建的監(jiān)聽容器myReadProxy,、myWriteProxy加入myRegistry中,完成Applet與服務器端Live Control模塊的連接:?
myRegistry.addPropertyChangeListener(myReadProxy);?
myRegistry.addPropertyChangeListener(myWriteProxy);?
另外,用戶可以創(chuàng)建自己的Java部件和DataObject ChangeListener方法,以完成更高級的應用。?
3.4 配置HTTP服務?
Wind Web Server可進行裁剪用于不同的應用環(huán)境,可配置的參數(shù)較多,同時參數(shù)之間相互影響,。因此參數(shù)的配置是否妥當將直接影響HTTP服務的性能,甚至導致HTTP服務不能正常工作,。其中對Web Server內(nèi)存池的配置和使用尤為關(guān)鍵,需要進行仔細調(diào)整和多次測試。另外整個系統(tǒng)的網(wǎng)絡內(nèi)存池的容量也直接影響HTTP服務的性能,需要結(jié)合系統(tǒng)規(guī)模進行配置,。?
4 實例應用?
在ADSL匯接器系統(tǒng)軟件的開發(fā)過程中,使用Wind Web Server開發(fā)了基于Web的圖形化設(shè)備管理接口,用戶在任何地點只需使用瀏覽器就可以對設(shè)備進行全面的管理,包括:?
·可以對系統(tǒng)用戶認證和管理,不同的用戶具有不同的操作權(quán)限;?
·可以對系統(tǒng)進行實時監(jiān)控,頁面依照機柜布局設(shè)計,。設(shè)備面板和頁面上的各種信號燈同步變化,一目了然。同時可以在頁面上直接使用設(shè)備面板上的各種按鍵,操作方便,。采用了服務器推送技術(shù),降低了網(wǎng)絡通信量和系統(tǒng)負擔;?
·可以對初始化數(shù)據(jù)進行修改和保存;?
·可以遠程更新整個軟件系統(tǒng);?
·可以隨時獲取和清除計費信息,。?
整個程序(含頁面代碼)共200K字節(jié)左右,任務的優(yōu)先級設(shè)為最低,不影響原系統(tǒng)的正常運行,達到了很好的效果。?
參考文獻?
1 Wind River Systems,, Inc. Wind Web Server Programmer's Guide 2.0. 2000?
2 譚浩強,,辛運幃,饒一梅,,張 均.Java 程序設(shè)計.北京:清華大學出版社.2000