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

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

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

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

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

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

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

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