論文首先對(duì)數(shù)據(jù)分發(fā)服務(wù)中的發(fā)布訂閱過(guò)程進(jìn)行簡(jiǎn)介,并依據(jù)相應(yīng)規(guī)范分別設(shè)計(jì)發(fā)布過(guò)程和訂閱過(guò)程,其中根據(jù)相應(yīng)時(shí)序圖給出清晰的網(wǎng)絡(luò)通信過(guò)程。最后,通過(guò)以上設(shè)計(jì)結(jié)果逐步構(gòu)建基于數(shù)據(jù)分發(fā)服務(wù)的發(fā)布訂閱系統(tǒng)類圖并逐一實(shí)現(xiàn)。
【關(guān)鍵詞】數(shù)據(jù)分發(fā)服務(wù) 訂閱過(guò)程 訂閱系統(tǒng)
1 發(fā)布過(guò)程實(shí)現(xiàn)
根據(jù)OpenDDS的開(kāi)發(fā)者文檔一個(gè)簡(jiǎn)單的消息發(fā)布過(guò)程需要分為發(fā)布過(guò)程和訂閱過(guò)程,其中發(fā)布過(guò)程又包含初始化參與者對(duì)象、注冊(cè)發(fā)布數(shù)據(jù)類型和創(chuàng)建自定義主題數(shù)據(jù)信息、創(chuàng)建對(duì)應(yīng)主題發(fā)布者、創(chuàng)建相關(guān)數(shù)據(jù)寫(xiě)入者和等待對(duì)應(yīng)主題訂閱者以及發(fā)布相關(guān)數(shù)據(jù)五個(gè)階段,訂閱過(guò)程又包含初始化參與者對(duì)象、注冊(cè)發(fā)布數(shù)據(jù)類型和創(chuàng)建對(duì)應(yīng)主題、創(chuàng)建對(duì)應(yīng)主題訂閱者、創(chuàng)建相關(guān)數(shù)據(jù)讀取者和監(jiān)聽(tīng)者、數(shù)據(jù)讀取者監(jiān)聽(tīng)實(shí)現(xiàn)五個(gè)階段。
1.1 初始化參與者
首先在主函數(shù)中初始化一個(gè)OpenDDS的參與者。DDS類圖中通過(guò)命令行參數(shù)來(lái)初始化一個(gè)域參與者工廠。create_participant()函數(shù)操作運(yùn)用域參與者工廠來(lái)注冊(cè)這個(gè)過(guò)程,通過(guò)指定ID來(lái)在域中創(chuàng)建一個(gè)參與者。這個(gè)參與者使用默認(rèn)的QoS策略和無(wú)監(jiān)聽(tīng)者。
1.2 注冊(cè)相關(guān)數(shù)據(jù)類型和創(chuàng)建對(duì)應(yīng)主題對(duì)象
首先,創(chuàng)建一個(gè)MessageTypeSupportImpl對(duì)象,之后調(diào)用register_type()函數(shù)用類型名注冊(cè)類型。其中注冊(cè)類型為空字符串類型名,因?yàn)镸essageTypeSupport接口庫(kù)被標(biāo)識(shí)作為類型名。同時(shí),也可以運(yùn)用一個(gè)特定的類型名,如“Message”。
1.3 創(chuàng)建發(fā)布者
接下來(lái)用默認(rèn)的發(fā)布者QoS創(chuàng)建發(fā)布者。如發(fā)布/訂閱初始化模塊類DDS類圖中通過(guò)DDS::DomainParticipant_var對(duì)象創(chuàng)建發(fā)布者。
1.4 創(chuàng)建數(shù)據(jù)寫(xiě)入者和等待訂閱者
創(chuàng)建好發(fā)布者之后,通過(guò)發(fā)布者創(chuàng)建數(shù)據(jù)寫(xiě)入者。依據(jù)主題對(duì)象的引用、默認(rèn)QoS兼容性策略和一個(gè)空的監(jiān)聽(tīng)者對(duì)象引用來(lái)創(chuàng)建數(shù)據(jù)寫(xiě)入者。接著調(diào)用narrow函數(shù)將數(shù)據(jù)寫(xiě)入者引用轉(zhuǎn)換為一個(gè)MessageDataWriter對(duì)象引用,因此我們能夠運(yùn)用特定類型進(jìn)行發(fā)布操作。
2 訂閱過(guò)程實(shí)現(xiàn)
大部分訂閱者代碼與發(fā)布者的是相近或者完全相同的。如果代碼相似本文會(huì)省略掉一部分代碼,從而專注于實(shí)現(xiàn)細(xì)節(jié)的差異。
2.1 初始化參與者
訂閱者開(kāi)始的實(shí)現(xiàn)部分與發(fā)布者是完全相同的,我們會(huì)初始化服務(wù)并加入域中。
2.2 注冊(cè)數(shù)據(jù)類型和創(chuàng)建對(duì)應(yīng)主題信息對(duì)象
下一步,初始化消息類型和主題。當(dāng)主題在域中以相同的數(shù)據(jù)類型和兼容的QoS策略已經(jīng)被初始化時(shí),create_topic()函數(shù)的調(diào)用會(huì)返回一個(gè)引用來(lái)響應(yīng)現(xiàn)存的主題。如果這個(gè)類型和QoS策略在create_topic()調(diào)用中被明確指定,與現(xiàn)存的主題不相互匹配,那么之后會(huì)調(diào)用失敗。此時(shí),同樣有find_topic()這樣的函數(shù)操作我們的訂閱者使得其能夠簡(jiǎn)單的獲取現(xiàn)存的主題。
2.3 創(chuàng)建訂閱者
下一步,以默認(rèn)的QoS策略創(chuàng)建一個(gè)訂閱者。如發(fā)布/訂閱初始化模塊類DDS類圖中通過(guò)DDS::DomainParticipant_var對(duì)象創(chuàng)建訂閱者。
2.4 創(chuàng)建數(shù)據(jù)讀取者和監(jiān)聽(tīng)者
我們需要用創(chuàng)建的數(shù)據(jù)讀取者來(lái)關(guān)聯(lián)監(jiān)聽(tīng)者對(duì)象,當(dāng)數(shù)據(jù)可用時(shí),可以用監(jiān)聽(tīng)者對(duì)象來(lái)發(fā)現(xiàn)。如發(fā)布/訂閱初始化模塊類圖中的構(gòu)造了一個(gè)監(jiān)聽(tīng)者對(duì)象。DataReaderListenerImpl類將應(yīng)用于下一部分。
監(jiān)聽(tīng)者被分配在堆上并且被分配給一個(gè)DataReaderListener_var對(duì)象。這種類型提供引用計(jì)數(shù)行為,因此當(dāng)最后的引用被移除時(shí),監(jiān)聽(tīng)者自動(dòng)清理。在OpenDDS應(yīng)用程序代碼中這種堆分配是典型的應(yīng)用方式并且使得應(yīng)用程序開(kāi)發(fā)人員從紛繁復(fù)雜的分配對(duì)象的生命周期管理中解脫出來(lái)。
3 結(jié)束語(yǔ)
論文首先基于數(shù)據(jù)分發(fā)服務(wù)的相關(guān)標(biāo)準(zhǔn)對(duì)發(fā)布訂閱過(guò)程進(jìn)行了簡(jiǎn)介,數(shù)據(jù)分發(fā)服務(wù)是一種以發(fā)布/訂閱作為主要通信方式的網(wǎng)絡(luò)服務(wù)模型結(jié)構(gòu),根據(jù)相應(yīng)規(guī)范分別設(shè)計(jì)發(fā)布過(guò)程和訂閱過(guò)程。在網(wǎng)絡(luò)通信交互環(huán)境下,系統(tǒng)的各個(gè)節(jié)點(diǎn)都可以作為發(fā)布或訂閱方且可以同時(shí)兼具兩者。當(dāng)開(kāi)始網(wǎng)絡(luò)傳輸時(shí),主要分為發(fā)布過(guò)程和訂閱過(guò)程。最后,通過(guò)以上設(shè)計(jì)結(jié)果逐步構(gòu)建基于數(shù)據(jù)分發(fā)服務(wù)的發(fā)布訂閱系統(tǒng)類圖并逐一實(shí)現(xiàn)。
參考文獻(xiàn)
[1]OMG,Data distribution service for real-time systems specification[S].Version1.0.http://www.omg.org/spec/DDS/ Dec.2004.
[2]OMG,Data distribution service for real-time systems specification[S].Version 1.1.http://www.omg.org/spec/DDS/ Nov.2005.
[3]OMG,Data distribution service for real-time systems specification[S].Version 1.2. http://www.omg.org/spec/DDS/ Jan.2007.
[4]Sanchez-Monedero J,Povedano-Molina J, Lopez-Vega J M,et al.Bloom filter-based discovery protocol for DDS middleware[J].Journal of Parallel & Distributed Computing,2011,71(10):1305-1317.
作者簡(jiǎn)介
錢(qián)哨(1992-),男,江蘇省南京市人。現(xiàn)為南京航空航天大學(xué)碩士研究生在讀。主要研究方向?yàn)榫W(wǎng)絡(luò)與信息安全。
作者單位
南京航空航天大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 江蘇省南京市 211106