我正在使用OpenDDS v3.6,并尝试向特定的DDS对等体发送消息,其中之一就是其中之一。在IDL中,消息结构如下所示:
module Test
{
#pragma DCPS_DATA_TYPE "Test::MyMessage"
#pragma DCPS_DATA_KEY "Test::MyMessage dest_id"
struct MyMessage {
short dest_id;
string txt;
};
};
我的理解是,因为数据键是唯一的,所以这是正在写入的主题的新实例,并且使用相同数据键写入的任何其他消息发送到该主题的该特定实例。我的发送代码如下:
DDS::ReturnCode_t ret;
Test::MyMessage msg;
// populate msg
msg.dest_id = n;
DDS::InstanceHandle_t handle;
handle = msg_writer->register_instance(msg);
ret = msg_writer->write(msg, handle);
所以现在我需要弄清楚如何让接收对等体只从该主题实例中读取,而不是接收发送给其他对等体的所有其他消息。我从以下开始,但不确定如何正确选择特定的主题实例。
DDS::InstanceHandle_t instance;
status = msg_dr->take_next_instance(spec, si, 1, DDS::ANY_SAMPLE_STATE,
DDS::ANY_VIEW_STATE, DDS::ANY_INSTANCE_STATE);
任何帮助都非常感激。
答案 0 :(得分:2)
实现所需目标的最简单方法是使用ContentFilteredTopic
。此类是TopicDescription
类的特化,允许您指定您感兴趣的样本的表达式(如SQL WHERE
- 子句)。
假设您希望DataReader
仅接收dest_id
等于42的样本,那么创建ContentFilteredTopic
的相应代码将类似于
DDS::ContentFilteredTopic_var cft =
participant->create_contentfilteredtopic("MyTopic-Filtered",
topic,
"dest_id = 42",
StringSeq());
从那时起,您使用DataReader
作为cft
的参数创建TopicDescription
。生成的阅读器看起来像常规DataReader
,除了它只接收所需的样本而没有其他内容。由于字段dest_id
恰好是标识实例的字段,因此最终结果是您的DataReader中只有一个实例。
您可以查看DDS specification(第7.1.2.3.3节)或OpenDDS Developer's Guide(第5.2节)了解更多详情。