李冰 朱巖
摘 要:應用目前普及率較高的Android系統(tǒng)作為電力分界開關監(jiān)控軟件的移動端系統(tǒng),該軟件能夠與各種平臺服務端之間進行通信,實現對柱上開關數據的遠程監(jiān)控。本文著重介紹了系統(tǒng)的通信模塊的設計和實現,其中主要利用Socket通信實現服務端的實時“推送”,并進行了相關的優(yōu)化。
關鍵詞:Android;分界開關監(jiān)控;Socket
近年來,電力分界開關在電網中的應用逐漸普及,極大的增強了各支網的智能化管理,相應的監(jiān)控系統(tǒng)也為電力監(jiān)管部門提供了遠程了解電力現場工況、故障排查、減小故障范圍等諸多功能[1]。但目前大部分監(jiān)控軟件都運行在PC機上,監(jiān)控人員需要固定在監(jiān)控室中進行查看操作,極為不便[2]。而移動端恰好解決以上難題,通過相對較小的硬件開銷,獲得更為便捷的體驗。
本文設計的Android軟件通過與轉發(fā)中心服務器通信來獲取遠程開關RTU(Remote Terminal Unit)的實時數據并動態(tài)顯示在界面上,本文將就通信方式的設計和實現重點分析。
1 系統(tǒng)總體結構
1.1 系統(tǒng)架構
整個分界開關監(jiān)控系統(tǒng)由轉發(fā)中心、遠程控制單元、監(jiān)控平臺組成。架構圖如圖1所示。
由系統(tǒng)架構圖來看,RTU將采集到的數據通過GPRS發(fā)送到轉發(fā)中心,轉發(fā)中心將接收到的數據解析、存儲,并分發(fā)到各監(jiān)控終端。與此同時,轉發(fā)中心還需要將監(jiān)控端發(fā)來的控制數據經過同樣步驟分發(fā)給各RTU。依次完成相應的控制分合閘及參數設定。
1.2 Android監(jiān)控端的設計
監(jiān)控端主要由以下核心功能:
⑴實時狀態(tài)監(jiān)控。能準確、即時的查看RTU的實時數據,如:電壓、電流數據。
⑵設置工作參數??梢园葱柙O置諸如過流電流、零序電流流及重合閘時間等參數。
⑶控制分合閘。通過監(jiān)控端遠程控制各RTU的分合閘。
⑷故障報警。由轉發(fā)中心推送報警信息,及時更新在UI上通知監(jiān)控人員。
⑸查詢歷史數據??梢詮腁ndroid自帶的SQLite數據庫中查詢RTU在某段時間內的運行數據,當數據庫中沒有時,再利用WebService向轉發(fā)中心請求獲取。
根據以上功能分析,Android監(jiān)控端的模塊大體可以分為數據顯示模塊,網絡通信模塊,數據處理模塊,數據存儲模塊。
2 網絡通信模塊設計
2.1 通信方式選擇
目前,在基于C/S的軟件結構中,客戶端進行網絡請求主要通過Http協(xié)議的“拉”[3],即客戶端按照一定時間周期性的向服務器發(fā)送http請求,但是通常如果這個周期很短,會增加客戶端開銷;而太長,則會造成數據延遲,這對于本系統(tǒng)也是致命性的,本系統(tǒng)由于對RTU數據實時性要求較高,實時性、準確性也是該系統(tǒng)的最重要的功能性要求,所以客戶端與轉發(fā)中心做到要“數據同步”—即轉發(fā)中心接收RTU實時數據第一時間推送到Android客戶端,所以采用了Socket長連接來實現[4][5]。需要開通一個信道保持Android端和轉發(fā)中心的的持久連接,雙方可在此連接上發(fā)送多個數據包。一旦連接建立,Android端會即時收到轉發(fā)中心發(fā)送的數據包。
Socket描述了服務端地址和端口,有無連接(UDP)和面向連接(TCP)兩種通信方式[6]??紤]到UDP協(xié)議傳輸的不可靠性,在傳輸過程中易于丟失數據,雖然 TCP相對于UDP的時間開銷大,但由于本系統(tǒng)單次傳輸數據量不大,只有幾十K,所以時間上的開銷并不會影響數據的實時性。所以基于傳輸數據的可靠性、時效性的綜合考慮,選擇TCP協(xié)議來建立一個Socket長連接。
2.2 加入多線程
如果把讀取數據,接收數據等所有操作都放在UI主線程中進行,會造成UI無法響應或者ANR(Application Not Respond),造成線程堵塞,所以需要開啟多個線程,并且線程間要通過Handler來完成數據傳遞[7],實時的將數據更新到UI上。
Android Socket通信流程圖如圖2所示:
2.3 通信類圖設計
Socket通信連接建立后,力求在Activity切換或者程序進入后臺時候都能保持持續(xù)性的連接。而Activity是有生命周期的,當被其他Activity覆蓋或者程序進入后臺時,當前Activity進入OnStopped停止狀態(tài),當前Activity中的Socket通信也隨之關閉。而本文中我們引入Application類來解決以上問題。
Application類也是Android框架的一個組件,當Android程序啟動時會創(chuàng)建一個Application對象且只創(chuàng)建一個,所以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傳過來的二進制流實時數據存在系統(tǒng)內存中,執(zhí)行相應的操作就會將進行數據解析,通過適配器類SimpleAdapter與前臺控件ListView進行數據綁定,開啟Service,通過BroadCastReceiver進行監(jiān)聽并實時刷新到界面顯示。下面我們以獲取所有RTU概覽實時狀態(tài)數據為例,序列圖如下圖所示:
經過測試,該軟件通信模塊較好的完成了RTU實時數據展示,數據推送等功能,10個節(jié)點的大約40K的RTU數據能夠在0.5s內刷新,且數據準確,達到了實時性的要求。
4 結束語
本文介紹一種基于Android平臺的遠程單元數據監(jiān)控通信模塊的設計,隨著智能電網的大力普及和無線網絡的飛速發(fā)展,該移動端軟件相對于傳統(tǒng)的PC監(jiān)控軟件有著更大的發(fā)展前景,符合未來監(jiān)控便攜化、移動化的需求。
[參考文獻]
[1]陳什.基于.NET的電力分界開關監(jiān)控系統(tǒng)的設計和實現.南京理工大學碩士論文.2012.
[2]彭鑫,黃文君,譚彰,等.基于Android的工業(yè)控制軟件設計[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].計算機研究與發(fā)展.2000,04:407-412.
[8]陳娟.基于UML的面向對象的系統(tǒng)分析與設計[D].武漢理工大學.2005.