陳志星,楊金孝
(西北工業(yè)大學電子信息學院,陜西西安710129)
隨著物聯(lián)網(wǎng)技術的興起和智能家居的發(fā)展,嵌入式設備需要接入局域網(wǎng)或者因特網(wǎng)已成為一種趨勢,由于網(wǎng)口通信比其他模式通信速率高且抗干擾性強,在局域網(wǎng)中往往很多嵌入式設備只留有網(wǎng)口供于外部通信,此時對于嵌入式設備內部一些參數(shù)設置和內部程序升級只能由網(wǎng)口通信完成。
當前大部分嵌入式設備已具有內部Web服務器的功能,不過許多都使用帶操作系統(tǒng)的高性能處理器和TCP/IP協(xié)議完成的[1]。這種實現(xiàn)方式對于硬件資源要求比較高,實現(xiàn)的過程比較復雜;而使用無操作系統(tǒng)的處理器和LwIP(light weight internet proto?col)輕量型網(wǎng)絡協(xié)議棧的實現(xiàn)方法,可以對硬件資源的要求減少許多[2],實現(xiàn)方式也比原來的簡單許多。本文研究實現(xiàn)了一種基于LwIP輕型協(xié)議棧和STM32處理器的嵌入式設備內部Web服務器。
嵌入式設備Web服務器以在內部嵌入Web方式來實現(xiàn)[3]。通過程序中嵌入的網(wǎng)頁數(shù)據(jù),完成嵌入式設備和上位機瀏覽器之間的數(shù)據(jù)轉換與傳輸[4]。嵌入式設備內部數(shù)據(jù)在轉換成網(wǎng)頁數(shù)據(jù)后由網(wǎng)絡接口模塊用有線或無線方式傳輸?shù)缴衔粰C瀏覽器。用戶通過上位機瀏覽器可以實時查看嵌入式設備內部數(shù)據(jù),同時還可以對內部參數(shù)進行配置控制操作。
硬件設計包括:服務器最小系統(tǒng)、電源模塊和網(wǎng)絡通訊模塊設計等。軟件設計的目的是完成數(shù)據(jù)的轉換與傳輸,實現(xiàn)上下行通信,參數(shù)配置、數(shù)據(jù)封包、數(shù)據(jù)緩沖和升級程序等。
LwIP協(xié)議是瑞典計算機科學院設計的一個小型的TCP/IP協(xié)議棧[5]。它的設計方式和TCP/IP協(xié)議是一樣的。LwIP協(xié)議的輕量型特點使其可以在無操作系統(tǒng)環(huán)境下運行。LwIP協(xié)議棧在保持TCP協(xié)議大部分功能的前提下減少了對RAM的占用量,它只需十幾KB的RAM和大約40 K的ROM就可以運行[6]。LwIP協(xié)議通過使用不復制任何數(shù)據(jù)的API函數(shù)減少數(shù)據(jù)處理和內存需求。因此LwIP協(xié)議很適用于資源受限的嵌入式系統(tǒng)。
協(xié)議中的每一個子協(xié)議作為一個模塊來實現(xiàn),在每個子協(xié)議中用幾個函數(shù)作為協(xié)議的接入口[7]。雖然這些子協(xié)議是以獨立行使實現(xiàn)的,但是為了提高處理速度和內存占用率,有些層協(xié)議不是被獨立實現(xiàn)的。換言之,應用層的應用協(xié)議與協(xié)議底層之間沒有嚴格的分開來,可以共用相同的內存[8]。所以各個協(xié)議層之間可以使用共享內存的方式實現(xiàn)通訊,這和傳統(tǒng)TCP/IP協(xié)議是不一樣的。
LwIP協(xié)議主要由IP模塊,ICMP模塊,UDP模塊,TCP模塊和相關支持模等幾個模塊組成。相關支持模塊包括:操作系統(tǒng)模擬層、緩沖與內存管理子系統(tǒng)、網(wǎng)絡接口函數(shù)及校驗和計算函數(shù)[9]。LwIP協(xié)議的主要特性如下:支持ARP以太網(wǎng)地址解析協(xié)議;支持IPv4和IPv6協(xié)議;支持IP分片與重裝;支持多網(wǎng)絡接口下數(shù)據(jù)轉發(fā);支持ICMP協(xié)議,用于網(wǎng)絡調試與維護;支持IGMP協(xié)議,用于網(wǎng)絡組管理;支持UDP協(xié)議,用戶數(shù)據(jù)報協(xié)議;支持TCP協(xié)議;具有TCP擁塞控制,RTT估計,快速恢復與重傳等功能;提 供 raw/callback API、sequential API、BSD-style socket API 3種用戶編程接口方式;支持DHCP,動態(tài)主機配置協(xié)議等;
Web服務器的硬件電路模塊主要由處理器和網(wǎng)絡通信模塊組成。
主控處理器選用意法半導體公司生產的STM32F103ZET6處理器。該處理器是一款基于Cortex-M3內核的具有高性能、低成本、低功耗的32位處理器[10]。它的主頻高達72MHz,完全滿足網(wǎng)口通信的需要。STM32F103ZET6處理器內置512KB的FLASH和64KB的SRAM[10]。
STM32F103ZET6處理器內部具有符合IEEE 802.3-2002標準的以太網(wǎng)模塊。該以太網(wǎng)模塊支持獨立于介質的接口(MII)和簡化的獨立于介質的接口(RMII)兩種標準接口[11]。通過這兩種接口連接到外接的物理層(PHY)模塊就可以實現(xiàn)以太網(wǎng)通信。所以使用STM32F103ZET6處理器只需外接一個物理層(PHY)芯片就可以實現(xiàn)一個完整的以太網(wǎng)收發(fā)器。
網(wǎng)絡通信芯片使用SMSC公司生產的LAN8720A作為PHY芯片。LAN8720是低功耗的10/100M以太網(wǎng)PHY層芯片,I/O引腳電壓符合IEEE802.3-2005標準[10]。LAN8720A支持通過RMII接口與以太網(wǎng)MAC層通信,內置10-BAST-T/100BASETX全雙工傳輸模塊,支持10 Mbps和100 Mbps。通過自協(xié)商的功能LAN8720A可以實現(xiàn)與目的主機最佳的連接方式(速度和雙工模式)。LAN8720A還支持HP Auto-MDIX自動翻轉功能,所以無需更替網(wǎng)線就可以把連接方式變成直線或交叉連接。
硬件電路設計包括服務器最小系統(tǒng)電路設計、網(wǎng)口芯片電路設計和RJ45接口電路設計。服務器最小系統(tǒng)電路包含時鐘電路、復位電路、電源電路和下載程序電路。處理器采用精簡介質獨立接口(RMII)和PHY芯片連接。相對于采用介質獨立接口(MII)的連接方式可以減少一半的信號數(shù)量。上位機通過瀏覽器發(fā)送數(shù)據(jù)經(jīng)過網(wǎng)線差分信號傳輸給PHY芯片再轉換成MAC層使用的數(shù)據(jù)格式。處理器內部的LwIP協(xié)議把收到的數(shù)據(jù)轉換成需要的應用數(shù)據(jù)。而處理器發(fā)送數(shù)據(jù)是與接收數(shù)據(jù)相反的過程。圖1為Web服務器系統(tǒng)框圖。圖2為RJ45接口電路原理圖;圖3為LAN8720A硬件電路原理圖。
圖1 Web服務器系統(tǒng)框圖
圖2 RJ45接口電路
圖3 LAN8720A硬件設計原理圖
LwIP協(xié)議棧的移植工作主要是在嵌入式設備中把LwIP協(xié)議棧源碼添加到服務器代碼工程中。主要將LwIP協(xié)議棧源碼中LWIP-NETIF、LWIPCORE、LWIP-API文件夾內的.c文件添加到工程中。其中還需添加arch文件將以太網(wǎng)驅動和LWIP連接起來。在arch中有5個文件cc.h、cpu.h、perf.h、sys_arch.h和sys_arch.c。cc.h定義協(xié)議棧內部常用的數(shù)據(jù)類型[11];perf.h定義系統(tǒng)測量與統(tǒng)計相關的宏,用戶可以根據(jù)需要定義測試的對象和數(shù)據(jù)記錄;cpu.h定義字節(jié)排放次序即大小端模式,由于STM32是小端模式,所以定義BYTE_ORDER為小端模式。在沒有使用操作系統(tǒng)的時候不使用sys_arch.h和sys_arch.c文件。添加LWIP通用文件,主要有l(wèi)wip_comm.c、lwip_comm.h和 lwipopts.h 3個文件。LWIP源碼和以太網(wǎng)驅動庫由lwip_comm.c和lwip_comm.h結合起來,lwipopts.h是用來裁剪和配置LWIP的文件[12]。利用struct netif結構體實現(xiàn)對LwIP中不同網(wǎng)絡接口的操作[13]。網(wǎng)絡設備的驅動、網(wǎng)卡初始化、接收和發(fā)送網(wǎng)絡數(shù)據(jù)以及網(wǎng)絡中斷處理函數(shù)這幾部分功能都在stm32f103_eth_bsp.c文件中實現(xiàn)。
使用html語言編寫原始網(wǎng)頁,將原始網(wǎng)頁使用makefsdata.exe工具生成C語言格式的網(wǎng)頁數(shù)組數(shù)據(jù)。網(wǎng)頁數(shù)據(jù)和嵌入式設備交互采用公共網(wǎng)關接口(Common Gateway Interface,CGI)技術和服務器端嵌入(Server Side Include,SSI)技術實現(xiàn)[14]。
Web服務器使用CGI技術執(zhí)行外部程序,并將輸出的結果發(fā)送給Web瀏覽器。在服務器上CGI是物理上一段程序,提供同客戶端網(wǎng)頁頁面的接口。當有來自瀏覽器表單的輸入信息時服務器調用CGI程序來解釋,并在產生相應的處理。
在數(shù)據(jù)發(fā)送到瀏覽器前,服務器使用SSI指令把文本、圖形和應用程序信息包含在網(wǎng)頁中[15]。Web服務器根據(jù)指示將內容插入適當網(wǎng)頁,完成數(shù)據(jù)從嵌入式設備傳向瀏覽器。圖4為嵌入式設備配置頁面。
圖4 嵌入式設備配置頁面
嵌入式設備程序開始運行時,首先對各個模塊進行初始化,初始化網(wǎng)卡參數(shù),申請內存,創(chuàng)建服務器控制塊,初始化Web服務器,在服務器上綁定本地地址與端口,建立網(wǎng)絡連接。在服務器進入監(jiān)聽狀態(tài)后,當有瀏覽器請求時,服務器采用回調函數(shù)機制調用數(shù)據(jù)接收函數(shù)處理接收的數(shù)據(jù),并返回查詢需要的數(shù)據(jù)。服務器軟件實現(xiàn)流程圖如圖5所示。
圖5 服務器實現(xiàn)流程圖
以PC機的瀏覽器作為客戶端,嵌入式設備作為Web服務器端;服務器IP地址設為192.168.1.103,端口設為8080,本地PC機IP地址設為192.168.1.100;使用ping命令在PC機上測試網(wǎng)絡連通狀況,測試結果如圖6所示;從圖6可知,上位機發(fā)送的數(shù)據(jù)均成功返回,無數(shù)據(jù)丟失,通信狀況良好。
圖6 ping通信測試結果
將192.168.1.103地址輸入到瀏覽器地址欄中,可以看到嵌入式設備內部服務器返回數(shù)據(jù)頁面,如圖7所示。
圖7 服務器返回數(shù)據(jù)
由圖7可以看出嵌入式設備Web服務器通信正常,返回了設備內部參數(shù),并可以通過頁面配置設備內部參數(shù),修改設備IP地址、設備端口等。
文中設計并實現(xiàn)了一種基于LwIP協(xié)議棧的嵌入式設備Web服務器。該服務器系統(tǒng)所需的外圍器件較少,方便組網(wǎng),對處理器性能要求較低,易于實現(xiàn)。系統(tǒng)經(jīng)過實際測試和驗證,性能可靠,運行穩(wěn)定,能滿足一般嵌入式設備數(shù)據(jù)傳輸要求。