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