如何使用通配符对类似的DDS主题进行分组

时间:2015-12-19 11:39:24

标签: data-distribution-service opensplice

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

1 个答案:

答案 0 :(得分:2)

这里有2个答案。

(非XTypes DDS)

它不会那样工作。

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

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

(X型回答)

它仍然没有那样工作:)

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
};

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

在内部,中间件将发送所有&#34;温度读数&#34;对于两个读者,无论是IN_T_Type编写者还是NEP_T_Type编写者。

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

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

也可以使用可变类型,但如果是绿地开发,则不要这样做。我看着可怕的类型,有着可怕的恐怖 - 我知道他们为什么会在那里,我知道我需要在某些时候使用它们,但如果你对我说,&#34;嘿!让我们使用可变类型构建这个新东西!&#34;没有讽刺意味,我会严厉地评判你。为了提供完整的答案,我只提供了这一段。