張振華
摘 要 由于操作系統(tǒng)及通信平臺的多樣性, 通信軟件開發(fā)者往往要面對諸多問題, 而利用軟件設(shè)計模式能夠幫助開發(fā)者成功完成任務(wù)并開發(fā)出高性能的通信軟件。本文首先闡述了傳統(tǒng)通信軟件的實現(xiàn)方式和存在的一些問題,接著介紹了ACE 框架以及使用ACE架構(gòu)構(gòu)建通信系統(tǒng)軟件的優(yōu)勢,然后詳細介紹了基于ACE架構(gòu)的前置采集軟件的設(shè)計,重點描述了軟件架構(gòu)中六個服務(wù)的功能。最后針對軟件中服務(wù)間通訊方式、守護進程和采集服務(wù)的實現(xiàn)方式做了詳細的介紹。
【關(guān)鍵詞】ACE架構(gòu) 前置采集
隨著國家節(jié)能減排工作的推進,軌道交通行業(yè)的節(jié)能減排工作得到了高度重視。軌道交通能源管理系統(tǒng)是針對軌道交通行業(yè)而開發(fā)的一套能源管理軟件平臺,其目的使軌道交通運營部門能夠科學(xué)的強化能源管理、降低能源消耗、提高能源利用效率。在軌道交通能源管理系統(tǒng)中,前置采集軟件起著最關(guān)鍵和最基本的作用,主要是進行全線車站及車輛段的能耗數(shù)據(jù)的采集和簡單處理,包括前置服務(wù)的監(jiān)控、終端數(shù)據(jù)的采集、解析、統(tǒng)計、補招等功能,因此前置采集軟件的設(shè)計和實現(xiàn)對在軌道交通能源管理系統(tǒng)中起到至關(guān)重要的作用。
傳統(tǒng)的前置采集軟件大多采用基于TCP/IP協(xié)議的Socket方式實現(xiàn)與終端設(shè)備的通信,雖然Socket具有很高的效率,但網(wǎng)絡(luò)編程人員通常從底層進行開發(fā),非常繁瑣且參數(shù)復(fù)雜,調(diào)用易出錯,異常處理容易遺漏,這些大大增加了軟件開發(fā)的難度和周期。另外前置采集軟件開發(fā)中通常采用模塊化設(shè)計,當(dāng)執(zhí)行任務(wù)時,需要通過其中不同的模塊進行協(xié)作完成,在這種情況下各模塊間的數(shù)據(jù)通信會變得異常繁瑣和復(fù)雜。為了提高系統(tǒng)的可靠性和實時性,使編程人員減少數(shù)據(jù)通訊編程的復(fù)雜度,重點關(guān)注于業(yè)務(wù)邏輯功能,本文提出了一種基于ACE架構(gòu)的前置采集軟件設(shè)計方案。
1 ACE架構(gòu)簡介
ACE(Adaptive Communication Environment)是一種面向?qū)ο蟮拈_放源碼的應(yīng)用框架,它封裝了底層API,屏蔽了系統(tǒng)間的差異,提供了一組豐富的可重用C++包裝外觀和框架組件,可跨多種平臺完成通用的通信軟件任務(wù)。
ACE體系機構(gòu)包括3個層次結(jié)構(gòu):
1.1 操作系統(tǒng)適配層
對操作系統(tǒng)并發(fā)機制和進程間通信機制進行封裝。采用模板技術(shù)對不同操作系統(tǒng)間的通信API進行封裝,對外提供統(tǒng)一的接口。消除了操作系統(tǒng)間的差異;
1.2 OO Wrappers層
應(yīng)用C++的面向?qū)ο筇匦院湍0鍖崿F(xiàn)內(nèi)存管理。多線程及多進程管理,消息隊列機制,動態(tài)服務(wù)配置,定時器隊列等。在具體應(yīng)用中可通過組合和聚合,選擇和包裝這些類完成具體的實現(xiàn)。
1.3 框架組件層
前攝器、反應(yīng)器、任務(wù)、連接接收器等框架組件。
ACE框架組件設(shè)計思想和設(shè)計模式是根據(jù)領(lǐng)域的特性來定制,其中具有針對通信系統(tǒng)特有的部分,將這種框架和設(shè)計模式應(yīng)用前置采集系統(tǒng)的設(shè)計中,消除系統(tǒng)底層通信編程的復(fù)雜性,使得網(wǎng)絡(luò)編程人員把大部分的精力集中于如何完成應(yīng)用系統(tǒng)軟件功能的實現(xiàn)上,將會大大縮短系統(tǒng)的開發(fā)周期。
2 前置采集軟件的設(shè)計
2.1 軟件設(shè)計原則
前置采集軟件的功能是采集整條地鐵線路的能源數(shù)據(jù)并進行統(tǒng)計分析,根據(jù)能源管理系統(tǒng)的特點,前置采集軟件具有較高的要求:
2.1.1 可靠性
軟件能夠長期可靠、穩(wěn)定的運行是軟件設(shè)計原則的首位。軟件應(yīng)具備主備切換功能,運行故障時能夠自動切換,保證系統(tǒng)能夠長期穩(wěn)定可靠的運行。
2.1.2 實時性
軟件能夠及時高效的采集各種能耗數(shù)據(jù),保證系統(tǒng)能夠?qū)崟r監(jiān)測各種能耗設(shè)備運行狀態(tài)和信息。
2.1.3 可維護性
軟件應(yīng)具有很好的易維護性,滿足多種通信方式、多種規(guī)約終端統(tǒng)一接入需求,并且能非常方便地擴充、維護通信規(guī)約和通信方式。
2.2 軟件架構(gòu)
前置采集軟件的主要功能進行能源數(shù)據(jù)的采集和數(shù)據(jù)的統(tǒng)計。前置采集的各個服務(wù)首先在啟動的時候,讀取對應(yīng)的配置文檔,加載并初始化各個服務(wù)。然后建立與現(xiàn)場各種采集終端通信,采用標準規(guī)約進行數(shù)據(jù)交互活動。前置采集軟件將采集后的數(shù)據(jù)經(jīng)過相關(guān)處理后存儲到相應(yīng)sqlite格式的文件中。
圖1為前置采集軟件的架構(gòu)圖,從圖中可以看出該軟件劃分為6部分,分別為監(jiān)控服務(wù),采集服務(wù)、解析服務(wù)、統(tǒng)計服務(wù)、補招服務(wù)和用戶服務(wù)。
監(jiān)控服務(wù):該服務(wù)主要有兩個作用,一個是控制前置采集軟件運行模式,前置采集軟件具有四種運行模式:單機模式、主備模式、負載均衡和負載分流。通過Web設(shè)置界面進行運行模式的設(shè)置;另一個是對軟件中其它的服務(wù)進行監(jiān)控,如其它服務(wù)運行中出現(xiàn)意外而崩潰,監(jiān)控模塊則重新開啟該服務(wù),以保證前置采集軟件的長期穩(wěn)定運行。
采集服務(wù):負責(zé)與終端的通信連接管理和數(shù)據(jù)收發(fā)和轉(zhuǎn)發(fā)。采集模塊首先獲取通道信息,然后根據(jù)通道類型創(chuàng)建通道對象(串口、TCP服務(wù)器、TCP客戶端和串口服務(wù)器等等),最后將所新建的通道對象依次打開并根據(jù)通道的類型依次對所關(guān)聯(lián)的終端進行連接。之后與終端進行報文通信,將從終端收到的報文轉(zhuǎn)發(fā)到解析服務(wù),將從解析服務(wù)接收到的報文根據(jù)所關(guān)聯(lián)終端的對應(yīng)通道發(fā)送到該終端。
解析服務(wù):主要包括解析模塊,任務(wù)模塊和對時模塊。其中解析模塊負責(zé)對從采集服務(wù)傳送來的報文數(shù)據(jù)和任務(wù)模塊傳送來的采集任務(wù)進行規(guī)約解析;任務(wù)模塊從數(shù)據(jù)庫中定時加載采集任務(wù)和模板,組織成采集任務(wù)后發(fā)送給解析模塊;對時模塊則通過自定義對時狀態(tài)機對終端時間進行控制。解析后的數(shù)據(jù)保存為sqlite格式的文件,以供其它服務(wù)使用。
統(tǒng)計服務(wù):主要是對從采集服務(wù)上傳來的數(shù)據(jù)進行統(tǒng)計分析。包括實時數(shù)據(jù)統(tǒng)計和曲線數(shù)據(jù)統(tǒng)計。其中統(tǒng)計實時數(shù)據(jù)分為流量統(tǒng)計、終端狀態(tài)和表計狀態(tài)統(tǒng)計。曲線數(shù)據(jù)統(tǒng)計分為終端歷史狀態(tài)統(tǒng)計,采集完整率統(tǒng)計和缺點統(tǒng)計。
補招服務(wù):負責(zé)對采集的數(shù)據(jù)項進行統(tǒng)計,如數(shù)據(jù)項在指定的時間點沒有采集到數(shù)據(jù)或采集到數(shù)據(jù)異常,則會生成補招任務(wù)下發(fā)給解析服務(wù)進行數(shù)據(jù)的補招。
用戶服務(wù):處理與用戶的任務(wù)交互。能源管理系統(tǒng)主要是由前臺和后臺兩部分組成,而用戶服務(wù)是前臺和后臺之間通訊的橋梁。用戶服務(wù)的功能主要是新建與前臺的路由,新建與解析服務(wù)的路由,對路由收到的數(shù)據(jù)進行相應(yīng)的處理等等。
3 前置采集軟件的實現(xiàn)
3.1 服務(wù)間的通訊方式
該軟件所包含的六個服務(wù)間通訊方式采用共享內(nèi)存方式,比如:解析服務(wù)和采集服務(wù)之間的通訊、補招服務(wù)和采集服務(wù)之間的通訊等。共享內(nèi)存就是允許多個不相關(guān)的進程訪問同一邏輯內(nèi)存來進行數(shù)據(jù)交換。當(dāng)網(wǎng)絡(luò)應(yīng)用擁有需要由多個進程來查看或操縱的數(shù)據(jù)時,共享內(nèi)存是非常有效的一種通信機制。
ACE提供兩個共享內(nèi)存機制:System V共享內(nèi)存和內(nèi)存映射文件,本軟件采用內(nèi)存映射文件機制。內(nèi)存映射文件機制是某個文件的部分或者全部都可以被映射到虛擬內(nèi)存的某一塊上,這部分虛擬內(nèi)存跨多進程共享,映射到內(nèi)存文件的內(nèi)容可被刷新到永久存儲器中,這種做法提供了一種便捷地保存和恢復(fù)跨程序執(zhí)行的信息的途徑。在這種機制中,操作系統(tǒng)都能夠讓多個進程把共享內(nèi)存區(qū)域映射到它們的地址空間中,如圖2,所有映射了共享內(nèi)存區(qū)域的進程都能夠直接對共享內(nèi)存進行讀寫操作。
本系統(tǒng)采用內(nèi)存映射文件機制的基礎(chǔ)是ACE_Mem_Map類,該類用來映射磁盤文件到內(nèi)存。而ACE_MMAP_Memory_Pool類則是為內(nèi)存映射文件分配內(nèi)存的內(nèi)存池。
3.2 守護進程的實現(xiàn)
在設(shè)計進程守護中使用ACE架構(gòu)中的ACE_Reactor模式來實現(xiàn)主動對象模式。在ACE_Reactor模式中,ACE_Event_Handler是所有事件處理器的基類。通過向ACE_Reactor注冊事件,并同時傳遞用以處理此事件的事件處理器的指針。ACE_Reactor自動在內(nèi)部維護一些表,將事件與事件處理器對象關(guān)聯(lián)起來,當(dāng)用戶注冊的事件發(fā)生時, ACE_Reactor發(fā)出對處理器中相應(yīng)方法的回調(diào)。
每個需要守護的進程定義一個服務(wù)對象,服務(wù)對象注冊一個定時器事件,定時來檢測需要守護的進程是否存在,如不存在則啟動該進程,如果存在則繼續(xù)守護。在實現(xiàn)服務(wù)類時,采取以下步驟:
(1)創(chuàng)建ACE_Event_Handler的子類。
(2)實現(xiàn)服務(wù)類的打開和關(guān)閉函數(shù):open函數(shù)用于對服務(wù)進行初始化;而close()函數(shù)則是釋放、關(guān)閉各種資源。
(3)創(chuàng)建定時時鐘,通過調(diào)用ACE_Reactor::instance()->schedule_timer()來定義時鐘。
(4)重寫時鐘超時的處理方法:handle_timeout(),當(dāng)時鐘超時后將自動調(diào)用該處理方法來處理。
3.3 采集服務(wù)的實現(xiàn)
采集服務(wù)是負責(zé)與終端的通信連接管理和數(shù)據(jù)收發(fā)和轉(zhuǎn)發(fā)的功能。該模塊采用異步I/O操作ACE_Proactor設(shè)計模式。首先采集服務(wù)注冊異步事件及相應(yīng)的回調(diào)函數(shù)注冊到完成分派器,然后發(fā)出異步I/O操作,完成分派器將在I/O操作完成時激活異步事件,并調(diào)用相應(yīng)的回調(diào)函數(shù)進行事件處理。前攝器設(shè)計模式允許單線程化應(yīng)用并發(fā)的執(zhí)行多個I/O操作,并且不會帶來與傳統(tǒng)的多線程化機制相關(guān)聯(lián)的開銷或設(shè)計復(fù)雜性。這樣做大大減少了 I/ O 處理時間。
采集服務(wù)的實現(xiàn)步驟如下:
(1)創(chuàng)建服務(wù)處理器。服務(wù)器處理均派生自ACE_Service_Handler類,并定義相應(yīng)的事件處理函數(shù);當(dāng)發(fā)生I/O操作完成事件時,會觸發(fā)相應(yīng)的事件完成回調(diào)函數(shù)。
(2)實現(xiàn)服務(wù)處理器I/O操作。ACE_Proactor框架中所有的I/O操作都由相應(yīng)的異步操作類來完成,如ACE_Asynch_Read_Stream用于在已連接的TCP/IP中進行異步的讀取操作,而ACE_Asynch_Write_Stream用于在已連接的 TCP/IP中進行異步寫操作。采集服務(wù)先將讀、寫操作注冊到服務(wù)處理器中,然后發(fā)出異步I/O操作請求,當(dāng)異步I/O操作完成后,系統(tǒng)自動調(diào)用服務(wù)處理器中的相關(guān)函數(shù)進行后續(xù)的處理工作。
(3)創(chuàng)建TCP/IP連接的接收器。本服務(wù)采用ACE_Asynch_Acceptor工廠類來創(chuàng)建TCP/IP連接的接收器,當(dāng)終端的連接到達時,接收器創(chuàng)建相應(yīng)的服務(wù)處理器對象來處理該連接。
(4)運行事件循環(huán),當(dāng)I/O事件發(fā)生時,調(diào)用事件處理器中的事件處理函數(shù)。
4 結(jié)論
ACE作為一種免費開源的架構(gòu),富含網(wǎng)絡(luò)與系統(tǒng)編程的實用設(shè)計模式,具有跨平臺等優(yōu)越特性,適合通信軟件的開發(fā)。
本文設(shè)計一種前置采集軟件架構(gòu),并應(yīng)用ACE框架組件完成軟件的開發(fā)工作。該軟件是軌道能源管理系統(tǒng)的重要組成部分,實現(xiàn)了能耗數(shù)據(jù)的采集和統(tǒng)計。對于軌道交通行業(yè)信息集中監(jiān)控管理未來發(fā)展的需求,本文可以為其提供通訊系統(tǒng)提供架構(gòu)設(shè)計和實現(xiàn)方式等方面的參考。
參考文獻
[1]Douglas C.Schmidt Stephen D.Huston. c++ Network Programming,Volumn2- Systematic Reuse with ACE and Frameworks[M].北京:電子工業(yè)出版社,2004.
[2]陶道,萬旺根.ACE框架在網(wǎng)絡(luò)游戲服務(wù)器中的設(shè)計與應(yīng)用[J].現(xiàn)代電子科技,2008.
[3]Schmidt DC.ACE自適配通信環(huán)境技術(shù)論文集[C].北京:電子工業(yè)出版社,2001.
[4]王繼剛,顧國昌,蘆東昕,黃燁明.構(gòu)架與模式在通信系統(tǒng)軟件中的應(yīng)用研究[J].計算機應(yīng)用,2003(11):43-45.
[5]陳雅芳,王曉東,陳德銘,陳建化.基于ACE框架的通信設(shè)備監(jiān)控系統(tǒng)的設(shè)計與應(yīng)用研究[J].福建電腦,2007(02):112-113,106.
[6]何青. ACE在開發(fā)健壯可靠的C++系統(tǒng)中的應(yīng)用研究[J].西安:微機發(fā)展,2005(05):43-45.
[7]馬學(xué)鵬,夏國臣.城市軌道交通能源管理系統(tǒng)研究[J]. 城市軌道交通研究,2014.
[8]劉勇,閆魯杰.基于物聯(lián)網(wǎng)、云計算和大數(shù)據(jù)的工業(yè)能源管理系統(tǒng)[J].供用電,2014(12):28-32.
作者單位
天津凱發(fā)電氣股份有限公司 天津市 300000