我正在使用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);
任何帮助非常感谢。
实现所需内容的最简单方法是使用 ContentFilteredTopic
.此类是 TopicDescription
类的专用化,允许您指定您感兴趣的示例的表达式(如 SQL WHERE
-子句)。
假设您希望DataReader
仅接收dest_id
等于 42 的示例,则用于创建ContentFilteredTopic
的相应代码将如下所示
DDS::ContentFilteredTopic_var cft =
participant->create_contentfilteredtopic("MyTopic-Filtered",
topic,
"dest_id = 42",
StringSeq());
从那里开始,您可以使用cft
作为TopicDescription
的参数来创建DataReader
。生成的阅读器看起来像一个普通的DataReader
,除了它只接收所需的样本,没有其他任何东西。由于字段dest_id
恰好是标识实例的字段,因此最终结果是 DataReader 中只有一个实例。
您可以查看 DDS 规范(第 7.1.2.3.3 节)或 OpenDDS 开发人员指南(第 5.2 节)以获取更多详细信息。