范郁寶
(上海電機學院高職學院,上海 200093)
隨著網(wǎng)絡技術(shù)的不斷發(fā)展,各種嵌入式設備進行網(wǎng)絡互聯(lián)變?yōu)楝F(xiàn)實。同時,隨著實時操作系統(tǒng)和TCP/IP協(xié)議在嵌入式設備中的廣泛應用,可使用標準瀏覽器在Internet網(wǎng)絡的遠端對這些設備進行訪問與控制。瀏覽器通過存儲在現(xiàn)場設備中的網(wǎng)頁,動態(tài)地反映現(xiàn)場設備的運行狀態(tài)以及執(zhí)行操作后的反饋信息,同時,嵌入式Web服務器與現(xiàn)場控制系統(tǒng)、儀器儀表相連結(jié),就可通過Internet實現(xiàn)遠程監(jiān)控和控制系統(tǒng)維護。因此,嵌入式Web技術(shù)對這些眾多的聯(lián)網(wǎng)設備的訪問簡單方便,易于實現(xiàn)。利用這種特性,可采用多種方式實現(xiàn)對設備狀態(tài)的實時監(jiān)測,從而達到可靠的控制效果
在工業(yè)現(xiàn)場中,由于各種智能儀表的運算能力、儲存空間和其他各種硬件資源均有不同,因此,它們接入到網(wǎng)絡中的方式也不同,嵌入式Web技術(shù)在具體的實現(xiàn)中有以下幾種方式。
在設備內(nèi)部實現(xiàn)Web服務器的關(guān)鍵就是用純軟件來實現(xiàn)TCP/IP的協(xié)議棧[1],使嵌入式Web服務器軟件在協(xié)議棧上運行,并可以直接連接到網(wǎng)絡上。這種方式通常要求CPU具有很強的運算處理能力,TCP/IP的協(xié)議棧通常有串口與modem連接,或可通過以太網(wǎng)芯片組連接到以太網(wǎng)上。這種方式的Web服務器結(jié)構(gòu)如圖1所示。

圖1 軟件實現(xiàn)的Web服務器Fig.1 The Web server implemented by software
通過軟件實現(xiàn)Web服務器的特點是設備可以直接掛接到網(wǎng)絡上,用到的硬件只有CPU和接口芯片,不需要其他輔助硬件,硬件設計簡單。而其不足之處在于CPU處理能力要求較高,通常為32位運算能力的處理器;代碼鼠很大,需要較大的存儲空間;純軟件協(xié)議棧,軟件調(diào)試復雜。

圖2 硬件實現(xiàn)的Web服務器Fig.2 The Web server implemented by hardware
在這種方式下,設備完全由硬件來實現(xiàn)TCP/IP協(xié)議棧,目前己經(jīng)有這種功能的芯片投入市場。也可以采用能實現(xiàn)TCP/IP的硬件電路板,通過串口接入到現(xiàn)場智能設備上,從而實現(xiàn)TCP/IP協(xié)議。現(xiàn)場設備的處理器只需要運行嵌入式Web服務器軟件即可。
通過硬件實現(xiàn)Web服務器的優(yōu)點是設備可以直接掛接到網(wǎng)絡上;全部的TCP/IP協(xié)議棧由外圍芯片硬件實現(xiàn),減輕了調(diào)試軟件的負擔;CPU不用運行TCP/IP協(xié)議棧軟件,減輕了處理負擔,因而對CPU的性能要求降低,減少了存儲器的使用空間。其缺點是增加了處理TCP/IP的外圍芯片成本;增加了硬件設計復雜度和硬件調(diào)試難度。
采用外部網(wǎng)關(guān)實現(xiàn)嵌入式Web服務器的結(jié)構(gòu)如圖3所示。

圖3 外部網(wǎng)關(guān)實現(xiàn)嵌入式Web服務器Fig.3 The Web embedded implemented by external gateway
這種結(jié)構(gòu)由一臺PC機充當外部網(wǎng)關(guān)[2],Web服務器運行完整的TCP/IP協(xié)議和部分嵌入式Web服務軟件,并通過串口等方式使每臺PC機可以控制一個或多個現(xiàn)場設備。外界對現(xiàn)場設備進行訪問時,Web服務器先要通過網(wǎng)關(guān)進行解析,然后與現(xiàn)場設備交換信息,提取網(wǎng)頁等,并將最終的信息送給外部訪問者。
GoAhead服務器是源代碼公開的嵌入式Web服務器[3],是為嵌入式設備而設計的,可以在 www.GoA-head.com網(wǎng)站上下載。這個開放、免費并且標準化的產(chǎn)品可以快速地與嵌入式設備結(jié)合,實現(xiàn)Web解決方案。它在標準的Web服務器的基礎(chǔ)上將源代碼簡化,通過模塊化的方法將各個處理構(gòu)件集中到單獨的文件中,如處理與Socket有關(guān)的函數(shù)均在Sock.c和 Sock-Gen.c中[4]、處理用戶管理的函數(shù)均在 um.c中以及處理安全認證的均在security.c中等,從而使得體系結(jié)構(gòu)十分清晰,源碼也易于理解。
GoAhead嵌入式Web服務器的開放源代碼如同Linux一樣,也是開放源代碼的軟件產(chǎn)品。開發(fā)源代碼可以有助于開發(fā)者更好地理解軟件的內(nèi)部構(gòu)成,也可以得到更多的技術(shù)內(nèi)幕,這是選擇GoAhead的原因。其他一些源代碼不開放的嵌入式Web服務器通常需要利用專門的開發(fā)工具對這些軟件進行開發(fā),因此增加了軟件開發(fā)的復雜性,也提高了購買開發(fā)工具產(chǎn)品的成本。GoAhead的體系結(jié)構(gòu)如圖4所示。

圖4 GoAhead的體系結(jié)構(gòu)Fig.4 Architecture of GoAhead
標準Web服務器通常含有大量的靜態(tài)存儲網(wǎng)頁,而嵌入式Web服務器則根據(jù)需求動態(tài)地生成所需的網(wǎng)頁。這些網(wǎng)頁需要實時地反映設備的狀態(tài)、采集的信號、報警的信息和反饋操作的執(zhí)行結(jié)果等。嵌入式Web服務器必須要求網(wǎng)頁能夠隨嵌入式設備的變化而動態(tài)更新和生成[5]。GoAhead采用ASP的應用和嵌入式JavaScript兩種方法實現(xiàn)動態(tài)網(wǎng)頁。
許多嵌入式Web服務器都是通過專有的方法來產(chǎn)生動態(tài)數(shù)據(jù)的,而GoAhead則更多地采用工業(yè)標準來實現(xiàn),如ASP和JavaScript。ASP是微軟開發(fā)的用于產(chǎn)生動態(tài)網(wǎng)頁的方法,允許多種腳本語言來動態(tài)地表示各種數(shù)據(jù),而不用對服務器進行重新編譯。GoA-head中的JavaScript是一種腳本語言,已經(jīng)得到了廣泛的應用。但是這種腳本語言的解釋器所需要的代碼空間為200~400 kB,不適用于嵌入式設備中,而GoA-head采用的是JavaScript的一個子集,稱之為Embedded JavaScript,它只需要完成嵌入式設備通常需要的流程控制、變量賦值和結(jié)構(gòu)測試等。
GoAhead嵌入式Web服務器采用安全套接層SSL(secure socket layer)協(xié)議在TCP/IP網(wǎng)絡上進行加密和認證,支持更高級的安全認證機制DAA(digest access authentication)。同時,通過用戶管理,可以給不同的用戶設置不同的訪問權(quán)限。
許多嵌入式設備通常沒有磁盤文件系統(tǒng)或其他大容量存儲設備,但仍需要通過網(wǎng)頁對其進行訪問和控制,這就要求嵌入式Web服務器能夠通過ROM或Flash這樣的存儲設備來進行網(wǎng)頁的存儲。GoAhead先對要存儲的網(wǎng)頁進行編譯,將所有的網(wǎng)頁轉(zhuǎn)換成一個大的矩陣數(shù)組,并將最終生成的可執(zhí)行文件存儲在ROM中;在網(wǎng)頁提取時,通過另外的解釋程序?qū)@些數(shù)組進行解壓縮轉(zhuǎn)換成所需的網(wǎng)頁,從而避免對文件系統(tǒng)的依賴。
嵌入式Web服務器能與現(xiàn)有的設備進行很好的集成,設計方便。這里的集成通常是指兩個方面:①嵌入式Web服務器與實時操作系統(tǒng)的集成;②嵌入式Web服務器與設備應用程序的集成。
對于前者,GoAhead提供了操作系統(tǒng)抽象層,在移植到不同的操作系統(tǒng)上時,只需對系統(tǒng)抽象層的接口函數(shù)進行修改[6],就可以使服務器程序較方便地在不同操作系統(tǒng)上運行。
目前,GoAhead操作系統(tǒng)己經(jīng)在 Linux、QNX、Vxworks和Windows CE等系統(tǒng)上得到了實現(xiàn)。對于后者,可以通過不同的途徑使與設備相關(guān)的應用程序接口API與Web服務器集成。GoAhead通過動態(tài)服務網(wǎng)頁ASP和JavaScript使設備應用程序產(chǎn)生的動態(tài)結(jié)果鏈接到網(wǎng)頁上。
GoAhead自身定義了兩個重要的結(jié)構(gòu)體,即維護每一個socket()所有信息的結(jié)構(gòu)體類型socket_t和維護每個Web訪問信息的結(jié)構(gòu)體類型WebsRec。GoA-head服務器主流程如圖5所示。

圖5 GoAhead服務器的主流程Fig.5 Main process of GoAhead server
盡管GoAhead已經(jīng)能夠移植到很多操作系統(tǒng)上[7],如 Linux、Windows、Vxworks、和 ECOS 等,但目前還沒有Nucleus上的版本。因此,只能選擇一個與Nucleus最接近的操作系統(tǒng)ECOS,并參照GoAhead在ECOS上的軟件移植版本進行修改。GoAhead服務器的Socket接口采用的是Berkley的標準API,Nucleus的NET部分也是遵循Berkley的標準,這就增加了移植的方便性。由于Nucleus的NET部分是一個精簡的TCP/IP協(xié)議棧,有許多功能函數(shù)或者函數(shù)選項沒有實現(xiàn),同時一些結(jié)構(gòu)體的定義也經(jīng)過了簡化,這就給移植帶來了很多需要考慮的問題。
2.6.1 對Socket接口函數(shù)的替代
GoAhead總共有30多個源文件(C文件),但是其中主要的Socket接口函數(shù)所在的文件是Sock.c、Sock-Gen.c、主函數(shù)(mainfunction.c)和幾個頭文件。其中Sock.c和SockGen.c文件中的函數(shù)均需要調(diào)用TCP/UDP套接字的Socket接口函數(shù),是GoAhead集中維護的位于Socket API和Web API中間的一層。由于在這兩個文件中均是調(diào)用標準的Berkley Socket API,因此,在移植時需要把這些Socket API完全替換成Nucleus的Socket API。同時,在調(diào)用函數(shù)時,由于參數(shù)的類型有差異,需要對參數(shù)進行強制轉(zhuǎn)換。替代的API函數(shù)如表1所示。

表1 Socket API函數(shù)替代表Tab.1 Substitution for Socket API functions
2.6.2 對類型和結(jié)構(gòu)體的替代和更改
①基本類型
GoAhead自身定義了許多基本數(shù)據(jù)類型,但與Nucleus相對應定義的類型表達方式不一致,這時就需要在Nucleus的源文件 target.h中對應地增加這些定義[8],以使類型保持一致。
②與套接字和TCP/IP有關(guān)的類型
GoAhead采用Socket的結(jié)構(gòu)體定義與Nucleus不同,必須替代,而且在對Socket結(jié)構(gòu)體賦值時,必須注意要強制轉(zhuǎn)換,其相關(guān)的結(jié)構(gòu)對照如表2所示。

表2 套接字結(jié)構(gòu)體對應關(guān)系Tab.2 Correspondence relationship of the Socket structure
2.6.3 GoAhead 編譯預處理的定義
對于編譯器來說,要想正確編譯GoAhead和Nucleus移植后的源代碼,就得把各自的編譯預處理定義加在一起,且相互之間不能產(chǎn)生語義上的歧義。
此外,在GoAhead的頭文件Uemf.h中有專為移植后的操作系統(tǒng)(如Linux、WindowsCE、和EEOS等)定義的 include[9-10],所以也要為 Nucleus 移植版本定義一個條件編譯。其中,NU為編譯預處理定義,表明此版本是在Nucleus操作系統(tǒng)上運行;PLUS ucleus.h是Nucleus的內(nèi)核頭文件;netinc unet.h是Nueleus網(wǎng)絡包的頭文件,這就包含了在GoAhead中把所要用到的Nucleus頭文件,使用時就不會再出現(xiàn)問題;STX和ETX分別為數(shù)據(jù)幀的起始標志和結(jié)束標志;Data為消息正文,包含向控制器發(fā)送的控制命令以及控制器返回的數(shù)據(jù)。
嵌入式設備以其體積小和性能穩(wěn)定等特點成為遠程監(jiān)控系統(tǒng)的主流方向。本文主要論述了嵌入式Web服務器在遠程控制系統(tǒng)中的應用。在傳統(tǒng)的控制系統(tǒng)中引入嵌入式Web服務器,實現(xiàn)了實時、方便的遠程控制,用戶只需輸入嵌入式Web服務器的地址即可控制遠程控制系統(tǒng)[11]。軟件設計使得該系統(tǒng)程序結(jié)構(gòu)清晰,維護方便,能夠滿足系統(tǒng)對現(xiàn)場設備的控制要求,促進低端控制設備的信息化。
本系統(tǒng)的研究與實驗對遠程控制系統(tǒng)具有一定的參考價值,系統(tǒng)經(jīng)過測試,取得了比較滿意的運行效果。
[1]呂京建,肖海橋.面向二十一世紀的嵌入式系統(tǒng)綜述[J].電子質(zhì)量,2001(8):3-8.
[2]葛源,胡榮強,吳小娟.嵌入式Web服務器與plc的通信實現(xiàn)[J].電力自動化設備,2005,25(12):70 -72.
[3]賀磊.一種嵌入式實時操作系統(tǒng)Nucleus plus[J].信息工程大學學報,2000(4):12-25.
[4]張湘,肖建.嵌入式系統(tǒng)和嵌入式操作系統(tǒng)[J].世界儀表與自動化,2002,6(5):12 -16.
[5]魏忠,蔡勇,雷紅衛(wèi).嵌入式系統(tǒng)開發(fā)詳解[M].北京:電子工業(yè)出版社,2006:63-70.
[6]錢斌,徐海云,林少華.嵌入式Web服務器在CTM系統(tǒng)中的應用[J].微計算機信息,2006(17):99-101.
[7]羅蕾.嵌入式實時操作系統(tǒng)及應用開發(fā)[M].北京:北京航空航天大學出版社,2007:6-20.
[8]吳小紅,楊海濤,王萬良.基于Web的遠程控制實驗系統(tǒng)的設計[J].浙江工業(yè)大學學報,2004(6):700-705.
[9]李善平,劉文峰,王煥龍,等.Linux與嵌入式操系統(tǒng)[M].北京:清華大學出版社,2003:25-25.
[10]王傳啟,鄧文棟,金敏.工業(yè)控系統(tǒng)制中嵌入式Web服務器的設計與實現(xiàn)[J].計算機工程與應用,2002(10):227-230.
[11]劉立芳,齊小剛.遠程設備實時監(jiān)控管理系統(tǒng)的設計與實現(xiàn)[J].計算機工程,2000,26(4):91 -92.