面向设备监控的LwIP协议栈扩展设计*
2013-10-24孙棣华廖孝勇郑林江余楚中
孙棣华 ,陆 旭 ,廖孝勇 ,郑林江 ,余楚中
(1.重庆大学 自动化学院,重庆400044;2.重庆大学 信息物理社会可信服务计算教育部重点实验室,重庆400044;3.重庆大学 计算机学院,重庆400044)
设备监控系统可获得设备的工作环境参数和设备运行状况,对确保设备安全正常运行、充分发挥设备效能、提高企业经济效益有极其重要的作用[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所示。
图1 系统硬件结构图
2 系统软件框架
系统软件整体设计流程如图2所示。首先启动系统,初始化系统时钟,建立主任务,初始化网卡驱动和串口设备,开启看门狗定时器,并创建邮箱作为检测任务和数据发送任务之间数据传递方式。然后建立检测任务、数据包发送任务以及指示灯显示任务。
图2 软件流程图
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()将应答信息回传。
图3 ICMP协议框架
但是在设备监控中,要求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。基本过程如下:
(3)通过RAW套接字发送请求
RAW SOCKET可以接收本机网卡上的所有数据帧或者数据包,这对于监听网络的流量和分析是很有作用的。所以选择利用LwIP提供的API套接字函数操作建立 RAW SOCKET,并调用 lwip_sendto()函数将数据通过RAW SOCKET发送到目的IP。基本过程如下:
(4)修改ICMP协议文件
为了实现对ICMP_ER消息的监听和处理,需要对/src/core/ipv4目录下的icmp.c文件做补充修改。在主要的报文处理函数icmp_input()中,添加 ICMP_ER消息中断响应方法,由于IP包头已经被剥离,所以需要在switch(type){}框架中添加 case ICMP_ER∶单元,主要处理是计算响应时间和消息存活时间,并提取icmp_seq、对方IP地址等相关信息,主要实现方法如下:
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 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请求。
图5 ICMP报文监听
对实验环境的具体要求:通过监控终端监测IP尾数为204和128的设备网络状态,同时监测设备电源配电状况并回显配电状态参数。分析图6可知,局域网内被监控设备网络连接正常,能快速响应网络检测数据包,丢包率为0,说明对LwIP的协议栈优化后,能够发送网络状态检测数据,并获得对方主机响应。另外,监控终端与主机网络连接正常,可以将设备状态参数通过网络及时上传到控制中心。
本文在分析设备远程监控实际需求的基础上,以32位微处理器STM32F207系列的处理器为核心,完成了LwIP嵌入式TCP/IP协议栈的移植与改进,设计并实现了一个基于改进LwIP的设备监控方案。该方案已经在实验室环境下完成了样机的研制并验证了其功能。实践表明,改进后的LwIP弥补了原有协议栈对ICMP协议功能支持上的不足,满足了用户需要,相信在未来的设备监控等领域必将有着广阔的应用前景。
图6 设备监控功能测试
[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.