陳志星,楊金孝
(西北工業大學電子信息學院,陜西西安710129)
隨著物聯網技術的興起和智能家居的發展,嵌入式設備需要接入局域網或者因特網已成為一種趨勢,由于網口通信比其他模式通信速率高且抗干擾性強,在局域網中往往很多嵌入式設備只留有網口供于外部通信,此時對于嵌入式設備內部一些參數設置和內部程序升級只能由網口通信完成。
當前大部分嵌入式設備已具有內部Web服務器的功能,不過許多都使用帶操作系統的高性能處理器和TCP/IP協議完成的[1]。這種實現方式對于硬件資源要求比較高,實現的過程比較復雜;而使用無操作系統的處理器和LwIP(light weight internet proto?col)輕量型網絡協議棧的實現方法,可以對硬件資源的要求減少許多[2],實現方式也比原來的簡單許多。本文研究實現了一種基于LwIP輕型協議棧和STM32處理器的嵌入式設備內部Web服務器。
嵌入式設備Web服務器以在內部嵌入Web方式來實現[3]。通過程序中嵌入的網頁數據,完成嵌入式設備和上位機瀏覽器之間的數據轉換與傳輸[4]。嵌入式設備內部數據在轉換成網頁數據后由網絡接口模塊用有線或無線方式傳輸到上位機瀏覽器。用戶通過上位機瀏覽器可以實時查看嵌入式設備內部數據,同時還可以對內部參數進行配置控制操作。
硬件設計包括:服務器最小系統、電源模塊和網絡通訊模塊設計等。軟件設計的目的是完成數據的轉換與傳輸,實現上下行通信,參數配置、數據封包、數據緩沖和升級程序等。
LwIP協議是瑞典計算機科學院設計的一個小型的TCP/IP協議棧[5]。它的設計方式和TCP/IP協議是一樣的。LwIP協議的輕量型特點使其可以在無操作系統環境下運行。LwIP協議棧在保持TCP協議大部分功能的前提下減少了對RAM的占用量,它只需十幾KB的RAM和大約40 K的ROM就可以運行[6]。LwIP協議通過使用不復制任何數據的API函數減少數據處理和內存需求。因此LwIP協議很適用于資源受限的嵌入式系統。
協議中的每一個子協議作為一個模塊來實現,在每個子協議中用幾個函數作為協議的接入口[7]。雖然這些子協議是以獨立行使實現的,但是為了提高處理速度和內存占用率,有些層協議不是被獨立實現的。換言之,應用層的應用協議與協議底層之間沒有嚴格的分開來,可以共用相同的內存[8]。所以各個協議層之間可以使用共享內存的方式實現通訊,這和傳統TCP/IP協議是不一樣的。
LwIP協議主要由IP模塊,ICMP模塊,UDP模塊,TCP模塊和相關支持模等幾個模塊組成。相關支持模塊包括:操作系統模擬層、緩沖與內存管理子系統、網絡接口函數及校驗和計算函數[9]。LwIP協議的主要特性如下:支持ARP以太網地址解析協議;支持IPv4和IPv6協議;支持IP分片與重裝;支持多網絡接口下數據轉發;支持ICMP協議,用于網絡調試與維護;支持IGMP協議,用于網絡組管理;支持UDP協議,用戶數據報協議;支持TCP協議;具有TCP擁塞控制,RTT估計,快速恢復與重傳等功能;提 供 raw/callback API、sequential API、BSD-style socket API 3種用戶編程接口方式;支持DHCP,動態主機配置協議等;
Web服務器的硬件電路模塊主要由處理器和網絡通信模塊組成。
主控處理器選用意法半導體公司生產的STM32F103ZET6處理器。該處理器是一款基于Cortex-M3內核的具有高性能、低成本、低功耗的32位處理器[10]。它的主頻高達72MHz,完全滿足網口通信的需要。STM32F103ZET6處理器內置512KB的FLASH和64KB的SRAM[10]。
STM32F103ZET6處理器內部具有符合IEEE 802.3-2002標準的以太網模塊。該以太網模塊支持獨立于介質的接口(MII)和簡化的獨立于介質的接口(RMII)兩種標準接口[11]。通過這兩種接口連接到外接的物理層(PHY)模塊就可以實現以太網通信。所以使用STM32F103ZET6處理器只需外接一個物理層(PHY)芯片就可以實現一個完整的以太網收發器。
網絡通信芯片使用SMSC公司生產的LAN8720A作為PHY芯片。LAN8720是低功耗的10/100M以太網PHY層芯片,I/O引腳電壓符合IEEE802.3-2005標準[10]。LAN8720A支持通過RMII接口與以太網MAC層通信,內置10-BAST-T/100BASETX全雙工傳輸模塊,支持10 Mbps和100 Mbps。通過自協商的功能LAN8720A可以實現與目的主機最佳的連接方式(速度和雙工模式)。LAN8720A還支持HP Auto-MDIX自動翻轉功能,所以無需更替網線就可以把連接方式變成直線或交叉連接。
硬件電路設計包括服務器最小系統電路設計、網口芯片電路設計和RJ45接口電路設計。服務器最小系統電路包含時鐘電路、復位電路、電源電路和下載程序電路。處理器采用精簡介質獨立接口(RMII)和PHY芯片連接。相對于采用介質獨立接口(MII)的連接方式可以減少一半的信號數量。上位機通過瀏覽器發送數據經過網線差分信號傳輸給PHY芯片再轉換成MAC層使用的數據格式。處理器內部的LwIP協議把收到的數據轉換成需要的應用數據。而處理器發送數據是與接收數據相反的過程。圖1為Web服務器系統框圖。圖2為RJ45接口電路原理圖;圖3為LAN8720A硬件電路原理圖。

圖1 Web服務器系統框圖

圖2 RJ45接口電路

圖3 LAN8720A硬件設計原理圖
LwIP協議棧的移植工作主要是在嵌入式設備中把LwIP協議棧源碼添加到服務器代碼工程中。主要將LwIP協議棧源碼中LWIP-NETIF、LWIPCORE、LWIP-API文件夾內的.c文件添加到工程中。其中還需添加arch文件將以太網驅動和LWIP連接起來。在arch中有5個文件cc.h、cpu.h、perf.h、sys_arch.h和sys_arch.c。cc.h定義協議棧內部常用的數據類型[11];perf.h定義系統測量與統計相關的宏,用戶可以根據需要定義測試的對象和數據記錄;cpu.h定義字節排放次序即大小端模式,由于STM32是小端模式,所以定義BYTE_ORDER為小端模式。在沒有使用操作系統的時候不使用sys_arch.h和sys_arch.c文件。添加LWIP通用文件,主要有lwip_comm.c、lwip_comm.h和 lwipopts.h 3個文件。LWIP源碼和以太網驅動庫由lwip_comm.c和lwip_comm.h結合起來,lwipopts.h是用來裁剪和配置LWIP的文件[12]。利用struct netif結構體實現對LwIP中不同網絡接口的操作[13]。網絡設備的驅動、網卡初始化、接收和發送網絡數據以及網絡中斷處理函數這幾部分功能都在stm32f103_eth_bsp.c文件中實現。
使用html語言編寫原始網頁,將原始網頁使用makefsdata.exe工具生成C語言格式的網頁數組數據。網頁數據和嵌入式設備交互采用公共網關接口(Common Gateway Interface,CGI)技術和服務器端嵌入(Server Side Include,SSI)技術實現[14]。
Web服務器使用CGI技術執行外部程序,并將輸出的結果發送給Web瀏覽器。在服務器上CGI是物理上一段程序,提供同客戶端網頁頁面的接口。當有來自瀏覽器表單的輸入信息時服務器調用CGI程序來解釋,并在產生相應的處理。
在數據發送到瀏覽器前,服務器使用SSI指令把文本、圖形和應用程序信息包含在網頁中[15]。Web服務器根據指示將內容插入適當網頁,完成數據從嵌入式設備傳向瀏覽器。圖4為嵌入式設備配置頁面。

圖4 嵌入式設備配置頁面
嵌入式設備程序開始運行時,首先對各個模塊進行初始化,初始化網卡參數,申請內存,創建服務器控制塊,初始化Web服務器,在服務器上綁定本地地址與端口,建立網絡連接。在服務器進入監聽狀態后,當有瀏覽器請求時,服務器采用回調函數機制調用數據接收函數處理接收的數據,并返回查詢需要的數據。服務器軟件實現流程圖如圖5所示。

圖5 服務器實現流程圖
以PC機的瀏覽器作為客戶端,嵌入式設備作為Web服務器端;服務器IP地址設為192.168.1.103,端口設為8080,本地PC機IP地址設為192.168.1.100;使用ping命令在PC機上測試網絡連通狀況,測試結果如圖6所示;從圖6可知,上位機發送的數據均成功返回,無數據丟失,通信狀況良好。

圖6 ping通信測試結果
將192.168.1.103地址輸入到瀏覽器地址欄中,可以看到嵌入式設備內部服務器返回數據頁面,如圖7所示。

圖7 服務器返回數據
由圖7可以看出嵌入式設備Web服務器通信正常,返回了設備內部參數,并可以通過頁面配置設備內部參數,修改設備IP地址、設備端口等。
文中設計并實現了一種基于LwIP協議棧的嵌入式設備Web服務器。該服務器系統所需的外圍器件較少,方便組網,對處理器性能要求較低,易于實現。系統經過實際測試和驗證,性能可靠,運行穩定,能滿足一般嵌入式設備數據傳輸要求。