李冰 朱巖
摘 要:應(yīng)用目前普及率較高的Android系統(tǒng)作為電力分界開關(guān)監(jiān)控軟件的移動(dòng)端系統(tǒng),該軟件能夠與各種平臺(tái)服務(wù)端之間進(jìn)行通信,實(shí)現(xiàn)對(duì)柱上開關(guān)數(shù)據(jù)的遠(yuǎn)程監(jiān)控。本文著重介紹了系統(tǒng)的通信模塊的設(shè)計(jì)和實(shí)現(xiàn),其中主要利用Socket通信實(shí)現(xiàn)服務(wù)端的實(shí)時(shí)“推送”,并進(jìn)行了相關(guān)的優(yōu)化。
關(guān)鍵詞:Android;分界開關(guān)監(jiān)控;Socket
近年來(lái),電力分界開關(guān)在電網(wǎng)中的應(yīng)用逐漸普及,極大的增強(qiáng)了各支網(wǎng)的智能化管理,相應(yīng)的監(jiān)控系統(tǒng)也為電力監(jiān)管部門提供了遠(yuǎn)程了解電力現(xiàn)場(chǎng)工況、故障排查、減小故障范圍等諸多功能[1]。但目前大部分監(jiān)控軟件都運(yùn)行在PC機(jī)上,監(jiān)控人員需要固定在監(jiān)控室中進(jìn)行查看操作,極為不便[2]。而移動(dòng)端恰好解決以上難題,通過(guò)相對(duì)較小的硬件開銷,獲得更為便捷的體驗(yàn)。
本文設(shè)計(jì)的Android軟件通過(guò)與轉(zhuǎn)發(fā)中心服務(wù)器通信來(lái)獲取遠(yuǎn)程開關(guān)RTU(Remote Terminal Unit)的實(shí)時(shí)數(shù)據(jù)并動(dòng)態(tài)顯示在界面上,本文將就通信方式的設(shè)計(jì)和實(shí)現(xiàn)重點(diǎn)分析。
1 系統(tǒng)總體結(jié)構(gòu)
1.1 系統(tǒng)架構(gòu)
整個(gè)分界開關(guān)監(jiān)控系統(tǒng)由轉(zhuǎn)發(fā)中心、遠(yuǎn)程控制單元、監(jiān)控平臺(tái)組成。架構(gòu)圖如圖1所示。
由系統(tǒng)架構(gòu)圖來(lái)看,RTU將采集到的數(shù)據(jù)通過(guò)GPRS發(fā)送到轉(zhuǎn)發(fā)中心,轉(zhuǎn)發(fā)中心將接收到的數(shù)據(jù)解析、存儲(chǔ),并分發(fā)到各監(jiān)控終端。與此同時(shí),轉(zhuǎn)發(fā)中心還需要將監(jiān)控端發(fā)來(lái)的控制數(shù)據(jù)經(jīng)過(guò)同樣步驟分發(fā)給各RTU。依次完成相應(yīng)的控制分合閘及參數(shù)設(shè)定。
1.2 Android監(jiān)控端的設(shè)計(jì)
監(jiān)控端主要由以下核心功能:
⑴實(shí)時(shí)狀態(tài)監(jiān)控。能準(zhǔn)確、即時(shí)的查看RTU的實(shí)時(shí)數(shù)據(jù),如:電壓、電流數(shù)據(jù)。
⑵設(shè)置工作參數(shù)??梢园葱柙O(shè)置諸如過(guò)流電流、零序電流流及重合閘時(shí)間等參數(shù)。
⑶控制分合閘。通過(guò)監(jiān)控端遠(yuǎn)程控制各RTU的分合閘。
⑷故障報(bào)警。由轉(zhuǎn)發(fā)中心推送報(bào)警信息,及時(shí)更新在UI上通知監(jiān)控人員。
⑸查詢歷史數(shù)據(jù)。可以從Android自帶的SQLite數(shù)據(jù)庫(kù)中查詢RTU在某段時(shí)間內(nèi)的運(yùn)行數(shù)據(jù),當(dāng)數(shù)據(jù)庫(kù)中沒(méi)有時(shí),再利用WebService向轉(zhuǎn)發(fā)中心請(qǐng)求獲取。
根據(jù)以上功能分析,Android監(jiān)控端的模塊大體可以分為數(shù)據(jù)顯示模塊,網(wǎng)絡(luò)通信模塊,數(shù)據(jù)處理模塊,數(shù)據(jù)存儲(chǔ)模塊。
2 網(wǎng)絡(luò)通信模塊設(shè)計(jì)
2.1 通信方式選擇
目前,在基于C/S的軟件結(jié)構(gòu)中,客戶端進(jìn)行網(wǎng)絡(luò)請(qǐng)求主要通過(guò)Http協(xié)議的“拉”[3],即客戶端按照一定時(shí)間周期性的向服務(wù)器發(fā)送http請(qǐng)求,但是通常如果這個(gè)周期很短,會(huì)增加客戶端開銷;而太長(zhǎng),則會(huì)造成數(shù)據(jù)延遲,這對(duì)于本系統(tǒng)也是致命性的,本系統(tǒng)由于對(duì)RTU數(shù)據(jù)實(shí)時(shí)性要求較高,實(shí)時(shí)性、準(zhǔn)確性也是該系統(tǒng)的最重要的功能性要求,所以客戶端與轉(zhuǎn)發(fā)中心做到要“數(shù)據(jù)同步”—即轉(zhuǎn)發(fā)中心接收RTU實(shí)時(shí)數(shù)據(jù)第一時(shí)間推送到Android客戶端,所以采用了Socket長(zhǎng)連接來(lái)實(shí)現(xiàn)[4][5]。需要開通一個(gè)信道保持Android端和轉(zhuǎn)發(fā)中心的的持久連接,雙方可在此連接上發(fā)送多個(gè)數(shù)據(jù)包。一旦連接建立,Android端會(huì)即時(shí)收到轉(zhuǎn)發(fā)中心發(fā)送的數(shù)據(jù)包。
Socket描述了服務(wù)端地址和端口,有無(wú)連接(UDP)和面向連接(TCP)兩種通信方式[6]??紤]到UDP協(xié)議傳輸?shù)牟豢煽啃裕趥鬏斶^(guò)程中易于丟失數(shù)據(jù),雖然 TCP相對(duì)于UDP的時(shí)間開銷大,但由于本系統(tǒng)單次傳輸數(shù)據(jù)量不大,只有幾十K,所以時(shí)間上的開銷并不會(huì)影響數(shù)據(jù)的實(shí)時(shí)性。所以基于傳輸數(shù)據(jù)的可靠性、時(shí)效性的綜合考慮,選擇TCP協(xié)議來(lái)建立一個(gè)Socket長(zhǎng)連接。
2.2 加入多線程
如果把讀取數(shù)據(jù),接收數(shù)據(jù)等所有操作都放在UI主線程中進(jìn)行,會(huì)造成UI無(wú)法響應(yīng)或者ANR(Application Not Respond),造成線程堵塞,所以需要開啟多個(gè)線程,并且線程間要通過(guò)Handler來(lái)完成數(shù)據(jù)傳遞[7],實(shí)時(shí)的將數(shù)據(jù)更新到UI上。
Android Socket通信流程圖如圖2所示:
2.3 通信類圖設(shè)計(jì)
Socket通信連接建立后,力求在Activity切換或者程序進(jìn)入后臺(tái)時(shí)候都能保持持續(xù)性的連接。而Activity是有生命周期的,當(dāng)被其他Activity覆蓋或者程序進(jìn)入后臺(tái)時(shí),當(dāng)前Activity進(jìn)入OnStopped停止?fàn)顟B(tài),當(dāng)前Activity中的Socket通信也隨之關(guān)閉。而本文中我們引入Application類來(lái)解決以上問(wèn)題。
Application類也是Android框架的一個(gè)組件,當(dāng)Android程序啟動(dòng)時(shí)會(huì)創(chuàng)建一個(gè)Application對(duì)象且只創(chuàng)建一個(gè),所以Application生命周期是等同于程序的生命周期的,所以把Socket連接操作類和IO數(shù)據(jù)讀寫類封裝到MyApplication類下,MyApplication繼承Application類即可,這樣Socket連接就可以貫穿整個(gè)程序,解決了一個(gè)socket在多個(gè)界面切換時(shí)不能保持鏈接的問(wèn)題。MyApplication類代碼如下:
public class MyApplication extends Application{
//SocketUtils類封裝了程序Socket連接和異步讀寫數(shù)據(jù)類;
private RTU rtu;
@override
Public void onCreate(){
//將SocketUtils實(shí)例化并調(diào)用構(gòu)造函數(shù),傳入建立Socket連接的IP地址和端口;
socketUtils =new SocketUtils(“SERVER_IP”;”SERVER_PORT”);
super.onCreate();
}
//只需要在別的Activity通過(guò)下面代碼將MyApplication實(shí)例化即可;MyApplication myApplication=
(MyApplication)this.getApplicationContext();
解決以上幾個(gè)問(wèn)題之后,充分考慮到軟件可擴(kuò)展和可復(fù)用的原則,我們簡(jiǎn)單的把Socket通信模塊部分類圖設(shè)計(jì)如下[8]:
3 客戶端通信功能測(cè)試
通過(guò)Socket傳過(guò)來(lái)的二進(jìn)制流實(shí)時(shí)數(shù)據(jù)存在系統(tǒng)內(nèi)存中,執(zhí)行相應(yīng)的操作就會(huì)將進(jìn)行數(shù)據(jù)解析,通過(guò)適配器類SimpleAdapter與前臺(tái)控件ListView進(jìn)行數(shù)據(jù)綁定,開啟Service,通過(guò)BroadCastReceiver進(jìn)行監(jiān)聽(tīng)并實(shí)時(shí)刷新到界面顯示。下面我們以獲取所有RTU概覽實(shí)時(shí)狀態(tài)數(shù)據(jù)為例,序列圖如下圖所示:
經(jīng)過(guò)測(cè)試,該軟件通信模塊較好的完成了RTU實(shí)時(shí)數(shù)據(jù)展示,數(shù)據(jù)推送等功能,10個(gè)節(jié)點(diǎn)的大約40K的RTU數(shù)據(jù)能夠在0.5s內(nèi)刷新,且數(shù)據(jù)準(zhǔn)確,達(dá)到了實(shí)時(shí)性的要求。
4 結(jié)束語(yǔ)
本文介紹一種基于Android平臺(tái)的遠(yuǎn)程單元數(shù)據(jù)監(jiān)控通信模塊的設(shè)計(jì),隨著智能電網(wǎng)的大力普及和無(wú)線網(wǎng)絡(luò)的飛速發(fā)展,該移動(dòng)端軟件相對(duì)于傳統(tǒng)的PC監(jiān)控軟件有著更大的發(fā)展前景,符合未來(lái)監(jiān)控便攜化、移動(dòng)化的需求。
[參考文獻(xiàn)]
[1]陳什.基于.NET的電力分界開關(guān)監(jiān)控系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn).南京理工大學(xué)碩士論文.2012.
[2]彭鑫,黃文君,譚彰,等.基于Android的工業(yè)控制軟件設(shè)計(jì)[J].計(jì)算機(jī)工程.2013,39(7):87-89.
[3]邵維忠,麻志毅,馬浩海,劉輝.UML用戶指南(第二版)[M].北京:人民郵電出版.2006.
[4]李芝興,主編.Java程序設(shè)計(jì)之網(wǎng)絡(luò)編程[M].清華大學(xué)出版社.2006.
[5]李新良,羅戈夕.用Socket的編程機(jī)制實(shí)現(xiàn)網(wǎng)上交談[J].電腦知識(shí)與技術(shù).2006(29).
[6]何進(jìn),謝松巍.基于Socket的TCP/IP網(wǎng)絡(luò)通訊模式研究[J].計(jì)算機(jī)應(yīng)用研究.2001,08:134-135.
[7]駱斌,費(fèi)翔林.多線程技術(shù)的研究與應(yīng)用[J].計(jì)算機(jī)研究與發(fā)展.2000,04:407-412.
[8]陳娟.基于UML的面向?qū)ο蟮南到y(tǒng)分析與設(shè)計(jì)[D].武漢理工大學(xué).2005.