目录

OpenDDS简介开源DDS解决方案

OpenDDS简介:开源DDS解决方案

文章目录

OpenDDS 简介

OpenDDS 是一个开源的 C++ 框架,用于在分布式系统中交换数据,遵循对象管理组织(OMG)关于数据分发服务(DDS)规范的实现。它不仅支持 C++,还为 Java 和 JMS 提供开发接口,允许 Java 程序员也能使用 OpenDDS。

该框架构建在 ACE(自适应通信环境)之上,确保了跨平台和可移植性。同时,OpenDDS 利用 TAO(基于 ACE 的 CORBA 实现框架),提供了 IDL 编译器等功能,以作为其 DCPS 信息仓库。

OpenDDS 遵循 OMG 的 DDS V1.2 规范,采用与 ACE/TAO 相同的许可证,允许开发者在保留版权声明的前提下,在各种场合(包括商业用途)使用和修改源代码。OpenDDS 的最新发行版本为 3.15。

用户可以通过 和 获取更多信息和资源。此外,OpenDDS 社区的用户还贡献并维护了对其他语言(如 C#、Node.js 和 Python)的绑定,进一步扩展了其适用范围。

ACE

TAO

ACE+TAO


读OpenDDS-latest.pdf

OpenDDS类型定义

OpenDDS定义IDL文件

@topic
struct Message
{
    string from;
    string subject;
    @key long subject_id;
    string text;
    long count;
}

@topic 注释说明:该类型可以与某一个Topic进行绑定,用作OpenDDS的传输类型。

@key 注释说明:subject_id字段被定义为键值。键值的作用是用来区分同一个topic下的不同的instance。

简单理解DDS中关于topic,instance和sample之间的关系,如图

https://i-blog.csdnimg.cn/blog_migrate/c2a674a9824334489bfa2de201180a07.png#pic_center

同一个topic可以创建多个instance,不同的instance是按照key来进行区分的。而每一个instance可以理解为sample的模子,sample是实际的在节点间进行收发的数据。

OpenDDS Demo Code

简单如下:

https://i-blog.csdnimg.cn/blog_migrate/e0223a90c0e7373dbf6847553e1a9423.png#pic_center

OpenDDS 可扩展的传输框架

OpenDDS使用由DDS规范定义的 IDL接口 ,以便于初始化以及控制服务使用。通过一个OpenDDS特有的传输框架,可以实现数据传输,而此框架可以允许服务利用各种传输协议,因此可称为 可插拔的传输层 ,使得OpenDDS的架构具有很大的灵活性。

目前,OpenDDS支持 TCP/IPUDP/IPIP多点发送共享内存 以及 RTPS_UDP 等多种传输协议,如图。传输协议可以通过配置文件指定,并在发布和订阅者进程中附于各种实体。

https://i-blog.csdnimg.cn/blog_migrate/6e7bdccdb42658c4090d2c5455e8b440.png#pic_center

OpenDDS 发现

OpenDDS发现服务,一种是peer-peer的发现(RTPS的对等发现),该发现的特点是节点在启动前需要配置好我所关心节点的信息(IP)。另一种是与第一种相反的方式(DCPSInfoRepo的集中式发现),在整个OpenDDS的系统中,所有节点之间并不知道彼此的存在,在程序启动后,由程序去检索DCPSInfoRepo服务实现动态发现。

我理解为 动态发现静态发现

  • 信息仓库 (InfoRepo)集中式 的储存库类型,其作为一个单独的进程运行,可以允许发布者和订阅者以集中式发现彼此。—动态发现

  • RTPS发现 :一种 对等 的发现类型,使用RTPS协议通知可用性和本地信息。 —静态发现

    与其他DDS实现的互操作性必须使用对等方法,但只在OpenDDS部署中才有用。

利用DCPSInfoRepo的集中式发现(动态发现)

https://i-blog.csdnimg.cn/blog_migrate/9425a6943158260a775716cc1031ad3c.png#pic_center

DCPSInfoRepo是OpenDDS执行的一种 独立式服务 ,以便于实现 集中式方法 ,他作为一个 CORBA服务器 进行实现。当用户请求关于一个主题的订阅时,DCPSInfoRepo就会定位主题,通知发布者目前有新的订阅者。当在非RTPS配置中使用OpenDDS时,就需要运行DCPSInfoRepo,而RTPS配置时则不需要使用DCPSInfoRepo。DCPSInfoRepo不包含在数据传播中,它的任务被限制在发现彼此的OpenDDS应用程序范围内。

应用程序使用者可利用DCPS域的非重叠性部分,灵活、自由地运行多个InfoRepo。

域操作可以在多个仓库上进行,从而形成一个 分布式虚拟仓库 ,即 仓库联盟 (Repository Federation)。为了使每个仓库参与到联盟中,每个仓库都必须在启动时指定它自己的 联盟标识符 数值(一个32位的数字值)。

利用RTPS的对等发现(静态发现)

https://i-blog.csdnimg.cn/blog_migrate/376b0b27e9a89f48f9da7cc6ca583a36.png#pic_center

需要 对等发现 模式的DDS应用程序可由OpenDDS性能设定,通过使用RTPS协议可以完成这种类型的发现。这个简单的发现形式可通过DDS对DataReader和DataWriter的配置进行实现。

当每个参与者的进程激活DDS-RTPS发现机制时,需要利用默认(或者配置)的网络端口,网络端点才能被创建,这样才能方便后续DDS参与者发布DataReader以及DataWriter的详细配置信息。一段时间后,各个节点就会基于所配置的、 可插拔的传输协议 ,发现彼此并创建一个连接。

当开发并部署需要使用RTPS发现的应用程序时,开发人员需考虑以下限制因素:

  • 由于UDP端口的方式被分配给域ID,那么,域ID应当在0~231(包含231)之间。在每个OpenDDS进程、每个域中,支持多达120个域参与者。
  • 主题名称以及类型识别码被限制到256个字符。
  • 由于全局唯一标识符(GUID)的方式被指定,OpenDDS的本地多点发送传输不能与RTPS发现一并工作(如果试图这样,那么将发布一个警告信息)。