DDS 键控主题
Posted
技术标签:
【中文标题】DDS 键控主题【英文标题】:DDS Keyed Topics 【发布时间】:2015-01-21 16:49:41 【问题描述】:我目前在一个系统上使用 RTI DDS,我们将为多个项目设置一个主题,例如带有多个 vin
号码的 car topic
。由于这是我正在尝试制作的设计,因此我尝试创建一个 "keyed" topic
,它基本上是一个主题,其中有一个成员充当键(有点像数据库中的主键),在本例中将是 vin
每辆车。为了实现keyed topics
,我使用了一个 IDL 文件,如下所示,
const string CAR_TOPIC = "CAR";
enum ALARMSTATUS
ON,
OFF
;
struct keys
long vin; //@key
string make;
ALARMSTATUS alarm;
;
当我通过 rtigen
工具运行 IDL 文件以从 IDL 制作 C、Java 等类型的文件时,我唯一能做的就是运行程序看看
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 设置主题。
【问题讨论】:
【参考方案1】:当你说“我唯一能做的就是运行程序”时,不清楚“该”程序是什么。我无法识别您给出的确切输出,所以您是否调整了生成示例的代码?
无论如何,回应你的一些言论:
因此很难看出关键主题是如何运作的,以及它们是否真的有效。
当 DataReader 中同时存在多个实例的值(即不同的键值)时,键的概念最清晰可见。这相当于拥有一个同时包含多行的数据库表。因此,为了演示关键概念,您必须为 DataWriter 端的关键字段和 write()
结果样本分配不同的值。这在生成的示例中默认不会发生,因此您必须调整代码才能实现。
在 DataReader 方面,您必须确保保留多个值以展示效果。这意味着您不应执行take()
(类似于“破坏性读取”),而应执行read()
。这样,您的 DataReader 中的值的数量将随着您写入的不同键值的数量而增长。
请注意,在现实生活中,您不应该永远拥有越来越多的键值,就像您不希望数据库表包含越来越多的行一样。
此外,我从来没有看到主题 CAR,所以我不确定我是否使用正确的语法来为 DDS 设置主题。
查看创建主题的代码。方法名称取决于您使用的语言,但应该包含 create_topic()
之类的内容。该调用的第二个参数是主题的名称。一般情况下,您定义的IDL常量CAR_TOPIC
不会自动作为Topic的名称,需要在代码中注明。
根据您正在运行的示例,您可以尝试-h
来获取一些额外的标志来使用。您也许可以增加详细程度以查看正在创建的主题的名称,或者将主题名称设置为关闭命令行。
如果您想验证系统中的主题名称,您可以使用rtiddsspy
来观察数据流动。它的输出包括它发现的主题的名称。
【讨论】:
对不起,我的意思是有一个**classname**Publisher.java
,默认情况下我对文件真正能做的就是运行那个发布者类。所以基本上我必须加入这些类并使用它们听起来像。它是一种像 jaxb 这样的类生成器,每个都说它们不是用来运行程序而是补充你想做的事情?
OK - 请注意,此**classname**Publisher.java
纯粹是为您提供的示例。它不应该在您的应用程序中使用。如果您想了解该示例中的不同代码块,我建议您查看参考手册中“模块”部分中的“编程方法”部分。见community.rti.com/rti-doc/500/ndds/doc/html/api_java
啊,好的,谢谢。我知道我做对了,但不确定生成类后该做什么,这很有帮助。所以如果我喜欢正确的话,我可以覆盖那里的内容和读者?
是的,您可以覆盖其中的内容。当您再次运行make
时,请注意不要丢失您的修改。例如,当您更改 IDL 时,将重新生成其所有依赖项,包括示例类。虽然我认为默认情况下,它会拒绝覆盖现有文件。
是的。你还知道 rti 使用的 idl 语法的好资源吗?以上是关于DDS 键控主题的主要内容,如果未能解决你的问题,请参考以下文章