一、DDS系统架构
DDS通信中间件的体系架构以及在整个系统中所处的位置如下图所示,主要包括:操作系统/通信协议屏蔽层、RTPS互联互通层、发布订阅逻辑层、用户接口层。

图1 DDS中间件体系架构图
DDS数据分发中间件自底向上包括:
异构资源屏蔽层:该层负责硬件平台/操作系统/通信资源的封装,并统一提供给上层使用,使得上层可以不用关心操作系统资源异构而专注发布订阅数据模型的逻辑设计。
RTPS互联互通层:该层通过实现RTPS协议以保证能与不同厂商DDS进行报文层面的互联互通。
发布订阅逻辑层:该层利用底层RTPS设计的报文以及报文行为来实现发布订阅数据模型,定义并实现发布订阅数据模型中的实体及其功能。
用户接口层:该层实现DDS规范中定义的接口,应用程序通过这些开发接口创建DDS实体、发布数据、订阅数据以及配置发布订阅的通信要求。
DDS中间件采用发布/订阅机制,

图2 DDS中间件中的发布/订阅机制
域时DDS支持的一个通信环境,应用程序实现相互通信的前提是在同一个域内,这一约束有利于隔离不同的应用程序。每个分布式系统可以由一个或多个域组成。
数据写者是数据发布方的类型化的接入器,数据写者将数据提供给数据发布方,由发布者完成数据分发,数据发布方根据自身的QoS策略和数据写者的QoS策略进行数据分发。
数据读者负责获取订阅者接收到的数据,并传递给应用程序的DCPS层。数据订阅方负责接收来自发布者的数据,然后将接收到的数据传给相应的数据读者,使应用程序获得它所感兴趣的数据。
主题作为数据发布方和数据订阅方之间的基本连接点,两个节点上的发布方主题和订阅方主题相匹配才能进行通信,一个主题由主题名(Topic Name)和主题类型(Topic Type)组成。
二、DDS功能模块划分
DDS中间件遵循国际OMG组织制定的数据分发服务DDS规范,将单点集成和即插即用的理念转化为可用平台,采用发布订阅模式,支持软件与硬件的松耦合、数据发布方和数据接收方的送耦合。
DDS中间件分为用户接口层、发布订阅逻辑层、RTPS互联互通层和异构资源屏蔽层。
1)用户接口层
用户接口层定义了一套标准接口,如图所示,分布在五个模块中:

图3 订阅/发布接口模块定义
基础模块:定义由其他模块精炼的接口,提供两种与中间件交互的方式,即WaitSet的同步模式以及Listener的异步模式。
主题模块:包含Topic接口,即应用定义Topic对象以及关联相应QoS策略所需要的所有数据结构及接口。
发布模块:包含Publisher、DataWriter接口,即发布端所需要的所有数据结构及接口。
订阅模块:包含Subscriber、DataReader、DataReaderListener接口,即订阅端所需要的全部数据结构及接口。
Domain模块:包含DomainParticipant接口,作为服务的入口点及多个实体的工厂,并作为其他组成服务对象的容器。
2)发布订阅逻辑层
由DDS实现全局数据空间的概念,按照逻辑上的<数据类型-主题>来组织标识系统中的所有数据,发布者和订阅者在该全局空间中分别发布和订阅自己需要的<数据类型-主题>,通过中间件处理后完成数据分发。在该模式中数据并非存在于同一存储的地址空间中,而是仅仅存在于那些对它感兴趣的应用程序的本地缓存中。

图4 DDS数据传递过程
上图为DDS中数据传递的过程,主要包括以下实体:域参与者(DomainParticipant)、发布者(Publisher)、数据写者(DataWriter)、订阅者(Subscriber)、数据读者(DataReader)、数据对象标识(Topic)。
Publisher是一个负责分发数据的实体,可以发布不同类型的数据,应用程序通过DataWriter的操作来写数据。每一个Publisher都有一个关联的DataWriter,当关联的数据对象有了新的值,通过写操作通知中间件,Publisher负责发布DataWriter描述的数据,并根据用户配置的QoS来决定如何发送数据,并执行发送操作。
Subscriber负责接收并分发不同类型的数据,应用程序使用主题化(类型、主题名称化)的DataReader来获取接收到的数据。
Topic包含名称(系统中唯一)、数据类型,通过Topic,使空间和时间上松耦合的发布者和订阅者之间产生关联。这种订阅/发布数据模型不需要系统中其他应用程序的信息(包括存在性以及位置等信息),以实现软硬件的解耦。
DDS支持多种通信特征,并提供接口通过丰富的QoS策略,让应用程序来定制DDS通信实体所需的通信特征的组合。

图5 Qos策略的作用
如上图所示,QoS策略将精细化地控制数据他在全局数据空间的生命周期、资源使用量以及数据传输的行为等。
3)RTPS互联互通层
RTPS层包含四个模块:RTPS结构定义模块、RTPS报文定义模块、RTPS行为模块和RTPS发现模块。
RTPS结构定义模块定义了通信端点;RTPS报文定义模块定义了这些端点可以交换的消息集合;RTPS行为定义模块定义了合法的交互(消息交换)的集合以及这些交互如何影响通信端点的状态;RTPS发现模块定义了实体如何自动地被发现以及配置。

图6 RTPS的组成
4)异构资源屏蔽层
异构资源屏蔽层负责对DDS系统使用到的硬件平台/操作系统/通信协议进行封装,并统一提供给上层使用,使得上层可以不用关心操作系统资源异构而专注发布订阅数据模型的逻辑设计。同时,屏蔽层的存在也增加了DDS的可定制性以及可扩展性。

图7 异构资源屏蔽层
异构资源屏蔽层的模块划分如上图所示,包含两个模块:
操作系统资源屏蔽模块:该模块主要包括线程/任务封装子模块、同步资源封装子模块、内存访问封装子模块、IO封装子模块,对异构操作系统(银河麒麟桌面版、银河麒麟服务器版)的上述系统资源访问接口进行封装。
网络资源屏蔽模块:主要包括已经实现的以太网封装子模块、反射内存网络子模块以及TSN仿真网络子模块。
a.线程/任务封装子模块
DDS利用该子模块封装不同操作系统(银河麒麟桌面版、银河麒麟服务器版)下的进程、线程(任务)资源,包括资源创建、销毁、标识、优先级设置等。根据实际提供的操作系统在进程/线程(任务)属性等标识来实现该模块下的创建、销毁等子模块定义的接口。
b.同步资源封装子模块
对于不同操作系统(银河麒麟桌面版、银河麒麟服务器版)多线程、多任务的进程(模块),需要利用同步资源(包括线程锁、信号量等)对共享资源进行访问同步,以保证系统状态的一致性。
DDS利用该子模块来屏蔽不同平台的差异,定义统一的创建、销毁、获取资源、释放资源、属性配置的接口。需要针对目标操作系统的同步资源的特征进行分析,并选取合适的同步资源使用。
c.内存访问封装子模块
DDS利用该子模块封装不同操作系统(银河麒麟桌面版、银河麒麟服务器版)的堆栈资源的访问,以及整个DDS的内存管理。
DDS中间件封装了2种内存管理方式,分别为动态内存管理和静态内存管理。
动态内存管理提供了更加灵活的使用方式,可以更有效地利用系统资源。
静态内存管理提供了对内存全局的监控和管理,避免用户进行不规范的内存访问或占满内存导致系统发生卡死、崩溃等故障。
d.异构网络屏蔽模块
异构网络屏蔽模块抽象出网络通信原语,并进一步抽象为通用的网络通信接口。用不同的网络通信方式实现这些接口形成子模块,如以太网通信子模块、反射内存网络通信子模块以及TSN仿真网络子模块等。
三、DDS转发节点
DDS使用同时处在多个网络中的应用程序作为转发节点,将多个网络联通。转发节点主要负责以下几点功能:
1)在发现阶段,将从某一个网络中收到的域参与者发送的SPDP广播消息,广播到其他网络之中,如此,其他网络的域参与者可以发现该域参与者。
2)在数据发送阶段,发布者将跨网数据发送给转发节点,由转发几点将数据转发给订阅者。
四、DDS数据监控
DDS数据监控工具用于监控网络中所有部署了DDS应用程序的节点的通信状况。该工具检测整个网络中所有DDS系统的可用信息,并将获取到的信息显示到一个人机交互界面上供用户查阅。用户通过此工具,可以直观地了解到当前网络中节点的联通情况,并且可以查看每个节点中的详细的版本状态、发布/订阅信息以及QoS配置等属性。只有开启了可监控状态的节点的信息才能被DDS数据监控工具获取到。
DDS数据监控工具主要分为节点信息交互模块和用户界面模块,整体布局如下图。

图8 DDS监控界面布局
五、DDS节点信息交互
节点信息交互模块负责获取各个DDS节点通过Monitor接口发送的Monitor数据报文,并解析为具体的属性值,提供给上层用户界面进行显示。
DDS数据监控工具启动后可以指定域号获取该域中所有节点的信息,此时,监控工具会向所有开启了监控状态的DDS节点发送报文,通知这些节点向监控工具发送信息。每一次开启/取消监控的动作都会发送特殊报文通知DDS节点是否需要继续向监控工具发送状态报文。
当DDS节点开启监控状态时,每一次状态的变更(发布/订阅数据更新、节点上下线等)都会通过Monitor接口向DDS数据监控工具发送一条报文;DDS数据监控工具解析该报文后将结果提交给上层界面。