DDS開發(fā)規(guī)范的一些理解
7發(fā)現(xiàn)配置在DDS 實現(xiàn)中,參與者參與到應(yīng)用程序中,必須發(fā)現(xiàn)其他參與者。DDS 使用了domain (域)給數(shù)據(jù)當(dāng)DDS 應(yīng)用程序?qū)懭?,參與者鏈接到域,同時需要確保他們的配置允許每一個參與者來發(fā)現(xiàn)其他
7發(fā)現(xiàn)配置
在DDS 實現(xiàn)中,參與者參與到應(yīng)用程序中,必須發(fā)現(xiàn)其他參與者。DDS 使用了domain (域)給數(shù)據(jù)當(dāng)DDS 應(yīng)用程序?qū)懭?,參與者鏈接到域,同時需要確保他們的配置允許每一個參與者來發(fā)現(xiàn)其他統(tǒng)一個域的參與者。
DDS 提供了一個中心發(fā)現(xiàn)方法和點對點發(fā)現(xiàn)方法來完成同一個域中的參與者。中心模式使用一個獨立的服務(wù)—DCPSInfoRepo 服務(wù),點對點模式使用DDS-RTPS 發(fā)現(xiàn)協(xié)議標(biāo)準(zhǔn)來達(dá)到無中心的發(fā)現(xiàn)。使用任何一種方法的應(yīng)用程序能夠使用多維配置屬性來滿足實現(xiàn)需求。每一種方法都提供了默認(rèn)配置,如果沒有通過命令行或者配置文件進(jìn)行配置的話。 如何細(xì)化配置達(dá)到更好的發(fā)現(xiàn)性能。使用多個DCPSInfoRepo 服務(wù),或者需要使用DDS-RTPS 來滿足互操作要求,為了達(dá)到這個目的,可以聯(lián)合使用[domain] [repository]和
[rtps_discovery]。
7.3.1域配置
OpenDDS 配置文件使用[domain]部分來配置一個或者多個發(fā)現(xiàn)域,每一個域在同一個文件中指定一個發(fā)現(xiàn)配置。OpenDDS 應(yīng)用程序可以使用基于DCPSInfoRepo 服務(wù)的中心發(fā)現(xiàn)模式,或者基于DDS-RTPS 發(fā)現(xiàn)協(xié)議標(biāo)準(zhǔn)的點對點發(fā)現(xiàn)方法,或者這兩種方法的結(jié)合。DCPSInfoRepo 方法對應(yīng)的類型是[rtps_discovery],一個單獨域只能使用一種類型的發(fā)現(xiàn)。
看7.3.2和7.3.3查看更多[repository]和[rtps_discovery]的配置屬性。
一個域可以跟一個整數(shù)聯(lián)系起來,配置文件可以在兩種方法支持他。第一種方法是簡單的是例子值和域聯(lián)系起來,例如:
[domain/1]
DiscoveryConfig=DiscoveryConfig1
(more properties...)
我們的例子使用域關(guān)鍵字來標(biāo)識域,這個關(guān)鍵字是/1.斜線后面的數(shù)值是和域連系的整數(shù)值。另一個可選的方法是使用更加容易識別的名字,增加DomainId 屬性,同時給它賦值。
[domain/books]
DomainId=1
DiscoveryConfig=DiscoveryConfig1
這個域使用books 名字,DomainId 賦值1,DDS 應(yīng)用需要這個數(shù)值來讀取配置。多個域?qū)嵗梢栽谝粋€配置文件中使用這種方式進(jìn)行區(qū)分。
一旦一個或者多個域?qū)嵗呀?jīng)確定,這個域的發(fā)現(xiàn)屬性必須確定。在我們以上的例子
1
,中,屬性DiscoveryConfig 必須指向另外還有發(fā)現(xiàn)屬性的section ,或者指定發(fā)現(xiàn)的內(nèi)置變量(DEFAULT_REPO或者DEFAULT_RTPS)例子名字是DiscoveryConfig1。例子名字必須和
[repository] or[rtps_discovery]聯(lián)系。
我們例子的擴(kuò)展:
[domain/1]
DiscoveryConfig=DiscoveryConfig1
[repository/DiscoveryConfig1]
RepositoryIor=host1.mydomain.com:12345
在這個例子中我們的域指向[repository],這用來OpenDDS DCPSInfoRepo服務(wù)。可以看7.3.2.
或者 有一些情況,當(dāng)特定域并沒有在配置文件中指定。例如,如果一個OpenDDS 應(yīng)用將域ID3分給他的參與者,上面的例子不支持域ID 為3的配置,下面可以用:
[common]
DCPSInfoRepo=host3.mydomain.com:12345
DCPSDefaultDiscovery=DEFAULT_REPO
[domain/1]
DiscoveryConfig=DiscoveryConfig1
[repository/DiscoveryConfig1]
RepositoryIor=host1.mydomain.com:12345
DCPSDefaultDiscovery 屬性告訴應(yīng)用如果參與者沒有指定域ID 的話就給他指定
DEFAULT_REPO發(fā)現(xiàn)類型,意思是使用DCPSInfoRepo 服務(wù),這個DCPSInfoRepo 服務(wù)可以在host3.mydomain.com:12345找到。
表7-2中,DCPSDefaultDiscovery 屬性還有兩個數(shù)值可以用。DEFAULT_RTPS連續(xù)值通知應(yīng)用來告訴在文件中沒有域配置的參與者使用RTPS 發(fā)現(xiàn)來發(fā)現(xiàn)參與者。
DCPSSefaultiscovery 屬性的最后選項告訴應(yīng)用來應(yīng)用使用其中一種已經(jīng)定義的配置作為默認(rèn)配置提供給那些沒有在文件中定義的參與域。這里有一個例子:
[common]
DCPSDefaultDiscovery=DiscoveryConfig2
[domain/1]
DiscoveryConfig=DiscoveryConfig1
[repository/DiscoveryConfig1]
RepositoryIor=host1.mydomain.com:12345
[domain/2]
DiscoveryConfig=DiscoveryConfig2
[repository/DiscoveryConfig2]
RepositoryIor=host2.mydomain.com:12345
通過在[common]中增加DCPSDefaultiscovery 屬性,那些沒有分配到域id 的參與者將使用DiscoveryConfig2的配置。更多關(guān)于RTPS 發(fā)現(xiàn)的類似配置參看7.3.3。
這是[domain]可用的屬性。
2
,7.3.2配置應(yīng)用程序的DCPSInfoRepo
一個OpenDDS DCPSInfoRepo是一個用來參與者發(fā)現(xiàn)的本地或者遠(yuǎn)程節(jié)點。配置參與者應(yīng)該如何發(fā)現(xiàn)DCPSInfoRepo 是本節(jié)的目的。假設(shè)DCPSInfoRepo 服務(wù)已經(jīng)在
myhost.mydomain.com:12345上啟動。應(yīng)用程序可以是他們的OpenDDS 參與者通過命令行選項或者配置文件發(fā)現(xiàn)這個服務(wù)。
在我們2.1.7節(jié)的“Running the Example”我們使用命令行參數(shù)來發(fā)現(xiàn)DCPSInfoRepo 服務(wù):
Publisher –DCPSInfoRepo
這里假設(shè)DCPSInfoRepo 用下面語句啟動:
$DDS_ROOT/bin/DCPSInfoRepo –o repo.ior
DCPSInfoRepo 服務(wù)在這個文件中產(chǎn)生他的位置對象信息,參與者需要讀取這個文件來進(jìn)行連接。基于IORs 的文件的使用來尋找發(fā)現(xiàn)服務(wù),然而在大多數(shù)環(huán)境中無效,所以應(yīng)用程序使用命令行選項來拿簡單的指定運行DCPSInfoRepo 服務(wù)的主機(jī)和端口:
Publisher –DCPSInfoRepo myhost.mydomain.com:12345
上面假設(shè)DCPSInfoRepo 已經(jīng)在主機(jī)(myhost.mydomain.com)上啟動:
$DDS_ROOT/bin/DCPSInfoRepo –ORBListenEndpoints iiop://:12345
如果應(yīng)用需要對另外的設(shè)置使用配置文件,應(yīng)該講發(fā)現(xiàn)內(nèi)容放到文件中,來降低命令行的復(fù)雜性。配置文件的使用同時能夠使多個應(yīng)用共享通用的OpenDDS 配置。上面的例子可以移動到配置文件的[common]部分:
[common]
DCPSInfoRepo=myhost.mydomain.com:12345
命令行將變成如下:
publisher –DCPSInfoRepo pub.ini
3
我們再來看7.3.1中的例子,配置文件可以指定域和與這些域相關(guān)聯(lián)的發(fā)現(xiàn)配置。這種情況下RepositoryIor 屬性將和命令行表達(dá)同一個信息,即指定一個運行的DCPSInfoRepo 服務(wù)。兩個域的配置如下:
[domain/1]
DiscoveryConfig=DiscoveryConfig1
[repository/DiscoveryConfig1]
RepositoryIor=myhost.mydomain.com:12345
[domain/2]
DiscoveryConfig=DiscoveryConfig2
[repository/DiscoveryConfig2]
RepositoryIor=host2.mydomain.com:12345
[domain/1]下的DiscoveryConfig 屬性是域1的所有參與者使用DiscoveryConfig1定義的配置。這指向了[reposity]部分,RepositoryIor 的值為myhost.mydomain.com:12345。
最終,當(dāng)定義了DCPSInfoRepo 的DiscoveryConfig 屬性,還可以包含DEFAULT_REPO。
[common]
DCPSInfoRepo=localhost:12345
[domain/1]
DiscoveryConfig=DiscoveryConfig1
[repository/DiscoveryConfig1]
RepositoryIor=myhost.mydomain.com:12345
[domain/2]
DiscoveryConfig=DEFAULT_REPO
這種情況下,域2的參與者將引用DCPSInfoRepo 的發(fā)現(xiàn)屬性,這個在[common]中已經(jīng)定義。如果DCPSInfoRepo 的值沒有在[common]中提供,將會在命令行中當(dāng)做一個參數(shù)提供:
publisher -DCPSInfoRepo localhost:12345 -DCPSConfigFile pub.ini
這樣設(shè)定了DCPSInfoRepo 的值,如果參與者在pub.ini 文件中讀到了DEFAULT_REPO,這有一個值。如果DCPSInfoRepo 沒有在配置文件和命令行中定義,那么他的默認(rèn)值是file :/repo.ior。如前所述,這在應(yīng)用環(huán)境中不能很有效,所以需要通過其中一種方法設(shè)定DCPSInfoRepo 的值。
7.3.2.1 配置多個DCPSInfoRepo 實例
一個DDS 程序中的DDS 實體可以關(guān)聯(lián)多個DCPS 信息庫(DCPSInfoRepo )。
庫信息和域關(guān)聯(lián)能夠使用配置文件或者通過應(yīng)用程序API 進(jìn)行配置。內(nèi)部默認(rèn)、命令行參數(shù)和配置文件選項會起作用,就像現(xiàn)有應(yīng)用一樣,這些應(yīng)用不想使用多DCPSInfoRepo 關(guān)聯(lián)。
參考圖7-2,一個進(jìn)行使用多個DCPSInfoRepo 庫。Process A和B 都是配置了進(jìn)行相互通信,并且在InfoRepo_1中發(fā)現(xiàn)其他。這是基本發(fā)現(xiàn)的簡單應(yīng)用。然而,隨著特定域(Domain
1)的使用,上下文的額外層被部署。DDS 實體(data readers/data writers)被限制在同一個域中和其他實體通信。者提供了一個分割交通的有效方式。Process C和D 配置了相同的方
4
,式,運行在域2中,使用InfoRepo_2。當(dāng)有一個應(yīng)用進(jìn)行需要使用多個域和不同的發(fā)現(xiàn)服務(wù)時就遇到了問題。這就是例子中的Process E。它有兩個訂閱者,一個訂閱者從InfoRepo_1發(fā)布,一個從InfoRepo_2??梢詮呐渲梦募onfigE.ini 中查看如何這樣工作。
下面是配置文件,只展示發(fā)現(xiàn)部分,不顯示傳輸內(nèi)容。 [domain/1]
DiscoveryConfig=DiscoveryConfig1
[repository/DiscoveryConfig1]
RepositoryIor=host1.mydomain.com:12345
[domain/2]
DiscoveryConfig=DiscoveryConfig2
[repository/DiscoveryConfig2]
RepositoryIor=host2.mydomain.com:12345
Process E讀到這個配置文件會發(fā)現(xiàn)多個domian 部分。每一個域都有一個整數(shù)和一個定義的DiscoveryConfig 。
對第一個域([domain/1]),DiscoveryConfig 屬性是用戶定義的DiscoveryConfig1值。這個屬性使得OpenDDS 實例去尋找repository 或者 rtps_discovery這樣的標(biāo)示和
DiscoveryConfig1。在我們的例子中,找到了[repository/DiscoveryConfig1],這就是域[domain/1]的發(fā)現(xiàn)配置。這部分告訴我們這個域使用的DCPSInfoRepo 的地址可以通過RepositoryIor 屬性得到。這里他是host1.mydomain.com ,端口12345。RepositoryIor 值可以是一個完整的CORBA IOR或者簡單主機(jī):端口。
第二個域名字為[domain/2],相應(yīng)的庫部分[repository/DiscoveryConfig2]標(biāo)示第二個域的配置和InfoRepo_2庫。在一個配置文件中可以有任意數(shù)量的域部分或者庫。
5
,沒有詳細(xì)配置的域都被關(guān)聯(lián)到默認(rèn)發(fā)現(xiàn)配置上。
每個DCPSInfoRepo 可以連接到多個域,然而一個域不能共享給多個DCPSInfoRepo 。
這里是[repository]部分的合法屬性。
7.3.3 DDS-RTPS發(fā)現(xiàn)配置
OMG DDS-RTPS規(guī)范給了下面例子來說明OpenDDS 使用的發(fā)現(xiàn)方法,還有兩種不同的協(xié)議來完成發(fā)現(xiàn)操作。引用8.5.1節(jié)如下:
RTPS 把發(fā)現(xiàn)協(xié)議劃分為兩個獨立協(xié)議
1、參與者發(fā)現(xiàn)協(xié)議
2、終端發(fā)現(xiàn)協(xié)議
參與者發(fā)現(xiàn)協(xié)議(PDP )說明了在一個網(wǎng)絡(luò)中參與者如何發(fā)現(xiàn)彼此。一旦兩個參與者發(fā)現(xiàn)彼此,他們在終端使用終端發(fā)現(xiàn)協(xié)議(EDP )來交換信息。排除這種因果關(guān)系,兩種協(xié)議都是成熟的
這節(jié)討論的配置選項允許用戶指定屬性值來改變簡單參與者發(fā)現(xiàn)協(xié)議(SPDP )的行為和檢點終端發(fā)現(xiàn)協(xié)議(SEDP )默認(rèn)設(shè)置。
DDS-RTPS 的發(fā)現(xiàn)配置可以用簡單的簡單基本發(fā)現(xiàn)來完成,或者是用在7.3.1中的域。 簡單配置通過在我們的例子配置文件的[common]中指定屬性來實現(xiàn)。
configE.ini (for RTPS)
[common]
DCPSDefaultDiscovery=DEFAULT_RTPS
所有DDS-RTPS 發(fā)現(xiàn)的默認(rèn)值都是用這種格式采用的。這個基本配置的不同時指定一部分來抱恨RTPS 發(fā)現(xiàn)的更多定制參數(shù)。下面的歷史使用[common]部分來指向
[]rtps_discovery]部分,跟著一個名為TheRTPSConfig 的實例。
[common]
DCPSDefaultDiscovery=TheRTPSConfig
[rtps_discovery/TheRTPSConfig]
ResendPeriod=5
[rtps_discovery/TheRTPSConfig]實例是和默認(rèn)DDS-RTPS 不同的地方。在我們例子中ResendPeriod=5,實體設(shè)置了可用數(shù)據(jù)讀取者和數(shù)據(jù)寫入者公告的間隔,這也是檢測網(wǎng)絡(luò)上其他數(shù)據(jù)讀取者和數(shù)據(jù)寫入者的間隔。這會修改默認(rèn)值30s 。
6
,如果使用了多個域,
7