1 引言
目前,对输油管道、电力装置等多个分散点进行监控主要采用人工巡逻的方式,这种方式存在实时性差、成本高、无法对环境恶劣的地区进行监控等缺点。随着internet与移动通信技术的发展,这种传统的监控方案已无法满足应用要求,亟待开发一种实时性好、可靠性高、价低易用的无线远程监控系统。GPRS能够很好地解决上述问题。GPRS是在充分利用现有GSM网络的基础上,通过添加GGSN和SGSN实现数据的分组传输,从而将移动通信与Internet网络联系起来,是目前无线数据传输应用最广泛的网络。
2 系统硬件组成
输油管道压力监控模块的硬件结构框图如图1所示,系统由远程监控模块和监控中心PC机组成,它们通过GPRS网络进行通信。远程监控节点由ARM模块、GPRS模块和传感器模块组成。其中,GPRS模块主要用于数据的发送、接收以及短消息的接收;ARM模块完成传感器数据的编码和TCP/IP封装,控制GPRS模块将数据发送到监控中心,并接收和执行监控中心发送的控制命令;监控中心为通过以太网卡连人Internet中的一台具有固定IP的计算机,采用VB.NET开发工具调用Winsock控件编写监控软件,用于接收、处理和显示各个监控点发送的数据,并对监控点发送控制命令。
其中,GPRS模块是无线数据传输的核心部分,本文采用西门子公司的MC39i,它提供一个标准的RS232接口用于与外部应用系统连接。
3 系统软件设计
3.1 基于FreeRTOS的系统任务设计
根据嵌入式实时操作系统模块化设计理念,将系统软件设计划分为主控任务MainTask()、与网络连接任务GPRSConctTask()、数据传输任务xDataTrsmtTask()、短消息处理任务xSMSProc-Task()和传感器任务xSensorStatTask()。任务之间采用信号量、队列和邮箱等进行通信,其关系如图2所示,其中MC39iSerialDrv()为串口驱动程序。
MC39iSerialDrv()为串口驱动函数,它负责将发送队列xQSendToMC39i里面的数据发送给与MC39i相连接的串口。接收到数据后,将MC39i串口接收到的数据发送到接收队列xQRecdFrom-MC39i中,数据的接收和发送是通过中断服务子程序完成的。
GPRSConctTask()实现MC39i模块与GPRS网络的连接,是远程数据传输的基础和关键。
3.2 基于状态机设计GPRS连接任务
由于网络和信号强弱等原因,可能导致节点与GPRS网络连接的失败。本文采用基于状态机的结构设计方法对各个阶段产生的错误进行处理,保障模块与GPRS网络建立可靠连接。程序状态机如图3所示。
3.3 基于uIP协议栈的传输层软件设计
利用GPRS模块进行数据传输时,数据格式须符合互连网络的TCP/IP协议标准。xDataTrsmtTask()任务完成传输层和网络层处理。根据系统状态(UDP或TCP态),传输层处理方式不同。
TCP提供可靠的数据传输方式,其应用层协议也比较多,被广泛应用于网络通信领域。由于TCP的协议头以及数据传输控制比较复杂,数据的传输效率较低,因而越来越多的实时小数据量的应用,更倾向于使用基于UDP的数据传输协议。
3.3.1 基于uIP的TCP数据传输方式的实现
本文基于uIP TCP/IP协议栈实现TCP数据传输方式。uIP是由Adam Dunkels编写的源代码免费开放的微型TCP/IP协议栈,传输层协议实现了UDP和TCP,链路层PPP协议可以作为uIP下面的设备驱动来实现,uIP系统底层和应用程序之间的关系如图4所示。应用程序必须提供一个回应函数给uIP,数据传输任务周期性调用UIP_AP-PCALL()函数处理事件的发生。
进行TCP数据传输之前,首先通过调用uIP协议栈提供的uip_connect()函数与监控中心的监控软件建立一个TCP连接,TCP连接的三次握手均由uIP协议栈的uip_process()函数完成。
默认情况下,uIP协议栈的发送和接收共用一个缓冲区,当uIP处理缓冲区内数据时,必须关中断,为了提高系统实时性,我们将其改为双缓冲区模式。系统每个时钟节拍分别对发送和接收缓冲区进行扫描,如发现缓冲区非空时,由uIP协议栈处理。接收数据时,uip_process()对接收缓冲区内数据进行TCP和IP 协议头解析,并将应用数据发送到In-Buffer[]中。发送数据时,由uip_process()完成发送缓冲区OutBuffer[]中数据的TCP/IP封装,再调用uIP驱动程序PPPSendData()进行链路层PPP协议头的封装,并将封装的数据发送到发送队列xQSendToMC39i中。
3.3.2 UDP数据传输的实现和改进
设计中采用对数据包进行编码和增加握手的方式实现UDP数据传输可靠性的改进。通过给每个UDP数据包加上一个顺序增加的ID号,区别各个不同的数据包,利用它来对丢包的检测。握手过程如图5所示。设计中采用UDPIDProc()函数完成握手功能,发送的数据备份在一个缓冲区中,每次接收到确认包后将对ID进行检验,如果ID正确则将备份的数据删除。如60 s内未收到正确的ID确认信息,则采用新的ID将备份的数据重传,当重传失败时,可以进行报警,从而实现了一种改进的可靠性较高的UDP数据传输方式。
4 系统测试
本文利用两个数据传输模块和监控中心组成测试系统对数据传输性能进行测试。最高重传次数设置为3,超过最高重传次数后,通过短消息方式将数据发送到用户手机上。模块每20 min向监控中心发送一次数据,监控中心每天发送两次控制命令到各个模块,分别采用改进的UDP和TCP进行传输。经测试,系统工作20天内未出现死机等异常情况;模块与GPRS网络连接成功率为100%(本文中增加了检错重试机制)。测试结果如表1所示。
GPRS网络中UDP传输有效率大于99%,TCP传输有效率约为100%。本文设计的远程监控系统采用经改进的UDP数据传输方式能检测到丢包,通过多次重传可以成倍降低UDP传输方式的丢包率,可以根据需要设置系统将一直重传到数据成功到达为止,从而实现数据传输成功率为100%。
5 结 论
本文给出的远程监控系统的设计方案具有可靠、实时、稳定、通用和低成本等优点,实现了TCP和经过改良的UDP两种数据传输方式,可以满足多种数据传输领域的要求。