1

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

我的理解是,因为数据键是唯一的,所以这是一个正在写入的主题的新实例,并且使用相同的数据键写入的任何进一步的 msgs 都会发送到该主题的这个特定实例。我的发送代码如下:

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);

非常感谢任何帮助。

4

1 回答 1

2

实现您正在寻找的最简单的方法是使用ContentFilteredTopic. 此类是该类的特化,允许您指定您感兴趣的样本TopicDescription的表达式(如 SQL子句)。WHERE

假设您希望DataReader只接收dest_id等于 42 的样本,那么用于创建的相应代码ContentFilteredTopic将类似于

DDS::ContentFilteredTopic_var cft =
              participant->create_contentfilteredtopic("MyTopic-Filtered",
                                                       topic,
                                                       "dest_id = 42",
                                                       StringSeq());

从那里开始,您创建DataReaderusingcft作为TopicDescription. 生成的阅读器看起来像一个普通的DataReader,除了它只接收所需的样本而没有其他内容。由于该字段dest_id恰好是标识实例的字段,因此最终结果是您的 DataReader 中将只有一个实例。

您可以查看DDS 规范(第 7.1.2.3.3 节)或OpenDDS 开发人员指南(第 5.2 节)以了解更多详细信息。

于 2015-04-20T14:13:10.777 回答