摘 要: 隨著計(jì)算機(jī)技術(shù)和網(wǎng)絡(luò)技術(shù)的快速發(fā)展,以嵌入式設(shè)備為主的監(jiān)控系統(tǒng)、信息家電和通信設(shè)備被廣泛使用,嵌入式Web服務(wù)器則是其中關(guān)鍵的技術(shù)設(shè)備。本文介紹了Web服務(wù)器的結(jié)構(gòu)設(shè)計(jì),并對(duì)系統(tǒng)中采用的關(guān)鍵技術(shù)及其實(shí)現(xiàn)進(jìn)行了論述。
關(guān)鍵詞: 嵌入式;Web服務(wù)器
Web應(yīng)用程序與傳統(tǒng)應(yīng)用程序相比,具有許多特點(diǎn)和優(yōu)勢, 隨著Web應(yīng)用程序工具與技術(shù)的快速發(fā)展,Web應(yīng)用程序的應(yīng)用也越來越廣泛。同時(shí),由于Internet技術(shù)的滲透,嵌入式系統(tǒng)正變得越來越智能化并具有越來越多的網(wǎng)絡(luò)友好特性,嵌入式Web服務(wù)器的應(yīng)用也越來越廣泛,它可以廣泛地用于各種監(jiān)控系統(tǒng)、信息家電及智能家居系統(tǒng)、通信設(shè)備等領(lǐng)域[1]。
1 嵌入式Web服務(wù)器結(jié)構(gòu)
嵌入式Web服務(wù)器應(yīng)有如下一些的設(shè)計(jì)目標(biāo):
(1)借助HTTP協(xié)議統(tǒng)一并通用化設(shè)備或終端的訪問接口。
(2)實(shí)現(xiàn)對(duì)HTTP 1.0和HTTP l.1的支持,實(shí)現(xiàn)HTTP的部分方法(GET、POST、HEAD等),支持Basic、Digest加密的認(rèn)證,支持服務(wù)器“推”技術(shù)等。
(3)集成簡單的應(yīng)用服務(wù)器功能,便于應(yīng)用開發(fā)人員方便地構(gòu)建基于嵌入式Web服務(wù)器的應(yīng)用系統(tǒng)。
(4)支持多種協(xié)作接口,嵌入式Web服務(wù)器應(yīng)該可以以各種接口方式與相應(yīng)的模塊進(jìn)行集成,這主要是通過動(dòng)態(tài)庫來實(shí)現(xiàn)。
(5)支持多種傳輸方式,嵌入式Web服務(wù)器需設(shè)計(jì)一個(gè)連接層,該層用來抽象各種具體的傳輸方式,提供統(tǒng)一和標(biāo)準(zhǔn)的連接服務(wù),Web服務(wù)器本身只依賴一個(gè)可靠的傳輸通道,并不限定是基于TCP的。
根據(jù)以上嵌入式Web服務(wù)器的設(shè)計(jì)目標(biāo),Web服務(wù)器的核心在于其HTTP引擎和分析引擎,前者主要負(fù)責(zé)HTTP協(xié)議請求和響應(yīng)消息處理,后者用于解析網(wǎng)頁中的嵌入式標(biāo)記,以實(shí)現(xiàn)動(dòng)態(tài)內(nèi)容支持。圖1是基于嵌入Web服務(wù)器的應(yīng)用系統(tǒng)框架,圖中的瀏覽器是客戶端,用戶接口庫是嵌入式Web服務(wù)器和設(shè)備的其他控制等部分的接口,由應(yīng)用開發(fā)人員提供。虛線框中的是嵌入式Web服務(wù)器的框架結(jié)構(gòu),該設(shè)計(jì)的基本思想來源于經(jīng)典的MVC(模型-視圖-控制)模型,這里把HTTP引擎和分析引擎作為控制器,待分析網(wǎng)頁和靜態(tài)網(wǎng)頁是視圖,而用戶接口庫則是作為模型,專注于業(yè)務(wù)邏輯。利用控制器來分離模型和視圖,實(shí)現(xiàn)模塊間松散耦合的效果,可以提高系統(tǒng)靈活性、復(fù)用性和可維護(hù)性[2]。
1.1 HTTP引擎
HTTP引擎主要負(fù)責(zé)對(duì)客戶訪問的過濾和權(quán)限檢查,HTTP請求和響應(yīng)消息的接收和發(fā)送,會(huì)話(session)管理,客戶認(rèn)證和授權(quán),消息的封裝、解析和消息安全性檢查。
首先,HTTP引擎進(jìn)行初始化工作,為該設(shè)備站點(diǎn)初始化相應(yīng)的配置數(shù)據(jù)結(jié)構(gòu),如設(shè)置站點(diǎn)基本信息、建立用戶賬號(hào)、初始化各目錄的訪問權(quán)限、初始化嵌入式標(biāo)記的映射定義等。然后HTTP引擎接收請求連接,提取訪問客戶的客戶端的信息(如IP等),根據(jù)配置文件的站點(diǎn)過濾設(shè)置進(jìn)行篩選,如不允許,則返回出錯(cuò)頁面,結(jié)束處理。
為了加強(qiáng)嵌入式應(yīng)用的安全管理,嵌入式Web服務(wù)器默認(rèn)設(shè)置:假定任何訪問客戶均需提供用戶名和口令,接著進(jìn)行客戶認(rèn)證,在客戶會(huì)話超時(shí)后的請求或初次發(fā)送請求時(shí)會(huì)要求輸入客戶的用戶名和密碼,一般在瀏覽器被關(guān)閉前或會(huì)話超時(shí)前,用戶再次訪問時(shí)不需再次提供,除非他所請求的操作需要更高的權(quán)限??蛻舻挠脩裘兔艽a是通過HTTP的401 Unauthorized響應(yīng)頭部來激發(fā)客戶端的瀏覽器提示用戶輸入的。
認(rèn)證通過后,HTTP引擎根據(jù)配置文件的定義給該客戶賦予相應(yīng)的角色和權(quán)限,并設(shè)立客戶會(huì)話環(huán)境,便于跟蹤客戶的訪問。
當(dāng)1個(gè)HTTP請求被接收后,進(jìn)入HTTP引擎的處理過程。根據(jù)資源URI判斷,若客戶請求的是靜態(tài)網(wǎng)頁(網(wǎng)頁的后綴是htm或html),那么HTTP引擎在靜態(tài)網(wǎng)頁集中查找,加載到內(nèi)存,并按照HTTP的協(xié)議規(guī)范封裝響應(yīng)消息,包括各頭部和協(xié)議實(shí)體(響應(yīng)的數(shù)據(jù)部分)。另外,若本網(wǎng)頁是采用服務(wù)器“推”技術(shù)的,其頭部信息是不同的,并與客戶端保持永久連接,此后不斷地刷新客戶端的顯示內(nèi)容。HTTP引擎將封裝好的響應(yīng)消息返回給客戶端,并刷新緩存。
1.2 分析引擎
分析引擎專注于待分析網(wǎng)頁的分析處理,實(shí)現(xiàn)動(dòng)態(tài)頁面。其實(shí)現(xiàn)的傳統(tǒng)技術(shù)思路有以下兩種方法[3]:
(1)采用傳統(tǒng)的CGI方式。該方式所需的資源開銷較大,每當(dāng)用戶請求CGI腳本時(shí),嵌入式Web服務(wù)器必須初始化CGI的運(yùn)行環(huán)境,導(dǎo)入有關(guān)參數(shù),然后啟動(dòng)其他的進(jìn)程來運(yùn)行CGI代碼,運(yùn)行結(jié)束后,再釋放進(jìn)程的相關(guān)資源,服務(wù)器需要承擔(dān)所有額外的負(fù)擔(dān),而且和動(dòng)態(tài)庫的接口也比較麻煩。
(2)使用PHP等腳本語言構(gòu)建類似主機(jī)系統(tǒng)的Web應(yīng)用服務(wù)器。當(dāng)一個(gè)訪問客戶打開網(wǎng)頁時(shí),服務(wù)端便執(zhí)行PHP的命令,并將執(zhí)行結(jié)果發(fā)送至訪問者的瀏覽器中。該方案與臺(tái)式機(jī)系統(tǒng)有最好的兼容性,可以充分借鑒和使用臺(tái)式機(jī)系統(tǒng)的現(xiàn)有軟件和相關(guān)源代碼。但是,該方案的實(shí)現(xiàn)需要很多資源,需要構(gòu)建相關(guān)的PHP庫,而PHP和嵌入式系統(tǒng)的接口比較困難,因?yàn)镻HP的設(shè)計(jì)本身是作為一種服務(wù)器端的嵌入式HTML的腳本語言,讓它直接和驅(qū)動(dòng)級(jí)的動(dòng)態(tài)庫等進(jìn)行鏈接,實(shí)現(xiàn)較復(fù)雜,特別是不能很好地控制它們之間的交互。而嵌入式系統(tǒng)最需要的是一種實(shí)現(xiàn)成本小,而且比較簡單、易于使用、具有相當(dāng)?shù)撵`活性和可控性,并且和動(dòng)態(tài)庫有很好的配合機(jī)制。
上述兩種方式還有一個(gè)共同的缺點(diǎn),就是實(shí)現(xiàn)業(yè)務(wù)邏輯的代碼經(jīng)常和網(wǎng)頁的布局代碼交叉在一起,嚴(yán)重影響程序的可讀性、可維護(hù)性和可擴(kuò)展性。由于屬于不同層次的代碼混在一起,會(huì)使它們的代碼的相關(guān)性大大提高,從而極不利于系統(tǒng)的維護(hù)。
鑒于上述問題,在嵌入式Web服務(wù)器中設(shè)計(jì)基于嵌入式標(biāo)記的HTML網(wǎng)頁分析引擎。采用該方法設(shè)計(jì)的分析引擎的基本特點(diǎn)如下:
(1)視圖(頁面布局)、控制(分析引擎)、模型(接口庫)松耦合。頁面布局和接口庫可以分別獨(dú)立地進(jìn)行設(shè)計(jì)和開發(fā),前者專注于HTML頁面的布局和美化設(shè)計(jì),后者則側(cè)重于和控制單元的交互,而分析引擎主要是協(xié)調(diào)兩者的工作。通過待分析網(wǎng)頁中的嵌入式標(biāo)記,關(guān)聯(lián)由應(yīng)用開發(fā)人員編寫動(dòng)態(tài)庫中的某個(gè)函數(shù),以此來動(dòng)態(tài)生成網(wǎng)頁。
(2)分析引擎中集成了若干應(yīng)用開發(fā)人員常用的基本功能,如用戶權(quán)限管理和口令認(rèn)證、支持緩存機(jī)制、多級(jí)客戶授權(quán)、一定的安全防范措施等。在此基礎(chǔ)上,應(yīng)用開發(fā)人員可以只專注于業(yè)務(wù)邏輯的處理和調(diào)整相關(guān)配置,就能構(gòu)建和靈活調(diào)整配置、功能豐富的基于嵌入式Web服務(wù)器的系統(tǒng)。
分析引擎和HTTP引擎是通過共享HTTP請求和響應(yīng)隊(duì)列來通信的。在分析引擎的每個(gè)運(yùn)行周期中,進(jìn)行如下工作:查看HTTP請求隊(duì)列是否為空,若有任務(wù)則進(jìn)行分析處理,然后將結(jié)果掛入和HTTP引擎共享的響應(yīng)隊(duì)列。分析引擎是周期性運(yùn)行的,將其掛入運(yùn)行隊(duì)列后,即可處理下個(gè)周期的請求。如果循環(huán)1個(gè)周期而沒有任務(wù)或結(jié)果,則進(jìn)入睡眠。一般分析引擎是單線程,因?yàn)樵谒倪\(yùn)行過程中不大會(huì)出現(xiàn)阻塞。此外,作為嵌入式Web服務(wù)器,同時(shí)訪問量一般不大,即使采用多線程也不大可能顯著地提高系統(tǒng)的性能,而且多線程有更多的開銷。但某些應(yīng)用可能需要多線程來提高系統(tǒng)的性能。
1.3 嵌入式標(biāo)記
嵌入式標(biāo)記的語法是任意連續(xù)的以空格結(jié)尾的數(shù)字或字符(除空格和圓括號(hào))序列,設(shè)計(jì)時(shí)采用易于書寫和記憶的簡短的字母數(shù)字序列。共有兩類嵌入式標(biāo)記在應(yīng)用開發(fā)人員設(shè)計(jì)的待分析網(wǎng)頁和靜態(tài)網(wǎng)頁時(shí)使用。
(1)參數(shù)替換標(biāo)記。該類標(biāo)記用于將傳入的POST等請求的參數(shù)的值直接替換網(wǎng)頁中相應(yīng)的參數(shù)替換標(biāo)記。這類標(biāo)記既是HTTP請求的參數(shù),又可能是結(jié)果替換標(biāo)記的參數(shù)。
(2)結(jié)果替換標(biāo)記。該類標(biāo)記用于將其代表的代碼段執(zhí)行結(jié)果置換網(wǎng)頁中的相應(yīng)結(jié)果替換標(biāo)記,在置換時(shí)可能要進(jìn)行類型轉(zhuǎn)換。例如,返回值是整型(int)4 000,引擎會(huì)將其轉(zhuǎn)換成字符串“4 000”,然后替換。
1.4 外部接口庫
外部接口庫是由應(yīng)用開發(fā)人員提供的用于進(jìn)行業(yè)務(wù)邏輯處理的動(dòng)態(tài)庫中的某些函數(shù)構(gòu)成的,這些函數(shù)(稱為外部函數(shù))遵循下面描述的規(guī)則:配置文件中的映射定義部分允許應(yīng)用開發(fā)人員靈活地將外部函數(shù)的運(yùn)行特性和與待分析網(wǎng)頁中的結(jié)果替換標(biāo)記的進(jìn)程對(duì)應(yīng)。分析引擎通過收集的外部函數(shù)的參數(shù)信息和實(shí)參值,加載指定的動(dòng)態(tài)庫,搜索該外部函數(shù)的入口地址,然后構(gòu)造實(shí)際的函數(shù)調(diào)用,再采集其返回值,替換相應(yīng)標(biāo)記,形成動(dòng)態(tài)網(wǎng)頁。
這種思路的基本實(shí)現(xiàn)技術(shù)是動(dòng)態(tài)裝載。過程如下:分析引擎在第1次調(diào)用該動(dòng)態(tài)庫中的函數(shù)時(shí)將其加載(dlopen)到運(yùn)行進(jìn)程的地址空間,在庫中查找(dlsym)函數(shù)的地址,然后調(diào)用該函數(shù),當(dāng)不再需要的時(shí)候,卸載(dlclose)動(dòng)態(tài)庫。
在嵌入式Web服務(wù)器啟動(dòng)時(shí),準(zhǔn)備了另外的運(yùn)行線程池,專門用于運(yùn)行應(yīng)用開發(fā)任務(wù)提供的函數(shù),該線程受嵌入式Web服務(wù)器的分析引擎控制。之所以要在另外的線程中運(yùn)行,是為盡量避免外部函數(shù)代碼對(duì)本引擎的影響,可以在出現(xiàn)異常時(shí)果斷地終止該運(yùn)行線程,加上超時(shí)定時(shí)器,能將外部函數(shù)帶來的風(fēng)險(xiǎn)降低。
運(yùn)行線程和分析引擎之間通過共享運(yùn)行隊(duì)列和結(jié)果隊(duì)列來通信。一旦分析引擎有執(zhí)行函數(shù)的需求時(shí),就封裝1個(gè)執(zhí)行結(jié)構(gòu)run_struct,它定義了某次HTTP請求所需執(zhí)行的所有函數(shù)及其參數(shù)、運(yùn)行超時(shí)時(shí)間等信息,然后將該run_struct掛入運(yùn)行隊(duì)列。運(yùn)行線程是定期訪問運(yùn)行隊(duì)列的,發(fā)現(xiàn)有任務(wù)時(shí),就加載相應(yīng)的共享庫,查找函數(shù)的入口地址,并加以執(zhí)行,等待其執(zhí)行結(jié)束,填充結(jié)果,直到run_struct中的所有函數(shù)執(zhí)行完畢(若期間某函數(shù)執(zhí)行異常,有可能導(dǎo)致提前結(jié)束),最后將運(yùn)行完成的run_struct從運(yùn)行隊(duì)列上摘下,掛入結(jié)果隊(duì)列等待分析引擎的訪問。
運(yùn)行線程是等待外部函數(shù)執(zhí)行完畢后,再繼續(xù)執(zhí)行的。如果有多個(gè)HTTP請求等待處理,而又只有1個(gè)運(yùn)行線程時(shí),可能會(huì)有較大的延時(shí),故可根據(jù)具體應(yīng)用的實(shí)際情況,將運(yùn)行線程的數(shù)量配置成多個(gè)。但不可過多,因?yàn)榫€程本身也要占有一定的資源,而線程切換同樣需要開銷。
2 嵌入式Web服務(wù)器的設(shè)計(jì)
嵌入式Web服務(wù)器與通用Web服務(wù)器比較,存在以下3個(gè)方面的差別[4]:
(1)運(yùn)行的目標(biāo)環(huán)境不一樣。通用Web服務(wù)器一般運(yùn)行在計(jì)算資源和內(nèi)存資源都比較豐富的臺(tái)式機(jī)上,而嵌入式Web服務(wù)器運(yùn)行的目標(biāo)系統(tǒng)大多是各類專用設(shè)備,資源比較缺乏。
(2)在各自系統(tǒng)中的作用不一樣。通用Web服務(wù)器主要是利用Web服務(wù)器向用戶提供信息服務(wù),而嵌入式Web服務(wù)器嵌入在設(shè)備中,其主要作用是控制和配置設(shè)備,但也向客戶提供設(shè)備的運(yùn)行信息。
(3)運(yùn)行的優(yōu)先級(jí)不一樣。嵌入式Web服務(wù)器作為一種監(jiān)控、管理手段存在,它不能干擾設(shè)備主要任務(wù)的運(yùn)行。
針對(duì)于上面嵌入式Web服務(wù)器與通用Web服務(wù)器的不同,設(shè)計(jì)嵌入式Web服務(wù)器時(shí)考慮的性能指標(biāo)也不一樣。對(duì)于嵌入式Web服務(wù)器來說,吞吐率并不需要很大,而需要很快的系統(tǒng)響應(yīng)速度,因?yàn)榍度胧絎eb服務(wù)器面對(duì)的用戶是少量的設(shè)備管理人員,實(shí)現(xiàn)的是監(jiān)控與管理功能。一個(gè)好的Web服務(wù)器應(yīng)具備良好的可移植性、可裁剪性和與目標(biāo)設(shè)備良好的兼容性。
嵌入式Web服務(wù)器中,其Web引擎(HTTP引擎和分析引擎)是核心部分。嵌入式Web引擎的狀態(tài)圖如圖2所示。
圖2中的管理應(yīng)用是嵌入式Web服務(wù)器與應(yīng)用設(shè)備的接口。它用來實(shí)現(xiàn)獲取用戶所需的設(shè)備信息及執(zhí)行實(shí)際的管理設(shè)備功能,構(gòu)成監(jiān)控、管理設(shè)備的用戶界面。
有時(shí)該用戶界面是靜態(tài)的,但大部分是隨時(shí)間動(dòng)態(tài)改變的。如客戶請求設(shè)備狀態(tài)參數(shù)時(shí),嵌入式Web服務(wù)器通過調(diào)用管理應(yīng)用程序獲得設(shè)備動(dòng)態(tài)信息,然后組織成動(dòng)態(tài)Web頁面返回給客戶端;如用戶通過Web頁面發(fā)送1個(gè)控制命令字,Web服務(wù)器也需通過調(diào)用管理應(yīng)用程序,把該命令相關(guān)參數(shù)傳遞給實(shí)際執(zhí)行控制動(dòng)作的管理程序并監(jiān)視其執(zhí)行,把執(zhí)行結(jié)果組織成Web頁面的形式返回給用戶。在嵌入式Web服務(wù)器中實(shí)現(xiàn)應(yīng)用程序的接口技術(shù)有公共網(wǎng)關(guān)技術(shù)(CGI)和服務(wù)器端包含技術(shù)(SSI)。
嵌入式系統(tǒng)中,Web服務(wù)器作為單獨(dú)的任務(wù)執(zhí)行,任務(wù)的優(yōu)先級(jí)應(yīng)設(shè)置成較低的優(yōu)先級(jí),以避免對(duì)嵌入式系統(tǒng)主要功能造成干擾。嵌入式Web服務(wù)器的結(jié)構(gòu)包括核心部分和可裁剪的功能模塊部分。核心部分包含HTTP請求分析引擎和模塊分析器。HTTP請求分析引擎負(fù)責(zé)接收客戶端發(fā)送來的HTTP請求報(bào)文,獲得客戶端信息,并把解析出的信息保存到請求結(jié)構(gòu)中,后續(xù)處理模塊都從該結(jié)構(gòu)中獲得請求報(bào)文的相關(guān)信息;模塊分析器則是根據(jù)配置信息調(diào)度其他功能模塊。模塊分配器執(zhí)行流程如圖3所示。
RPM(Request Process Module)可以根據(jù)用戶的需求進(jìn)行裁剪,它分成兩種類型:系統(tǒng)PRM和用戶PRM。一旦配置了系統(tǒng)PRM模塊,則該P(yáng)RM模塊對(duì)服務(wù)器接收到的所有請求都會(huì)進(jìn)行處理;用戶PRM模塊則根據(jù)進(jìn)一步的配置信息,只對(duì)某些特定的請求進(jìn)行處理。
針對(duì)嵌入式Web服務(wù)器采用以下措施可以提高系統(tǒng)性能:
(1)減小Web服務(wù)器中請求的生命周期以縮短等待時(shí)間。
(2)在Web服務(wù)器中使用線程取代進(jìn)程來加強(qiáng)系統(tǒng)的并發(fā)性。
(3)采用瘦Web服務(wù)器、胖客戶機(jī)的應(yīng)用模式以提升服務(wù)性能。
隨著因特網(wǎng)的迅速發(fā)展,需構(gòu)造嵌入式Web應(yīng)用系統(tǒng)的應(yīng)用也越來越多,嵌入式Web服務(wù)器將會(huì)有很好的發(fā)展前景。
參考文獻(xiàn)
[1] 冀振燕.UML系統(tǒng)分析設(shè)計(jì)與應(yīng)用案例[M].北京:人民郵電出版社,2003.
[2] CONALLEN J. Building Web applications with UML. Addison Wesley Longman,2000.
[3] 陳偉,邱書波.蓄電池生產(chǎn)控制網(wǎng)絡(luò)結(jié)構(gòu)的設(shè)計(jì)與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2009(1-3).
[4] DOUGLASS B P.實(shí)時(shí)UML——開發(fā)嵌入式系統(tǒng)高效對(duì)象[M].尹浩瓊譯.北京:中國電力出版社,2003.