DDS开发规范的一些理解
7发现配置在DDS 实现中,参与者参与到应用程序中,必须发现其他参与者。DDS 使用了domain (域)给数据当DDS 应用程序写入,参与者链接到域,同时需要确保他们的配置允许每一个参与者来发现其他
7发现配置
在DDS 实现中,参与者参与到应用程序中,必须发现其他参与者。DDS 使用了domain (域)给数据当DDS 应用程序写入,参与者链接到域,同时需要确保他们的配置允许每一个参与者来发现其他统一个域的参与者。
DDS 提供了一个中心发现方法和点对点发现方法来完成同一个域中的参与者。中心模式使用一个独立的服务—DCPSInfoRepo 服务,点对点模式使用DDS-RTPS 发现协议标准来达到无中心的发现。使用任何一种方法的应用程序能够使用多维配置属性来满足实现需求。每一种方法都提供了默认配置,如果没有通过命令行或者配置文件进行配置的话。 如何细化配置达到更好的发现性能。使用多个DCPSInfoRepo 服务,或者需要使用DDS-RTPS 来满足互操作要求,为了达到这个目的,可以联合使用[domain] [repository]和
[rtps_discovery]。
7.3.1域配置
OpenDDS 配置文件使用[domain]部分来配置一个或者多个发现域,每一个域在同一个文件中指定一个发现配置。OpenDDS 应用程序可以使用基于DCPSInfoRepo 服务的中心发现模式,或者基于DDS-RTPS 发现协议标准的点对点发现方法,或者这两种方法的结合。DCPSInfoRepo 方法对应的类型是[rtps_discovery],一个单独域只能使用一种类型的发现。
看7.3.2和7.3.3查看更多[repository]和[rtps_discovery]的配置属性。
一个域可以跟一个整数联系起来,配置文件可以在两种方法支持他。第一种方法是简单的是例子值和域联系起来,例如:
[domain/1]
DiscoveryConfig=DiscoveryConfig1
(more properties...)
我们的例子使用域关键字来标识域,这个关键字是/1.斜线后面的数值是和域连系的整数值。另一个可选的方法是使用更加容易识别的名字,增加DomainId 属性,同时给它赋值。
[domain/books]
DomainId=1
DiscoveryConfig=DiscoveryConfig1
这个域使用books 名字,DomainId 赋值1,DDS 应用需要这个数值来读取配置。多个域实例可以在一个配置文件中使用这种方式进行区分。
一旦一个或者多个域实例已经确定,这个域的发现属性必须确定。在我们以上的例子
1
,中,属性DiscoveryConfig 必须指向另外还有发现属性的section ,或者指定发现的内置变量(DEFAULT_REPO或者DEFAULT_RTPS)例子名字是DiscoveryConfig1。例子名字必须和
[repository] or[rtps_discovery]联系。
我们例子的扩展:
[domain/1]
DiscoveryConfig=DiscoveryConfig1
[repository/DiscoveryConfig1]
RepositoryIor=host1.mydomain.com:12345
在这个例子中我们的域指向[repository],这用来OpenDDS DCPSInfoRepo服务。可以看7.3.2.
或者 有一些情况,当特定域并没有在配置文件中指定。例如,如果一个OpenDDS 应用将域ID3分给他的参与者,上面的例子不支持域ID 为3的配置,下面可以用:
[common]
DCPSInfoRepo=host3.mydomain.com:12345
DCPSDefaultDiscovery=DEFAULT_REPO
[domain/1]
DiscoveryConfig=DiscoveryConfig1
[repository/DiscoveryConfig1]
RepositoryIor=host1.mydomain.com:12345
DCPSDefaultDiscovery 属性告诉应用如果参与者没有指定域ID 的话就给他指定
DEFAULT_REPO发现类型,意思是使用DCPSInfoRepo 服务,这个DCPSInfoRepo 服务可以在host3.mydomain.com:12345找到。
表7-2中,DCPSDefaultDiscovery 属性还有两个数值可以用。DEFAULT_RTPS连续值通知应用来告诉在文件中没有域配置的参与者使用RTPS 发现来发现参与者。
DCPSSefaultiscovery 属性的最后选项告诉应用来应用使用其中一种已经定义的配置作为默认配置提供给那些没有在文件中定义的参与域。这里有一个例子:
[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的配置。更多关于RTPS 发现的类似配置参看7.3.3。
这是[domain]可用的属性。
2
,7.3.2配置应用程序的DCPSInfoRepo
一个OpenDDS DCPSInfoRepo是一个用来参与者发现的本地或者远程节点。配置参与者应该如何发现DCPSInfoRepo 是本节的目的。假设DCPSInfoRepo 服务已经在
myhost.mydomain.com:12345上启动。应用程序可以是他们的OpenDDS 参与者通过命令行选项或者配置文件发现这个服务。
在我们2.1.7节的“Running the Example”我们使用命令行参数来发现DCPSInfoRepo 服务:
Publisher –DCPSInfoRepo
这里假设DCPSInfoRepo 用下面语句启动:
$DDS_ROOT/bin/DCPSInfoRepo –o repo.ior
DCPSInfoRepo 服务在这个文件中产生他的位置对象信息,参与者需要读取这个文件来进行连接。基于IORs 的文件的使用来寻找发现服务,然而在大多数环境中无效,所以应用程序使用命令行选项来拿简单的指定运行DCPSInfoRepo 服务的主机和端口:
Publisher –DCPSInfoRepo myhost.mydomain.com:12345
上面假设DCPSInfoRepo 已经在主机(myhost.mydomain.com)上启动:
$DDS_ROOT/bin/DCPSInfoRepo –ORBListenEndpoints iiop://:12345
如果应用需要对另外的设置使用配置文件,应该讲发现内容放到文件中,来降低命令行的复杂性。配置文件的使用同时能够使多个应用共享通用的OpenDDS 配置。上面的例子可以移动到配置文件的[common]部分:
[common]
DCPSInfoRepo=myhost.mydomain.com:12345
命令行将变成如下:
publisher –DCPSInfoRepo pub.ini
3
我们再来看7.3.1中的例子,配置文件可以指定域和与这些域相关联的发现配置。这种情况下RepositoryIor 属性将和命令行表达同一个信息,即指定一个运行的DCPSInfoRepo 服务。两个域的配置如下:
[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。
最终,当定义了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 的发现属性,这个在[common]中已经定义。如果DCPSInfoRepo 的值没有在[common]中提供,将会在命令行中当做一个参数提供:
publisher -DCPSInfoRepo localhost:12345 -DCPSConfigFile pub.ini
这样设定了DCPSInfoRepo 的值,如果参与者在pub.ini 文件中读到了DEFAULT_REPO,这有一个值。如果DCPSInfoRepo 没有在配置文件和命令行中定义,那么他的默认值是file :/repo.ior。如前所述,这在应用环境中不能很有效,所以需要通过其中一种方法设定DCPSInfoRepo 的值。
7.3.2.1 配置多个DCPSInfoRepo 实例
一个DDS 程序中的DDS 实体可以关联多个DCPS 信息库(DCPSInfoRepo )。
库信息和域关联能够使用配置文件或者通过应用程序API 进行配置。内部默认、命令行参数和配置文件选项会起作用,就像现有应用一样,这些应用不想使用多DCPSInfoRepo 关联。
参考图7-2,一个进行使用多个DCPSInfoRepo 库。Process A和B 都是配置了进行相互通信,并且在InfoRepo_1中发现其他。这是基本发现的简单应用。然而,随着特定域(Domain
1)的使用,上下文的额外层被部署。DDS 实体(data readers/data writers)被限制在同一个域中和其他实体通信。者提供了一个分割交通的有效方式。Process C和D 配置了相同的方
4
,式,运行在域2中,使用InfoRepo_2。当有一个应用进行需要使用多个域和不同的发现服务时就遇到了问题。这就是例子中的Process E。它有两个订阅者,一个订阅者从InfoRepo_1发布,一个从InfoRepo_2。可以从配置文件configE.ini 中查看如何这样工作。
下面是配置文件,只展示发现部分,不显示传输内容。 [domain/1]
DiscoveryConfig=DiscoveryConfig1
[repository/DiscoveryConfig1]
RepositoryIor=host1.mydomain.com:12345
[domain/2]
DiscoveryConfig=DiscoveryConfig2
[repository/DiscoveryConfig2]
RepositoryIor=host2.mydomain.com:12345
Process E读到这个配置文件会发现多个domian 部分。每一个域都有一个整数和一个定义的DiscoveryConfig 。
对第一个域([domain/1]),DiscoveryConfig 属性是用户定义的DiscoveryConfig1值。这个属性使得OpenDDS 实例去寻找repository 或者 rtps_discovery这样的标示和
DiscoveryConfig1。在我们的例子中,找到了[repository/DiscoveryConfig1],这就是域[domain/1]的发现配置。这部分告诉我们这个域使用的DCPSInfoRepo 的地址可以通过RepositoryIor 属性得到。这里他是host1.mydomain.com ,端口12345。RepositoryIor 值可以是一个完整的CORBA IOR或者简单主机:端口。
第二个域名字为[domain/2],相应的库部分[repository/DiscoveryConfig2]标示第二个域的配置和InfoRepo_2库。在一个配置文件中可以有任意数量的域部分或者库。
5
,没有详细配置的域都被关联到默认发现配置上。
每个DCPSInfoRepo 可以连接到多个域,然而一个域不能共享给多个DCPSInfoRepo 。
这里是[repository]部分的合法属性。
7.3.3 DDS-RTPS发现配置
OMG DDS-RTPS规范给了下面例子来说明OpenDDS 使用的发现方法,还有两种不同的协议来完成发现操作。引用8.5.1节如下:
RTPS 把发现协议划分为两个独立协议
1、参与者发现协议
2、终端发现协议
参与者发现协议(PDP )说明了在一个网络中参与者如何发现彼此。一旦两个参与者发现彼此,他们在终端使用终端发现协议(EDP )来交换信息。排除这种因果关系,两种协议都是成熟的
这节讨论的配置选项允许用户指定属性值来改变简单参与者发现协议(SPDP )的行为和检点终端发现协议(SEDP )默认设置。
DDS-RTPS 的发现配置可以用简单的简单基本发现来完成,或者是用在7.3.1中的域。 简单配置通过在我们的例子配置文件的[common]中指定属性来实现。
configE.ini (for RTPS)
[common]
DCPSDefaultDiscovery=DEFAULT_RTPS
所有DDS-RTPS 发现的默认值都是用这种格式采用的。这个基本配置的不同时指定一部分来抱恨RTPS 发现的更多定制参数。下面的历史使用[common]部分来指向
[]rtps_discovery]部分,跟着一个名为TheRTPSConfig 的实例。
[common]
DCPSDefaultDiscovery=TheRTPSConfig
[rtps_discovery/TheRTPSConfig]
ResendPeriod=5
[rtps_discovery/TheRTPSConfig]实例是和默认DDS-RTPS 不同的地方。在我们例子中ResendPeriod=5,实体设置了可用数据读取者和数据写入者公告的间隔,这也是检测网络上其他数据读取者和数据写入者的间隔。这会修改默认值30s 。
6
,如果使用了多个域,
7