[FASTDDS]05-DDS库总览
架构
- 应用层:用户应用通过
fast dds
的API
实现分布式系统通信 - Fast DDS 层:
DDS
通信中间件的实现。它允许部署一个或多个DDS域,同一域内的DomainParticipants
通过在Domain
中的topic
来发布/订阅来交换消息。 - RTPS 层:实现实时发布-订阅(RTPS)协议,以实现与
DDS
应用程序的互操作性。该层充当传输层的抽象层。 - 传输层:
DDS
的传输层,支持各种传输协议,例如UDP
、TCP
、SHM
DDS层
DDS
层定义了几个关键的通信元素——用户将会在他们的应用中创建这些元素,然后将DDS
应用串联起来,并创建一个以数据为中心的通信系统。DDS
实体是任何支持服务质量配置(QoS)并实现侦听器的对象。
- Qos:每个实体所定义的行为机制
- Listener:向实体通知应用执行过程中可能的事件的机制
以下为DDS
实例的功能和描述:
- domain:用于定义
DDS Domain
的正整数。每个Domain Participant
都被赋予一个DDS Doamin
,因此在相同domain
的Domain Participant
可以进行通信,并且用来隔离不同DDS Domain
之间的通信。当创建Domain Participant
时,应用开发者必须提供domain
的值 - domain participant:包含其他
DDS
实例的对象,例如发布者、订阅者、话题。它提供创建前面那些它所包含的实体,并且配置它们的行为 - publisher:发布者,通过
datawriter
以topic
发布数据,将数据写入传输层。它包含并负责创建、配置datawriter
——一个发布者可以包含一个或多个datawriter
- datawriter:负责发布消息的实体。用户创建该实体时,必须提供一个
topic
与之对应,通过该datawriter
发布数据将会写到与之绑定的topic
下。发布成功是通过在datawriter history
中写入数据更改来完成的 - DataWriterHisory:这是数据对象的变更列表。当
datawriter
在指定的topic
下发布数据时,将在该数据中创建一个变更记录,这些变更记录将被发送给订阅了该topic
的订阅者。 - Subscriber:订阅者通过
data reader
订阅指定的topic
,它是包含并创建和配置data reader
的实体——一个订阅者可以包含一个或多个data reader
- DataReader:它是订阅者接收发布信息的实体。用户在创建该实体时,必须提供订阅的
topic
。一个data reader
在data reader history
中接收消息作为更改 - DataReaderHistory:它包含
DataReader
订阅了某个Topic
接收的数据对象中的更改 - Topic:绑定发布者
data writer
和订阅者data reader
的实体
RTPS层
RTPS
是DDS
中传输层的抽象,如上图所示,RTPS
有四个实体:
RTPSDomain
:它是DDS域到RTPS协议的扩展RTPSParticipant
:包含其他RTPS实体的实体,通过它可以配置和创建它所包含的其他实体。RTPSWriter
:消息的来源。它读取DataWriterHistory
中写入的更改,并将其传输到之前匹配的所有RTPSReader
RTPSReader
:消息的接收实体。它将RTPSWriter
报告的更改写入DataReaderHistory
传输层
FAST DDS
支持UDPv4
、UDPv6
、TCPv4
、TCPv6
和SHM
等传输协议。默认情况下,DomainParticipant
支持UDPv4
和SHM
传输协议,可以通过配置来支持所有的传输协议。
编程和执行模型
fast dds
是基于事件的并发模型。接下来将解释fast dds
的多线程模型以及可能的事件。
并发与多线程
Fast DDS
实现了一个并发多线程系统。每个DomainParticipant
生成一组线程来处理后台任务,如日志记录、消息接收和异步通信。Fast DDS
的API
是线程安全的,因此你可以从不同的线程无畏地调用同一DomainParticipant
上的任何方法。以下是FAST DDS
多线程调度工作方式的简要概述:
Main thread
:由应用管理Event thread
:每个domain participant
都有一个事件线程,它处理周期型和触发型的时间信号Asynchronous writer thread
:这个线程管理所有domain participant
的异步写入。即使对于同步写,某些形式的通信也必须在后台启动Reception threads
:DomainParticipants
为每个接收通道生成一个线程,其中通道的概念取决于传输层
事件驱动架构
DDS
通过time-event
系统响应特定的条件,并以此进行周期性的调度。因为他们大多数都是DDS
和RTPS
的元数据,因此对于用户大多是不可见的。但是,用户可以通过继承TimedEvent
类来自定义周期性的时间事件。
功能特性
FAST DDS
具有一些附加功能,用户可以在其应用程序中实现和配置这些功能。
发现协议
发现协议定义了DataWriter
和DataReader
如何匹配同一topic
,并在该topic
下通过发布和订阅交换共享数据。FAST DDS
的发现机制如下:
Simple Discovery
:默认的发现机制,定义在RTPS
标准中,并提供与其他DDS
实现的兼容性。此处,DomainParticipants
在早期阶段被单独发现,以随后匹配它们实现的DataWriter
和DataReader
Discovery Server
:这种发现机制使用集中式发现体系结构,其中服务器充当元数据的hub
Static Discovery
:DomainParticipant
之间相互发现的机制,如果远程的DomainParticipant
事先已经知道了每个DomainParticipant
中包含的实体(DataReader/DataWriter),则可以跳过这些实体的发现Manual Discovery
:该机制仅与RTPS层兼容。它允许用户使用其选择的任何外部元信息通道手动匹配和取消RTPS Participant
、RTPS Writer
和RTPS Reader
安全
FAST DDS
可以通过配置在三个级别事先可插拔的安全性通信:
- 远程
DoaminParticipant
安全验证:DDS:Auth:PKI-DH
使用可信的身份验证(CA)和ECDSA
数字前面算法执行身份验证。它还使用Diffie-Hellman
(ECDH)密钥协商协议建立了共享秘密 - 实体访问控制:
DDS:Access:Permissions
插件提供DDS Domain
和Topic
层的Domain Participant
访问控制 - 数据加密:
DDS:Crypto:AES-GCM-GMAC
插件在通过(AES-GCM)中使用高级加密标准(AES)提供经过身份验证的加密
日志
FAST DDS
提供扩展的日志系统。Log
类是日志系统的入口。它暴露三个宏定义便于日志的使用——EPROSIMA_LOG_INFO
、EPROSIMA_LOG_WARNING
、EPROSIMA_LOG_ERROR
。此外,除了已经可用的类别(INFO_MSG、WARN_MSG和ERROR_MSG)之外,它还允许定义新的类别。它使用正则表达式按类别提供筛选,并控制日志记录系统的详细程度。可以在日志记录部分找到可能的日志记录系统配置的详细信息。
XML配置
Fast DDS
提供了通过使用XML
配置文件更改其默认设置的可能性。因此,用户不需要更改任何代码或重新构建现有应用程序,就可以修改DDS
实体的行为。每个用户API
功能都有对应的XML tag
。因此,可以通过participant
标记构建和配置domain participant
配置文件,或者分别使用data_writer
和data_reader
来配置DataWriter
和DataReader
。
环境变量
用户可以通过FAST DDS
环境变量轻易的定制默认的DDS
应用设置。