(上海航天電子技術(shù)研究所,上海 201109)
軍事信息系統(tǒng)中的信息分發(fā)網(wǎng)絡(luò)作為數(shù)字化戰(zhàn)場(chǎng)的中樞,將各種信息按照通信協(xié)議規(guī)定的格式,實(shí)時(shí)、快速、自動(dòng)、保密地進(jìn)行數(shù)據(jù)交換,從而實(shí)現(xiàn)信息資源共享,最大限度地提高武器平臺(tái)的作戰(zhàn)技能[1]。因此,信息分發(fā)網(wǎng)絡(luò)面臨數(shù)據(jù)的分布性、準(zhǔn)確性、實(shí)時(shí)性、正確性、協(xié)調(diào)性、和安全性等挑戰(zhàn)[2]。 OpenDDS是用于分發(fā)實(shí)時(shí)應(yīng)用系統(tǒng)數(shù)據(jù)的網(wǎng)絡(luò)中間件,簡(jiǎn)化了分布式應(yīng)用程序的開(kāi)發(fā)、部署和維護(hù),應(yīng)用程序簡(jiǎn)單地發(fā)布和訂閱數(shù)據(jù),發(fā)布方和訂閱方無(wú)需知道對(duì)方地址即可通信。其以數(shù)據(jù)為中心的發(fā)布訂閱模式極大地減少了在網(wǎng)絡(luò)上發(fā)送數(shù)據(jù)所需的消耗,為大容量傳輸網(wǎng)絡(luò)提供了針對(duì)關(guān)鍵數(shù)據(jù)快速且可靈活配置的傳輸方法[2-3]。此外,OpenDDS規(guī)范還定義了大量的服務(wù)質(zhì)量(Quality of Service, QoS)策略,使得OpenDDS可以很好地配置和利用系統(tǒng)資源,協(xié)調(diào)通信質(zhì)量和執(zhí)行效率之間的平衡,增加了通信的可靠性[4-5]。目前,許多軍事領(lǐng)域已廣泛采用OpenDDS技術(shù)[6]。
OpenDDS是建立在公共對(duì)象請(qǐng)求代理體系結(jié)構(gòu)(common object request broker architecture, CORBA)上的應(yīng)用框架,遠(yuǎn)程調(diào)用通信是其信息分發(fā)的主要技術(shù),在訂閱發(fā)布通信中起到重要作用,默認(rèn)情況下傳輸介質(zhì)為網(wǎng)卡[7-8]。為了進(jìn)一步提高信息分發(fā)的效率,降低網(wǎng)絡(luò)間通訊的時(shí)延,屏蔽子網(wǎng)內(nèi)部頻繁通訊對(duì)整個(gè)網(wǎng)絡(luò)中其他設(shè)備的干擾,本文使用光纖反射內(nèi)存卡作為底層傳輸介質(zhì)替換網(wǎng)卡,提出一種基于反射內(nèi)存卡和OpenDDS通信模型的信息分發(fā)技術(shù)[9-10]。依據(jù)CORBA通信的原理,ACE中Reactor監(jiān)控硬件數(shù)據(jù)到和多路分離方法,以及反射內(nèi)存卡應(yīng)用函數(shù)實(shí)現(xiàn)相應(yīng)功能,將本通過(guò)DIOP完成的通信使用反射內(nèi)存實(shí)現(xiàn),設(shè)計(jì)了OpenDDS下基于反射內(nèi)存卡的信息分發(fā)網(wǎng)絡(luò)。
OpenDDS采用以數(shù)據(jù)為中心的發(fā)布訂閱機(jī)制,其通信網(wǎng)絡(luò)由一個(gè)或者多個(gè)數(shù)據(jù)域組成。每個(gè)域包含一套域參與者(發(fā)布者和訂閱者),參與者為網(wǎng)絡(luò)中分布式通信節(jié)點(diǎn),節(jié)點(diǎn)間使用OpenDDS通信。完整的OpenDDS網(wǎng)絡(luò)域包括域參與者和主題,域參與者又可分為數(shù)據(jù)寫(xiě)入者、發(fā)布者、訂閱者、數(shù)據(jù)讀取者。OpenDDS中各分布式節(jié)點(diǎn)身份可以是發(fā)布者、訂閱者或兩者兼有,節(jié)點(diǎn)間關(guān)系平等,數(shù)據(jù)域內(nèi)使用主題標(biāo)識(shí)數(shù)據(jù),每個(gè)主題有唯一的名稱(chēng)、數(shù)據(jù)類(lèi)型和一套QoS策略。發(fā)布者發(fā)布主題和數(shù)據(jù),訂閱者根據(jù)自己需要的主題訂閱數(shù)據(jù)。OpenDDS網(wǎng)絡(luò)發(fā)現(xiàn)模型為集中式發(fā)現(xiàn)模型,網(wǎng)絡(luò)通信節(jié)點(diǎn)中除了域參與者,還需要一個(gè)DCPSInfpRepo (信息倉(cāng)庫(kù))節(jié)點(diǎn)提供發(fā)現(xiàn)服務(wù),允許發(fā)布者和訂閱者通過(guò)DCPSInfpRepo根據(jù)主題發(fā)現(xiàn)彼此。OpenDDS模型提供匿名、對(duì)上透明、多對(duì)多的通信,通信時(shí)隨時(shí)可有新的節(jié)點(diǎn)注冊(cè)入全局?jǐn)?shù)據(jù)空間發(fā)布/訂閱信息,或隨時(shí)退出該網(wǎng)絡(luò)而不影響其余各節(jié)點(diǎn),解決了因網(wǎng)絡(luò)結(jié)構(gòu)動(dòng)態(tài)變化需要重構(gòu)整個(gè)通信系統(tǒng)的問(wèn)題,增強(qiáng)了通信組網(wǎng)的靈活性[2-3,11]。
OpenDDS節(jié)點(diǎn)框架如圖1所示,最上層為應(yīng)用程序,底層為操作系統(tǒng)和通信介質(zhì),OpenDDS作為網(wǎng)絡(luò)中間件構(gòu)建在A(yíng)CE環(huán)境和CORBA模型上。其中CORBA使用遠(yuǎn)程調(diào)用完成了分布式通信的功能,ACE完成了操作系統(tǒng)的適配、包裝,為CORBA通信提供了框架和模式。本文使用反射內(nèi)存卡替換遠(yuǎn)程分布式通信中使用的底層硬件,是在CORBA中間件的基礎(chǔ)上實(shí)現(xiàn)的。
圖1 OpenDDS 節(jié)點(diǎn)框架圖
集中式發(fā)現(xiàn)的OpenDDS網(wǎng)絡(luò)通信分為分布式遠(yuǎn)程調(diào)用通信和本地通信。信息倉(cāng)庫(kù)(DCPSInfpRepo)節(jié)點(diǎn)提供發(fā)現(xiàn)服務(wù),允許發(fā)布者和訂閱者通過(guò)DCPSInfpRepo根據(jù)主題發(fā)現(xiàn)彼此.DCPSInfpRepo與發(fā)布者和訂閱者之間采用遠(yuǎn)程調(diào)用通信。發(fā)布者和訂閱者相互發(fā)現(xiàn)后,發(fā)布者直接向訂閱者發(fā)送數(shù)據(jù),使用本地通信。如圖2所示。
圖2 OpenDDS通信模型
遠(yuǎn)程調(diào)用通信節(jié)點(diǎn)使用的Discovery模塊包含CORBA中間件,采用基于UDP的DIOP協(xié)議,CORBA的核心是ORB (對(duì)象請(qǐng)求代理),通過(guò)ORB實(shí)現(xiàn)了客戶(hù)端和服務(wù)對(duì)象的完全分開(kāi),客戶(hù)端不需要了解服務(wù)對(duì)象的實(shí)現(xiàn)過(guò)程和具體位置,就可以使用服務(wù)對(duì)象。本文主要研究OpenDDS基于CORBA的遠(yuǎn)程通信。
CORBA為可移植的、面向?qū)ο蟮姆植际接?jì)算應(yīng)用程序解決了遠(yuǎn)程對(duì)象之間的互操作問(wèn)題。CORBA基于客戶(hù)端/服務(wù)器模型,在OpenDDS框架中,DCPSInfpRepo作為CORBA服務(wù)器,發(fā)布者和訂閱者為客戶(hù)端。CORBA核心是對(duì)象請(qǐng)求代理(Object Request Broker, ORB),通過(guò)ORB實(shí)現(xiàn)了客戶(hù)端和服務(wù)對(duì)象的完全分開(kāi),客戶(hù)端不需要了解服務(wù)對(duì)象的實(shí)現(xiàn)過(guò)程和具體位置,就可以使用服務(wù)對(duì)象。CORBA通信原理如圖3所示。
圖3 CORBA 通信原理圖
CORBA的基本工作方式如下:
1)客戶(hù)端使用靜態(tài)存根(IDL STUBS)或動(dòng)態(tài)調(diào)用接口(DII)提出請(qǐng)求,將請(qǐng)求傳遞給ORB內(nèi)核。
2)客戶(hù)端ORB內(nèi)核通過(guò)網(wǎng)絡(luò)傳送到與服務(wù)器應(yīng)用程序相連的服務(wù)器ORB內(nèi)核。
3)服務(wù)器ORB內(nèi)核將請(qǐng)求分配給對(duì)象適配器(Object ADAPTER),產(chǎn)生目標(biāo)內(nèi)核。
4)服務(wù)器ORB內(nèi)核將請(qǐng)求分配給目標(biāo)對(duì)象的伺服程序。
5)伺服程序執(zhí)行客戶(hù)機(jī)請(qǐng)求后,將結(jié)果返回。
客戶(hù)端和服務(wù)器端的ORB必須協(xié)同起來(lái)完成工作。ORB間通信協(xié)議為通用對(duì)象請(qǐng)求代理間協(xié)議(General Inter-ORB Protocol, GIOP),存在于ORB內(nèi)核中,結(jié)合不同的通信硬件,GIOP可以具體化為很多協(xié)議,基于UDP數(shù)據(jù)報(bào)的傳輸協(xié)議是DIOP。DIOP協(xié)議框架主要由Acceptor,Connector、Connection Handler、Endpoint、Profile、Protocol Factory、Transport類(lèi)的子類(lèi)組成。其中Profile是基于CORBA的IOR定義的,封裝了所有創(chuàng)建和解析一個(gè)特定協(xié)議的IOR所需的全部方法和成員,在ORB啟動(dòng)服務(wù)時(shí),Protocol Factory負(fù)責(zé)根據(jù)給定的可插拔協(xié)議在服務(wù)器端創(chuàng)建一個(gè)Acceptor,監(jiān)聽(tīng)客戶(hù)端發(fā)來(lái)的請(qǐng)求,同時(shí)為每個(gè)客戶(hù)端啟動(dòng)一個(gè)Connector。當(dāng)客戶(hù)端涉及對(duì)象時(shí),ORB必須獲得相應(yīng)IOR的profile列表。該profile被選定后, Connector注冊(cè)會(huì)將一個(gè)具體的connector實(shí)例與相應(yīng)的profile類(lèi)型進(jìn)行匹配并向ORB發(fā)出連接請(qǐng)求。而Acceptor一旦監(jiān)聽(tīng)到客戶(hù)的連接請(qǐng)求,就將他送給ORB處理。只要連接關(guān)系確立,客戶(hù)端與服務(wù)器端就可以通過(guò)可插拔協(xié)議進(jìn)行數(shù)據(jù)通信[7-9]。DIOP協(xié)議的主要部分繼承了7個(gè)基類(lèi),并加入了自己的特性。
反射內(nèi)存卡類(lèi)似于共享內(nèi)存,硬件安裝在不同的計(jì)算機(jī)主機(jī)上,所有節(jié)點(diǎn)共享同一片存儲(chǔ)區(qū)域,同一時(shí)刻允許系統(tǒng)中所有節(jié)點(diǎn)同時(shí)讀寫(xiě)共享內(nèi)存。由于不需要通信協(xié)議,在任意一塊反射內(nèi)存卡被寫(xiě)入數(shù)據(jù)后,可以在極短的時(shí)間內(nèi)更新數(shù)據(jù),網(wǎng)絡(luò)上所有計(jì)算機(jī)都可以訪(fǎng)問(wèn)這個(gè)新數(shù)據(jù)[11],傳輸延遲小,可以實(shí)時(shí)進(jìn)行信息傳輸,更能滿(mǎn)足大型通信網(wǎng)絡(luò)的數(shù)據(jù)分發(fā)要求。
反射內(nèi)存卡對(duì)于任意節(jié)點(diǎn)的數(shù)據(jù)讀寫(xiě)沒(méi)有硬件限制,在實(shí)際使用時(shí)需要制定具體的協(xié)議監(jiān)控?cái)?shù)據(jù)收發(fā),數(shù)據(jù)的收發(fā)監(jiān)控可以使用查詢(xún)或中斷模式:查詢(xún)模式需要有監(jiān)控線(xiàn)程監(jiān)控?cái)?shù)據(jù)的讀寫(xiě),中斷模式需要使用反射內(nèi)存卡提供的中斷函數(shù)。
ACE Reactor處于OpenDDS中的底層模塊ACE中間件。ACE Reactor類(lèi)似一種監(jiān)控程序,提供多路分離和事件分派框架,簡(jiǎn)化了事件驅(qū)動(dòng)應(yīng)用的開(kāi)發(fā)。通過(guò)在操作系統(tǒng)事件多路分離接口上進(jìn)行偵聽(tīng)事件發(fā)生,ACE Reactor觸發(fā)對(duì)用戶(hù)預(yù)先登記事件處理器(event handler)對(duì)象中方法的回調(diào)(callback)。該回調(diào)方法由應(yīng)用開(kāi)發(fā)者實(shí)現(xiàn),其中含有應(yīng)用程序處理此事件的特定代碼[9-10]。
OpenDDS中使用ACE Reactor進(jìn)行UDP數(shù)據(jù)的接收和處理,當(dāng)ACE Reactor監(jiān)控到某個(gè)Socket上UDP數(shù)據(jù)到達(dá)這類(lèi)事件時(shí),觸發(fā)此Socket對(duì)應(yīng)的DIOP模塊中的事件處理器函數(shù)。這樣的模式即查詢(xún)模式,由于A(yíng)CE Reactor作為OpenDDS底層數(shù)據(jù)通信重要的環(huán)節(jié),當(dāng)傳輸介質(zhì)由網(wǎng)卡替換成反射內(nèi)存卡時(shí),也使用ACE Reactor對(duì)反射內(nèi)存卡上的數(shù)據(jù)進(jìn)行監(jiān)控。
反射內(nèi)存卡允許系統(tǒng)中所有節(jié)點(diǎn)同時(shí)讀寫(xiě)共享內(nèi)存,在OpenDDS分布式網(wǎng)絡(luò)應(yīng)用中,設(shè)計(jì)最大有128個(gè)通信節(jié)點(diǎn),需要對(duì)每個(gè)節(jié)點(diǎn)的反射內(nèi)存卡進(jìn)行地址分配。反射內(nèi)存卡的地址以反射內(nèi)存ID標(biāo)識(shí),反射內(nèi)存ID由板卡硬件設(shè)置。網(wǎng)絡(luò)中的節(jié)點(diǎn)需要實(shí)現(xiàn)ID與UDP協(xié)議中的IP地址的對(duì)應(yīng),這里使用算法:
IP=0xc0a800+ID;
DCPSInfpRepo服務(wù)器在網(wǎng)絡(luò)中心,設(shè)置反射內(nèi)存ID為129,其他反射內(nèi)存節(jié)點(diǎn)為1~127。由此DCPSInfpRepo服務(wù)器和其他發(fā)布者/訂閱者對(duì)應(yīng)的IP地址設(shè)為192.168.0.129和192.168.0.1~192.168.0.127。
反射內(nèi)存卡存儲(chǔ)區(qū)設(shè)計(jì)如圖4所示,每塊反射內(nèi)存卡地址分為2個(gè)部分,狀態(tài)區(qū)和數(shù)據(jù)區(qū),狀態(tài)區(qū)記錄每個(gè)節(jié)點(diǎn)是否可讀寫(xiě),數(shù)據(jù)區(qū)記錄每個(gè)節(jié)點(diǎn)收到的幀內(nèi)容。由于OpenDDS網(wǎng)絡(luò)通信分為分布式遠(yuǎn)程調(diào)用通信和本地通信,遠(yuǎn)程調(diào)用通信為DIOP幀,本地通信為DCPS幀。因此每個(gè)反射內(nèi)存卡節(jié)點(diǎn)內(nèi)部還需要針對(duì)不同的傳輸幀劃分為2個(gè)數(shù)據(jù),將節(jié)點(diǎn)內(nèi)部劃分地址可以實(shí)現(xiàn)數(shù)據(jù)在單個(gè)節(jié)點(diǎn)上的分離。這里實(shí)現(xiàn)了socket端口到反射內(nèi)存卡數(shù)據(jù)區(qū)的映射。
圖4 反射內(nèi)存卡存儲(chǔ)分配圖
OpenDDS使用DIOP前要配置DIOP協(xié)議,方法如下:
1)DIOP協(xié)議代碼被包含在TAO_Strategies庫(kù)中,將TAO_Strategies.lib加入到OpenDDS應(yīng)用鏈接庫(kù)中。
2)通過(guò)服務(wù)配置器動(dòng)態(tài)加載DIOP協(xié)議:在DCPSInfpRepo應(yīng)用路徑下創(chuàng)建svc.conf文件,輸入動(dòng)態(tài)加載DIOP協(xié)議指令:
dynamic DIOP_Factory Service_Object*
TAO_Strategies:_make_TAO_DIOP_Protocol_Factory () ""
Dynamic Advanced_Resource_Factory Service_Object*
TAO_Strategies:_make_TAO_Advanced_Resource_Factory ()
"-ORBProtocolFactory DIOP_Factory"
3)修改發(fā)布者訂閱者應(yīng)用程序的配置文件dds_udp_conf.ini,將其中的DCPSInfoRepo=corbaloc::192.168.0.129:12345/DCPSInfoRepo
改成DCPSInfoRepo=corbaloc:diop:192.168.0.129:12345/DCPSInfoRepo
4)由于服務(wù)器和客戶(hù)端都需要?jiǎng)?chuàng)建TAO_DIOP_Acceptor,在運(yùn)行應(yīng)用程序時(shí),服務(wù)器端和客戶(hù)端需要聲明DIOP端點(diǎn),方法是在命令行數(shù)輸入-ORBListenEndpoints diop://主機(jī)號(hào):端口號(hào)。
至此,配置DIOP協(xié)議配置完畢。
發(fā)布者和訂閱者作為客戶(hù)端與DCPSInfpRepo服務(wù)器端DIOP通信圖如圖5所示。
圖5 發(fā)布者/訂閱者與DCPSInfpRepo服務(wù)器DIOP通信圖
DIOP協(xié)議中,客戶(hù)端DIOP_Connector和DIOP_Acceptor創(chuàng)建的DIOP_Connection_Handler和TAO_DIOP_Transport負(fù)責(zé)與服務(wù)器端實(shí)現(xiàn)通信,為保證可以正確收到服務(wù)器發(fā)送的數(shù)據(jù),因此需要在TAO_DIOP_Transport中將DIOP_Connection_Handler注冊(cè)到反應(yīng)器上,使得反應(yīng)器可以監(jiān)控handler句柄上是否有數(shù)據(jù)到來(lái)。具體操作為在TAO_DIOP_Transport::register_handler函數(shù)中加入代碼:
ACE_Reactor * const r = this->orb_core_->reactor ();
if(r==this->event_handler_i()->reactor ()){
return 0;
}
this->ws_->is_registered (true);
return r->register_handler (this->event_handler_i (),
ACE_Event_Handler::READ_MASK);
在OpenDDS的DIOP上實(shí)現(xiàn)反射內(nèi)存卡的數(shù)據(jù)傳輸,需要解決反射內(nèi)存卡數(shù)據(jù)監(jiān)控問(wèn)題,這里的數(shù)據(jù)監(jiān)控使用程序查詢(xún)模式,通過(guò)ACE Reator觸發(fā)接收回調(diào)函數(shù)接收數(shù)據(jù)。圖5描述了在DIOP中使用反射內(nèi)存卡作為通信介質(zhì)的實(shí)現(xiàn)方法。
如圖6所示,在服務(wù)器端DIOP_Acceptor類(lèi)中創(chuàng)建反射內(nèi)存卡監(jiān)控線(xiàn)程函數(shù),用于監(jiān)控?cái)?shù)據(jù)是否已經(jīng)寫(xiě)入反射內(nèi)存,監(jiān)控到反射內(nèi)存有數(shù)據(jù)寫(xiě)完成時(shí)通過(guò)socket向本機(jī)發(fā)送可讀的1字節(jié)數(shù)據(jù),ACE Reactor監(jiān)視到事先注冊(cè)在其中的socket有數(shù)據(jù)到來(lái),進(jìn)而能夠觸發(fā)到事先注冊(cè)在Reactor中注冊(cè)的事件處理函數(shù)接收數(shù)據(jù)。反射內(nèi)存卡監(jiān)控函數(shù)作為一個(gè)單獨(dú)的線(xiàn)程創(chuàng)建位置較為重要,既要滿(mǎn)足用于監(jiān)控網(wǎng)卡數(shù)據(jù)的socket已經(jīng)建立并完成監(jiān)聽(tīng)端口綁定的初始化之后,又要滿(mǎn)足發(fā)送端發(fā)送第一幀數(shù)據(jù)之前,以確保接收端能及時(shí)準(zhǔn)確地監(jiān)控到發(fā)送端寫(xiě)入反射內(nèi)存卡的所有數(shù)據(jù)。這里監(jiān)控線(xiàn)程函數(shù)的創(chuàng)建位置是DIOP_Acceptor.cpp的open_i函數(shù)中。
圖6 OpenDDS 反射內(nèi)存卡替換原理圖
在觸發(fā)接收函數(shù)后,在接收數(shù)據(jù)函數(shù)內(nèi)部從反射內(nèi)存卡對(duì)應(yīng)地址讀出發(fā)布端寫(xiě)入的數(shù)據(jù)。由此,基于DIOP的反射內(nèi)存卡數(shù)據(jù)傳輸,客戶(hù)端向反射內(nèi)存寫(xiě)數(shù)據(jù),服務(wù)器端從反射內(nèi)存讀數(shù)據(jù)的單詞流程得以實(shí)現(xiàn)。服務(wù)器端向客戶(hù)端傳輸數(shù)據(jù)流程與此類(lèi)似。
由于發(fā)送和接收方是2個(gè)不同的進(jìn)程,而操作反射內(nèi)存卡的同一塊地址范圍可能會(huì)出現(xiàn)接收端還未將前一次數(shù)據(jù)取走,發(fā)送端已將下一幀數(shù)據(jù)寫(xiě)入的丟幀問(wèn)題。為解決數(shù)據(jù)在反射內(nèi)存卡中數(shù)據(jù)共享時(shí)的同步問(wèn)題,程序中創(chuàng)建讀寫(xiě)標(biāo)志位,即設(shè)置兩個(gè)標(biāo)志:
f1:寫(xiě)入標(biāo)志位,置位時(shí)表示發(fā)布端已將完整一幀數(shù)據(jù)寫(xiě)入反射內(nèi)存卡對(duì)應(yīng)地址。
f2:讀取標(biāo)志位,置位時(shí)表示訂閱端已將數(shù)據(jù)從反射內(nèi)存卡對(duì)應(yīng)地址讀走,此時(shí)可寫(xiě)。
標(biāo)志位配合反射內(nèi)存讀寫(xiě)的流程如圖7所示。
圖7 反射內(nèi)存卡讀寫(xiě)流程圖
1)TAO_DIOP_Transport::send依據(jù)讀標(biāo)志f2是否置位,決定是否將將要發(fā)布的數(shù)據(jù)寫(xiě)入反射內(nèi)存卡,寫(xiě)入后清除讀標(biāo)志f2,置位寫(xiě)標(biāo)志f1。
2)線(xiàn)程函數(shù)ThreadProc依據(jù)寫(xiě)標(biāo)志f1是否置位,決定是否向自己進(jìn)程的發(fā)送1個(gè)字節(jié)通知數(shù)據(jù)以便觸發(fā)ACE reactor,并清除寫(xiě)標(biāo)志f1。
3)TAO_DIOP_Transport:recv首先通過(guò)this->connection_handler_->peer ().recv()接收由線(xiàn)程函數(shù)發(fā)來(lái)的一字節(jié)通知數(shù)據(jù),從反射內(nèi)存卡取出訂閱的數(shù)據(jù),并置位讀標(biāo)志f2。
實(shí)驗(yàn)驗(yàn)證使用3臺(tái)計(jì)算機(jī)分別作為DCPSInfoRepo,發(fā)布者和訂閱者,運(yùn)行DCPSInfoRepo服務(wù)器程序如圖8,命令行輸入:
DCPSInfoRepo -ORBListenEndpoints diop://192.168.0.129:12345
圖8 DCPSInfoRepo服務(wù)器運(yùn)行示意圖
運(yùn)行發(fā)布者程序,命令行輸入:
./subscriber -ORBListenEndpoints diop://192.168.0.1:10000 -DCPSConfigFile dds_udp_conf.ini
運(yùn)行訂閱者程序,命令行輸入:
./publisher -ORBListenEndpoints diop://192.168.0.4:10001 -DCPSConfigFile dds_udp_conf.ini
發(fā)布者發(fā)送數(shù)據(jù),訂閱者可以順利接收到數(shù)據(jù),如圖9和圖10所示。
圖9 發(fā)布者發(fā)布數(shù)據(jù)
圖10 訂閱者接收數(shù)據(jù)
實(shí)驗(yàn)結(jié)果證明,基于反射內(nèi)存卡和OpenDDS的通信模型能夠順利實(shí)現(xiàn)OpenDDS發(fā)布訂閱的過(guò)程,數(shù)據(jù)可以正確分發(fā)。
以數(shù)據(jù)為中心的OpenDDS增加了信息分發(fā)系統(tǒng)通信的靈活性。反射內(nèi)存卡作為網(wǎng)絡(luò)的底層硬件允許系統(tǒng)中所有節(jié)點(diǎn)同時(shí)讀取共享的內(nèi)存數(shù)據(jù),其無(wú)需通信協(xié)議,減少了網(wǎng)絡(luò)中不必要的數(shù)據(jù),提高了數(shù)據(jù)的傳輸效率,是一種非常適合實(shí)時(shí)信息網(wǎng)絡(luò)的底層硬件?;贠penDDS的分層架構(gòu),采用修改DIOP協(xié)議的方法,使遠(yuǎn)程調(diào)用數(shù)據(jù)通過(guò)反射內(nèi)存卡傳輸,實(shí)現(xiàn)了基于OpenDDS和反射內(nèi)存卡的信息分發(fā)系統(tǒng)。將反射內(nèi)存卡和發(fā)布/訂閱模式結(jié)合設(shè)計(jì)的信息分發(fā)網(wǎng)絡(luò),更好地滿(mǎn)足軍事領(lǐng)域中信息分發(fā)系統(tǒng)實(shí)時(shí)性、可靠性的要求。