李冰 朱岩
摘 要:应用目前普及率较高的Android系统作为电力分界开关监控软件的移动端系统,该软件能够与各种平台服务端之间进行通信,实现对柱上开关数据的远程监控。本文着重介绍了系统的通信模块的设计和实现,其中主要利用Socket通信实现服务端的实时“推送”,并进行了相关的优化。
关键词:Android;分界开关监控;Socket
近年来,电力分界开关在电网中的应用逐渐普及,极大的增强了各支网的智能化管理,相应的监控系统也为电力监管部门提供了远程了解电力现场工况、故障排查、减小故障范围等诸多功能[1]。但目前大部分监控软件都运行在PC机上,监控人员需要固定在监控室中进行查看操作,极为不便[2]。而移动端恰好解决以上难题,通过相对较小的硬件开销,获得更为便捷的体验。
本文设计的Android软件通过与转发中心服务器通信来获取远程开关RTU(Remote Terminal Unit)的实时数据并动态显示在界面上,本文将就通信方式的设计和实现重点分析。
1 系统总体结构
1.1 系统架构
整个分界开关监控系统由转发中心、远程控制单元、监控平台组成。架构图如图1所示。
由系统架构图来看,RTU将采集到的数据通过GPRS发送到转发中心,转发中心将接收到的数据解析、存储,并分发到各监控终端。与此同时,转发中心还需要将监控端发来的控制数据经过同样步骤分发给各RTU。依次完成相应的控制分合闸及参数设定。
1.2 Android监控端的设计
监控端主要由以下核心功能:
⑴实时状态监控。能准确、即时的查看RTU的实时数据,如:电压、电流数据。
⑵设置工作参数。可以按需设置诸如过流电流、零序电流流及重合闸时间等参数。
⑶控制分合闸。通过监控端远程控制各RTU的分合闸。
⑷故障报警。由转发中心推送报警信息,及时更新在UI上通知监控人员。
⑸查询历史数据。可以从Android自带的SQLite数据库中查询RTU在某段时间内的运行数据,当数据库中没有时,再利用WebService向转发中心请求获取。
根据以上功能分析,Android监控端的模块大体可以分为数据显示模块,网络通信模块,数据处理模块,数据存储模块。
2 网络通信模块设计
2.1 通信方式选择
目前,在基于C/S的软件结构中,客户端进行网络请求主要通过Http协议的“拉”[3],即客户端按照一定时间周期性的向服务器发送http请求,但是通常如果这个周期很短,会增加客户端开销;而太长,则会造成数据延迟,这对于本系统也是致命性的,本系统由于对RTU数据实时性要求较高,实时性、准确性也是该系统的最重要的功能性要求,所以客户端与转发中心做到要“数据同步”—即转发中心接收RTU实时数据第一时间推送到Android客户端,所以采用了Socket长连接来实现[4][5]。需要开通一个信道保持Android端和转发中心的的持久连接,双方可在此连接上发送多个数据包。一旦连接建立,Android端会即时收到转发中心发送的数据包。
Socket描述了服务端地址和端口,有无连接(UDP)和面向连接(TCP)两种通信方式[6]。考虑到UDP协议传输的不可靠性,在传输过程中易于丢失数据,虽然 TCP相对于UDP的时间开销大,但由于本系统单次传输数据量不大,只有几十K,所以时间上的开销并不会影响数据的实时性。所以基于传输数据的可靠性、时效性的综合考虑,选择TCP协议来建立一个Socket长连接。
2.2 加入多线程
如果把读取数据,接收数据等所有操作都放在UI主线程中进行,会造成UI无法响应或者ANR(Application Not Respond),造成线程堵塞,所以需要开启多个线程,并且线程间要通过Handler来完成数据传递[7],实时的将数据更新到UI上。
Android Socket通信流程图如图2所示:
2.3 通信类图设计
Socket通信连接建立后,力求在Activity切换或者程序进入后台时候都能保持持续性的连接。而Activity是有生命周期的,当被其他Activity覆盖或者程序进入后台时,当前Activity进入OnStopped停止状态,当前Activity中的Socket通信也随之关闭。而本文中我们引入Application类来解决以上问题。
Application类也是Android框架的一个组件,当Android程序启动时会创建一个Application对象且只创建一个,所以Application生命周期是等同于程序的生命周期的,所以把Socket连接操作类和IO数据读写类封装到MyApplication类下,MyApplication继承Application类即可,这样Socket连接就可以贯穿整个程序,解决了一个socket在多个界面切换时不能保持链接的问题。MyApplication类代码如下:
public class MyApplication extends Application{
//SocketUtils类封装了程序Socket连接和异步读写数据类;
private RTU rtu;
@override
Public void onCreate(){
//将SocketUtils实例化并调用构造函数,传入建立Socket连接的IP地址和端口;
socketUtils =new SocketUtils(“SERVER_IP”;”SERVER_PORT”);
super.onCreate();
}
//只需要在别的Activity通过下面代码将MyApplication实例化即可;MyApplication myApplication=
(MyApplication)this.getApplicationContext();
解决以上几个问题之后,充分考虑到软件可扩展和可复用的原则,我们简单的把Socket通信模块部分类图设计如下[8]:
3 客户端通信功能测试
通过Socket传过来的二进制流实时数据存在系统内存中,执行相应的操作就会将进行数据解析,通过适配器类SimpleAdapter与前台控件ListView进行数据绑定,开启Service,通过BroadCastReceiver进行监听并实时刷新到界面显示。下面我们以获取所有RTU概览实时状态数据为例,序列图如下图所示:
经过测试,该软件通信模块较好的完成了RTU实时数据展示,数据推送等功能,10个节点的大约40K的RTU数据能够在0.5s内刷新,且数据准确,达到了实时性的要求。
4 结束语
本文介绍一种基于Android平台的远程单元数据监控通信模块的设计,随着智能电网的大力普及和无线网络的飞速发展,该移动端软件相对于传统的PC监控软件有着更大的发展前景,符合未来监控便携化、移动化的需求。
[参考文献]
[1]陈什.基于.NET的电力分界开关监控系统的设计和实现.南京理工大学硕士论文.2012.
[2]彭鑫,黄文君,谭彰,等.基于Android的工业控制软件设计[J].计算机工程.2013,39(7):87-89.
[3]邵维忠,麻志毅,马浩海,刘辉.UML用户指南(第二版)[M].北京:人民邮电出版.2006.
[4]李芝兴,主编.Java程序设计之网络编程[M].清华大学出版社.2006.
[5]李新良,罗戈夕.用Socket的编程机制实现网上交谈[J].电脑知识与技术.2006(29).
[6]何进,谢松巍.基于Socket的TCP/IP网络通讯模式研究[J].计算机应用研究.2001,08:134-135.
[7]骆斌,费翔林.多线程技术的研究与应用[J].计算机研究与发展.2000,04:407-412.
[8]陈娟.基于UML的面向对象的系统分析与设计[D].武汉理工大学.2005.