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