0

我是数据分发服务 (DDS) 的新手。我想知道我们是否可以使用通配符订阅 DDS 中的主题组。这样我就可以一起接收来自具有相似名称的主题的数据。例如,我有 2 个主题 IN_Temperature,NEP_Temperature 有没有办法订阅所有名称为温度的主题

4

1 回答 1

2

这里有2个答案。

(非 XTypes DDS)

它不是那样工作的。

创建主题时,它会绑定到特定的类型。当一个 reader 被实例化时,它被绑定到一个特定的 Topic。无法改变这种行为。允许通配符主题名称意味着中间件需要(在每个 on_data_available 触发器上)交换正确的阅读器。

当然,您可以在应用程序级别的 DDS 基础架构之上实现它,但我不明白这一点。

(X-Types 答案)

它仍然不能那样工作:)

X-Types 还取决于供应商的支持。YMMV。

但是使用 X-Types(DDS 的可扩展类型),您可以构建一个系统,其中类型继承改变了“一个主题一个类型”的要求。

考虑以下 IDL(注意,这是 RTI 风格,而不是 PrismTech,尽管如果您使用的是 X-Types 感知 ddsgen 编译器,这无关紧要):

struct ATemperatureReading {
    float value;
};

struct ATemperatureDevice : ATemperatureReading {
    string<32> deviceId; //@key
    string<64> description;
};

struct IN_T_Type : ATemperatureDevice {
    // additional fields that are specific to an IN_Temperature
    string<16> manuId; //@key
    unsigned long serialno; //@key
};

struct NEP_T_Type : ATemperatureDevice {
    // additional fields that are specific to a NEP_Temperature
    long long nepProvider; //@key
};

现在,您可以创建一个主题“温度读数”,一个订阅者可以使用 NEP_T_Type 阅读器,另一个可以使用 IN_T_Type 阅读器。

在内部,中间件会将所有“温度读数”发送给两个读取器,无论它是 IN_T_Type 写入器还是 NEP_T_Type 写入器。

当 NEP_T 阅读器接收到 IN_T 数据时, nepProvider 字段将为零。当 IN_T 阅读器接收到 NEP_T 数据时,manuID 和 serialNo 字段将为<null>和零。

但其余字段将被填充。您可以将此行为扩展到使用 ATemperatureReading 订阅,并且任何 *_T_Type 温度写入器样本都将仅使用浮点值传递(并且任何附加数据将在接收时被中间件丢弃,即在订阅者端 - 注意带宽使用)。

也可以使用可变类型,但如果是未开发的开发,则不要这样做。我对可变类型感到极度恐惧——我知道它们为什么存在,而且我知道在某些时候我需要使用它们,但是如果你对我说,“嘿!让我们使用可变类型来构建这个新东西吧! " 没有讽刺意味,我会严厉地评判你。为了提供完整的答案,我只包含了这一段。

于 2015-12-19T16:51:08.350 回答