張焱,周文碩,趙華敏
(1.西安電子科技大學(xué),陜西 西安 710071;2.中國(guó)電子科技集團(tuán)公司第54研究所,河北 石家莊 050081)
電子靶場(chǎng)作為現(xiàn)代戰(zhàn)爭(zhēng)仿真試驗(yàn)基地,在電子戰(zhàn)裝備采辦、戰(zhàn)術(shù)應(yīng)用研究和操作人員訓(xùn)練中具有不可替代的重要作用,是確保作戰(zhàn)部隊(duì)獲得高效可靠的電子作戰(zhàn)裝備、有效運(yùn)用電子戰(zhàn)戰(zhàn)術(shù)和提高部隊(duì)生存能力的堅(jiān)強(qiáng)保障。當(dāng)前,電子戰(zhàn)已經(jīng)由以往單一設(shè)備,單項(xiàng)領(lǐng)域的對(duì)抗,發(fā)展為系統(tǒng)對(duì)系統(tǒng)、體系對(duì)體系的綜合較量。為適應(yīng)這種變化,電子靶場(chǎng)測(cè)控信息系統(tǒng)也應(yīng)該走一條靈活擴(kuò)展、隨需構(gòu)建的道路,有效地管理各種資源,能夠按照測(cè)試的需要,靈活編排測(cè)試場(chǎng)景,有效地給出效能評(píng)估。這就要求現(xiàn)代武器的靶場(chǎng)測(cè)控系統(tǒng)具有一個(gè)開(kāi)放式的、可實(shí)現(xiàn)設(shè)備擴(kuò)展和功能更新的系統(tǒng)構(gòu)架。
基于軟總線的體系結(jié)構(gòu)具有可維護(hù)性好、可重用度高、擴(kuò)展能力強(qiáng)及較強(qiáng)的通用性,并支持構(gòu)件的“即插即用”和服務(wù)接口的動(dòng)態(tài)配置,使目標(biāo)系統(tǒng)具有良好的靈活性,在業(yè)務(wù)需求變化時(shí),目標(biāo)系統(tǒng)可快速重構(gòu)進(jìn)行適應(yīng)。
本文介紹基于軟總線的電子靶場(chǎng)測(cè)控的架構(gòu)設(shè)計(jì),并參照該體系架構(gòu)實(shí)現(xiàn)了原型系統(tǒng)。
電子靶場(chǎng)的目的是通過(guò)模擬出各種復(fù)雜的戰(zhàn)場(chǎng)電磁環(huán)境,并提供相應(yīng)的評(píng)估技術(shù),對(duì)武器及其配套的電子設(shè)備進(jìn)行測(cè)試,客觀地、準(zhǔn)確地評(píng)定現(xiàn)代武器裝備的作戰(zhàn)效能,對(duì)新研制的武器裝備系統(tǒng)進(jìn)行合理全面的試驗(yàn)鑒定。
從電子靶場(chǎng)系統(tǒng)組成上來(lái)看,主要包括監(jiān)控計(jì)算機(jī)(含監(jiān)控軟件)、測(cè)試設(shè)備(主要包括各種商用測(cè)試儀器)、模擬設(shè)備(包括各種干擾機(jī)等)、數(shù)據(jù)存儲(chǔ)設(shè)備(數(shù)據(jù)庫(kù)服務(wù)器等)、打印設(shè)備、配電及通信設(shè)備等。對(duì)于不同的應(yīng)用需求,區(qū)別主要是測(cè)試和模擬設(shè)備的數(shù)量及種類多少問(wèn)題。
從電子靶場(chǎng)的功能上來(lái)看,主要包括測(cè)試方案設(shè)計(jì)、設(shè)備控制、實(shí)時(shí)監(jiān)視、自動(dòng)測(cè)試、評(píng)估分析、數(shù)據(jù)管理及系統(tǒng)維護(hù)等幾大塊。
通過(guò)對(duì)電子靶場(chǎng)測(cè)控領(lǐng)域進(jìn)行分析,發(fā)現(xiàn)從整個(gè)靶場(chǎng)測(cè)控領(lǐng)域的應(yīng)用模式來(lái)看系統(tǒng)需求和功能配置具有顯著的共性,同時(shí)不同的應(yīng)用系統(tǒng)側(cè)重點(diǎn)又不盡相同。
它們的不同點(diǎn)體現(xiàn)在:系統(tǒng)的規(guī)模、結(jié)構(gòu)不同,如體系結(jié)構(gòu)級(jí)試驗(yàn),相對(duì)來(lái)說(shuō)系統(tǒng)規(guī)模大、設(shè)備多、系統(tǒng)結(jié)構(gòu)復(fù)雜;而對(duì)于單體設(shè)備級(jí)試驗(yàn),則相對(duì)規(guī)模較小、設(shè)備少、結(jié)構(gòu)簡(jiǎn)單。另外系統(tǒng)的測(cè)試內(nèi)容及目標(biāo)也不同,如雷達(dá)對(duì)抗、通信對(duì)抗以及光電對(duì)抗等。
它們的共性體現(xiàn)在:測(cè)控系統(tǒng)大部分功能模塊主要是通過(guò)對(duì)設(shè)備的控制,獲得各種測(cè)量數(shù)據(jù),再基于不同的測(cè)試目的對(duì)測(cè)量數(shù)據(jù)進(jìn)行相應(yīng)的業(yè)務(wù)處理,并可對(duì)測(cè)量數(shù)據(jù)及結(jié)果進(jìn)行保存,生成測(cè)試評(píng)估結(jié)果。還有一部分功能模塊是基于對(duì)數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)的分析、管理。
通過(guò)以上分析發(fā)現(xiàn),電子靶場(chǎng)測(cè)控作為特定領(lǐng)域的應(yīng)用,其業(yè)務(wù)方式和業(yè)務(wù)范圍相對(duì)比較規(guī)范、穩(wěn)定,雖然隨著靶場(chǎng)測(cè)控技術(shù)的發(fā)展,會(huì)有一些新技術(shù)、新業(yè)務(wù)、新體制出現(xiàn),但在業(yè)務(wù)流程及方式上基本上都是類似的,其應(yīng)用模式具有非常大的相似性,這一點(diǎn)符合實(shí)施領(lǐng)域工程的前提,即領(lǐng)域特征的相對(duì)穩(wěn)定性?;诎袌?chǎng)測(cè)控這一特定應(yīng)用領(lǐng)域,完全可以建立一套合理、可行的關(guān)于軟件體系結(jié)構(gòu)的解決方案,從而改變目前電子靶場(chǎng)測(cè)控系統(tǒng)軟件開(kāi)發(fā)周期長(zhǎng)、擴(kuò)展能力差、維護(hù)困難等現(xiàn)實(shí)問(wèn)題。
在進(jìn)行新一代的電子靶場(chǎng)測(cè)控系統(tǒng)體系架構(gòu)的設(shè)計(jì)時(shí),需要解決以下幾個(gè)問(wèn)題:
(1)電子靶場(chǎng)劇情控制、效能評(píng)估等系統(tǒng)與靶場(chǎng)的各種測(cè)試設(shè)備間的耦合問(wèn)題,即實(shí)現(xiàn)各個(gè)業(yè)務(wù)系統(tǒng)、軟件或待測(cè)設(shè)備在空間、時(shí)間和傳輸協(xié)議解耦。如,在系統(tǒng)增加新的待測(cè)設(shè)備或者測(cè)控業(yè)務(wù)發(fā)生變化時(shí),可以快速動(dòng)態(tài)的響應(yīng),而不影響現(xiàn)有的系統(tǒng)或盡可能少的波及;
(2)分布在網(wǎng)絡(luò)環(huán)境中的大量專業(yè)化的業(yè)務(wù)處理服務(wù)的共享問(wèn)題,即實(shí)現(xiàn)業(yè)務(wù)處理服務(wù)的跨語(yǔ)言和跨平臺(tái)的有效共享和接入,這樣電子靶場(chǎng)的測(cè)控范圍將不再局限在某一專業(yè)范圍,從而保證電子靶場(chǎng)測(cè)控平臺(tái)是一個(gè)具有通用性的平臺(tái);
(3)應(yīng)用軟件開(kāi)發(fā)的重用性問(wèn)題,即軟件代碼在共享代碼庫(kù)或?qū)ο蟮闹赜脤哟?,提升到?gòu)件或服務(wù)層次進(jìn)行重用,以提高大規(guī)模軟件系統(tǒng)開(kāi)發(fā)的重用度,一方面減少新應(yīng)用開(kāi)發(fā)的投入,另一方面,也最大限度保護(hù)了前期應(yīng)用系統(tǒng)投入;
(4)已有測(cè)控?cái)?shù)據(jù)的重用問(wèn)題,即通過(guò)建立武器裝備、電磁信號(hào)以及測(cè)試模型庫(kù),可支持以全數(shù)字仿真的方式完成對(duì)武器裝備的測(cè)試,也可以通過(guò)調(diào)用模型庫(kù)的數(shù)據(jù),支持實(shí)物或半實(shí)物電磁環(huán)境的產(chǎn)生和測(cè)試。
通過(guò)分析抽象出三個(gè)基礎(chǔ)平臺(tái)作為電子靶場(chǎng)的支撐環(huán)境,即測(cè)控?cái)?shù)據(jù)交互平臺(tái)、測(cè)控服務(wù)組裝平臺(tái)和可編程劇情控制平臺(tái)。這三個(gè)平臺(tái),是電子靶場(chǎng)測(cè)控系統(tǒng)的基礎(chǔ)支撐平臺(tái),是電子靶場(chǎng)測(cè)控系統(tǒng)的核心部件,具有內(nèi)核穩(wěn)定,對(duì)外易于擴(kuò)展的特點(diǎn)。其設(shè)計(jì)原則遵循開(kāi)放關(guān)閉原則(The Open Closed Principle,OCP),即對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉,基于這三個(gè)平臺(tái),能夠進(jìn)一步研發(fā)各具特色的電子靶場(chǎng)測(cè)控應(yīng)用。電子靶場(chǎng)測(cè)控平臺(tái)體系架構(gòu)如圖1所示。
圖1 電子靶場(chǎng)測(cè)控平臺(tái)體系架構(gòu)圖
這三個(gè)平臺(tái)共同組成了電子靶場(chǎng)測(cè)控的通用領(lǐng)域模型,或稱電子靶場(chǎng)測(cè)控的核心領(lǐng)域模型。
數(shù)據(jù)交互平臺(tái),使電子靶場(chǎng)系統(tǒng)中的各個(gè)子系統(tǒng)、軟件或待測(cè)設(shè)備之間的通信松耦合,做到在空間、時(shí)間和傳輸協(xié)議解耦。
服務(wù)組裝平臺(tái),使分布在網(wǎng)絡(luò)環(huán)境中的大量專業(yè)化的業(yè)務(wù)處理服務(wù)實(shí)現(xiàn)跨語(yǔ)言、跨平臺(tái)的有效共享。
可編程劇情控制平臺(tái),使在復(fù)雜多變的大規(guī)模的測(cè)控環(huán)境中,靈活機(jī)動(dòng)的在測(cè)控模型和測(cè)控服務(wù)級(jí)重用,使得平臺(tái)能夠快速應(yīng)對(duì)電子靶場(chǎng)靈活多變的測(cè)控場(chǎng)景。
在體系架構(gòu)研究的基礎(chǔ)之上,設(shè)計(jì)實(shí)現(xiàn)了測(cè)控平臺(tái)原型系統(tǒng)。
原型系統(tǒng)是由開(kāi)發(fā)平臺(tái)、監(jiān)控平臺(tái)以及運(yùn)行平臺(tái)組成。開(kāi)發(fā)平臺(tái)負(fù)責(zé)實(shí)際劇情的可視化建模、以及對(duì)應(yīng)服務(wù)構(gòu)件組裝的生成。監(jiān)控平臺(tái)在服務(wù)組裝部署運(yùn)行后負(fù)責(zé)監(jiān)控劇情的運(yùn)行情況,并能夠?qū)崟r(shí)的發(fā)送控制命令給某個(gè)特定的服務(wù)單元最終控制設(shè)備的運(yùn)行狀態(tài)。運(yùn)行平臺(tái)包括兩個(gè)部分:系統(tǒng)總線、設(shè)備代理。其中系統(tǒng)總線能夠提供規(guī)范化的消息交換和路由,提供服務(wù)構(gòu)件生命周期管理和服務(wù)構(gòu)件之間的組裝。設(shè)備代理是具體設(shè)備的抽象。原型系統(tǒng)的結(jié)構(gòu)如圖2所示。
圖2 原型系統(tǒng)結(jié)構(gòu)圖
為了提高開(kāi)發(fā)效率,在原型系統(tǒng)中選用中創(chuàng)軟件商用中間件公司的中間件產(chǎn)品InforSIB和Infor-Bus共同構(gòu)建核心基礎(chǔ)平臺(tái)。
InforSIB符合JBI規(guī)范,采用面向服務(wù)的體系架構(gòu)、事件驅(qū)動(dòng)的體系結(jié)構(gòu)、提供即插即用的構(gòu)件框架,是一個(gè)開(kāi)放的基于構(gòu)件的服務(wù)組裝和互操作平臺(tái)。原型系統(tǒng)中的開(kāi)發(fā)平臺(tái)及運(yùn)行平臺(tái)中的系統(tǒng)總線部分是基于InforSIB來(lái)實(shí)現(xiàn)的。
InforBus是一個(gè)遵循CORBA(Common Object Request Broker Architecture,公共對(duì)象請(qǐng)求代理結(jié)構(gòu))規(guī)范的分布式軟件計(jì)算平臺(tái)。原型系統(tǒng)中監(jiān)控平臺(tái)、設(shè)備代理等與系統(tǒng)總線之間的交互均采用Corba方式實(shí)現(xiàn)。
系統(tǒng)業(yè)務(wù)流程為電子靶場(chǎng)的相關(guān)管理人員確定所需要的劇情然后由技術(shù)人員實(shí)施。技術(shù)人員接收到劇情的需求后,使用開(kāi)發(fā)平臺(tái)進(jìn)行劇情的編排。不同的構(gòu)件對(duì)應(yīng)不同的屬性,用戶設(shè)置構(gòu)件的屬性以及消息傳遞的關(guān)系后可以打包成服務(wù)組裝。處于運(yùn)行狀態(tài)的服務(wù)組裝中的各個(gè)功能點(diǎn)在恰當(dāng)?shù)臅r(shí)機(jī)被調(diào)用,這是劇情控制的概念。每一個(gè)設(shè)備都有一個(gè)對(duì)應(yīng)的設(shè)備代理,構(gòu)件同設(shè)備代理通訊來(lái)控制和監(jiān)視設(shè)備。
原型系統(tǒng)總體接口關(guān)系如圖3所示。
圖3 原型系統(tǒng)接口關(guān)系圖
可以看到在業(yè)務(wù)層構(gòu)件與構(gòu)件之間的交互是通過(guò)系統(tǒng)總線,,我們稱之為系統(tǒng)控制總線。設(shè)備注冊(cè)消息和測(cè)控?cái)?shù)據(jù)是通設(shè)備代理傳輸?shù)絁MS構(gòu)件后,通過(guò)系統(tǒng)總線發(fā)送到監(jiān)控構(gòu)件,我們稱之為系統(tǒng)數(shù)據(jù)總線。應(yīng)用層軟件和接入設(shè)備正是在控制總線和數(shù)據(jù)總線的共同作用下實(shí)現(xiàn)系統(tǒng)功能。下面對(duì)系統(tǒng)主要內(nèi)部接口設(shè)計(jì)進(jìn)行描述。
(1)模型庫(kù)與開(kāi)發(fā)平臺(tái)間接口
模型庫(kù)采用XML標(biāo)記語(yǔ)言描述各個(gè)構(gòu)件模型。開(kāi)發(fā)平臺(tái)讀取構(gòu)件模型后提供用戶進(jìn)行各種構(gòu)件的服務(wù)組裝。
XML文檔由一系列元素構(gòu)成,這些元素形成一種樹(shù)型的結(jié)構(gòu)。一個(gè)XML元素是由開(kāi)始標(biāo)記、結(jié)束標(biāo)記、以及標(biāo)記之間的數(shù)據(jù)構(gòu)成。開(kāi)始和結(jié)束標(biāo)記用來(lái)描述標(biāo)記之間的數(shù)據(jù)。標(biāo)記之間的數(shù)據(jù)被認(rèn)為是元素的值。在XML中,沒(méi)有一定的標(biāo)記,完全可以根據(jù)應(yīng)用領(lǐng)域的需要來(lái)定義和使用標(biāo)記。利用XML的上述特性,對(duì)模型進(jìn)行結(jié)構(gòu)化的表示。如下是用XML表示的某雷達(dá)設(shè)備模型相關(guān)數(shù)據(jù)片段,它清楚地描述了數(shù)據(jù)、對(duì)數(shù)據(jù)含義的說(shuō)明、以及數(shù)據(jù)之間的相互關(guān)系。
〈equipment name=“XX雷達(dá)” package=“武器裝備庫(kù)”〉
〈recieves- xml name=“inPort”/〉
〈function name=“開(kāi)機(jī)”value=“雷達(dá)開(kāi)始工作”〉
〈params〉
〈/params〉
〈/function〉
〈function name=“關(guān)機(jī)”value=“完雷達(dá)停止工作”〉
〈params〉
〈/params〉
〈/function〉
〈/equipment〉
在模型庫(kù)中添加新模型時(shí)僅需要在模型文件中按照格式添加〈equipment〉〈/equipment〉之間的字段。〈equipment〉屬性“name”代表模型的名稱;“package”代表該模型屬于哪類模型庫(kù);〈function〉〈/function〉中間的字段表示該設(shè)備可供操作的方法。其中“name”屬性表示方法名,“value”屬性表示方法的描述,〈params〉〈/params〉表示操作的參數(shù)值。
(2)開(kāi)發(fā)平臺(tái)與劇情控制構(gòu)件間接口
開(kāi)發(fā)平臺(tái)根據(jù)用戶操作對(duì)服務(wù)進(jìn)行組裝和打包,生成劇情控制文件。劇情控制構(gòu)件負(fù)責(zé)對(duì)劇情控制文件進(jìn)行解析執(zhí)行,實(shí)現(xiàn)預(yù)設(shè)劇情控制。因此開(kāi)發(fā)平臺(tái)與劇情控制構(gòu)件之間的主要接口為劇情控制打包文件。劇情控制打包文件基于XML形式實(shí)現(xiàn),下面內(nèi)容為劇情控制文件實(shí)例。
〈command index=“1” preindex=“0”delay=“15”parameter=“60”matchname=“StartWork”mode=“7”〉
〈service〉引導(dǎo)-雷達(dá)〈/service〉
〈function name=“StartWork”〉
〈param〉60〈/param〉
〈/function〉
〈/command〉
其中“command index”字段表示設(shè)備劇情動(dòng)作序列號(hào);“delay”字段表示該動(dòng)作為相對(duì)時(shí)間執(zhí)行方式,取值單位為秒;“time”字段表示該動(dòng)作為絕對(duì)時(shí)間執(zhí)行方式;“service”字段表示該動(dòng)作設(shè)備名稱;“function name”字段表示該動(dòng)作名稱;“param“字段為該動(dòng)作所跟參數(shù)項(xiàng),在該實(shí)例中表示雷達(dá)轉(zhuǎn)速。
(3)監(jiān)控平臺(tái)與監(jiān)控構(gòu)件間接口
監(jiān)控平臺(tái)通過(guò)Corba接口與系統(tǒng)總線上的監(jiān)控構(gòu)件進(jìn)行交互,實(shí)現(xiàn)設(shè)備監(jiān)視數(shù)據(jù)、劇情狀態(tài)數(shù)據(jù)的接收和設(shè)備控制指令的發(fā)送。監(jiān)控平臺(tái)與監(jiān)控構(gòu)件之間通過(guò)Corba遠(yuǎn)程調(diào)用的方式實(shí)現(xiàn)通信,具體接口如下:
·獲取狀態(tài)信息函數(shù)
long getMonitorInfor(in long type,inout string infor);
其中type為信息獲取類型參數(shù),0:獲得所有的設(shè)備名稱及類型;1:獲得設(shè)備名稱為infor的設(shè)備狀態(tài)信息;2:獲得設(shè)備名稱為infor的劇情狀態(tài)信息;3:獲得劇情下所有設(shè)備的狀態(tài);4:獲得劇情下所有設(shè)備的劇情狀態(tài)。
·設(shè)備控制函數(shù)
long setDeviceStatus(in string name,in string commandxml);
向名稱為name的設(shè)備發(fā)送控制指令,通過(guò)向設(shè)備發(fā)送commandxml命令,完成控制。
·劇情控制信息函數(shù)
long setScenarioStatus(in long index,in long type);
對(duì)劇情編號(hào)為index的劇情進(jìn)行控制,其中type為控制類型參數(shù),0:表示立刻執(zhí)行;1:表示暫停執(zhí)行;2:表示恢復(fù)原始狀態(tài)。
(4)設(shè)備通用構(gòu)件與設(shè)備代理間接口
為了保證系統(tǒng)的靈活性設(shè)備通用構(gòu)件與設(shè)備代理軟件只提供一個(gè) corba接口,string Command(string xml),其中xml為輸入?yún)?shù)包含需要調(diào)用的函數(shù)以及參數(shù)。構(gòu)件需要根據(jù)代理軟件的編寫人員提供的設(shè)備功能說(shuō)明文件,產(chǎn)生內(nèi)含xml內(nèi)容的string發(fā)起調(diào)用請(qǐng)求。設(shè)備代理軟件可以根據(jù)傳入的xml文檔解析后調(diào)用相應(yīng)的接口,完成功能。傳入的為XML文本,可以一次調(diào)用多個(gè)功能。以調(diào)用獲得run類型的業(yè)務(wù)信息的接口為例XML格式如下:
〈getBusinessData〉
〈type>run< /type〉
〈/getBusinessData〉
在原型系統(tǒng)軟件實(shí)現(xiàn)方面主要涉及JBI構(gòu)件開(kāi)發(fā)和Corba應(yīng)用開(kāi)發(fā)兩個(gè)技術(shù)點(diǎn)。下面結(jié)合原型系統(tǒng)主要組成部分劇情控制構(gòu)件和設(shè)備代理軟件介紹相關(guān)內(nèi)容。
(1)劇情控制構(gòu)件
劇情編排后的運(yùn)行過(guò)程需要有流程的概念,主要是時(shí)間控制的問(wèn)題。例如,A時(shí)刻啟動(dòng)設(shè)備甲,B時(shí)刻啟動(dòng)設(shè)備乙。劇情控制構(gòu)件即為完成此項(xiàng)功能而設(shè)計(jì)。
劇情控制構(gòu)件遵循JBI構(gòu)件開(kāi)發(fā)規(guī)范。在具體實(shí)現(xiàn)上采用開(kāi)源工具maven進(jìn)行構(gòu)件框架的開(kāi)發(fā),maven為開(kāi)發(fā)JBI構(gòu)件所需的大部分接口提供了基礎(chǔ)的實(shí)現(xiàn),使構(gòu)件的開(kāi)發(fā)者可以更多的關(guān)注構(gòu)件所提供的服務(wù)的業(yè)務(wù)邏輯。在構(gòu)件框架中添加入自己的業(yè)務(wù)邏輯后,構(gòu)件的開(kāi)發(fā)工作即結(jié)束。
劇情控制構(gòu)件的主要業(yè)務(wù)邏輯為劇情控制函數(shù)。劇情控制函數(shù)定時(shí)從劇情文件中讀取劇情執(zhí)行時(shí)間信息,當(dāng)有劇情的執(zhí)行時(shí)間與當(dāng)前時(shí)間吻合,則向該劇情的執(zhí)行設(shè)備發(fā)送劇情信息。劇情控制函數(shù)的實(shí)現(xiàn)代碼如下:
/**
*?jiǎng)∏榭刂凭€程
*/
public void run()
{
while(status!=JQTimer.STOP)//定時(shí)器未停止
{
//設(shè)置劇情控制定時(shí)間隔,單位毫秒
Thread.sleep((long)(100));
//劇情信息列表
List<String> scenariosStringList=Collections.synchronizedList(new ArrayList());
//循環(huán)遍歷劇情列表,判斷是否有滿足條件的劇情
for(Iterator< Scenario > it=cenariosList.iterator();it.hasNext();)
{
Date date=new Date();
Scenario scenario=(Scenario)it.next();
if(((0==scenario.getStatus()&&scenario.get-Time().before(date))))//劇情狀態(tài)正常,并且時(shí)間到。
{
//設(shè)置劇情狀態(tài),1:表示執(zhí)行成功
scenario.setStatus(1);
//構(gòu)造向具體設(shè)備發(fā)送的劇情信息包
MessageExchangechange=endpoint.createProperMessageExchange();
NormalizedMessagemsg= exchange.createMessage();
//從劇情文件中獲取劇情信息內(nèi)容,并復(fù)制到消息中
msg.setContent(new StringSource(scenario.getXmlActionFile()));
exchange.setMessage(msg,“in”);
//設(shè)置目標(biāo)設(shè)備
endpoint.setTargetService(scenario.getService());
//設(shè)置目標(biāo)節(jié)點(diǎn)
endpoint.setTargetEndpoint(scenario.getEndpoint());
//設(shè)置消息路由信息
endpoint.setRoutingInfo(exchange);
exchange.setProperty(“index”,scenario.getIndex());
scenario.setMessageId(exchange.getExchangeId());
//發(fā)送消息
endpoint.getProcessor().send(exchange);
}
else
{
//不執(zhí)行任何動(dòng)作
}
}
}
}
}
(2)設(shè)備代理軟件
設(shè)備代理程序由三部分構(gòu)成:設(shè)備驅(qū)動(dòng)的實(shí)現(xiàn)、Corba代理服務(wù)、設(shè)備自動(dòng)注冊(cè)服務(wù)。其中設(shè)備驅(qū)動(dòng)主要負(fù)責(zé)與具體設(shè)備進(jìn)行交互,控制設(shè)備運(yùn)行,采集設(shè)備運(yùn)行數(shù)據(jù),并提供Corba調(diào)用的接口。
Corba代理服務(wù)主要負(fù)責(zé)封裝設(shè)備驅(qū)動(dòng),提供通用設(shè)備構(gòu)件與設(shè)備之間的接口映射。開(kāi)發(fā)Corba代理服務(wù)模塊首先需要編寫IDL接口文件。該文件描述了代理端能夠提供何種類型服務(wù)給通用設(shè)備構(gòu)件。設(shè)備代理程序中的IDL接口文件基本格式如下,其中的Command為設(shè)備代理程序暴露給通用設(shè)備構(gòu)件的接口。
module dzbc
{interface PrefixComputer
{
string Command(in string xml);
};
};
在設(shè)備代理端的Command實(shí)現(xiàn)代碼如下:
char*dzbc::PrefixComputer_impl::Command(const char* xml)
throw(CORBA::SystemException)
{
if(xml[0]! =‘