将 FastRTPS 用于命令和控制应用程序



我试图了解如何使用FAST-RTPS库来实现命令和控制应用程序。要求是允许多个编写器将命令消息定向到负责控制设备的单个读取器。在此应用中,可以控制一个或多个相同的设备,每个设备都使用相同读取器代码的唯一实例。我已经明白我应该将读者的RELIABILITY_QOS设置为可靠,将OWNERSHIP_QOS设置为EXCLUSIVE_OWNERSHIP。我仍在考虑的部分是如何配置我的应用程序,以便当编写器向控制设备的读取器发送命令时,可能也收到消息的其他读取器不会对其执行操作。我想在 FAST-RTPS 级别执行此操作;也就是说,配置应用程序,以便只有控制设备的读取器接收命令消息,而不是允许多个读取器接收控制消息,同时对这些读取器进行编程,以便只有控制读取器将对其进行操作。到目前为止,我的方法是将所有控制编写器仅分配给一个分区(请参阅Fast-RTPS用户手册中的高级功能(。每件设备将有一个这样的分区。这是实现我要求的正确方法还是有其他更好的方法?

谢谢。

由于这个问题是在数据分发服务下提出的,因此此答案引用了OMG DDS规范,目前版本为1.4。

尽管您可以使用分区来实现所需的选择付,但对于您的用例,这可能不是推荐的方法。想到的主要缺点是单个写入器必须将控制消息发送到多个设备的情况。使用当前的方法,您需要为每个设备提供一个分区,并且还需要将每条消息写入正确的分区。这只能通过将单个分区附加到每个数据写入器来实现,因此每台设备需要一个数据写入器。根据您的设置,从资源使用角度以及代码复杂性的角度来看,您最终可能会得到许多 DataWriter,而您更愿意拥有一些。

用于此类用例的正确机制是所谓的 ContentFilteredTopic,如规范中的第 2.2.2.3.3 节 ContentFilteredTopic 类所示。为了您的方便,我引用了其中的一些:

ContentFilteredTopic描述了更复杂的订阅 表示订阅者不一定希望看到所有内容 在Topic下发布的每个实例的值。相反,它想要 以仅查看其内容满足特定条件的值。这 因此,类可用于请求基于内容的订阅。 内容的选择是使用filter_expression参数expression_parameters.

使用 ContentFilteredTopics,每个 DataReader 将使用与其关联的设备的标识符一致的filter_expression。在发送端的应用程序级别,数据写入器不会意识到这一点;他们只是在编写他们的控制消息。中间件将负责向那些(并且仅那些(筛选器表达式与数据匹配的 DataReader 的交付。

这是许多基于 DDS 的系统的核心功能。尽管 DDS 规范不需要它,但在许多情况下,实现足够智能,可以在消息进入线路之前在 DataWriter 端进行过滤,如果有意义。

我不知道其中有多少是由Fast-RTPS实际实现的。

最新更新