我是数据分发服务(DDS)的新手。我想知道我们是否可以使用通配符订阅DDS中的一组主题。这样我就可以一起接收来自同名主题的数据。例如,我有两个主题IN_Temperature,NEP_Temperature是否有一种方法可以订阅名称为的所有主题
这里有两个答案。
(非XTypes DDS)
这样不行。
创建主题时,该主题将绑定到特定类型。当一个阅读器被实例化时,它被绑定到一个特定的Topic。无法改变这种行为。允许使用通配符主题名称意味着中间件需要(在每个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
};
现在,您可以创建一个主题"温度读数",一个订阅者可以使用NEP__Type阅读器,另一个订阅者则可以使用IN_Type阅读器。
在内部,中间件将向两个读取器发送所有"温度读数",无论它是IN_T_Type写入器还是NEP_Type写入器。
当NEP_T读卡器接收到IN_T数据时,nepProvider字段将为零。当IN_T读卡器接收到NEP_T数据时,manuID和serialNo字段将为<null>
和零。
但剩余的字段将被填充。您可以将此行为扩展到使用ATemperatureReading进行订阅,并且任何*_Type温度写入程序样本都将只传递浮点值(并且任何附加数据都将在收到时被中间件丢弃,也就是说,在订阅方,请注意带宽使用情况)。
也可以使用可变类型,但如果是绿地开发,就不要这样做。我对可变类型感到极度恐惧——我知道它们为什么存在,我知道在某个时候我需要使用它们,但如果你对我说,"嘿!让我们用可变类型来构建这个新东西!"而不是讽刺,我会严厉地评判你。我之所以列入这一段,只是为了提供一个完整的答案。