一文了解DDS实时传输协议及其消息格式

随着数据分发服务 (Data Distribution Service,DDS)在大型分布式系统中的广泛采用,需要定义一个标准的“有线协议”:

一方面允许多个供应商的DDS产品实现互操作;

另一方面,能够利用DDS可配置的服务质量(Quality of Service,QoS)设置,以优化其对底层传输能力的使用,特别是能够利用许多DDS QoS设置的多播、尽力而为和无连接的特性。

在此背景下,DDS 实时发布订阅(Real-Time Publish Subscribe,RTPS)协议应运而生,并被设计为能够在多播和无连接的尽力而为传输(如UDP/IP)上运行,该协议主要功能包括:

性能和服务质量属性,可在标准IP网络上为实时应用程序实现最大努力和可靠的发布-订阅通信

容错性,允许创建无单点故障的网络

可扩展性,允许在不破坏向后兼容性和互操作性情况下使用新服务扩展和增强协议

即插即用连接,以便自动发现新的应用程序和服务,应用程序可以随时加入和离开网络,而无需重新配置

可配置性,允许平衡每次数据交付的可靠性和及时性要求

模块化允许,简单设备实现协议的一个子集,并且仍然参与网络

可扩展性,使系统能够潜在地扩展到非常大的网络

类型安全(Type-safety),以防止应用程序编程错误影响远程节点的操作

RTPS层的位置如下图1所示,该层位于以数据为中心的发布订阅(Data-Centric Publish Subscribe,DCPS)层和传输层之间。

应用程序将数据对象(Data object)传递给DCPS层,DCPS层通过历史缓存(HistoryCache)将数据传递给RTPS层,RTPS层以RTPS消息(Message)的形式将序列化后的数据传递给传输层进行传输。

Image

图1 DDS各层的交互关系简图

今天我们就来详细了解一下DDS实时传输协议——RTPS

1核心概念

表示一个包含一组参与者的单独通信平面,所有RTPS实体都与一个RTPS域关联。

域参与者

表示RTPS端点的拥有者,与DCPS层的域参与者相映射。

RTPS端点

分写入者端点和读取者端点两类。写入者通知在线状态、并将域内本地可用的数据发送给读取者,读取者可以请求并确认数据。

RTPS消息

RTPS读取者端点和写入者端点之间交换数据的结构和内容。

缓存变更

代表数据对象的变更。

历史缓存

是DCPS层和RTPS层之间交互接口的一部分。在写入者端,它包括数据对象变更的部分历史记录;

在读取者端它包括可存储的部分数据对象变更。历史缓存的内容取决于DDS QoS策略以及读取者的通信状态。

2 RTPS消息

RTPS 消息由固定长度的报头(Header)和可变数量的子消息(submessage)组成。其中,每个RTPS消息可以包括可变数量的子消息。消息总长度由下层的传输协议确定,目前RTPS协议中应用UDP/IP作为传输层协议。RTPS消息的组成如下图2所示:

Image

图2 RTPS消息的组成

3 消息报头

消息报头必须存在于每个消息的开头,用以识别RTPS消息、协议版本和中间件所属供应商,主要包括协议、协议版本、全局唯一标识符前缀三个字段。

其中协议字段用于标识消息属于RTPS消息,全局唯一标识符前缀被消息中所有子消息共用,表示所属的参与者。

4 子消息

每个子消息包括两部分:

  1. 子消息报头(SubmessageHeader)
  2. 一组子消息元素(SubmessageElement)

子消息报头包括子消息标识符、子消息标志、子消息长度三部分。

其中,子消息标识符是RTPS中规定的用于标识特定子消息类型的值;

子消息标志用于标识子消息的字节序及与具体子消息类型相关的标志位信息;

子消息长度不包括子消息报头的长度。

RTPS支持多种类型的子消息元素,常用的子消息元素如下图3所示:

Image

图3 子消息元素的类型

5 子消息分类

根据子消息与RTPS实体的关系及对消息接收器的影响,分为实体子消息和解释器子消息两大类,常用的RTPS子消息可细分如下表1所示。

表1 常用RTPS子消息

子消息名称

子消息用途

Data

包含有关应用数据对象的值的信息。

DataFrag

相当于Data ,但只包含新值的一部分(一个或多个片段)。允许数据作为多个片段传输,以克服传输消息大小的限制。

Heartbeat

描述Writer中可用的信息。

HeartbeatFrag

对于分片数据,描述了Writer中可用的分片信息。

Gap

描述与Readers不再相关的信息。

AckNack

Readers状态的信息。子消息允许Reader通知Writer它已经收到的序列号以及它仍然缺少的序列号。此子消息可用于进行正面和负面确认。

NackFrag

Readers状态的信息,更具体地说, Reader还缺少哪些片段。

HeaderExtension

提供逻辑上属于RTPS Header的其他信息。

InfoSource

提供有关后续实体子消息来源的信息。此子消息主要用于中继RTPS子消息。当前规范中没有讨论这一点。

InfoDestination

提供有关后续实体子消息的最终目的地的信息。此子消息主要用于中继RTPS子消息。当前规范中没有讨论这一点。

InfoReply

提供有关在何处回复后续子消息中出现的实体的信息。

InfoTimestamp

为后续实体子消息提供源时间戳。

Pad

如果内存对齐需要,用于在一条消息中增加填充。

不同子消息在组成上的差异主要体现在三个方面,即子消息标志、子消息长度、子消息元素组合。以数据子消息为例,数据子消息的布局如下图4所示:

Image

图4 数据子消息的布局

其中:

▷ 子消息标志:

• E标识消息的字节序;

• Q标识子消息中是否有内联QoS参数;

• D标识本消息的负载字段是否包含数据对象的序列化值;

• K标识本消息的负载字段是否包含数据对象的关键字序列化值;

• N标识负载的序列化是否已按照当前使用标准实施。

▷ readerId标识相关的读取者;

▷ writerId标识相关的写入者实体;

▷ writerSN 标识写入者赋予变更的序列号;

▷ inlineQos标识内联的QoS参数(仅在Q=1时有效);

▷ serializedPayload标识负载的类型:

• 当D=1时此字段包含数据对象的序列化值;

• 当K=1时此字段包含数据对象关键字的序列化值;

• D和K不能同时置1。

6 序列化负载

序列化负载包括报头和内容两部分。其中,报头由表示标识符和表示选项组成,表示标识符规定了数据表示形式,表示选项部分目前未使用,全部置0。常用的端点表示标识符如下表2所示:

表2 常用端点表示标识符

表示标识符

意义

CDR_BE 

{0x00, 0x00} 

采用大端表示

CDR_LE

{0x00, 0x01} 

采用小端表示

PL_CDR_BE

{0x00, 0x02} 

带有参数列表,使用大端表示

PL_CDR_LE

{0x00, 0x03} 

带有参数列表,使用小端表示

_

以内置端点序列化负载为例,对于主题名称为square、主题类型为ShapeType的DDS数据读取者,在端点发现过程中声明该数据读取者传输的数据子消息序列化负载如下图所示。

Image

图5 序列化负载举例

由上图可知,表示标识符为PL_LE,即采用小端表示(图中黑色方框);

数据读取者的端点GUID为C0:A8:02:05:00:00:3A:20:00:00:02:80:00:00:07(图中绿色方框);

目的地顺序QoS的类型为基于源时间戳(图中橙色方框);

截止期限QoS为3秒(图中蓝色方框)。

7总结

本文主要分享了DDS RTPS层的背景、基本的概念及RTPS消息的类型,实际中,RTPS还包括了实体及其交互行为、自动发现等内容,未来我们将会持续展开相应的技术与应用分享,欢迎持续关注公众号!

参考文献:

[1]DDS: Data-Distribution Service for Real-Time Systems version 1.4.

[2]DDS-RTPS: Data-Distribution Service Interoperability Wire Protocol version 2.5.

[3]DDS-XTYPES: Extensible and Dynamic Topic-Types for DDS version 1.3.

[4]Corsaro A ,  Schmidt D . The Data Distribution Service - The Communication Middleware Fabric for Scalable and Extensible Systems-of-Systems[J]. Chapters, 2012.

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值