在这里插入图片描述
在车载领域使用的通信协议中,DDS绝对排的上号.

对于面向服务的通信协议中,DDS与SOME/IP各自的优劣.

DDS能否替换SOME/IP等问题也随之而来。今天来介绍下什么是DDS?

DDS

DDS全称:Data Distribution Service 数据分发服务,是分布式实时通信中间件协议.

官网传送门:https://www.dds-foundation.org/

采用发布/订阅体系架构,强调以数据为中心,提供丰富的QoS服务质量策略,以保障数据进行实时、高效、灵活地分发,可满足各种分布式实时通信应用需求。

DDS最早应用在美国海军系统,用于解决军舰系统复杂网络环境中大量软件升级的兼容性问题。

在汽车领域,2018年Adaptive AUTOSAR引用了DDS,作为可选择的通信方式之一。目前国内已有主机厂开始研究,主要针对自动驾驶相关需求,工具方面,在汽车电子领域常用的工具厂商也在开发这部分内容。不仅是汽车领域引入DDS,在机器人开发领域,最新升级的ROS2也引入了DDS中间件来传递信息。

请添加图片描述

源码路径

OpenDDS 是 Object Management Group (OMG) 数据分发服务 (DDS) 的开源实现,由 Object Computing Incorporated (OCI) 开发并拥有版权。

OpenDDS 是一种多语言和多平台的实现。OMG DDS 规范旨在适用于要求包括使用发布和订阅模型的实时、大容量、稳健性、容错数据分发的系统。

最新版本可从 OpenDDS 下载站点获得:https://download.objectcomputing.com/OpenDDS/GitHub

以前的版本可在 OpenDDS 下载站点的以前版本部分获得:https://download.objectcomputing.com/OpenDDS/previous-releases/GitHub

DDS架构

OMG 数据分发服务规范将 DDS 分为两个独立的架构层。

  • 下层是数据中心发布和订阅 (DCPS) 层,包含发布/订阅通信机制的类型安全接口。
  • 上层是数据本地重建层(DLRL),它使应用程序开发人员能够在 DCPS 层之上构建本地对象模型,从而使应用程序免受 DCPS 知识的影响。每一层都有自己的一组概念和使用模式,因此可以分别讨论两层的概念和术语。

以数据为中心的发布和订阅 - DCPS

DCPS 层负责有效地将数据从发布者传播到感兴趣的订阅者。

它是使用发送端的发布者数据写入者以及接收端的订阅者数据读取者的概念来实现的 。

DCPS 层由一个或多个数据域组成,每个数据域都包含一组通过 DDS 进行通信的参与者(发布者和订阅者)。每个实体(即发布者或订阅者)都属于一个域。每个进程对于它所属的每个数据域都有一个域参与者。

在任何数据域中,数据由主题标识,主题是特定类型的域段,允许发布者和订阅者明确引用数据。在域中,主题将唯一的主题名称、数据类型和一组服务质量 (QoS) 策略与数据本身相关联。每个主题仅与一种数据类型相关联,尽管许多不同的主题可以发布相同的数据类型。发布者的行为由与特定数据源的发布者、数据写入者和主题元素关联的 QoS 策略确定。同样,订阅者的行为由与订阅者、数据读取器和特定数据接收器的主题元素相关联的 QoS 策略确定。

在这里插入图片描述

“发布”(Publisher 和 DataWriter 的关联)将 Samples 发送到一个或多个“订阅”(DataReader 和 Subscriber 的关联)。

系统的基本组成部分

我们先熟悉下几个专有名词:

  • Domain
    代表一个通信平面,由Domain ID唯一标识,只有在同一个域内的通信实体才可以通信;如果考虑车内通信,可以只划分1个Domain,也可以按照交互规则或其他规则,定义多个Domain;
  • Domain Participant
    代表域内通信的应用程序的本地成员身份,简单来说,就是说明同一数据域内的通信成员;
  • Topic
    是数据的抽象概念,由TopicName标识,关联相应数据的数据类型(DataType),如果把车内所涉及的所有Topic集合在一起,这样就形成一个虚拟的全局数据空间“Global Data Space”,进一步弱化了节点的概念,所以域参与者已经不是节点的概念了;
  • DataWriter
    数据写入者,类似缓存,把需要发布的主题数据从应用层写入到DataWriter中;
  • DataReader
    数据读取者,同样可以理解为一种缓存,从订阅者得到主题数据,随之传给应用层;
  • Publisher
    发布者,发布主题数据,至少与1个DataWriter关联,通过调用DataWriter的相关函数将数据发出去;
  • Subscriber
    订阅者,订阅主题数据,至少与1个DataReader关联。当数据到达时,应用程序可能忙于执行其他操作或应用程序只是等待该消息时,这样就会存在两种情况,同步访问和异步通知
    基本组件是 Topic、Publisher、Subscriber、DataWriter 和 DataReader。

在这里插入图片描述

注意:

  • 一个 Publisher 可以有多个 DataWriter
  • 一个订阅者可以有多个 DataReader
  • DataWriter 只有一个Topic
  • DataReader 只有一个Topic
  • 一个 Topic 可以有许多 DataReader 和 DataWriter
  • Publisher可以有许多关联的Subscriber
  • 一个Subscriber可以有许多关联的Publisher

QoS服务质量

服务质量 (QoS) 策略控制通过系统的数据流。

Topic、DataReader、DataWriter、Publisher和Subscriber都有QoS策略。

Publisher、DataWriter和Topic的QoS策略控制发送端的数据。

Subscriber、DataReader 和 Topic 的 QoS 策略控制接收端的数据。

目前共支持22种QoS策略,每种策略都可以应用在不同的角色上,而针对同一角色,可单独使用一种QoS,也可以组合使用多种QoS策略。

在这里插入图片描述

例如RELIABILITY (可靠性):

参数定义:Kind = RELIABLE

如果当网络发生错误, DataReader可能无法收到DataWriter的样本数据时,会对样本数据进行重发,保证DataReader能够收到数据;

参数定义:Kind = BEST_EFFORT
如果当网络发生错误, DataWriter不会重新发送丢失的样本数据,这样,无法保证DataReader能够收到数据;

在这里插入图片描述