2. 库概览
Fast DDS(前身为Fast RTPS)是DDS规范的高效高性能实现,DDS规范是一种用于分布式应用软件的以数据为中心的通信中间件(DCPS)。本节回顾Fast DDS的体系结构、操作和关键特性。
2.1 架构
Fast DDS的架构如下图所示,其中可以看到具有以下不同环境的层模型。
- Application Layer. 使用Fast DDS API在分布式系统中实现通信的用户应用程序。
- Fast DDS Layer. DDS通信中间件的稳健实现。它允许部署一个或多个DDS域,在这些域中,同一域中的域参与者通过在域主题下发布/订阅来交换消息。
- RTPS Layer. 实时发布订阅(RTPS)协议的实现,以实现与DDS应用程序的互操作性。该层充当传输层的抽象层。
- Transport Layer. 快速DDS可用于各种传输协议,如不可靠传输协议(UDP)、可靠传输协议tcp, 或共享内存传输协议(SHM)。
2.1.1 DDS层
在DDS层中定义了通信的几个关键元素。用户将在其应用程序中创建这些元素,从而合并DDS应用程序元素并创建以数据为中心的通信系统。Fast DDS遵循DDS规范,将通信中涉及的这些元素定义为实体。DDS实体是支持服务质量配置(QoS)并实现侦听器的任何对象。
- QoS. 定义每个实体行为的机制。
- Listener. 向实体通知应用程序执行期间可能发生的事件的机制。
下面列出了DDS实体及其描述和功能。有关每个实体、其QoS及其侦听器的更详细说明,请参阅DDS层部分。
- Domain. 标识DDS域的正整数。每个DomainParticipant都将分配一个DDS域,以便同一域中的DomainParticipants可以进行通信,并隔离DDS域之间的通信。此值必须由应用程序开发人员在创建DomainParticipant时提供。
- DomainParticipant. 包含其他DDS实体(如发布者、订阅者、主题和多主题)的对象。它可以创建包含在自己中的实体以及实体的配置。
- Publisher. 发布服务器使用DataWriter发布主题下的数据,DataWriter将数据写入传输。它是创建和配置其包含的DataWriter实体的实体,并且可能包含一个或多个DataWriter实体。
- DataWriter. 它是负责发布消息的实体。用户在创建此实体时必须提供一个主题,该主题将是发布数据的主题。发布是通过将数据对象作为更改写入DataWriterHistory来完成的。
- DataWriterHistory. 这是对数据对象的更改列表。当DataWriter继续发布特定主题下的数据时,它实际上会对该数据进行更改。历史记录中记录的正是这一更改。然后将这些更改发送到订阅该特定主题的DataReader。
- Subscriber. 订阅服务器使用DataReader订阅主题,DataReader从传输中读取数据。它是创建和配置其包含的DataReader实体的实体,可以包含一个或多个DataReader实体。
- DataReader. 它是订阅出版物接收主题的实体。创建此实体时,用户必须提供订阅主题。DataReader接收消息作为其HistoryDataReader中的更改。
- DataReaderHistory. 它包含DataReader由于订阅某个主题而接收的数据对象中的更改。
- Topic. 将发布服务器的DataWriter与订阅服务器的DataReader绑定的实体。
2.1.2 RTPS层
如上所述,Fast DDS中的RTPS协议允许从传输层抽象DDS应用实体。根据上面显示的图表,RTPS层有四个主要实体。
- RTPSDomain. 它是RTPS协议对DDS域的扩展。
- RTPSParticipant. 包含其他RTPS实体的实体。它允许配置和创建包含的实体。
- RTPSWriter. 消息的来源。它读取写入DataWriterHistory中的更改,并将其传输到先前匹配的所有RTPSReader。
- RTPSReader. 消息的接收实体。它将RTPSWriter报告的更改写入DataReaderHistory。
有关每个实体、其属性和侦听器的更详细说明,请参阅RTPS层部分。
2.1.3 Transport层
Fast DDS支持通过各种传输协议实现应用程序。这些是UDPv4、UDPv6、TCPv4、TCPv6和共享内存传输(SHM)。默认情况下,DomainParticipant实现UDPv4和SHM传输协议。传输层部分详细介绍了所有支持的传输协议的配置。
2.2 编程和执行模型
快速DDS是并发的和基于事件的。以下说明了控制Fast DDS操作的多线程模型以及可能的事件。
2.2.1 并发和多线程
Fast DDS实现了一个并发多线程系统。每个DomainParticipant都产生一组线程来处理后台任务,如日志记录、消息接收和异步通信。这不会影响您使用库的方式,即Fast DDS API是线程安全的,因此您可以从不同的线程无畏地调用同一DomainParticipant上的任何方法。但是,当外部函数访问由库内部运行的线程修改的资源时,必须考虑此多线程实现。这方面的一个例子是实体侦听器回调中修改的资源。以下是Fast DDS多线程调度工作原理的简要概述:
- Main thread: 有应用程序管理。
- Event thread: 每个DomainParticipant都拥有其中一个。它处理周期性和触发的时间事件。
- Asynchronous writer thread: 此线程管理所有DomainParticipant的异步写入。即使对于同步写入程序,某些形式的通信也必须在后台启动。
- Reception threads: DomainParticipes为每个接收信道生成一个线程,其中信道的概念取决于传输层(例如UDP端口)。
2.2.2 事件驱动架构
有一种时间事件系统,使Fast DDS能够响应特定条件,并安排定期操作。其中很少对用户可见,因为大多数与DDS和RTPS元数据相关。但是,用户可以通过从TimedEvent类继承来在应用程序中定义周期性时间事件。
2.3 功能
快速DDS具有一些附加功能,用户可以在其应用程序中实现和配置这些功能。这些概述如下。
2.3.1 发现协议
发现协议定义了在给定主题下发布的DataWriter和订阅同一主题的DataReader相匹配的机制,以便它们可以开始共享数据。这适用于通信过程中的任何一点。Fast DDS提供以下发现机制:
- Simple Discovery. 这是默认的发现机制,在RTPS标准中定义,并提供与其他DDS实现的兼容性。在这里,DomainParticipant在早期阶段被单独发现,以随后匹配它们实现的DataWriter和DataReader。
- Discovery Server. 该发现机制使用集中式发现架构,其中服务器充当元流量发现的中心。
- Static Discovery. 这实现了对彼此的DomainParticipant的发现,但如果远程DomainParticipants事先知道每个DomainParticipate(DataReader/DataWriter)中包含的实体,则可以跳过对这些实体的发现。
- Manual Discovery. 该机制仅与RTPS层兼容。它允许用户使用其选择的任何外部元信息通道手动匹配和取消匹配RTPSParticipant、RTPSWriter和RTPSReader。
快速DDS中实现的所有发现协议的详细说明和配置可以在发现部分中看到。
2.3.2 安全
快速DDS可配置为通过在三个级别实现可插拔安全性来提供安全通信:
- Authentication of remote DomainParticipants. DDS:Auth:PKI-DH插件使用可信证书颁发机构(CA)和ECDSA数字签名算法提供认证,以执行相互认证。它还使用椭圆曲线Diffie-Hellman(ECDH)密钥协议建立共享密钥。
- Access control of entities. DDS:Access:Permissions插件在DDS域和主题级别为域参与者提供访问控制。
- Encryption of data. DDS:Crypto:AES-GCM-GMAC插件在伽罗瓦计数器模式(AES-GCM)中使用高级加密标准(AES)提供认证加密。
有关Fast DDS中安全配置的更多信息,请参阅安全部分。
2.3.3 日志
Fast DDS提供了一个可扩展的日志记录系统。日志类是日志系统的入口点。它公开了三个宏定义以便于使用:EPROSIMA_LOG_INFO、EPROSIMA-LOG_WARNING和EPROSIMA.LOG_ERROR。此外,除了已经可用的类别(INFO_MSG、WARN_MSG和ERROR_MSG)之外,它还允许定义新的类别。它使用正则表达式按类别进行过滤,并控制日志系统的详细程度。有关可能的日志记录系统配置的详细信息,请参阅日志记录部分。
2.3.4 Xml配置
Fast DDS提供了使用XML配置文件更改默认设置的可能性。因此,可以修改DDS实体的行为,而无需用户实现任何程序源代码或重新构建现有应用程序。
用户具有每个API功能的XML标记。因此,可以通过标记或分别带有<data_writer>和<data_reader>标记的DataWriter和DataReader配置文件来构建和配置DomainParticipant配置文件。
为了更好地理解如何编写和使用这些XML概要文件配置文件,您可以继续阅读XML概要文件部分。
2.3.5 环境变量
环境变量是指通过操作系统功能在程序范围之外定义的变量。Fast DDS依赖于环境变量,因此用户可以轻松自定义DDS应用程序的默认设置。有关影响Fast DDS的环境变量的完整列表和说明,请参阅环境变量部分。