曾冬梅 王彥桂 唐會天
摘要:文章討論了一個當(dāng)前正在使用的新的電信公司動力與環(huán)境集中監(jiān)控系統(tǒng)的原理和架構(gòu),并且詳細討論了在新的軟件平臺下為該監(jiān)控系統(tǒng)設(shè)計以及實現(xiàn)一個高性能的TCP/IP通信庫的方法和過程,使用該通信庫可以非常容易給監(jiān)控系統(tǒng)軟件內(nèi)部模塊或與其他系統(tǒng)互聯(lián)提供高性能的Sockets服務(wù)端和客戶端功能。
關(guān)鍵詞: Sockets; TCP/IP;.C#.NET; 通信; 電信; 動力監(jiān)控;
中圖分類號:TP319文獻標(biāo)識碼:A文章編號:1009-3044(2009)22-pppp-0c
眾所周知,電信公司的主要業(yè)務(wù)是提供7X24小時的不間斷通信、數(shù)據(jù)服務(wù),這些服務(wù)都需要依靠各種交換、路由、網(wǎng)橋和防火墻等設(shè)備完成,這些設(shè)備對于電以及動力設(shè)備的依賴尤勝于其他生產(chǎn)企業(yè),而且這些通信設(shè)備運行的環(huán)境都有比較嚴格的要求,使用大量的人力進行現(xiàn)場維護,不但效率低下,也不能保證維護質(zhì)量和維護水平,而動力及環(huán)境集中監(jiān)控系統(tǒng)使得這一現(xiàn)狀得到了徹底的改觀,觀察動力設(shè)備運行情況、記錄設(shè)備及環(huán)境參數(shù)這些工作完全可以依靠監(jiān)控系統(tǒng)來完成。廣泛應(yīng)用的動力及環(huán)境監(jiān)控系統(tǒng)實現(xiàn)了對通信局站內(nèi)各種動力設(shè)備、空調(diào)設(shè)備及環(huán)境的實時監(jiān)控、維護和綜合管理,保障了電信系統(tǒng)的可靠運行,降低了維護成本,并逐步實現(xiàn)了通信動力設(shè)備由分散維護向集中監(jiān)控、維護和管理。
下面介紹的電信動力與環(huán)境集中監(jiān)控系統(tǒng)使用了模塊化和面向?qū)ο蟮脑O(shè)計,并且重點討論了一個專門設(shè)計的TCP/IP通信庫。
1 動力監(jiān)控系統(tǒng)架構(gòu)
一個完整的電信動力與環(huán)境監(jiān)控系統(tǒng)應(yīng)該包括配電系統(tǒng)設(shè)備、環(huán)境系統(tǒng)參數(shù)、消防系統(tǒng)信息和保安系統(tǒng)等數(shù)據(jù),這些監(jiān)控對象包括可以直接使用通信協(xié)議采集的所謂智能設(shè)備,也包括向溫濕度傳感器一樣的非智能設(shè)備,對于不同的監(jiān)控對象需要使用不同的數(shù)據(jù)采集前端設(shè)備,這些前端設(shè)備放置在被監(jiān)控設(shè)備的附近或者通過現(xiàn)場鋪設(shè)通信電纜進行數(shù)據(jù)采集。
當(dāng)前以太網(wǎng)技術(shù)已經(jīng)非常成熟,電信公司的DCN網(wǎng)絡(luò)(專用數(shù)據(jù)通信網(wǎng))是一個完全意義上的分組交換網(wǎng)絡(luò),TCP/IP協(xié)議在公司內(nèi)和機樓之間都可以隨處可用,所有數(shù)據(jù)通過前端采集設(shè)備采集后都可以通過TCP/IP網(wǎng)絡(luò)進行傳輸。本系統(tǒng)整體的設(shè)計都基于電信完善的TCP/IP網(wǎng)絡(luò),系統(tǒng)以數(shù)據(jù)庫為基礎(chǔ)、以數(shù)據(jù)處理機為數(shù)據(jù)的中心,所有的監(jiān)控段包括監(jiān)控機和辦公室都可以通過使用TCP/IP協(xié)議連接到數(shù)據(jù)處理機獲得實時處理的監(jiān)控數(shù)據(jù),通過連接中心數(shù)據(jù)庫獲得保存的歷史數(shù)據(jù)。
2 系統(tǒng)軟件設(shè)計
監(jiān)控軟件功能模塊以數(shù)據(jù)處理軟件為實時數(shù)據(jù)分發(fā)中心,以數(shù)據(jù)庫為歷史數(shù)據(jù)存放中心。其余客戶端軟件都通過Sockets的方式連接到數(shù)據(jù)處理中心,數(shù)據(jù)處理中心作為Socket Server給其他客戶端提供數(shù)據(jù)服務(wù),客戶端作為Socket client主動與中心建立連接,使用TCP/IP協(xié)議與中心進行通信。
3 通信庫實現(xiàn)原理
在Windows操作系統(tǒng)下實現(xiàn)的TCP/IP通信程序,用戶進程的每次網(wǎng)絡(luò)訪問都要通過操作系統(tǒng)來完成,Socke通信中發(fā)送方首先在用戶空間將欲發(fā)送的數(shù)據(jù)準(zhǔn)備好,通過系統(tǒng)調(diào)用進入核心,由核心將發(fā)送的數(shù)據(jù)從用戶空間拷貝到核心空間,數(shù)據(jù)經(jīng)TCP/UDP協(xié)議和IP協(xié)議處理,最后由網(wǎng)卡驅(qū)動程序發(fā)送到網(wǎng)絡(luò),當(dāng)消息被接收方的網(wǎng)絡(luò)接口卡收到后,產(chǎn)生硬件中斷通知核心,接收方核心同樣要經(jīng)過IP協(xié)議和TCP/UDP協(xié)議的處理然后才能將數(shù)據(jù)拷貝到接收方進程的用戶空間中。
除了操作系統(tǒng)負責(zé)完成的部分以為,用戶程序還需要實現(xiàn)客戶業(yè)務(wù)數(shù)據(jù)的調(diào)度,尤其對于服務(wù)程序需要建立一個高效的線程級的服務(wù)架構(gòu),因為服務(wù)程序需要實時響應(yīng)很多監(jiān)控客戶端的同時數(shù)據(jù)請求。故很有必要專門為之設(shè)計一個高性能的TCP/IP通信庫,用于實現(xiàn)高效的通信服務(wù)程序和通信客戶程序。
這里設(shè)計的通信庫基于TCP Client/TCP Server的通信模式,而不是Peer-to-Peer的通信模式。基于Client/Server通信模式需要至少完成兩項任務(wù):
TCP客戶端負責(zé)發(fā)起一個與服務(wù)器的連接,因此客戶端只需要關(guān)心并處理僅僅一個簡單的向外的連接。
服務(wù)器端監(jiān)聽所有指向自己的客戶端的請求,服務(wù)器端必須關(guān)心并處理多個向內(nèi)的連接請求和向內(nèi)的連接。
4 通信庫設(shè)計實現(xiàn)
本系統(tǒng)的大部分軟件都使用微軟的新開發(fā)平臺.NET進行開發(fā),通信庫也使用.NET平臺下的C#語言進行設(shè)計和實現(xiàn),可以供.NET平臺支持的所有語言調(diào)用。
4.1 關(guān)鍵接口設(shè)計
基于.NET開發(fā)平臺,在通信庫中設(shè)計一個向外的連接類OutgoingConnection供客戶端程序連接服務(wù)器程序使用。當(dāng)客戶端請求一個向服務(wù)器程序的連接時,服務(wù)器程序創(chuàng)建一個向內(nèi)的連接類IncomingConnection的實例負責(zé)與客戶端進行通信。OutgoingConnection類和IncomingConnection類都繼承自同一個基礎(chǔ)通信類ConnectionBase類,它提供了向內(nèi)和向外通信相關(guān)的公共方法(如發(fā)送、接收數(shù)據(jù)等),都由接口ICommunicationsBase進行聲明,這兩個連接類共同實現(xiàn)的接口包含如下元素:一個Socket實例(發(fā)送和接收數(shù)據(jù)的管道);一個可以有管道接收到的新的數(shù)據(jù)觸發(fā)的事件;一個可以通過管道與遠程主機進行數(shù)據(jù)傳輸?shù)姆椒?一個可以關(guān)閉Socket的方法。
客戶端使用的OutgoingConnection類需要另外實現(xiàn)一些元素:一個連接方法(包含節(jié)點地址、端口參數(shù))用來初始化與服務(wù)器的連接;三個線程:分別負責(zé)接收數(shù)據(jù)、發(fā)送數(shù)據(jù)和從數(shù)據(jù)流中提取數(shù)據(jù)。服務(wù)端使用的IncomingConnection類需要另外實現(xiàn)一些元素:一個類實例隸屬的通信服務(wù)器指針實例;一個用來標(biāo)識自己的ID編號;一個指向要發(fā)送的信息的接口IIncomingMessageHandler的實現(xiàn)。
幾個關(guān)鍵的接口之間的關(guān)系如下,ICommunicationsServer包含了實現(xiàn)了接口ICommincomingConnection的類的多個實例,并且動態(tài)建立。
4.2 信息傳輸設(shè)計
動力與環(huán)境監(jiān)控系統(tǒng)TCP/IP類庫的核心功能就是在設(shè)備和系統(tǒng)之間、系統(tǒng)內(nèi)部、系統(tǒng)之間高效、正確地傳輸實時信息,實時信息可以是一段打包的實時變化的字節(jié)流或者字符的集合,類庫負責(zé)的內(nèi)容就是保證打包發(fā)送信息,并且負責(zé)接收、解包信息,并保證發(fā)送的信息和接收到的信息完全一致。
通信類庫提高性能的第一步是合理的利用多線程技術(shù),監(jiān)聽、接收、發(fā)送都使用單獨的線程,以有效的利用CPU時間并且不會互相影響和造成不合理的等待。
類庫設(shè)計了一個線程安全的類SendReceiveBuffer作為發(fā)送的信息緩沖區(qū),緩沖區(qū)中的字節(jié)等待被發(fā)送或被處理,使用線程安全的隊列保存緩沖區(qū)數(shù)據(jù)。提供發(fā)送性能的關(guān)鍵在于減少少量字節(jié)的多次發(fā)送,將需要發(fā)送的多個少量字節(jié)預(yù)先保存在隊列緩存中,發(fā)送時可以合并成單個的TCP/IP包進行發(fā)送以提供效率。
通信庫中另一個提高通信性能的方法是使用非阻塞模式,因為非阻塞模式在發(fā)送和接收是不需要等待,可以立即進行下一次接收和發(fā)送,而阻塞模式將使得當(dāng)前線程進入等待直到發(fā)送或接收完成。尤其在通信庫的服務(wù)器端性能的提高將非常明顯,因為在有大量的數(shù)據(jù)等待發(fā)送到大量的客戶端時,非阻塞模式可以立即進行下一個客戶端的發(fā)送和接收。
5 結(jié)論
文章介紹的電信動力與環(huán)境集中監(jiān)控系統(tǒng)已經(jīng)在電信公司實際運行,獲得了良好的效果。系統(tǒng)采用了新的軟件平臺,并且使用了專門設(shè)計的高性能TCP/IP通信庫,經(jīng)過測試,可以支持100個以上的監(jiān)控客戶端沒有明確的通信滯后,表現(xiàn)了良好的性能,也有一定的通用性。
參考文獻:
[1] Christian Holm, Mike Kruger等. C#軟件項目全程剖析[M]. 北京: 清華大學(xué)出版社, 2003: 13-36.
[2] 嚴蔚敏, 吳偉民. 數(shù)據(jù)結(jié)構(gòu):[M].北京:北京: 清華大學(xué)出版社,1997.
[3] Ivar Jacobson, Grady Booch 等.統(tǒng)一軟件開發(fā)過程 [M].北京:機械工業(yè)出版社,2002.
[4] Erich Gamma, Richard Helm.設(shè)計模式 [M].北京:機械工業(yè)出版社,2000:54-91.
[5] 劉險峰,倪涉權(quán). 蓄電池容量在線監(jiān)測研究[J].通信電源技術(shù), 2009(5): 51-54.
[6] 王彥桂,郁 濱等. 配電自動化系統(tǒng)中應(yīng)用DNP3.0協(xié)議進行數(shù)據(jù)通信[J].計算機自動測量與控制, 2001(T):99-101.
[7] 郝燕玲,趙玉新等. 基于事件交互樹模型的GUI測試技術(shù)[J].應(yīng)用科技, 2009(5):61-65.