仅从特定DDS主题实例接收消息?

时间:2015-04-19 21:37:24

标签: ace data-distribution-service tao

我正在使用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);

任何帮助都非常感激。

1 个答案:

答案 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节)了解更多详情。