前面已经简要介绍过DDS协议规范了,接下来我们来看一个它的C++实现----Fast DDS。
eProsima Fast-DDS是eprosima对于DDS的C++实现,这是一个免费开源软件,遵循Apache License 2.0。eProsima Fast DDS在性能,功能和对最新版本RTPS标准(RTPS 2.2)的遵守方面均处于领先地位。它最为被大家知道的可能是因为被ROS2设定为默认的消息中间件。Fast DDS由以下几部分组成:
1.DDS API接口实现;
2.Fast DDS-Gen工具,用于将类型化接口与中间件实现桥接的生成工具。
3.底层RTPS协议实现。
DDS API
DDS采用的通信模型是一种多对多的单向数据交换,生产数据的应用程序将数据发布给应用本地缓存的订阅者,订阅者消费数据。信息流由负责数据交换的实体之间建立的服务质量(QoS)策略来调节。
作为一个以数据为中心的模型,DDS建立在所有感兴趣的应用程序都可以访问“全局数据空间”的概念之上。提供数据的应用程序成为发布者,而希望访问部分数据空间的应用程序成为订阅者。每当发布者将新数据发布到此空间时,中间件将信息传播给所有感兴趣的订阅者。
通信是跨域进行的,抽象的平面连接所有能够相互通信的分布式应用程序。只有属于同一个域的实体才能进行交互,订阅数据的实体和发布数据的实体之间的匹配是通过主题进行匹配的。主题是将域中唯一的名称与数据类型和一组附加的特定于数据的QoS相关联的明确标识符。
下图是信息如何在DDS域中流动的概念图,只有属于同一域的实体才能通过匹配主题相互发现,从而在发布者和订阅者之间交换数据。
Fast DDS-Gen
依赖于接口意味着需要一个生成工具,将类型描述转换为适当的实现,以填补接口和中间件之间的空白。此任务由专用的生成工具Fast DDS-Gen执行,Fast DDS-Gen是一个Java应用程序,它使用在接口定义语言(IDL)文件中定义的数据类型生成源代码。
RTPS Wire Protocol
eProsima Fast DDS用于在标准网络上交换消息的协议是实时发布-订阅协议(RTPS),这是一种由OMG联盟定义和维护的互操作性协议。该协议通过TCP/UDP/IP等传输协议提供发布者-订阅者通信,并保证不同DDS实现之间的兼容性。
考虑到RTPS协议的发布-订阅设计的目的及其为满足DDS应用程序域处理的相同需求而设计的规范,RTPS协议许多概念和DDS都是对应的,因此是DDS实现理所当然的选择。所有RTPS核心实体都与一个RTPS端点匹配的隔离通信平面的域相关联,而RTPS核心实体又与DDS实体一一对应,从而同一域的DDS实体间可以通信。
主要特点
- 两个API层。eProsima Fast DDS包括一个关注可用性的高级DDS兼容层和一个提供对RTPS协议更好访问的低级RTPS兼容层。
- 实时行为。eProsima Fast DDS可以配置为提供实时功能,保证在指定的时间限制内响应。
- 内置的发现服务器。eProsima Fast DDS基于对现有发布者和订阅者的动态发现,并且不需要联系或设置任何服务器就可以连续执行此任务。但是,还可以配置Client-Server发现以及其他发现范式。
- 同步和异步发布模式。eProsima Fast DDS同时支持同步和异步数据发布。
- 尽力的和可靠的沟通。eProsima Fast DDS支持一种可选的可靠通信范式,超过UDP等最佳努力通信协议。此外,另一种设置可靠通信的方法是使用我们的TCP传输。
- 传输层。eProsima Fast DDS实现了可插拔传输的体系结构。当前版本实现了五种传输:UDPv4、UDPv6、TCPv4、TCPv6和SHM(共享内存)。
- 安全。eProsima Fast DDS可以配置为提供安全通信。为此,它在三个级别上实现了可插拔安全性:远程参与者的身份验证、实体的访问控制和数据加密。
- 统计模块。可以配置eProsima Fast DDS来收集和提供关于用户应用程序正在交换的数据的信息。
- 流控制器。我们支持用户可配置的流量控制器,可用于限制在特定条件下要发送的数据量。
- 即插即用连接。新的应用程序和服务被自动发现,并且可以在任何时候加入和离开网络,而不需要重新配置。
- 可伸缩性和灵活性。DDS构建在全局数据空间的概念之上。中间件负责在发布者和订阅者之间传播信息。这保证了分布式网络能够适应重新配置,并可扩展到大量的实体。
- 应用程序的可移植性。DDS规范包括到IDL的特定于平台的映射,允许使用DDS的应用程序只需要重新编译就可以在DDS实现之间切换。
- 可扩展性。eProsima Fast DDS允许使用新的服务对协议进行扩展和增强,而不会破坏向后兼容性和互操作性。
- 可配置性和模块化。eProsima Fast DDS提供了一种通过代码或XML概要进行配置的直观方式。模块化允许简单的设备实现协议的一个子集,同时仍然参与网络。
- 高性能。eProsima Fast DDS使用了一个静态的低级序列化库Fast CDR,这是一个c++库,根据RTPS规范中定义的标准CDR序列化机制进行序列化。
- 资源消耗低。允许预分配资源,最大限度地减少动态资源分配。避免使用无限资源。最大限度地减少复制数据的需要。
- 多平台。操作系统依赖项被视为可插拔模块。用户可以在目标平台上使用eProsima Fast DDS库轻松实现平台模块。默认情况下,该项目可以在Linux、Windows和MacOS上运行。
- 免费和开源。Fast DDS库、底层RTPS库、生成器工具、内部依赖项(如eProsima Fast CDR)和外部依赖项(如foonathan库)都是免费和开源的。
后续,会一起看下Fast DDS在不同平台的部署,欢迎关注。