范郁寶
(上海電機(jī)學(xué)院高職學(xué)院,上海 200093)
隨著網(wǎng)絡(luò)技術(shù)的不斷發(fā)展,各種嵌入式設(shè)備進(jìn)行網(wǎng)絡(luò)互聯(lián)變?yōu)楝F(xiàn)實(shí)。同時(shí),隨著實(shí)時(shí)操作系統(tǒng)和TCP/IP協(xié)議在嵌入式設(shè)備中的廣泛應(yīng)用,可使用標(biāo)準(zhǔn)瀏覽器在Internet網(wǎng)絡(luò)的遠(yuǎn)端對(duì)這些設(shè)備進(jìn)行訪問(wèn)與控制。瀏覽器通過(guò)存儲(chǔ)在現(xiàn)場(chǎng)設(shè)備中的網(wǎng)頁(yè),動(dòng)態(tài)地反映現(xiàn)場(chǎng)設(shè)備的運(yùn)行狀態(tài)以及執(zhí)行操作后的反饋信息,同時(shí),嵌入式Web服務(wù)器與現(xiàn)場(chǎng)控制系統(tǒng)、儀器儀表相連結(jié),就可通過(guò)Internet實(shí)現(xiàn)遠(yuǎn)程監(jiān)控和控制系統(tǒng)維護(hù)。因此,嵌入式Web技術(shù)對(duì)這些眾多的聯(lián)網(wǎng)設(shè)備的訪問(wèn)簡(jiǎn)單方便,易于實(shí)現(xiàn)。利用這種特性,可采用多種方式實(shí)現(xiàn)對(duì)設(shè)備狀態(tài)的實(shí)時(shí)監(jiān)測(cè),從而達(dá)到可靠的控制效果
在工業(yè)現(xiàn)場(chǎng)中,由于各種智能儀表的運(yùn)算能力、儲(chǔ)存空間和其他各種硬件資源均有不同,因此,它們接入到網(wǎng)絡(luò)中的方式也不同,嵌入式Web技術(shù)在具體的實(shí)現(xiàn)中有以下幾種方式。
在設(shè)備內(nèi)部實(shí)現(xiàn)Web服務(wù)器的關(guān)鍵就是用純軟件來(lái)實(shí)現(xiàn)TCP/IP的協(xié)議棧[1],使嵌入式Web服務(wù)器軟件在協(xié)議棧上運(yùn)行,并可以直接連接到網(wǎng)絡(luò)上。這種方式通常要求CPU具有很強(qiáng)的運(yùn)算處理能力,TCP/IP的協(xié)議棧通常有串口與modem連接,或可通過(guò)以太網(wǎng)芯片組連接到以太網(wǎng)上。這種方式的Web服務(wù)器結(jié)構(gòu)如圖1所示。
圖1 軟件實(shí)現(xiàn)的Web服務(wù)器Fig.1 The Web server implemented by software
通過(guò)軟件實(shí)現(xiàn)Web服務(wù)器的特點(diǎn)是設(shè)備可以直接掛接到網(wǎng)絡(luò)上,用到的硬件只有CPU和接口芯片,不需要其他輔助硬件,硬件設(shè)計(jì)簡(jiǎn)單。而其不足之處在于CPU處理能力要求較高,通常為32位運(yùn)算能力的處理器;代碼鼠很大,需要較大的存儲(chǔ)空間;純軟件協(xié)議棧,軟件調(diào)試復(fù)雜。
圖2 硬件實(shí)現(xiàn)的Web服務(wù)器Fig.2 The Web server implemented by hardware
在這種方式下,設(shè)備完全由硬件來(lái)實(shí)現(xiàn)TCP/IP協(xié)議棧,目前己經(jīng)有這種功能的芯片投入市場(chǎng)。也可以采用能實(shí)現(xiàn)TCP/IP的硬件電路板,通過(guò)串口接入到現(xiàn)場(chǎng)智能設(shè)備上,從而實(shí)現(xiàn)TCP/IP協(xié)議?,F(xiàn)場(chǎng)設(shè)備的處理器只需要運(yùn)行嵌入式Web服務(wù)器軟件即可。
通過(guò)硬件實(shí)現(xiàn)Web服務(wù)器的優(yōu)點(diǎn)是設(shè)備可以直接掛接到網(wǎng)絡(luò)上;全部的TCP/IP協(xié)議棧由外圍芯片硬件實(shí)現(xiàn),減輕了調(diào)試軟件的負(fù)擔(dān);CPU不用運(yùn)行TCP/IP協(xié)議棧軟件,減輕了處理負(fù)擔(dān),因而對(duì)CPU的性能要求降低,減少了存儲(chǔ)器的使用空間。其缺點(diǎn)是增加了處理TCP/IP的外圍芯片成本;增加了硬件設(shè)計(jì)復(fù)雜度和硬件調(diào)試難度。
采用外部網(wǎng)關(guān)實(shí)現(xiàn)嵌入式Web服務(wù)器的結(jié)構(gòu)如圖3所示。
圖3 外部網(wǎng)關(guān)實(shí)現(xiàn)嵌入式Web服務(wù)器Fig.3 The Web embedded implemented by external gateway
這種結(jié)構(gòu)由一臺(tái)PC機(jī)充當(dāng)外部網(wǎng)關(guān)[2],Web服務(wù)器運(yùn)行完整的TCP/IP協(xié)議和部分嵌入式Web服務(wù)軟件,并通過(guò)串口等方式使每臺(tái)PC機(jī)可以控制一個(gè)或多個(gè)現(xiàn)場(chǎng)設(shè)備。外界對(duì)現(xiàn)場(chǎng)設(shè)備進(jìn)行訪問(wèn)時(shí),Web服務(wù)器先要通過(guò)網(wǎng)關(guān)進(jìn)行解析,然后與現(xiàn)場(chǎng)設(shè)備交換信息,提取網(wǎng)頁(yè)等,并將最終的信息送給外部訪問(wèn)者。
GoAhead服務(wù)器是源代碼公開(kāi)的嵌入式Web服務(wù)器[3],是為嵌入式設(shè)備而設(shè)計(jì)的,可以在 www.GoA-head.com網(wǎng)站上下載。這個(gè)開(kāi)放、免費(fèi)并且標(biāo)準(zhǔn)化的產(chǎn)品可以快速地與嵌入式設(shè)備結(jié)合,實(shí)現(xiàn)Web解決方案。它在標(biāo)準(zhǔn)的Web服務(wù)器的基礎(chǔ)上將源代碼簡(jiǎn)化,通過(guò)模塊化的方法將各個(gè)處理構(gòu)件集中到單獨(dú)的文件中,如處理與Socket有關(guān)的函數(shù)均在Sock.c和 Sock-Gen.c中[4]、處理用戶管理的函數(shù)均在 um.c中以及處理安全認(rèn)證的均在security.c中等,從而使得體系結(jié)構(gòu)十分清晰,源碼也易于理解。
GoAhead嵌入式Web服務(wù)器的開(kāi)放源代碼如同Linux一樣,也是開(kāi)放源代碼的軟件產(chǎn)品。開(kāi)發(fā)源代碼可以有助于開(kāi)發(fā)者更好地理解軟件的內(nèi)部構(gòu)成,也可以得到更多的技術(shù)內(nèi)幕,這是選擇GoAhead的原因。其他一些源代碼不開(kāi)放的嵌入式Web服務(wù)器通常需要利用專(zhuān)門(mén)的開(kāi)發(fā)工具對(duì)這些軟件進(jìn)行開(kāi)發(fā),因此增加了軟件開(kāi)發(fā)的復(fù)雜性,也提高了購(gòu)買(mǎi)開(kāi)發(fā)工具產(chǎn)品的成本。GoAhead的體系結(jié)構(gòu)如圖4所示。
圖4 GoAhead的體系結(jié)構(gòu)Fig.4 Architecture of GoAhead
標(biāo)準(zhǔn)Web服務(wù)器通常含有大量的靜態(tài)存儲(chǔ)網(wǎng)頁(yè),而嵌入式Web服務(wù)器則根據(jù)需求動(dòng)態(tài)地生成所需的網(wǎng)頁(yè)。這些網(wǎng)頁(yè)需要實(shí)時(shí)地反映設(shè)備的狀態(tài)、采集的信號(hào)、報(bào)警的信息和反饋操作的執(zhí)行結(jié)果等。嵌入式Web服務(wù)器必須要求網(wǎng)頁(yè)能夠隨嵌入式設(shè)備的變化而動(dòng)態(tài)更新和生成[5]。GoAhead采用ASP的應(yīng)用和嵌入式JavaScript兩種方法實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁(yè)。
許多嵌入式Web服務(wù)器都是通過(guò)專(zhuān)有的方法來(lái)產(chǎn)生動(dòng)態(tài)數(shù)據(jù)的,而GoAhead則更多地采用工業(yè)標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn),如ASP和JavaScript。ASP是微軟開(kāi)發(fā)的用于產(chǎn)生動(dòng)態(tài)網(wǎng)頁(yè)的方法,允許多種腳本語(yǔ)言來(lái)動(dòng)態(tài)地表示各種數(shù)據(jù),而不用對(duì)服務(wù)器進(jìn)行重新編譯。GoA-head中的JavaScript是一種腳本語(yǔ)言,已經(jīng)得到了廣泛的應(yīng)用。但是這種腳本語(yǔ)言的解釋器所需要的代碼空間為200~400 kB,不適用于嵌入式設(shè)備中,而GoA-head采用的是JavaScript的一個(gè)子集,稱(chēng)之為Embedded JavaScript,它只需要完成嵌入式設(shè)備通常需要的流程控制、變量賦值和結(jié)構(gòu)測(cè)試等。
GoAhead嵌入式Web服務(wù)器采用安全套接層SSL(secure socket layer)協(xié)議在TCP/IP網(wǎng)絡(luò)上進(jìn)行加密和認(rèn)證,支持更高級(jí)的安全認(rèn)證機(jī)制DAA(digest access authentication)。同時(shí),通過(guò)用戶管理,可以給不同的用戶設(shè)置不同的訪問(wèn)權(quán)限。
許多嵌入式設(shè)備通常沒(méi)有磁盤(pán)文件系統(tǒng)或其他大容量存儲(chǔ)設(shè)備,但仍需要通過(guò)網(wǎng)頁(yè)對(duì)其進(jìn)行訪問(wèn)和控制,這就要求嵌入式Web服務(wù)器能夠通過(guò)ROM或Flash這樣的存儲(chǔ)設(shè)備來(lái)進(jìn)行網(wǎng)頁(yè)的存儲(chǔ)。GoAhead先對(duì)要存儲(chǔ)的網(wǎng)頁(yè)進(jìn)行編譯,將所有的網(wǎng)頁(yè)轉(zhuǎn)換成一個(gè)大的矩陣數(shù)組,并將最終生成的可執(zhí)行文件存儲(chǔ)在ROM中;在網(wǎng)頁(yè)提取時(shí),通過(guò)另外的解釋程序?qū)@些數(shù)組進(jìn)行解壓縮轉(zhuǎn)換成所需的網(wǎng)頁(yè),從而避免對(duì)文件系統(tǒng)的依賴(lài)。
嵌入式Web服務(wù)器能與現(xiàn)有的設(shè)備進(jìn)行很好的集成,設(shè)計(jì)方便。這里的集成通常是指兩個(gè)方面:①嵌入式Web服務(wù)器與實(shí)時(shí)操作系統(tǒng)的集成;②嵌入式Web服務(wù)器與設(shè)備應(yīng)用程序的集成。
對(duì)于前者,GoAhead提供了操作系統(tǒng)抽象層,在移植到不同的操作系統(tǒng)上時(shí),只需對(duì)系統(tǒng)抽象層的接口函數(shù)進(jìn)行修改[6],就可以使服務(wù)器程序較方便地在不同操作系統(tǒng)上運(yùn)行。
目前,GoAhead操作系統(tǒng)己經(jīng)在 Linux、QNX、Vxworks和Windows CE等系統(tǒng)上得到了實(shí)現(xiàn)。對(duì)于后者,可以通過(guò)不同的途徑使與設(shè)備相關(guān)的應(yīng)用程序接口API與Web服務(wù)器集成。GoAhead通過(guò)動(dòng)態(tài)服務(wù)網(wǎng)頁(yè)ASP和JavaScript使設(shè)備應(yīng)用程序產(chǎn)生的動(dòng)態(tài)結(jié)果鏈接到網(wǎng)頁(yè)上。
GoAhead自身定義了兩個(gè)重要的結(jié)構(gòu)體,即維護(hù)每一個(gè)socket()所有信息的結(jié)構(gòu)體類(lèi)型socket_t和維護(hù)每個(gè)Web訪問(wèn)信息的結(jié)構(gòu)體類(lèi)型WebsRec。GoA-head服務(wù)器主流程如圖5所示。
圖5 GoAhead服務(wù)器的主流程Fig.5 Main process of GoAhead server
盡管GoAhead已經(jīng)能夠移植到很多操作系統(tǒng)上[7],如 Linux、Windows、Vxworks、和 ECOS 等,但目前還沒(méi)有Nucleus上的版本。因此,只能選擇一個(gè)與Nucleus最接近的操作系統(tǒng)ECOS,并參照GoAhead在ECOS上的軟件移植版本進(jìn)行修改。GoAhead服務(wù)器的Socket接口采用的是Berkley的標(biāo)準(zhǔn)API,Nucleus的NET部分也是遵循Berkley的標(biāo)準(zhǔn),這就增加了移植的方便性。由于Nucleus的NET部分是一個(gè)精簡(jiǎn)的TCP/IP協(xié)議棧,有許多功能函數(shù)或者函數(shù)選項(xiàng)沒(méi)有實(shí)現(xiàn),同時(shí)一些結(jié)構(gòu)體的定義也經(jīng)過(guò)了簡(jiǎn)化,這就給移植帶來(lái)了很多需要考慮的問(wèn)題。
2.6.1 對(duì)Socket接口函數(shù)的替代
GoAhead總共有30多個(gè)源文件(C文件),但是其中主要的Socket接口函數(shù)所在的文件是Sock.c、Sock-Gen.c、主函數(shù)(mainfunction.c)和幾個(gè)頭文件。其中Sock.c和SockGen.c文件中的函數(shù)均需要調(diào)用TCP/UDP套接字的Socket接口函數(shù),是GoAhead集中維護(hù)的位于Socket API和Web API中間的一層。由于在這兩個(gè)文件中均是調(diào)用標(biāo)準(zhǔn)的Berkley Socket API,因此,在移植時(shí)需要把這些Socket API完全替換成Nucleus的Socket API。同時(shí),在調(diào)用函數(shù)時(shí),由于參數(shù)的類(lèi)型有差異,需要對(duì)參數(shù)進(jìn)行強(qiáng)制轉(zhuǎn)換。替代的API函數(shù)如表1所示。
表1 Socket API函數(shù)替代表Tab.1 Substitution for Socket API functions
2.6.2 對(duì)類(lèi)型和結(jié)構(gòu)體的替代和更改
①基本類(lèi)型
GoAhead自身定義了許多基本數(shù)據(jù)類(lèi)型,但與Nucleus相對(duì)應(yīng)定義的類(lèi)型表達(dá)方式不一致,這時(shí)就需要在Nucleus的源文件 target.h中對(duì)應(yīng)地增加這些定義[8],以使類(lèi)型保持一致。
②與套接字和TCP/IP有關(guān)的類(lèi)型
GoAhead采用Socket的結(jié)構(gòu)體定義與Nucleus不同,必須替代,而且在對(duì)Socket結(jié)構(gòu)體賦值時(shí),必須注意要強(qiáng)制轉(zhuǎn)換,其相關(guān)的結(jié)構(gòu)對(duì)照如表2所示。
表2 套接字結(jié)構(gòu)體對(duì)應(yīng)關(guān)系Tab.2 Correspondence relationship of the Socket structure
2.6.3 GoAhead 編譯預(yù)處理的定義
對(duì)于編譯器來(lái)說(shuō),要想正確編譯GoAhead和Nucleus移植后的源代碼,就得把各自的編譯預(yù)處理定義加在一起,且相互之間不能產(chǎn)生語(yǔ)義上的歧義。
此外,在GoAhead的頭文件Uemf.h中有專(zhuān)為移植后的操作系統(tǒng)(如Linux、WindowsCE、和EEOS等)定義的 include[9-10],所以也要為 Nucleus 移植版本定義一個(gè)條件編譯。其中,NU為編譯預(yù)處理定義,表明此版本是在Nucleus操作系統(tǒng)上運(yùn)行;PLUS ucleus.h是Nucleus的內(nèi)核頭文件;netinc unet.h是Nueleus網(wǎng)絡(luò)包的頭文件,這就包含了在GoAhead中把所要用到的Nucleus頭文件,使用時(shí)就不會(huì)再出現(xiàn)問(wèn)題;STX和ETX分別為數(shù)據(jù)幀的起始標(biāo)志和結(jié)束標(biāo)志;Data為消息正文,包含向控制器發(fā)送的控制命令以及控制器返回的數(shù)據(jù)。
嵌入式設(shè)備以其體積小和性能穩(wěn)定等特點(diǎn)成為遠(yuǎn)程監(jiān)控系統(tǒng)的主流方向。本文主要論述了嵌入式Web服務(wù)器在遠(yuǎn)程控制系統(tǒng)中的應(yīng)用。在傳統(tǒng)的控制系統(tǒng)中引入嵌入式Web服務(wù)器,實(shí)現(xiàn)了實(shí)時(shí)、方便的遠(yuǎn)程控制,用戶只需輸入嵌入式Web服務(wù)器的地址即可控制遠(yuǎn)程控制系統(tǒng)[11]。軟件設(shè)計(jì)使得該系統(tǒng)程序結(jié)構(gòu)清晰,維護(hù)方便,能夠滿足系統(tǒng)對(duì)現(xiàn)場(chǎng)設(shè)備的控制要求,促進(jìn)低端控制設(shè)備的信息化。
本系統(tǒng)的研究與實(shí)驗(yàn)對(duì)遠(yuǎn)程控制系統(tǒng)具有一定的參考價(jià)值,系統(tǒng)經(jīng)過(guò)測(cè)試,取得了比較滿意的運(yùn)行效果。
[1]呂京建,肖海橋.面向二十一世紀(jì)的嵌入式系統(tǒng)綜述[J].電子質(zhì)量,2001(8):3-8.
[2]葛源,胡榮強(qiáng),吳小娟.嵌入式Web服務(wù)器與plc的通信實(shí)現(xiàn)[J].電力自動(dòng)化設(shè)備,2005,25(12):70 -72.
[3]賀磊.一種嵌入式實(shí)時(shí)操作系統(tǒng)Nucleus plus[J].信息工程大學(xué)學(xué)報(bào),2000(4):12-25.
[4]張湘,肖建.嵌入式系統(tǒng)和嵌入式操作系統(tǒng)[J].世界儀表與自動(dòng)化,2002,6(5):12 -16.
[5]魏忠,蔡勇,雷紅衛(wèi).嵌入式系統(tǒng)開(kāi)發(fā)詳解[M].北京:電子工業(yè)出版社,2006:63-70.
[6]錢(qián)斌,徐海云,林少華.嵌入式Web服務(wù)器在CTM系統(tǒng)中的應(yīng)用[J].微計(jì)算機(jī)信息,2006(17):99-101.
[7]羅蕾.嵌入式實(shí)時(shí)操作系統(tǒng)及應(yīng)用開(kāi)發(fā)[M].北京:北京航空航天大學(xué)出版社,2007:6-20.
[8]吳小紅,楊海濤,王萬(wàn)良.基于Web的遠(yuǎn)程控制實(shí)驗(yàn)系統(tǒng)的設(shè)計(jì)[J].浙江工業(yè)大學(xué)學(xué)報(bào),2004(6):700-705.
[9]李善平,劉文峰,王煥龍,等.Linux與嵌入式操系統(tǒng)[M].北京:清華大學(xué)出版社,2003:25-25.
[10]王傳啟,鄧文棟,金敏.工業(yè)控系統(tǒng)制中嵌入式Web服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與應(yīng)用,2002(10):227-230.
[11]劉立芳,齊小剛.遠(yuǎn)程設(shè)備實(shí)時(shí)監(jiān)控管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2000,26(4):91 -92.