DDS键控主题

时间:2015-01-21 16:49:41

标签: publish-subscribe idl data-distribution-service

我目前正在系统中使用 RTI DDS ,我们将为多个项目提供一个主要主题,例如car topic包含多个vin个数字。因为这是我试图设计的"keyed" topic,它基本上是一个成员充当密钥的主题(有点像数据库中的主键),在本例中是{{1}。每辆车的1}}要实施vin我正在使用 IDL 文件,如下所示,

keyed topics

当我通过const string CAR_TOPIC = "CAR"; enum ALARMSTATUS { ON, OFF }; struct keys { long vin; //@key string make; ALARMSTATUS alarm; }; 工具运行 IDL 文件来制作来自 IDL 的C,Java等文件时,我唯一能做的就是do运行程序并查看

rtigen

Writing keys, count 0
Writing keys, count 1 ...

因此很难看出关键主题是如何运作的,以及它们是否真正起作用。有没有人有任何输入如何处理从 IDL 文件生成的文件,以使程序更实用?此外,我从未看到主题keys subscriber sleeping for 4 sec... Received: vin: 38 make: alarm : ON keys subscriber sleeping for 4 sec... Received: vin: 38 make: alarm : ON ... 所以我不确定我是否使用正确的语法为DDS设置主题。

1 个答案:

答案 0 :(得分:1)

当你说“我唯一可以做的就是运行程序”时,不清楚“程序”是什么。我不认识你给出的确切输出,所以你调整了生成的例子的代码吗?

无论如何,回应你的一些评论:

  

因此很难看出关键主题是如何运作的,以及它们是否真正起作用。

当您在DataReader中同时存在多个实例(即不同的键值)的值时,键的概念最清晰可见。这与具有同时包含多个行的数据库表相当。因此,为了演示关键概念,您必须为DataWriter端的关键字段分配不同的值,并为结果样本分配write()。默认情况下,在生成的示例中不会发生这种情况,因此您必须调整代码才能实现此目的。

在DataReader方面,您必须确保保留多个值以证明效果。这意味着您不应该take()(类似于“破坏性阅读”),而是read()。这样,DataReader中的值的数量将随着您编写的不同键值的数量而增长。

请注意,在现实生活中,您不应该永远拥有越来越多的键值,就像您不希望数据库表包含越来越多的行一样。

  

此外,我从未看过主题CAR,所以我不确定我是否使用正确的语法为DDS设置主题。

查看创建主题的代码段。方法名称取决于您使用的语言,但其中应包含create_topic()。该调用的第二个参数是主题的名称。通常,您定义的IDL常量CAR_TOPIC不会自动用作主题的名称,您必须在代码中指明。

根据您运行的示例,您可以尝试使用-h来获取一些额外的标志。您可以增加详细程度以查看正在创建的主题的名称,或者从命令行设置主题名称。

如果要验证系统中主题的名称,可以使用rtiddsspy来观看数据流动。它的输出包括它发现的主题的名称。