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