DDS 关键主题
DDS Keyed Topics
我目前在一个系统上使用 RTI DDS,在该系统上我们将有一个主题用于多个项目,例如 car topic
有多个 vin
数字。由于这是我试图制作的设计 "keyed" topic
,它基本上是一个主题,其中有一个成员充当键(有点像数据库中的主键),在这个例子中是 vin
每辆车。为了实现 keyed topics
,我使用了一个 IDL 文件,如下所示,
const string CAR_TOPIC = "CAR";
enum ALARMSTATUS {
ON,
OFF
};
struct keys {
long vin; //@key
string make;
ALARMSTATUS alarm;
};
当我 运行 IDL 文件通过 rtigen
工具制作 C 时,Java,等类型的文件来自 IDL,我唯一能做的就是运行程序,看看
Writing keys, count 0
Writing keys, count 1 ...
和
keys subscriber sleeping for 4 sec...
Received:
vin: 38
make:
alarm : ON
keys subscriber sleeping for 4 sec...
Received:
vin: 38
make:
alarm : ON ...
因此很难看出关键主题是如何工作的,以及它们是否真的有效。有没有人知道如何处理从 IDL 文件生成的文件以使程序功能更强大?此外,我从未看到主题 CAR
,所以我不确定我是否使用了正确的语法来设置 DDS 的主题。
当你说"the only thing I can do is run the program"时,不清楚"the"程序是什么。我不认识你给出的确切输出,所以你是否调整了生成示例的代码?
无论如何,回应你的一些评论:
Thus making it hard to see how the keyed topics work and if they are really working at all.
当您的 DataReader 中同时存在多个实例(即不同的键值)的值时,键的概念最为清晰可见。这相当于拥有一个同时包含多行的数据库 table。因此,为了演示关键概念,您必须将不同的值分配给 DataWriter 端的关键字段和 write()
结果样本。在生成的示例中默认情况下不会发生这种情况,因此您必须调整代码才能实现。
在 DataReader 端,您必须确保存储多个值以演示效果。这意味着您不应执行 take()
(类似于 "destructive read"),而应执行 read()
。这样,DataReader 中值的数量将与您编写的不同键值的数量一致。
请注意,在现实生活中,您不应该永远拥有越来越多的键值,就像您不希望数据库 table 包含越来越多的行一样。
Also I never see the topic CAR so I am not sure I am using the right syntax to set the topic for the DDS.
查看创建主题的代码段。方法名称取决于您使用的语言,但应该包含 create_topic()
之类的内容。该调用的第二个参数是主题的名称。一般来说,你定义的IDL常量CAR_TOPIC
不会自动作为Topic的名字,你必须在代码中注明。
根据您 运行 的示例,您可以尝试 -h
获取一些额外的标志以供使用。您可能能够增加详细程度以查看正在创建的主题的名称,或者在命令行之外设置主题名称。
如果您想验证系统中的主题名称,您可以使用rtiddsspy
来观察数据流。它的输出包括它发现的主题的名称。
我目前在一个系统上使用 RTI DDS,在该系统上我们将有一个主题用于多个项目,例如 car topic
有多个 vin
数字。由于这是我试图制作的设计 "keyed" topic
,它基本上是一个主题,其中有一个成员充当键(有点像数据库中的主键),在这个例子中是 vin
每辆车。为了实现 keyed topics
,我使用了一个 IDL 文件,如下所示,
const string CAR_TOPIC = "CAR";
enum ALARMSTATUS {
ON,
OFF
};
struct keys {
long vin; //@key
string make;
ALARMSTATUS alarm;
};
当我 运行 IDL 文件通过 rtigen
工具制作 C 时,Java,等类型的文件来自 IDL,我唯一能做的就是运行程序,看看
Writing keys, count 0
Writing keys, count 1 ...
和
keys subscriber sleeping for 4 sec...
Received:
vin: 38
make:
alarm : ON
keys subscriber sleeping for 4 sec...
Received:
vin: 38
make:
alarm : ON ...
因此很难看出关键主题是如何工作的,以及它们是否真的有效。有没有人知道如何处理从 IDL 文件生成的文件以使程序功能更强大?此外,我从未看到主题 CAR
,所以我不确定我是否使用了正确的语法来设置 DDS 的主题。
当你说"the only thing I can do is run the program"时,不清楚"the"程序是什么。我不认识你给出的确切输出,所以你是否调整了生成示例的代码?
无论如何,回应你的一些评论:
Thus making it hard to see how the keyed topics work and if they are really working at all.
当您的 DataReader 中同时存在多个实例(即不同的键值)的值时,键的概念最为清晰可见。这相当于拥有一个同时包含多行的数据库 table。因此,为了演示关键概念,您必须将不同的值分配给 DataWriter 端的关键字段和 write()
结果样本。在生成的示例中默认情况下不会发生这种情况,因此您必须调整代码才能实现。
在 DataReader 端,您必须确保存储多个值以演示效果。这意味着您不应执行 take()
(类似于 "destructive read"),而应执行 read()
。这样,DataReader 中值的数量将与您编写的不同键值的数量一致。
请注意,在现实生活中,您不应该永远拥有越来越多的键值,就像您不希望数据库 table 包含越来越多的行一样。
Also I never see the topic CAR so I am not sure I am using the right syntax to set the topic for the DDS.
查看创建主题的代码段。方法名称取决于您使用的语言,但应该包含 create_topic()
之类的内容。该调用的第二个参数是主题的名称。一般来说,你定义的IDL常量CAR_TOPIC
不会自动作为Topic的名字,你必须在代码中注明。
根据您 运行 的示例,您可以尝试 -h
获取一些额外的标志以供使用。您可能能够增加详细程度以查看正在创建的主题的名称,或者在命令行之外设置主题名称。
如果您想验证系统中的主题名称,您可以使用rtiddsspy
来观察数据流。它的输出包括它发现的主题的名称。