通用嵌入式Web服務器模塊的設計與實現
1 引言
從20世紀90年代中期開始, Internet以前所未有的驚人速度在全球蔓延,目前,幾乎覆蓋到了地球的每一個角落,成為計算機技術中的一個發展亮點;與此同時,嵌入式技術在最近十幾年里也得到了飛速發展,被廣泛應用于消費電子、通信網絡、工業控制、汽車電子、醫療儀器、信息家電、航空航天、軍事國防等眾多領域。Internet與嵌入式技術相結合的產物———嵌入式Web服務器[1],是一個很有發展前景的研究方向,它將極大拓展嵌入式設備的應用范圍,使嵌入式設備具有遠程監控功能,而且可以使用通用PC的瀏覽器作為用戶界面,操作簡便,符合用戶的使用習慣。
2 系統結構與工作原理
系統采用當前流行的B/S結構,這種結構是隨著Internet技術的發展,對傳統C/S結構的擴展和改造。實質上B/S結構是一種特殊的C/S結構,所不同的是,在B/S結構中,系統主要功能都在服務器端實現,瀏覽器是客戶端,提供用戶接口,將用戶的請求傳遞到服務器,并將服務器的響應展現給用戶。系統結構如圖1所示。
分析嵌入式系統的具體情況,發現對于一般的嵌入式系統,基本的功能需求大體上分為兩大類,可以用兩個字來概括“監控”。“監”即監測,是數據采集和查看的過程,數據流的方向是從嵌入式系統到瀏覽器或上位機;“控”即控制,如設定工作參數、遠程打開關閉現場的設備等,控制流的方向是從上位機或瀏覽器到嵌入式系統的。總而言之,就是要實現信息(上行的數據流和下行的控制流)的雙向流動。
(1)嵌入式服務器端包含———“監”功能的實現。對于上行的數據流,通過嵌入式服務器端包含技術(ESSI)來實現。服務器端包含(SSI)[2]是在普通靜態HTML語言中嵌入SSI指令,以便將文本、圖形或應用程序信息包含到網頁中。例如,可以使用SSI包含時間/日期戳、版權聲明等。嵌入式服務器端包含是對服務器端包含技術的改造和完善,使其適應于嵌入式系統的軟硬件環境。在本系統中,自定義了一條ESSI指令“DATA”,用來實現動態信息的實時顯示,該指令的語法如下: DATA var = state func = Get-State>/DATA>,該指令與標準的HTML[3]標記兼容,其屬性有兩個,分別為var和func, var表示設備的狀態名稱,一個設備可以定義多個狀態名; func管理接口函數,
用來獲得相應設備的狀態信息,原型為uint8* func( )。嵌入式服務器端包含技術的運行過程如圖2所示。
(2)嵌入式通用網關接口———“控”功能的實現。對于下行的控制流,通過嵌入式通用網關接口(ECGI)[4]來實現,如圖2所示。在需要向嵌入式設備下達控制命令的情況下,借助表單的POST方法[5, 6]向服務器傳遞數據,表單的語法格式如下:
FORM =“form”SPATTRIBUTES“>”a setof stand-ardHTML elements>“/form>”
ATTRIBUTES =* (ATTRIBUTE SP)ATTRIBUTE =ATTRIBUTENAME“=”TOKEN
ATTRIBUTENAME = name |methodTOKEN = 1* anyCHAR exceptCTLs or separators>
SP = US-ASCII SP, space (32)>
CHAR =anyUS-ASCII character (octets 0 - 127)>
CTL = anyUS-ASCII control character(octets 0 - 31) and DEL (127)>
表單的name屬性指定了管理接口函數名,此函數用來處理表單數據,原型為void TestForm(uint8*
content), content是瀏覽器傳送過來的參數;表單的另一個屬性method指定了瀏覽器向服務器傳送數據的方式。為進一步闡述ECGI的工作原理,舉例如下:
form name=“TestForm”method=“POST”>
p>TestEmbedded Common Gateway Interface /p>
p>input type=“text”name=“var1”>/p>
p>input type=“text”name=“var2”>/p>
p>input type=“text”name=“var3”>/p>
p>input type=“submit”
name=“Go”value=“OK”>/p>
/form>
包含有上述表單的HTML文件傳送到瀏覽器之后,網頁上出現三個編輯框和一個submit按鈕,用戶在編輯框中輸入參數,點擊submit按鈕后,瀏覽器向Web服務器傳送以下內容:
var1=value1var2=value2var3=value3Go=OK,
其中, value1、value2、value3為用戶輸入的參數,服務器接收到以上參數后,便調用表單的name屬性指定的管理接口函數,從而實現對嵌入式設備的控制。
3 硬件系統設計
本系統的主要功能是監測現場的設備狀態,及時將監測到的狀態數據發布到網絡上;同時接收來自用戶的控制信息,利用這些控制信息準確地控制設備工作。因此,在硬件上,需包含以下幾個模塊:
嵌入式處理器、網絡接口芯片和有關I/O接口。
3. 1 硬件原理框圖
系統的硬件原理框圖如圖3所示,嵌入式處理器LPC2292處于中心位置,設備的狀態數據經過處理器打包后,經由RTL8019AS發布到網絡上,供用戶瀏覽,用戶的控制命令經過RTL8019AS傳遞到處理器LPC2292,再由處理器控制相應的設備執行相應的控制命令。
3. 2 嵌入式處理器
嵌入式處理器采用了Philips公司的基于ARM7TDMI內核的處理器LPC2292,該處理器具有16 kB片內靜態RAM和256 kB片內Flash程序存儲器;可以通過片內boot裝載程序實現在系統編程(ISP)和在應用編程(IAP),編程速度快, 512字節行編程時間為1ms,單扇區或整片擦除時間為400ms;同時還內置豐富的外設接口,如:A/D轉換器、CAN控制器、UART接口、I2C接口、SPI接口、定時器、RTC實時時鐘和看門狗等,極大的簡化和方便了應用系統的設計,提高了系統的可靠性[7]。
3. 3 網絡接口芯片
網絡接口芯片采用Realtek公司的RTL8019AS,它是一種高度集成的以太網控制芯片,能簡單的實現Plug and Play并兼容NE2000、掉電等特性。同時還支持全雙工模式,能夠實現網絡數據的同時發送和接收。RTL8019AS芯片內部集成了DMA控制器、ISA總線控制器和16K SRAM、網絡PHY收發器。用戶可以通過DMA方式把需要發送的數據寫入SRAM中,讓芯片自動將數據發送出去;而芯片在接收到數據后,用戶也可以通過DMA方式將其讀出。
3. 4 其它模塊
RS232電路有兩個作用,首先可以用作在系統編程(ISP),方便了LPC2292中軟件的升級和調試,提高了效率;其次,在系統運行時,充當與外界通訊的一個通道。I2C和CAN電路可以用于擴展外圍設備,完成系統在工業現場的控制任務和數據采集任務等。
4 軟件系統設計
該系統的軟件主要由以下幾個部分組成:嵌入式操作系統、嵌入式TCP/IP協議棧、嵌入式Web服務器。嵌入式操作系統是整個系統的基礎,對整個系統軟硬件資源進行統一協調、指揮和控制[8]。嵌入式TCP/IP協議棧是網絡通訊的基礎,負責收發網絡上的數據包,對于從網絡上接收到的數據包,協議棧對其解析,分離出有效載荷交由應用層處理;對應用層向網絡上發送的數據包,協議棧按照相關協議的要求加上相應的協議頭,然后發送到網絡上。嵌入式Web服務器是本系統的核心,實現了HTTP協議中的基本功能,能夠與通用的Web瀏覽器通信,并且提供開放的應用程序編程接口API,方便的系統軟件資源的重用。
4. 1 嵌入式操作系統
為了滿足多任務和實時性的要求,本系統移植了嵌入式多任務實時操作系統μC/OS-II,并針對系統的具體情況和相應軟硬件資源的情況,做了適當的裁剪和修改。μC/OS-II是由Jean J. Labrosse在1999年推出的,在2000年得到了美國聯邦航空管理局對于商用飛機的、符合RTCA DO-178B標準的認證,從而證明μC/OS-II具有足夠的穩定性和安全性。μC/OS-II是開放源代碼的,本系統在設計時使用的是μC/OS-IIV2. 52版本,為了將其移植到ARM7TDMI平臺上,主要在以下方面作了修改:進出臨界段的宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()、堆棧增長方式、任務切換等[9]。
4. 2 嵌入式TCP/IP協議棧
為了搭建一個Web服務器平臺,網絡協議棧是必不可少的。TCP/IP協議是目前廣泛應用的網絡協議棧,并且成了事實上的國際標準。本系統設計并實現了針對嵌入式系統的簡易TCP/IP協議棧,該協議棧利用μC/OS-II實時操作系統的信號機制來實現多任務和可重入的特性,并且完全使用ANSIC進行編寫,在設計實現時充分考慮了重用性和可移植性,可以像μC/OS-II那樣支持多種CPU。
4. 3 嵌入式W eb服務器
在整個軟件體系中,嵌入式Web服務器處于最上層,在它之下的是上述的嵌入式操作系統和嵌入式TCP/IP協議棧。嵌入式Web服務器除了實現靜態文檔以外,還利用嵌入式服務器端包含(ESSI)技術實現了動態文檔,從而支持實時顯示系統的工作狀態;此外,通過嵌入式通用網關接口(ECGI)[4]技術實現了瀏覽器端數據向服務器的傳遞,從而為對系統的控制提供了數據通道。
4. 3. 1 嵌入式Web服務器層次模型
如圖4所示,嵌入式Web服務器包含四個層次,分別為套接字層、協議解析層、功能模塊層和用戶定義層。套接字層負責本系統與網絡上的數據收發;協議解析層負責解析HTTP協議,從中獲取有效數據或按照HTTP協議要求,生成HTTP協議報文;功能模塊層有三個部分,分別是嵌入式文件系統(EFS)、嵌入式服務器端包含(ESSI)、嵌入式通用網關接口(ECGI);用戶定義層的三個部分由用戶(開發人員)自定義,從而在不改變其他模塊的情況下,增加、減少或修改系統的功能,使得系統具有二次開發功能。
4. 3. 2 嵌入式文件系統
為了方便Web服務器的實現,設計并實現了一個嵌入式文件系統[10-12]用來存儲網頁。此文件系統結構簡潔、效率高,所有文件被集合成一個順序結構,文件系統中每個文件包含一下幾個域:HEAD,文件報頭,兩個字節,標記一個文件的開始(0xFA, 0xF3);NAME,文件名,長度不定,以NULL結尾; SIZE,文件長度,四個字節,指示文件長度(以字節為單位);FILE,文件內容,長度由SIZE指定。
為了將多個文件(包括網頁文件、圖片文件等)轉化為嵌入式文件系統所需要的可編譯格式,在PC上開發了一個工具軟件ConvertFile,其功能是把一個指定目錄下的所有文件轉換成一個filedata. c文件,從而加快了后續程序的開發。
4. 3. 3 用戶定義層
為了方便更改系統功能,提供二次開發能力,系統引入了用戶定義層。該層為用戶開放了系統的編程接口,主要有三個方面:
(1)文件系統構造。當用戶需要更改Web服務器的網頁時,只需在PC上用任何一種網頁設計工具設計好網頁,然后用ConverFile工具轉化稱filedata. c,即完成了文件系統的設計。
(2)ESSI變量定義。如需在瀏覽器上顯示設備的工作狀態等信息,可為每個狀態定義一個變量,并綁定一個能夠返回該狀態值的函數即可。
(3)ECGI句柄定義。為了在服務器端獲得用戶的命令信息,需要為每一個命令定義一個虛擬網址(此網址并不對應一個網頁文件),并綁定該網址到一個服務器端的函數,該函數獲得瀏覽器端發送過來的參數,執行相應的命令。
5 實驗結果分析
為了驗證方案的可行性和實用性,在上述的軟硬件平臺的基礎上,搭建了一個測試環境:在ARM處理器上外接八個LED指示燈,通過嵌入式Web服務器顯示并控制每一個LED指示燈的亮和滅。系統測試的網絡環境如圖5所示,該網絡由兩個網段組成,用一臺路由器連接,網段一的地址為172. 18. 136. 0/24,段內連接終端1和嵌入式設備,網段二的地址為172.18. 135. 0/24,段內連接終端2和終端3,具體的地址分配如圖5所示。嵌入式Web服務器運行在IP地址為172. 18. 136. 8的嵌入式設備上,測試結果如圖6。結果表明,無論是在同一網段內的終端1上訪問嵌入式Web服務器,還是在不同網段的終端2和終端3上訪問嵌入式We服務器,系統都可以正常、穩定地運行,并實現對嵌入式設備的監控功能。
6 結束語
引入嵌入式Web服務器,采用B/S方式對嵌入式設備進行遠程監控,已逐漸成為一種趨勢,極大的方便了系統的使用和維護,此方式以友好的用戶界面和簡單的操作方法贏得了越來越多的用戶的支持。以上設計并實現的通用嵌入式Web服務器模塊,可移植到多種ARM7系列的處理器上,采用此模塊可簡化系統的設計,加快開發速度,具有一定的應用前景。
評論