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