data-distribution-service - 将 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 实际实现了多少。
推荐阅读
- sql - 如何管理 2 堆栈查询
- docker - dockerize SPA web 应用有什么好处
- mysql - MYSQL 我试图返回一个值,当与另一个字段分组时,我需要将一个值与同一字段的最小值进行比较
- http-status-code-403 - Google 字体链接返回 403 错误,我该如何解决?
- mysql - 在 MySQL 上创建数据库索引的最佳方法
- python - python中dict的弹性seacrh查询
- javascript - 正则表达式删除文件名中的特殊字符,扩展名除外
- json - 如何将 JSON 对象键值对分别绑定到角度模板
- wso2 - 如何在 WSO2 身份服务器电子邮件模板中添加新语言
- php - 检查一个数组中某个键的值是否等于另一个数组中不同键的值