如何使用通配符订阅一组相似的 DDS 主题

Posted

技术标签:

【中文标题】如何使用通配符订阅一组相似的 DDS 主题【英文标题】:How to subscibe to group of similar DDS topics using wildcard 【发布时间】:2015-12-19 11:39:23 【问题描述】:

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

【问题讨论】:

【参考方案1】:

这里有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 字段将为&lt;null&gt; 和零。

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

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

【讨论】:

以上是关于如何使用通配符订阅一组相似的 DDS 主题的主要内容,如果未能解决你的问题,请参考以下文章

MQTT通配符

Mqtt 客户端多主题订阅

通过案例理解 MQTT 主题与通配符

如何使用 kafka-python 订阅多个 kafka 通配符模式的列表?

如何使用通配符导入多个具有相似工作表名称的 Excel 文件?

MOOS通配符订阅