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

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

【问题讨论】:

    标签: data-distribution-service opensplice


    【解决方案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 温度写入器样本都将仅使用浮点值传递(并且任何附加数据将在接收时被中间件丢弃,即在订阅者端 - 注意带宽使用)。

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

    【讨论】:

      猜你喜欢
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2019-06-28
      • 1970-01-01
      相关资源
      最近更新 更多