文献标识码: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.