OpenDDS 和发布者存在通知

Posted

技术标签:

【中文标题】OpenDDS 和发布者存在通知【英文标题】:OpenDDS and notification of publisher presence 【发布时间】:2009-12-10 07:47:41 【问题描述】:

问题:如何获取展位发布者连接和断开的活跃度通知?

背景: 我正在使用 OpenDDS 实现,其中我有一个数据类型 (dt) 的发布者和订阅者,使用相同的主题,位于不同的计算机上。

订阅方的阅读器已覆盖 on_data_available(...)on_liveliness_changed(...) 的实现。我的订阅者首先启动,导致对on_liveliness_changed(...) 的回调,表示没有可用的作者。当发布者启动时,我得到一个新的回调,告诉我有一个可用的作者,当发布者发布时,on_data_available(...) 被调用。到目前为止,一切都按预期工作。

发布者上的作者具有on_publication_matched(...) 的覆盖实现。启动发布者时,on_publication_matched(...) 会被调用,因为我们已经启动了订阅者。

问题是当发布者断开连接时,我在阅读器端没有收到on_liveliness_changed(...)的回调,当发布者再次启动时我也没有收到新的回调。

我尝试通过设置readerQos.liveliness.lease_duration 来更改 readerQos。 但结果是 on_data_available(...) 永远不会被调用,而对 on_liveliness_changed(...) 的唯一回调是在启动时,告诉我没有发布者。

DDS::DataReaderQos readerQos;
DDS::StatusKind mask = DDS::DATA_AVAILABLE_STATUS | DDS::LIVELINESS_CHANGED_STATUS |  DDS::LIVELINESS_LOST_STATUS ; 
m_subscriber->get_default_datareader_qos( readerQos );
DDS::Duration_t t =  3, 0 ;
readerQos.liveliness.lease_duration = t;
m_binary_Reader = static_cast<binary::binary_tdatareader( m_subscriber->create_datareader(m_Sender_Topic,readerQos,this, mask, 0, false) );

/克里斯托弗

【问题讨论】:

【参考方案1】:

好吧,估计这里的 DDS 用户不多。

经过一些研究,我发现只有在满足以下兼容性标准时才会发生读取器/写入器匹配:提供的租约持续时间

解决方案是设置 writer QoS 以提供相同的活力。可能有一种方法可以检查请求的读取器 QoS 是否可以由相应的写入器提供,如果没有,请使用“较低”的 QoS,我还没有尝试过。

在 on_liveliness_changed 回调方法中,我只是评估了 LivelinessChangedStatus 中的 alive_count。

/克里斯托弗

【讨论】:

以上是关于OpenDDS 和发布者存在通知的主要内容,如果未能解决你的问题,请参考以下文章

Opendds-3.13 发布构建失败

我们可以使用 Opendds 发送图像文件或视频文件吗?

如何使 OpenDDS DCPSInfoRepo 持久化?

opendds TAO_IDL_GEN、OpenDDS_XML_QOS_XSC_Generation 和其他跳过的包

OpenDDS IDL 序列类型

在 IDL 文件上使用 opendds_idl 工具时出现致命错误 C1083