文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2013)06-0010-04
設(shè)備監(jiān)控系統(tǒng)可獲得設(shè)備的工作環(huán)境參數(shù)和設(shè)備運(yùn)行狀況,對(duì)確保設(shè)備安全正常運(yùn)行、充分發(fā)揮設(shè)備效能、提高企業(yè)經(jīng)濟(jì)效益有極其重要的作用[1]。目前已有許多企業(yè)構(gòu)建了設(shè)備監(jiān)控系統(tǒng),但大部分是通過(guò)RS232、RS485和CAN總線等協(xié)議進(jìn)行通信,不僅在數(shù)據(jù)傳輸距離和傳輸速度上有很大限制,而且無(wú)法直接接入互聯(lián)網(wǎng),無(wú)法滿足信息化條件下對(duì)企業(yè)生產(chǎn)作業(yè)管理的要求[2]。本文將結(jié)合嵌入式技術(shù)和網(wǎng)絡(luò)技術(shù),設(shè)計(jì)一種遠(yuǎn)程設(shè)備監(jiān)控方案,保證設(shè)備工作狀態(tài)的準(zhǔn)確采集和快速傳遞,同時(shí)輔助工作人員實(shí)現(xiàn)對(duì)現(xiàn)場(chǎng)設(shè)備的及時(shí)維護(hù)與管理。
瑞士計(jì)算機(jī)科學(xué)院的Adam Dunkels等開發(fā)了一套用于嵌入式系統(tǒng)的TCP/IP協(xié)議棧-LwIP,這是一種既可以移植到操作系統(tǒng)上,又可以獨(dú)立運(yùn)行的輕型嵌入式TCP/IP協(xié)議棧,其主要特點(diǎn)是在保持TCP協(xié)議主要功能的基礎(chǔ)上減少了對(duì)RAM的占用[2-3]。LwIP作為一種嵌入式網(wǎng)絡(luò)協(xié)議棧,具有相對(duì)齊全的功能,并提供一套非常完善的內(nèi)存管理方法,適合在32位的低端嵌入式系統(tǒng)中使用。
在綜合考慮設(shè)計(jì)成本和穩(wěn)定性等多方面因素后,本文在32位ARM處理器 STM32F207和嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II組成的軟硬件平臺(tái)上移植和改進(jìn)LwIP協(xié)議棧,從而實(shí)現(xiàn)了對(duì)遠(yuǎn)端設(shè)備的監(jiān)控與管理。
1 系統(tǒng)硬件平臺(tái)
設(shè)備監(jiān)控系統(tǒng)主要包括以太網(wǎng)通信和本地?cái)?shù)據(jù)采集兩大模塊。采用STM32F207系列作為開發(fā)板核心處理器,硬件功能模塊主要包括網(wǎng)絡(luò)功能模塊、串口設(shè)備驅(qū)動(dòng)模塊、A/D模塊、看門狗定時(shí)器功能模塊、Flash數(shù)據(jù)讀寫模塊等,通過(guò)各模塊之間的互相輔助與合作,保證監(jiān)控終端的穩(wěn)定可靠工作,實(shí)現(xiàn)配電狀態(tài)檢測(cè)、網(wǎng)絡(luò)狀態(tài)檢測(cè)以及環(huán)境溫濕度數(shù)據(jù)采集等功能,并通過(guò)以太網(wǎng)向上位機(jī)傳遞現(xiàn)場(chǎng)設(shè)備信息[4]。硬件電路結(jié)構(gòu)框圖如圖1所示。
3 LwIP協(xié)議的移植與改進(jìn)
3.1 LwIP協(xié)議進(jìn)程模式
LwIP的設(shè)計(jì)與實(shí)現(xiàn)采用分層模式,每層協(xié)議都解決網(wǎng)絡(luò)通信的一部分問(wèn)題并作為獨(dú)立的模塊來(lái)實(shí)現(xiàn),提供一些與其他協(xié)議的接口函數(shù)。各層之間通過(guò)共享內(nèi)存的方式實(shí)現(xiàn)通信,從而減少了內(nèi)存拷貝開銷,提高其性能[5]。LwIP所支持的協(xié)議主要包括IP、ICMP、UDP和TCP等協(xié)議,這些模塊能夠完成網(wǎng)絡(luò)通信的主要功能。除此之外,還設(shè)計(jì)了一些輔助模塊,主要包括內(nèi)存管理子系統(tǒng)、操作系統(tǒng)模擬層、網(wǎng)絡(luò)API函數(shù)等[6]。
3.2 LwIP協(xié)議的移植
(1)與CPU或編譯器相關(guān)的文件移植
修改/include/arch目錄下cc.h文件中有關(guān)數(shù)據(jù)長(zhǎng)度、字的高低位順序等的宏定義。同時(shí),使用_packed關(guān)鍵字聲明結(jié)構(gòu)體struct,以便LwIP讀取pbuf結(jié)構(gòu)體中不同長(zhǎng)度的數(shù)據(jù)[2]。
(2)與操作系統(tǒng)相關(guān)的部分
LwIP中使用信號(hào)量通信,所以在 sys_arch.h、sys_arch.c中應(yīng)實(shí)現(xiàn)信號(hào)量結(jié)構(gòu)體sys_sem_t和相關(guān)的信號(hào)量處理函數(shù),包括sys_sem_new()、sys_ sem _free()、sys_sem_signal()、sys_arch_sem_wait()等,完成信號(hào)量的建立、釋放、發(fā)送和等待接收功能。同時(shí),LwIP使用消息隊(duì)列來(lái)緩沖、傳遞數(shù)據(jù)報(bào)文, 因此需要實(shí)現(xiàn)消息隊(duì)列結(jié)構(gòu)體sys_mbox_t以及相應(yīng)的操作函數(shù)(包括sys_mbox_new()、sys_mbox_free()、sys_mbox_post()等),從而實(shí)現(xiàn)消息隊(duì)列的創(chuàng)建、釋放、發(fā)送和獲取等功能。
LwIP與外界網(wǎng)絡(luò)連接的線程都有獨(dú)立的等待超時(shí)時(shí)間,也就要求在移植過(guò)程中用戶要實(shí)現(xiàn)sys_arch_
timeouts()函數(shù), 返回當(dāng)前該線程所對(duì)應(yīng)的timeout隊(duì)列指針。另外,LwIP 中網(wǎng)絡(luò)數(shù)據(jù)的處理需要新建任務(wù)來(lái)完成操作, 有必要實(shí)現(xiàn)sys_thread_new()函數(shù)來(lái)保證數(shù)據(jù)處理任務(wù)在操作系統(tǒng)中能夠被建立。
(3)相關(guān)庫(kù)函數(shù)的實(shí)現(xiàn)
LwIP協(xié)議棧中用到了8個(gè)外部函數(shù),主要完成16 bit數(shù)據(jù)的高低字節(jié)交換、32 bit數(shù)據(jù)的大小頭對(duì)調(diào)、返回字符串長(zhǎng)度、字符串比較、內(nèi)存數(shù)據(jù)塊拷貝、指定長(zhǎng)度的數(shù)據(jù)塊清零等功能,與系統(tǒng)或編譯器有關(guān),需要用戶實(shí)現(xiàn)。
(4)網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序
在LwIP中可以有多個(gè)網(wǎng)絡(luò)接口,每個(gè)網(wǎng)絡(luò)接口都對(duì)應(yīng)了一個(gè)struct netif結(jié)構(gòu),這個(gè)netif包含了相應(yīng)網(wǎng)絡(luò)接口的屬性、收發(fā)函數(shù)。在網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序中主要是實(shí)現(xiàn)4個(gè)網(wǎng)絡(luò)接口函數(shù):網(wǎng)卡初始化、網(wǎng)卡接收數(shù)據(jù)、網(wǎng)卡發(fā)送數(shù)據(jù)以及網(wǎng)卡中斷處理函數(shù)。
3.3 LwIP問(wèn)題分析
LwIP中對(duì)ICMP協(xié)議的數(shù)據(jù)處理比較簡(jiǎn)單,基本流程如圖3所示。底層物理接口將接收ICMP包并向上傳送至網(wǎng)絡(luò)層,經(jīng)由IP模塊中的ip_input()函數(shù)移交到ICMP層處理,在ICMP協(xié)議中調(diào)用icmp_input()函數(shù)解析出IP包頭、ICMP包頭及數(shù)據(jù)內(nèi)容。一些ICMP信息被傳遞到更高協(xié)議層并被傳輸層的一些特殊函數(shù)處理,其中函數(shù)icmp_dest_unreach()用來(lái)通過(guò)傳輸層的UDP協(xié)議發(fā)送目標(biāo)無(wú)法到達(dá)消息[7]。通常情況下,使用ICMP ECHO信息來(lái)探測(cè)LwIP協(xié)議移植情況,主要在函數(shù)icmp_input()中完成對(duì)ICMP ECHO信息的響應(yīng),包括地址信息驗(yàn)證、目的與源地址進(jìn)行交換、修改ICMP數(shù)據(jù)類型、求取校驗(yàn)和,然后通過(guò)IP層協(xié)議中的ip_output()將應(yīng)答信息回傳。
但是在設(shè)備監(jiān)控中,要求LwIP能夠識(shí)別ICMP_ER類型的回送報(bào)文。因此,需要對(duì)LwIP中的ICMP模塊進(jìn)行補(bǔ)充,以滿足嵌入式終端對(duì)局域網(wǎng)中設(shè)備網(wǎng)絡(luò)狀態(tài)的監(jiān)控。另外,為了模擬類似Linux系統(tǒng)中ping功能系統(tǒng)調(diào)用,需要開發(fā)相應(yīng)的功能接口函數(shù)來(lái)組成所需IP數(shù)據(jù)包,并通過(guò)IP層的報(bào)文發(fā)送函數(shù)ip_output()或者原始套接字將數(shù)據(jù)包發(fā)送到目的主機(jī),以達(dá)到監(jiān)控網(wǎng)絡(luò)狀態(tài)的目的。
3.4 LwIP改進(jìn)方法
根據(jù)以上所述問(wèn)題,本文所采取的改進(jìn)方法主要包括合成ICMP報(bào)文、建立套接字并發(fā)送報(bào)文到目的地址、添加ICMP協(xié)議支持這三個(gè)基本步驟。
(1)ping指令簡(jiǎn)介
因特網(wǎng)包探索器ping(packet internet groper),是用來(lái)檢查網(wǎng)絡(luò)是否通暢或者網(wǎng)絡(luò)連接速度的命令。ping發(fā)送一個(gè)ICMP包,發(fā)送請(qǐng)求消息給目的主機(jī)并報(bào)告是否收到所希望的ICMP應(yīng)答。ping本質(zhì)上屬于IP協(xié)議層,并且根據(jù)用戶輸入不同的指令參數(shù)返回網(wǎng)絡(luò)狀態(tài)信息。
(2)合成ICMP_ER報(bào)文
LwIP本身具有一套較為完善的內(nèi)存管理機(jī)制,利用pbuf結(jié)構(gòu)實(shí)現(xiàn)數(shù)據(jù)傳遞,這與BSD中的Mbuf 很相似。pbuf主要用于保存用戶應(yīng)用程序與LwIP之間互相傳遞的用戶數(shù)據(jù)。利用LwIP提供的內(nèi)存分配函數(shù)pbuf_alloc(),在RAM中分配一塊空間存儲(chǔ)IP數(shù)據(jù)包,數(shù)據(jù)大小為sizeof(struct icmp_echo_hdr),然后填充icmp_echo_hdr類型對(duì)象iecho。基本過(guò)程如下:
q=pbuf_alloc(PBUF_IP,sizeof(struct IcmpHeader),
PBUF_RAM);
iecho=q->payload;
iecho->type=ICMP_ECHO;
iecho->code=0;
iecho->seqno=htons(1);
iecho->id=htons(13);
iecho->chksum=0; //由硬件求取校驗(yàn)和
(3)通過(guò)RAW套接字發(fā)送請(qǐng)求
RAW SOCKET可以接收本機(jī)網(wǎng)卡上的所有數(shù)據(jù)幀或者數(shù)據(jù)包,這對(duì)于監(jiān)聽網(wǎng)絡(luò)的流量和分析是很有作用的。所以選擇利用LwIP提供的API套接字函數(shù)操作建立RAW SOCKET,并調(diào)用lwip_sendto()函數(shù)將數(shù)據(jù)通過(guò)RAW SOCKET發(fā)送到目的IP?;具^(guò)程如下:
sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
lwip_sendto(sockfd,q->payload, sizeof(q->payload), 0,
(struct sockaddr *) & dest_addr,sizeof(dest_addr));
(4)修改ICMP協(xié)議文件
為了實(shí)現(xiàn)對(duì)ICMP_ER消息的監(jiān)聽和處理,需要對(duì)/src/core/ipv4目錄下的icmp.c文件做補(bǔ)充修改。在主要的報(bào)文處理函數(shù)icmp_input()中,添加ICMP_ER消息中斷響應(yīng)方法,由于IP包頭已經(jīng)被剝離,所以需要在switch(type){}框架中添加case ICMP_ER:單元,主要處理是計(jì)算響應(yīng)時(shí)間和消息存活時(shí)間,并提取icmp_seq、對(duì)方IP地址等相關(guān)信息,主要實(shí)現(xiàn)方法如下:
case ICMP_ER:
timeofrecv = OSTimeGet();
iechr = (struct IcmpHeader *)p->payload;
timeofsend = iechr->timestamp;
timeofrecv = (timeofrecv - timeofsend) * 1000 /
OS_TICKS_PER_SEC;
printf("%d byte from %s: icmp_seq=%u ttl=%d rtt=
%u ms \n\r",ntohs(iphdr->_len),ip_ntoa(&(iphdr->src)),
ntohs(iecho->seqno),IPH_TTL(iphdr),timeofrecv);
4 實(shí)驗(yàn)分析
4.1 LwIP移植情況測(cè)試
移植情況測(cè)試是通過(guò)設(shè)備監(jiān)控終端與PC之間的網(wǎng)絡(luò)ping指令實(shí)現(xiàn)的。監(jiān)控終端IP地址為:172.20.36.93,主機(jī)IP地址為:172.20.36.72。從圖4中可以看出,終端響應(yīng)時(shí)間為1 ms,可以滿足數(shù)據(jù)快速收發(fā)的要求,數(shù)據(jù)存活時(shí)間為ttl=255 ms,丟包率為0,說(shuō)明LwIP協(xié)議已經(jīng)移植成功。
4.2 改進(jìn)后設(shè)備監(jiān)控功能測(cè)試
在地址為172.20.36.72的主機(jī)上使用IP Sinffer軟件偵聽網(wǎng)絡(luò)中傳遞上來(lái)的ICMP報(bào)文,如圖5所示。分析圖5可知,主機(jī)接收到了多條由終端發(fā)送上來(lái)的ICMP報(bào)文,數(shù)據(jù)包具體內(nèi)容顯示在右側(cè)邊框中,IP數(shù)據(jù)包的內(nèi)容是ICMP_ER類型的ICMP報(bào)文;ID號(hào)0x0D與終端中所設(shè)置的報(bào)文ID相等,即iecho->id=htons(13);序號(hào)為1與終端中所設(shè)置的報(bào)文序號(hào)相等,即iecho->seqno=htons(1)。由此說(shuō)明終端中所合成的ICMP_ER類型的IP報(bào)文已經(jīng)成功發(fā)送到了目的地址,并且目的主機(jī)立刻返回了ICMP請(qǐng)求。
對(duì)實(shí)驗(yàn)環(huán)境的具體要求:通過(guò)監(jiān)控終端監(jiān)測(cè)IP尾數(shù)為204和128的設(shè)備網(wǎng)絡(luò)狀態(tài),同時(shí)監(jiān)測(cè)設(shè)備電源配電狀況并回顯配電狀態(tài)參數(shù)。分析圖6可知,局域網(wǎng)內(nèi)被監(jiān)控設(shè)備網(wǎng)絡(luò)連接正常,能快速響應(yīng)網(wǎng)絡(luò)檢測(cè)數(shù)據(jù)包,丟包率為0,說(shuō)明對(duì)LwIP的協(xié)議棧優(yōu)化后,能夠發(fā)送網(wǎng)絡(luò)狀態(tài)檢測(cè)數(shù)據(jù),并獲得對(duì)方主機(jī)響應(yīng)。另外,監(jiān)控終端與主機(jī)網(wǎng)絡(luò)連接正常,可以將設(shè)備狀態(tài)參數(shù)通過(guò)網(wǎng)絡(luò)及時(shí)上傳到控制中心。
本文在分析設(shè)備遠(yuǎn)程監(jiān)控實(shí)際需求的基礎(chǔ)上,以32位微處理器STM32F207系列的處理器為核心,完成了LwIP嵌入式TCP/IP協(xié)議棧的移植與改進(jìn),設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于改進(jìn)LwIP的設(shè)備監(jiān)控方案。該方案已經(jīng)在實(shí)驗(yàn)室環(huán)境下完成了樣機(jī)的研制并驗(yàn)證了其功能。實(shí)踐表明,改進(jìn)后的LwIP彌補(bǔ)了原有協(xié)議棧對(duì)ICMP協(xié)議功能支持上的不足,滿足了用戶需要,相信在未來(lái)的設(shè)備監(jiān)控等領(lǐng)域必將有著廣闊的應(yīng)用前景。
參考文獻(xiàn)
[1] 孫彩云,李世中,李麗麗,等.基于ZigBee技術(shù)的設(shè)備監(jiān)控系統(tǒng)設(shè)計(jì)[J].水電能源科學(xué),2010,11(28):125-127.
[2] 張亞魁.基于LwIP的嵌入式WEB服務(wù)器的研究與實(shí)現(xiàn)[D].合肥:合肥工業(yè)大學(xué),2009:14-19.
[3] 楊曄.實(shí)時(shí)操作系統(tǒng)的μC/OS-Ⅱ下TCP/IP協(xié)議棧的實(shí)現(xiàn)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2003(7):80-83.
[4] 王暉,周巧娣,章雪挺,等.基于LwIP的海洋數(shù)據(jù)采集與傳輸系統(tǒng)[J].電子技術(shù)應(yīng)用,2012,38(8):26-29.
[5] Duan Zhiyu,Zhao Zhaowang.A study of the Ethernet throughput performance of the embedded system[J].Astronomical Research and Technology,2007,4(3):266-275.
[6] DUNKELS A.Design and implementation of the LwIP TCP/IP stack[EB/OL].(2001-2-1)[2004-2-1].http://www.ece.ualberta.ca/~cmpe401/fall2004/labs/docs/lwip.pdf.
[7] 徐鑫,曹奇英.基于LwIP協(xié)議棧的UDP協(xié)議分析與優(yōu)化[J].計(jì)算機(jī)應(yīng)用與軟件,2011,28(3):246-249.