DDS与OpenDDS

DDS与openDDS

DDS

  • 什么是DDS?
    Data Distribution Service(DDS),根据字面理解就是数据分发服务。这套服务,在分布式应用环境下,可以高效率地分发参与者(应用)间的数据信息。
  • 订阅/发布体系结构
    考虑到应用实现,肯定要定一套体系结构。DDS采用订阅/发布体系结构,以数据为中心,也就是通过订阅/发布这个结构来实现消息(数据)的交换。
  • P/S与RTPS
    上面说的订阅/发布,从通信角度考虑。其实,就是P/S通信模式。P(Publish)是发布者,S(Subscribe)是订阅者,订阅者订阅发布者提供的某些服务后,P与S间就存在了通信关系。P发布了相应的消息后,订阅者便可以收到这些消息(数据)。
    RTPS又是什么?
    RTPS指Real Time Publish/Subscribe,它继承自P/S模型。简单来说,相比P/S,RTPS多出了QoS属性(Quality of Service)、将发布/订阅模块化等等优点。
    因此,OMG将RTPS标准化为:DDS的实施互操作协议。
  • OMG
    一个组织,全名为Object Management Group。DDS就是OMG这个组织规定的规范。
  • 全局数据空间
    DDS以数据为中心,也就是基于数据去考虑如何分发消息。因此在DDS中存在全局数据空间的概念。这个全局数据空间是虚拟(逻辑)上的,所有数据都在这个空间中,每个分布式结点可以向这个空间写数据,也可以从这个空间读数据。
    这个空间可以总结为三点:All Data、Read and Write、Cache。
    全局数据空间

DCPS

OMG将RPTS重定义为DCPS,DDS采用DCPS通信机制。DCPS主要组成有:

  • Domain : 域。参与者只有在同一个域内,才可以通信。不同域间,不可通信。
  • DomainParticipant: 域参与者。一个域的入口点。
  • Topic:主题。只有使用相同主题(主题名)的P和S,才能够通信。
  • DataWriter:数据写入者,负责向Publisher写入消息。
  • Publisher:发布者,负责发布DataWriter写入的消息。
  • Subscriber:订阅者,负责接收已订阅的消息。
  • DataReader数据读取写,负责处理从Subscriber接收的消息。
    DCPS

DLRL与DCPS

DDS规范定义了两类Interfaces结构

  1. DCPS:DDS核心,数据分布基础架构。
    DCPS

  2. DLRL(A Data Local Reconstruction Layer):更高的抽象接口层,隐藏细节实现。其实,Data Local Reconstruction可以理解为将App与DDS直接的数据,根据应用环境重构为需要的格式。
    DLRL

OpenDDS

  • 根据OpenDDS(目前最新版本是3.14)官网开发者手册中的介绍

OpenDDS is an open source implementation of the OMG Data Distribution Service (DDS) for
Real-Time Systems Specification v1.4 (OMG Document formal/2015-04-10) and the Realtime Publish-Subscribe Wire Protocol DDS Interoperability Wire Protocol Specification
(DDSI-RTPS) v2.3 (OMG Document formal/2019-04-03). OpenDDS also implements the
DDS Security Specification v1.1 (OMG Document formal/2018-04-01).

  • 因此OpenDDS,是DDS规范的实现。当然还有其他一些DDS规范的实现。例如:RTI DDS、OpenSplice DDS。
  • OpenDDS框架:下图为OpenDDS官网给出的Framework图。可以看出,主要部分为Topic、Transport、Discovery。也就是,数据如何定义?如何传输信息?如何发现两端(P/S)?
    OpenDDS架构
  • OpenDDS Topic:根据IDL,定义Topic结构,利用OpenDDS提供的工具,根据IDL文件自动生成主题文件。例:https://github.com/adver1991/DDS-Example/blob/master/Messenger.idl
  • OpenDDS Transport: OpenDDS提供了多种传输协议,TCP、UDP、Multicast、Shared-Memory、RTPS_UDP。使用者可以通过配置文件,指定使用的传输协议。
OpenDDS Discovery

DDS应用在分布式环境中,订阅者和发布者两端,如何发现对方?OpenDDS提供了两种节点寻找方式:

  1. DCPSInfoRepo(默认):一个集中式的仓库,相当于发现中心,它需要运行在独立的进程中(例:P端一个进程,S端一个进程,还需要一个进程运行InfoRepo)。
    DCPSInfoRepo

  2. RTPS:使用RTPS协议,点对点,不需要额外的进程运行其他服务。
    RTPS

使用OpenDDS

  • 平台(Ubuntu 16.4)
  • 下载解压安装报,根据官网提示操作即可。
  • https://opendds.org/quickstart/GettingStartedLinux.html
  • 例子(参考自OpenDDS官网开发手册2.1.3节),使用RTPS发现方式,使用rtps_udp传输协议。这里只给出代码,代码中具体的含义请参考OpenDDS开发者手册。代码见:
    https://github.com/adver1991/DDS-Example
  • 关于例子的简单说明:例子中,包括订阅者、发布者、数据写入者、数据读取者(包含Listener)、Topic(IDL定义)部分。根据IDL文件,使用OpenDDS提供的工具,生成Topic相关的代码。订阅者与发布者,在同一个域内,使用相同的主题(主题名)实现数据的分发。

参考