冯凌杰,张 梅,范建丰
(华南理工大学精密电子制造装备教育部工程研究中心自动化学院,广州510640)
远程监控是国内外研究的前沿热门课题,基于Internet的远程监控取得了巨大的发展,被广泛应用于机器人远程分布式控制、设备远程故障诊断、远程网络实验室等领域。
目前的数据采集和远程监控系统中,通讯方式分为有线通讯和无线通讯。有线通信因其线路架设成本太高,位置固定不能移动,从而限制了在偏远地区和移动环境下的应用。无线通信则克服了有线通信的缺点[1]。GPRS是一种基于GSM系统的无线分组交换技术。GPRS借用了移动的接入网和传输网,提供端到端、广域的无线IP连接。所以,GPRS较其他通信链路具有五大优点:瞬间上网、永远在线、快速传输、按量计费、自由切换。因此,GPRS通信方式广泛的应用于各类远程监控系统。
基于GPRS通信链路的实现方案:客户端采用RAM7+一体化GPRS DTU实现数据的采集与收发,服务器端采用通信模块与数据处理模块相分离的实现方案。这种实现降低了系统的开发难度,提高了系统的实时性。整个远程监控系统的构建如图1所示。
目前,GPRS的通信链路主要有四种实现方案:
(1)中心采用ADSL等INTELNET公网连接,采用公网固定IP。监控点直接向中心发起连接,系统运行可靠稳定。
(2)中心采用主副GPRS-DTU,采用移动内网动态IP+移动DNS解析服务。此方案可以节约固定IP的费用,但某些移动公司不提供DNS解析服务,所以应用受到限制,并且此方案实时性和稳定性较差。
图1 远程监控系统构建
(3)中心采用主副GPRS-DTU,采用移动APN专网固定IP。这种方案具有移动内网固定IP,传输数据不经过公网,节省了宽带专线费用,所以其稳定性,安全性和性价比都比方案二好。
(4)中心采用APN专线,采用内网固定IP。此方案在实时性、安全性和稳定性方面都比前三种方案有很大提高,适用于数据点多、安全性和实时性要求高的环境。缺点是费用太高[2-3]。
综合考虑稳定性和开发成本,最终决定采用方案一。
GPRS有TCP和UDP两种通信协议。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP协议有五大特点:①面向连接的传输;②端到端的通信;③高可靠性;④全双工方式传输;⑤采用字节流方式。UDP提供的服务是不可靠的、无连接的,因UDP无需进行确认排序以及网络信息的发送,其数据包的包头较TCP小,占用网络资源少,实时性较高。因此,TCP协议更多的应用于对数据传输的可靠性要求较高,但对实时性要求不是很高的情况,例如文件传送、计算机邮件等;而UDP适用于对数据传输的可靠性要求不是很高,但对实时性要求比较高的情况,例如视频电话会议系统等[4]。
综合考虑远程监控的实时性和数据传输的可靠性,决定选用TCP协议。
在客户端,利用RAM7开发出基于UC/OS II实时操作系统的串口通信程序,从而将RAM7采集到的数据发送给GPRS DTU模块。UC/OS II操作系统是基于任务的,所以在该程序中建立了一个主函数和两个任务。
主函数采用UC/OS II中main函数的典型写法,只用于初始化UC/OS II、启动多任务环境和建立一个 TaskUart0Send 任务[5]。
TaskUart0Send任务完成目标板的初始化和数据的发送,并建立一个数据发送任务Taskrecv:
UART0_Init(115200);/*初始化目标板的串口*/
UART1_SendStr(snd);/*向串口发送字符串snd*/
OSTaskCreate(Taskrecv,(void*)0,&TaskStk[TaskStkLengh-1],2);
TaskRecv任务主要完成数据的接收[6],本任务采用循环接收,每次接收一个字节,直到接收完规定的字节数为止。
for(i=0;i<8;i++)
{if(UART0Getch())
{
temp=UART0Getch();
*cp++=temp;
}
}
该服务器的通信模块采用socket套接字的非阻塞实现形式,其基本流程如图2所示。
图2 服务器通信模块流程图
图2 中启动服务器函数的主要功能是初始化套接字[7],包括初始化 windows socket的动态库、创建新的套接字并设置其为非阻塞模式、绑定套接字并进行监听。
创建清理资源线程和接收客户端线程的程序模块主要是实现接收客户端请求线程和释放资源线程的创建。接收客户端请求线程用来完成接收客户端的连接请求,释放资源线程主要用于当数据传输完毕时清理相应线程所占的系统资源。
当完成接收客户端请求时,在临界区内以sAccept套接字和addrclient客户端地址为参数创建一个cClient类的实例,将该实例作为一个节点加入用户链表cClientlist中,并为该客户端创建接收和发送数据线程,从而使服务器在各自的线程中调用socket中的recv()和send()l来实现数据的收发:
//创建接收客户端数据线程
m_hThreadRecv=CreateThread(NULL,0,Recv-DataThread,this,0,&ulThreadId);
//创建数据发送线程
m_hThreadSend=CreateThread(NULL,0,Send-DataThread,this,0,&ulThreadId);
结束进程完成服务器退出是最后清理工作,清理在启动主线程时申请的资源[8]。其中包括释放临界区对象和事件对象句柄、关闭SOCKET以及卸载Windows Sockets DLL。
通过实际的链路搭建和调试运行,证明该系统可以很好的满足远程监控系统对实时性和移动性的要求,并且所用费用不高,具有很好的性价比。实际的客户端搭建如图3所示。
图3 客户端的搭建
[1]GeoffreySanders.GPRSnetworks[C].Chichester,England;Hoboken,NJ:Wiley,2003:210 -230.
[2]赵亮,黎峰.GPRS无线网络在远程数据采集中的应用[J].计算机工程与设计,2005(9)期:2552 -2554.
[3]Yi- Bing Lin,Shun - Ren Yang.A mobility management strategy for GPRS[J].IEEE Transactions on Wireless Communications,2003,2(6):1178 -1188.
[4]TCP/IP协 议[EB/OL].http://tieba.baidu.com/f?kz=477764940.
[5]Labrosse J J.MicroC/OS - II The Real- Time Kenel[M].Second Edition.邵贝贝译.北京:北京航空航天大学出版社,2006.
[6]周立功,张华.深入浅出 RAM7-LPC213X/214X(下册)[M].北京:北京航空航天大学出版社,2006.
[7]Socket编程的实现过程[EB/OL].http://blog.sina.com.cn/s/blog_59f0cdb00100ajgl.htm.
[8]孙海民.精通windows socket网络开发[M].北京:北京邮电出版社,2008.