我是 DDS 域的新手,需要了解以下内容。
如何发布两个供应商之间的共同话题以实现 DDS 中的互操作?
场景是:假设有两个供应商产品 V1 和 V2。V1 有一个发布者在主题 T1 上发布。V2想订阅这个topic。Subscriber(V2)怎么知道有一个Topic T1?
我对域级别有类似的疑问。订阅者如何知道它必须参与哪个域?
我正在使用 OpenDDS。
谢谢
我是 DDS 域的新手,需要了解以下内容。
如何发布两个供应商之间的共同话题以实现 DDS 中的互操作?
场景是:假设有两个供应商产品 V1 和 V2。V1 有一个发布者在主题 T1 上发布。V2想订阅这个topic。Subscriber(V2)怎么知道有一个Topic T1?
我对域级别有类似的疑问。订阅者如何知道它必须参与哪个域?
我正在使用 OpenDDS。
谢谢
要在@rcs 的答案的基础上建立一点...您必须做的实际工作量可能取决于 DDS 实现(OpenDDS、RTI、Prismtech ...),因为它们将具有不同的默认值。如果您在两端使用相同的配置,那么您的配置会变得更加简单,因为默认值应该与域和 RTPS 等内容一致。
您需要确保以下匹配:
目前能想到的就这么多,希望对你有帮助。我发现 DDS 文档非常好,特别是如果您知道何时可以(以及何时不能)使用任何供应商文档的答案来实现您的实施(例如:在 RTI 的文档或论坛上找到的答案以及它是否适用于您的 OpenDDS 应用程序)。通常解决方案是相似的,但您会发现 RTI 支持最多,并且 RTI + Prismtech 拥有一些最好的文档。
供应商之间的互操作性是可能的,并由主要供应商定期测试/演示。
您将需要配置您的 DDS 实现以使用 RTPS(我认为目前是 RTPS2),而不是供应商可能使用的任何专有传输。这可能默认启用。
关于要参与的域,您以编程方式在特定域中创建域参与者(它连接到的域可能由配置文件控制)以及您创建的所有其他实体(发布者、订阅者等)然后属于该域参与者,因此在该域中运行
DDS RTPS 协议交换发现信息,以便参与同一域(!)的不同应用程序知道谁在那里,以及他们提供/请求什么。您需要确保两个应用程序使用相同的域 ID(在域参与者上指定)。此外,由于某些实现允许不同的传输选项,请确保使用 RTPS(有时称为 DDSI)网络。
RTPS 规范包含从域 ID 到端口号的映射,因此如果来自不同供应商的应用程序使用相同的 ID,它应该可以正常工作。然而,实现可能会使用配置覆盖端口号。
为了最大限度地提高应用程序正确通信的机会,请确保它们使用相同的 IDL 数据模型。供应商对不完全匹配的类型演变/映射类型有不同的方法,并且并非所有供应商都实现了 XTypes 规范(目前)。
此外,由于某些实现比其他实现更严格,请确保您保持在规范的范围内。这意味着主题名称只能包含字母数字字符(我有时会看到“:”表示范围,这是不允许的)。
供应商之间绝对行不通的事情是瞬态/持久性持久性或基于 TCP 的通信,因为两者都还没有标准化。TRANSIENT_LOCAL 应该可以工作。TRANSIENT_LOCAL 和 TRANSIENT 之间的区别在于,使用 TRANSIENT_LOCAL,发布者(作者)离开系统后数据不再对齐,而使用 TRANSIENT,数据仍然可用。
另请注意,对于供应商之间的 API 级互操作性,最好的机会是使用新的 isocpp API,因为我见过的供应商实现中已经非常一致地实现了这一 API。
希望有帮助!