2.1。架构
Fast DDS的架构如下图所示,其中可以看到具有以下不同环境的层模型。
应用层。使用Fast DDS API 在分布式系统中实现通信的用户应用程序。
快速 DDS 层。DDS 通信中间件的稳健实现。它允许部署一个或多个 DDS 域,其中同一域内的域参与者通过在域主题下发布/订阅来交换消息。
RTPS 层。实施实时发布-订阅 (RTPS) 协议 以实现与 DDS 应用程序的互操作性。该层充当传输层的抽象层。
传输层。 快速 DDS可用于各种传输协议,例如不可靠传输协议 (UDP)、可靠传输协议 (TCP) 或共享内存传输协议 (SHM)。
2.1.1。DDS 层
Fast DDS的 DDS 层定义了几个用于通信的关键元素。用户将在他们的应用程序中创建这些元素,从而结合 DDS 应用程序元素并创建以数据为中心的通信系统。 Fast DDS遵循 DDS 规范,将通信中涉及的这些元素定义为Entities。DDS实体是支持服务质量配置 (QoS) 并实现侦听器的任何对象。
服务质量。定义每个实体的行为的机制。
听者。通知实体在应用程序执行期间出现的可能事件的机制。
下面列出了 DDS 实体及其描述和功能。有关每个实体、它们的 QoS 和它们的侦听器的更详细说明,请参阅DDS 层 部分。
域。一个正整数,用于标识 DDS 域。每个 DomainParticipant 都会有一个分配的 DDS 域,以便同一域中的 DomainParticipant 可以进行通信,以及隔离 DDS 域之间的通信。此值必须由应用程序开发人员在创建 DomainParticipants 时给出。
域参与者。包含其他 DDS 实体的对象,例如发布者、订阅者、主题和多主题。它是允许创建它包含的先前实体的实体,以及它们的行为配置。
出版商。Publisher 使用 DataWriter 在主题下发布数据,DataWriter 将数据写入传输。它是创建和配置它包含的 DataWriter 实体的实体,并且可能包含其中的一个或多个。
数据写入器。它是负责发布消息的实体。用户在创建此实体时必须提供一个主题,该主题将是发布数据的主题。通过将数据对象写入 DataWriterHistory 中的更改来完成发布。
数据写入器历史。这是对数据对象的更改列表。当 DataWriter 继续在特定主题下发布数据时,它实际上会在此数据中创建更改。正是这种变化记录在历史记录中。然后将这些更改发送到订阅该特定主题的 DataReader。
订户。订阅者使用 DataReader 订阅主题,DataReader 从传输中读取数据。它是创建和配置它包含的 DataReader 实体的实体,并且可能包含一个或多个 DataReader 实体。
数据读取器。它是订阅主题以接收发布的实体。用户在创建此实体时必须提供订阅主题。DataReader 接收消息作为其 HistoryDataReader 中的更改。
数据读取器历史。它包含DataReader 由于订阅某个主题而收到的数据对象的更改。
主题。将发布者的 DataWriters 与订阅者的 DataReaders 绑定的实体。
2.1.2. RTPS层
如上所述,Fast DDS中的 RTPS 协议允许从传输层抽象出 DDS 应用实体。根据上图,RTPS 层有四个主要的实体。
RTPSD 域。它是 DDS 域对 RTPS 协议的扩展。
RTPS 参与者。包含其他 RTPS 实体的实体。它允许配置和创建它包含的实体。
RTPS 编写器。消息的来源。它读取写入 DataWriterHistory 中的更改并将它们传输到之前匹配的所有 RTPSReader。
RTPS 阅读器。消息的接收实体。它将 RTPSWriter 报告的更改写入 DataReaderHistory。
有关每个实体、它们的属性和它们的侦听器的更详细说明,请参阅RTPS 层 部分。
2.1.3。传输层
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多线程调度如何工作的简要概述:
主线程:由应用程序管理。
事件线程:每个 DomainParticipant 拥有其中之一。它处理周期性和触发的时间事件。
异步写入线程:该线程管理所有 DomainParticipants 的异步写入。即使对于同步写入器,某些形式的通信也必须在后台启动。
接收线程:域参与者为每个接收通道生成一个线程,其中通道的概念取决于传输层(例如 UDP 端口)。
2.2.2。事件驱动架构
有一个时间事件系统使Fast DDS能够响应某些条件,以及安排定期操作。由于大多数与 DDS 和 RTPS 元数据有关,因此用户很少看到它们。TimedEvent 但是,用户可以通过从类继承在他们的应用程序中定义周期性时间事件。
2.3. 功能
Fast DDS具有一些附加功能,可由用户在其应用程序中实施和配置。这些概述如下。
2.3.1。发现协议
发现协议定义了 DataWriters 在给定 Topic 下发布和订阅同一 Topic 的 DataReader 匹配的机制,以便它们可以开始共享数据。这适用于通信过程中的任何时候。 Fast DDS提供以下发现机制:
简单的发现。这是默认的发现机制,在 RTPS 标准中定义并提供与其他 DDS 实现的兼容性。在这里,DomainParticipants 是在早期单独发现的,以便随后匹配它们实现的 DataWriter 和 DataReader。
发现服务器。这种发现机制使用集中式发现架构,其中服务器充当元流量发现的中心。
静态发现。这实现了 DomainParticipant 彼此之间的发现,但如果远程 DomainParticipant 事先知道这些实体,则可以跳过每个 DomainParticipant (DataReader/DataWriter) 中包含的实体的发现。
手动发现。此机制仅与 RTPS 层兼容。它允许用户使用其选择的任何外部元信息通道手动匹配和取消匹配 RTPSParticipants、RTPSWriters 和 RTPSReaders。
Fast DDS中实现的所有发现协议的详细解释和配置可以在Discovery部分看到。
2.3.2. 安全
Fast DDS可配置为通过在三个级别实施可插拔安全性来提供安全通信:
远程域参与者的身份验证。DDS:Auth:PKI-DH插件使用受信任的证书颁发机构 (CA) 和 ECDSA 数字签名算法提供身份验证,以执行相互身份验证。它还使用椭圆曲线 Diffie-Hellman (ECDH) 密钥协议协议建立共享秘密。
实体的访问控制。DDS:Access:Permissions插件在DDS 域和主题级别为 DomainParticipants 提供访问控制。
数据加密。DDS:Crypto:AES-GCM-GMAC插件使用伽罗瓦计数器模式 (AES-GCM) 中的高级加密标准 (AES) 提供经过身份验证的加密。
有关Fast DDS中安全配置的更多信息,请参见安全部分。
2.3.3。日志记录
Fast DDS提供了一个可扩展的日志系统。 Logclass 是 Logging 系统的入口点。它公开了三个宏定义以简化其使用logInfo:logWarning和logError. 此外,除了已经可用的类别( 和 )之外,它还允许定义INFO_MSG新WARN_MSG类别ERROR_MSG。它使用正则表达式提供按类别过滤,以及控制日志系统的详细程度。可能的日志系统配置的详细信息可以在日志部分找到。
2.3.4。XML 配置文件配置
Fast DDS提供了使用 XML 配置文件更改其默认设置的可能性。因此,可以修改 DDS 实体的行为,而无需用户实现任何程序源代码或重新构建现有应用程序。
用户对每个 API 功能都有 XML 标签。因此,可以通过标签构建和配置 DomainParticipant 配置文件,或者分别使用和标签构建和配置DataWriter 和 DataReader 配置文件。
为了更好地理解如何编写和使用这些 XML 配置文件,您可以继续阅读XML 配置文件部分。
2.3.5。环境变量
环境变量是那些通过操作系统功能在程序范围之外定义的变量。 Fast DDS依赖于环境变量,因此用户可以轻松自定义 DDS 应用程序的默认设置。有关影响Fast DDS的环境变量的完整列表和说明,请参阅环境变量部分。