1

我目前在一个系统上使用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 制作 C、Java 等文件的工具运行IDL文件,我唯一能做的就是运行程序并查看 rtigen

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 设置主题。

4

1 回答 1

1

当您说“我唯一能做的就是运行程序”时,不清楚“该”程序是什么。我无法识别您给出的确切输出,所以您是否调整了生成示例的代码?

无论如何,回应您的一些言论:

因此,很难看出关键主题是如何工作的,以及它们是否真的有效。

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

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

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

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

查看创建主题的代码。方法名称取决于您使用的语言,但应该包含类似create_topic()的内容。该调用的第二个参数是主题的名称。一般情况下,您定义的 IDL 常量CAR_TOPIC不会自动用作 Topic 的名称,您必须在代码中注明。

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

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

于 2015-01-21T17:53:49.117 回答