0

我想了解当删除 DataWriter 时,为什么 OpenDDS 会重新发送相同的最后一个数据 n 次(其中 n 是已发送的消息数)?

这是我错过的特定 QoS 的影响吗?

我做了一个小测试的输出:

Received data ! ID = 0 Text = Hello world !
Received data ! ID = 1 Text = Hello world !
Received data ! ID = 2 Text = Hello world !
Received data ! ID = 3 Text = Hello world !
Received data ! ID = 4 Text = Hello world !
Received data ! ID = 5 Text = Hello world !
Received data ! ID = 6 Text = Hello world !
Received data ! ID = 7 Text = Hello world !
Received data ! ID = 8 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !

在该示例中,我们清楚地看到 DataReader 发送和接收了 10 条消息。然后,一旦 DataWriter 被删除(或在删除期间?),将出现 10 次重复收到的最后一条消息。

4

2 回答 2

0

在网上搜索,我找到了自己问题的答案:

事实上,在DataSample. 该valid_data标志可用于识别是否DataSample有数据。

这些空DataSample的符号化通知是在 OpenDDS 内部状态变化时DataWriter发出的。它们不应被阅读,而应被视为通知。

于 2017-01-13T12:48:49.133 回答
0

尽管我没有专门使用 OpenDDS 的经验,但我想扩展您自己的答案,这对我来说似乎并不完全正确。我以DDS 规范中描述的机制为基础。

当 DataWriter 关闭时,这些空的 DataSample 象征着 OpenDDS 内部状态变化的通知。

根据 DDS 规范,销毁 DataWriter 会导致注销其所有实例。取消注册意味着实例的状态从 ALIVE 更改为 NOT_ALIVE。这些状态更改不像您所写的那样“内部”,而是旨在对任何感兴趣的人可见。订阅应用程序可以通过检查结构instance_state中的字段来了解这一点SampleInfo

在您的情况下,您编写了 10 个实例(键值),因此 DataWriter 的销毁导致了 10 次更新,每个更新都表明先前发布的实例的状态发生了变化。

它们不应被阅读,而应被视为通知。

由于这些更新仅指示实例状态的更改,因此该valid_data标志被清除,实际上不应读取它们的数据字段。但是,仍然可以通过在相关 DataReader 上调用get_key_value()InstanceHandle_t并将在结构字段instance_handle中找到的值传递给它来确定更新是关于哪个实例的SampleInfoID如果你这样做了,那么你会注意到在你的情况下,从 0 到 9都会有一个通知。

于 2017-01-13T20:42:44.577 回答