我目前正在系统中使用 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设置主题。
答案 0 :(得分:1)
当你说“我唯一可以做的就是运行程序”时,不清楚“程序”是什么。我不认识你给出的确切输出,所以你调整了生成的例子的代码吗?
无论如何,回应你的一些评论:
因此很难看出关键主题是如何运作的,以及它们是否真正起作用。
当您在DataReader中同时存在多个实例(即不同的键值)的值时,键的概念最清晰可见。这与具有同时包含多个行的数据库表相当。因此,为了演示关键概念,您必须为DataWriter端的关键字段分配不同的值,并为结果样本分配write()
。默认情况下,在生成的示例中不会发生这种情况,因此您必须调整代码才能实现此目的。
在DataReader方面,您必须确保保留多个值以证明效果。这意味着您不应该take()
(类似于“破坏性阅读”),而是read()
。这样,DataReader中的值的数量将随着您编写的不同键值的数量而增长。
请注意,在现实生活中,您不应该永远拥有越来越多的键值,就像您不希望数据库表包含越来越多的行一样。
此外,我从未看过主题CAR,所以我不确定我是否使用正确的语法为DDS设置主题。
查看创建主题的代码段。方法名称取决于您使用的语言,但其中应包含create_topic()
。该调用的第二个参数是主题的名称。通常,您定义的IDL常量CAR_TOPIC
不会自动用作主题的名称,您必须在代码中指明。
根据您运行的示例,您可以尝试使用-h
来获取一些额外的标志。您可以增加详细程度以查看正在创建的主题的名称,或者从命令行设置主题名称。
如果要验证系统中主题的名称,可以使用rtiddsspy
来观看数据流动。它的输出包括它发现的主题的名称。