如何使用通配符订阅一组相似的 DDS 主题
How to subscibe to group of similar DDS topics using wildcard
我是数据分发服务 (DDS) 的新手。我想知道我们是否可以使用通配符订阅 DDS 中的主题组。这样我就可以一起接收来自具有相似名称的主题的数据。
例如,我有 2 个主题 IN_Temperature,NEP_Temperature 有没有一种方法可以订阅名称为 temperature
的所有主题
这里有 2 个答案。
(非 X 类型 DDS)
这样不行。
创建主题时,它会绑定到特定类型。当 reader 被实例化时,它被绑定到一个特定的主题。无法改变这种行为。允许通配符主题名称意味着中间件需要(在每个 on_data_available 触发器上)交换正确的 reader。
当然,您可以在 DDS 基础架构之上,在应用程序级别实现它,但我不明白这一点。
(X 型答案)
这样还是不行:)
X-Types 还取决于供应商的支持。 YMMV.
但是使用 X-Types(DDS 的可扩展类型)您可以构建一个系统,类型继承改变了 "one Type for one Topic" 要求。
考虑以下 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
};
现在,您可以创建主题 "Temperature Readings",一个订阅者可以使用 NEP_T_Type reader,另一个订阅者可以使用 IN_T_Type reader .
在内部,中间件会将所有 "Temperature Readings" 发送到两个 readers,无论它是 IN_T_Type 编写器还是 NEP_T_Type 编写器。
当NEP_T reader 收到IN_T 数据时,nepProvider 字段将为零。
当 IN_T reader 接收到 NEP_T 数据时,manuID 和 serialNo 字段将为 <null>
和零。
但其余字段将被填充。您可以将此行为扩展为使用 ATemperatureReading 进行订阅,并且任何 *_T_Type 温度编写器样本都将仅使用浮点值传递(并且任何其他数据将在接收时被中间件丢弃,即在订阅者端-- 注意带宽使用)。
也可以使用可变类型,但如果是全新开发,请不要这样做。我非常恐惧地看待可变类型——我知道它们为什么在那里,我知道我会在某些时候需要使用它们,但是如果你对我说,"hey! let's build this new thing using mutable types!" 没有讽刺意味,我会评判你严厉地。为了提供完整的答案,我只包含了这一段。
我是数据分发服务 (DDS) 的新手。我想知道我们是否可以使用通配符订阅 DDS 中的主题组。这样我就可以一起接收来自具有相似名称的主题的数据。 例如,我有 2 个主题 IN_Temperature,NEP_Temperature 有没有一种方法可以订阅名称为 temperature
的所有主题这里有 2 个答案。
(非 X 类型 DDS)
这样不行。
创建主题时,它会绑定到特定类型。当 reader 被实例化时,它被绑定到一个特定的主题。无法改变这种行为。允许通配符主题名称意味着中间件需要(在每个 on_data_available 触发器上)交换正确的 reader。
当然,您可以在 DDS 基础架构之上,在应用程序级别实现它,但我不明白这一点。
(X 型答案)
这样还是不行:)
X-Types 还取决于供应商的支持。 YMMV.
但是使用 X-Types(DDS 的可扩展类型)您可以构建一个系统,类型继承改变了 "one Type for one Topic" 要求。
考虑以下 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
};
现在,您可以创建主题 "Temperature Readings",一个订阅者可以使用 NEP_T_Type reader,另一个订阅者可以使用 IN_T_Type reader .
在内部,中间件会将所有 "Temperature Readings" 发送到两个 readers,无论它是 IN_T_Type 编写器还是 NEP_T_Type 编写器。
当NEP_T reader 收到IN_T 数据时,nepProvider 字段将为零。
当 IN_T reader 接收到 NEP_T 数据时,manuID 和 serialNo 字段将为 <null>
和零。
但其余字段将被填充。您可以将此行为扩展为使用 ATemperatureReading 进行订阅,并且任何 *_T_Type 温度编写器样本都将仅使用浮点值传递(并且任何其他数据将在接收时被中间件丢弃,即在订阅者端-- 注意带宽使用)。
也可以使用可变类型,但如果是全新开发,请不要这样做。我非常恐惧地看待可变类型——我知道它们为什么在那里,我知道我会在某些时候需要使用它们,但是如果你对我说,"hey! let's build this new thing using mutable types!" 没有讽刺意味,我会评判你严厉地。为了提供完整的答案,我只包含了这一段。