仅接收来自特定 DDS 主题实例的消息?

Receive messages only from a specific DDS topic instance?

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

所以现在我需要弄清楚如何让接收端只读取这个主题实例,而不接收发送给其他端点的所有其他消息。我从以下开始,但不确定如何正确 select 特定主题实例。

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

非常感谢任何帮助。

实现您的目标的最简单方法是使用 ContentFilteredTopic。 class 是 TopicDescription class 的特例,允许您指定样本的表达式(如 SQL WHERE-子句)有兴趣。

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

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

从那时起,您使用 cft 作为 TopicDescription 的参数创建 DataReader。生成的 reader 看起来像一个常规的 DataReader,除了它只接收所需的样本而没有其他任何东西。由于字段 dest_id 恰好是标识实例的字段,因此最终结果是您的 DataReader 中将只有一个实例。

您可以查看 DDS specification (section 7.1.2.3.3) or OpenDDS Developer's Guide(第 5.2 节)了解更多详情。