雷尼尔是对的。 Connext DDS不会直接传播主题 TopicBuiltinTopicData ;相反,它间接地在 PublicationBuitinTopicData 和 SubscriptionBuiltinTopicData 。这是DDS规范允许的。
TopicBuiltinTopicData
PublicationBuitinTopicData
SubscriptionBuiltinTopicData
有关如何在本HOWTO标题中使用内置主题的信息 检测DDS域中DomainParticipants,DataWriters和DataReader的存在 。 HOWTO包含一些工作示例代码。它是用Java而不是C#,但应该很容易映射。这个示例一次读取一个Sample,因此您不需要处理序列sytax。
你必须使用的原因:
DDS.SampleInfoSeq infoSeq = new DDS.SampleInfoSeq();
代替:
DDS.SampleInfoSeq infoSeq = new DDS.SampleInfoSeq(10);
是读取/获取API具有两种不同的行为取决于传递的序列是“空”(即具有零分配/最大长度)还是具有分配的长度。
如果序列为空,这是你使用默认构造函数得到的,那么read / take表现为零拷贝API。这意味着序列中的实际元素从已存储在中间件内的元素中“借出”。由于这个原因,必须传入的序列必须是一个“空”序列,以便中间件知道可以用对内部元素的引用替换内容。访问元素后,您必须将“借用元素”返回给调用的中间件 DataReader::return_loan 操作。
DataReader::return_loan
如果序列不为空。然后DDS将假设元素已预先分配,并将尝试将数据复制到您传递的元素中。你展示的代码的问题是
只分配序列本身。但不是元素。因此,当尝试进行复制时,读取/接听调用将失败。如果您想使用此非零拷贝API,则必须使用每个元素的分配/分配来跟随调用,即:
for (int i=0; i< 10; i++ ) { infoSeq.set_at(i, new DDS.SampleInfo()); }
同样适用于数据序列。 如果你这样做,你就不必使用了 DataReader::return_loan 操作。但是会有额外的副本,因此效率较低。
您可以在本HOWTO标题中找到有关如何使用DDS序列的更多信息 如何在C ++中使用OMG DDS序列 。它是用C ++示例编写的,但原则适用于所有语言。
问候, 赫拉尔
有了RTI Connext, TopicBuiltinTopic 不像人们预期的那样表现。查看文档 C#API DDS :: TopicBuiltinTopicData类参考 :
TopicBuiltinTopic
注意: DDS_TopicBuiltinTopicData 内置主题意味着传达 有关已发现主题的信息这个主题的样本不是 在线上的单独数据包中传播。而是发送数据 作为其他内置主题所载信息的一部分 ( DDS::PublicationBuiltinTopicData 和 DDS::SubscriptionBuiltinTopicData )。因此 TopicBuiltinTopicData DataReaders不会收到任何数据。
DDS_TopicBuiltinTopicData
DDS::PublicationBuiltinTopicData
DDS::SubscriptionBuiltinTopicData
基本上说的是:由于在Connext中实现发现的方式,您将看不到任何数据 TopicBuiltinTopicData 的DataReader。这是您在代码段中观察到的内容。
幸运的是,仍然可以在总线上获取有关主题的信息。这必须通过PublicationBuiltinTopicData和SubscriptionBuiltinTopicData进行。如果你看看的文档 C#API DDS :: PublicationBuiltinTopicData类参考 ,您可以看到数据包含字符串字段 topic_name 和 type_name 。此外,您可以获取有关类型结构的信息,但这是更高级和特定于实现的。
topic_name
type_name
如果您计划实施“发布和订阅内置主题”的阅读,请注意三点。首先,不要像使用的那样硬编码内置主题的名称 "DCPSTopic" ,最好引用相应的TypeSupport属性,如:
"DCPSTopic"
reader = sub.lookup_datareader( DDS.PublicationBuiltinTopicDataTypeSupport.PUBLICATION_TOPIC_NAME);
然后,很高兴知道使用Connext,内置的DataReader将不包含与内置订阅服务器位于同一DomainParticipant中的出版物或订阅的任何示例。换句话说,您只能看到其他参与者的实体,而不能看到您自己的实体。
最后,在使用代码时,我注意到除非我替换序列的构造函数调用,否则读取样本不起作用,如下所示:
代替
和数据序列相似。我不知道为什么会这样,但它不应该有任何实际意义。