DDS中的互操作性

时间:2016-01-20 08:36:30

标签: data-distribution-service

我是DDS领域的新手,需要具备以下理解。

如何在两个供应商之间发布共同主题以实现DDS中的互操作性?

情景是: 假设有两个供应商产品V1和V2。 V1有一个发布主题T1的发布者。 V2想要订阅这个主题。订阅者(V2)如何知道存在主题T1?

我对域级有类似疑问。订阅者是否知道它必须参与哪个域?

我正在使用OpenDDS。

由于

3 个答案:

答案 0 :(得分:1)

供应商之间的互操作性是可能的,并且由主要供应商定期测试/演示。

您需要将DDS实施配置为使用RTPS(我认为目前是RTPS2),而不是供应商可能使用的任何专有传输。默认情况下可能会启用此功能。

就要参与的域而言,您可以通过编程方式在特定域中创建域参与者(它连接到的域可能由配置文件控制)以及您创建的所有其他实体(发布者,订阅者等)然后属于该域名参与者,因此在该域中运作

答案 1 :(得分:1)

建立@ rcs的答案......你需要做的实际工作量取决于DDS实施(OpenDDS,RTI,Prismtech ......),因为它们会有所不同默认值。如果你在两端都使用相同的,那么你的配置会变得简单得多,因为默认值应该排列在域和RTPS之类的东西上。

您需要确保以下匹配:

  • 域名
  • Domain Partion
  • 运输(我推荐RTPS,根据我的经验,FWIW版本在2.1和2.2之间的差异并不重要)
  • TCP或UDP
  • 发现端口和数据端口 - 这或多或少取决于您使用的实施方式以及您是否在连接的两端使用相同的实施方式,如果使用相同的方式,它们会使用相同的方式。将具有相同的默认值。
  • 确保发布的主题与其他订阅的主题相匹配,这将适用于主题和类型(see more here
  • 数据序列化
  • 发现(单播与多播,请确保 你选择的任何设置都是有效的,例如:两个设备都是相同的 多播组)
  • QoS设置需要排队,但我认为默认设置可能有效(read more here
  • 首先在您正在处理的计算机之间进行Shapes演示,这会进行一些基本的健全性检查,以了解可以使用给定的配置和网络设置。我见过的每个供应商/实施都有一个可运行的形状演示,例如here is RTI's

我现在所能想到的一切,希望有所帮助。我发现DDS文档非常好,特别是如果你知道什么时候可以(并且什么时候你不能)使用任何供应商的文档答案来实现(例如:在RTI&上找到答案) #39; s doc或forum以及它是否适用于您的OpenDDS应用程序)。通常解决方案类似,但您会发现RTI支持最多,而RTI + Prismtech拥有一些最好的文档。

答案 2 :(得分:0)

DDS RTPS协议交换发现信息,以便参与同一域(!)的不同应用程序知道谁在那里,以及他们提供/请求的内容。您需要确保两个应用程序使用相同的域ID(在域参与者上指定)。此外,由于某些实现允许不同的传输选项,请确保使用RTPS(有时称为DDSI)网络。

RTPS规范包含从域ID到端口号的映射,因此如果来自不同供应商的应用程序使用相同的ID,它应该可以正常工作。但是,实现可能会使用配置覆盖端口号。

为了最大限度地提高应用程序正确通信的可能性,请确保它们使用相同的IDL数据模型。供应商有不同的方法来键入不完全匹配的进化/映射类型,并且并非所有这些都实现了XTypes规范(尚未)。

此外,由于某些实现比其他实现更严格,请确保您保持在规范的范围内。这意味着主题名称应该只包含字母数字字符(我有时会看到':'表示作用域,这是不允许的。)

供应商之间肯定不会起作用的事情是TRANSIENT / PERSISTENT持久性或通过TCP进行通信,因为两者尚未标准化。 TRANSIENT_LOCAL应该有效。 TRANSIENT_LOCAL和TRANSIENT之间的区别在于使用TRANSIENT_LOCAL,数据在发布者(编写者)离开系统后不再对齐,而使用TRANSIENT时数据仍然可用。

另请注意,对于供应商之间的API级互操作性,您最好的机会是使用新的isocpp API,因为在我看到的供应商实现中,这个API已经非常一致地实现了。

希望有所帮助!