首页 > 解决方案 > 将 FastRTPS 用于命令和控制应用程序

问题描述

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

谢谢你。

标签: data-distribution-service

解决方案


由于这个问题是在下提出的,所以这个答案引用了OMG DDS 规范,当前版本为 1.4

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

用于这种用例的适当机制是所谓的 ContentFilteredTopic,如规范中的第2.2.2.3.3 节 ContentFilteredTopic 类中所示。为了您的方便,我引用了其中的一些内容:

ContentFilteredTopic描述了一个更复杂的订阅,它指示订阅者不一定希望看到在Topic. 相反,它只想查看内容满足特定标准的值。因此,此类可用于请求基于内容的订阅。使用filter_expression with 参数选择内容expression_parameters

使用 ContentFilteredTopics,每个 DataReader 将使用一个 filter_expression 与它关联的设备的标识符对齐。在发送方的应用程序级别,DataWriters 不会意识到这一点;他们只会写他们的控制信息。中间件将负责传递给过滤器表达式与数据匹配的那些(并且只有那些)DataReader。

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

我不知道 Fast-RTPS 实际实现了多少。


推荐阅读