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