车载通信与DDS标准解读系列(3):DDS-XTypes

DDS-XTypes协议,全称为Extensible and Dynamic Topic Types for DDS,与DDS协议和DDSI-RTPS协议共同作为DDS协议簇中的子协议,其基于DDS协议中定义的DCPS模型,对Topic的数据类型及操作方式进行规范化。协议于2012年发布1.0版本,目前最新版本为2020年发布的1.3版本。本文将从序列化概念切入,将XTypes中对于DDS Datatypes和序列化方式的规范做介绍。

▎一个例子帮你了解序列化

从前有一对儿小夫妻,约定好时间要搬家,于是丈夫张三和妻子李四分别在旧家和新家整理搬运的家具。为了方便家具搬运,张三在家里先按照说明书把家具拆解打包,而后等工人搬上车,运到新家。到达新家后,李四负责把家具拆封且按照说明书组装回家具原来的样子。

将DDS的数据发布订阅过程映射为搬家的流程再贴切不过了,传数据的过程和搬家具的过程类似, DDS的各个角色在传数据过程中提供序列化功能。

数据传输过程中,发布方需要将数据像家具一样拆解打包变为字节流,这个过程为序列化;订阅方则需要将收到的字节流重新组装为原始写入数据,这个过程为反序列化。

在这里插入图片描述

▎DDS-XTypes协议定义了哪些内容

上一节已经对于序列化的概念有了基本介绍,那么后面需要思考的问题是以数据为中心的DDS中间件中如何进行数据的序列化。

在这里插入图片描述
如果将DDS中发布订阅数据对象的数据类型类比为家具,每一类家具的结构不同,都需要按照自己特有的说明书进行拆解,在DDS中则是通过DDS-XTypes协议规范了不同数据类型序列化流程的关键环节,主要涉及的环节包括:

在这里插入图片描述

  • Type System:定义了用于描述DDS 数据Topic的Datatype(数据类型),可以理解为对于家具的分类(沙发类,床类等)。
  • Type Representation:定义了Datatype的标准化描述格式,如XML、IDL等,每种描述格式具有统一的描述语言和形式,作为后续软件开发的输入。
  • Language Binding:定义了应用程序如何通过API对Datatype进行定义和操作,不同Datatype的定义都要由特定的编程语言实现,如c++,java等,通过编程语言可以生成指定Datatype的数据对象,并对其或者其类型进行其他操作。
  • Data Representation:定义了不同Datatype的序列化方式,可以理解为执行某类家具拆解的用户手册,不同的家具类型执行不同的拆分方式。

在这里插入图片描述

Type System

在DCPS模型中,DataWriter和DataReader在创建时绑定了数据主题——Topic,每个Topic都唯一地支持一种数据类型,在XTypes中则定义了DDS中支持的各数据类型。

DDS支持的数据类型分为三个大类:Primitive Types(基本类型)、String Types(字符串类型)、Constructed Types(构造类型)。

在这里插入图片描述

  • Primitive Types:涵盖整数类型、浮点类型和字符类型,对于基本类型中的数据类型需要掌握其范围及精度,对于DDS中涉及的基本数据类型主要包括:Boolean、UInt8、UInt16、UInt32、UInt64、Float32、Float64、Float128。
  • String Types:基于Primitive Types中char类型的多维数据类型,可以理解为定义一个string类型的数据对象,其等价为内部元素为Char类型的数组。在基本类型中对于Char8和char16进行区分,同样在String中对于string8和string16进行区分,string8成员为char8,默认使用UTF-8,string16成员为char16。
  • Constructed Types:复合数据类型,每一个构造类型的实例化对象都是一个容器,其内部包含某种或者多种类型的成员,主要包括:Enumeration、Bitmask、Alias、Array、Sequence、Map、Structure、Union。协议规定Topic的数据类型必须为Structure或者Union。

Type Representation

Type Representation中规范了DataType的文件定义格式,其主要包含几个功能:

  • 提供用户定义或存储数据类型的格式
  • 通过定义特定的存储文件作为代码生成的输入
  • 提供应用动态解析数据对象的输入

当前版本中涉及的类型表示格式有:IDL、TypeObject、XML和XSD,其结构关系如下图所示。

在这里插入图片描述

  • IDL(Interface description language):类似伪代码,语言简洁,可通过编译转化为大部分编程语言。
  • XML(Extensible Markup Language):语言简洁,易于读写。
  • XSD(XML Schema Definition):允许工具执行语法检查和编辑,可读性强,语法繁琐,更多用于定义XML语法而不是数据类型,需要使用特定模式构造数据。
  • TypeObject:基于IDL表示,所有的数据和属性均定义相应的名称和取值,表示紧凑,但可读性差。

Data Representation

Data Representation部分定义了不同Datatype的序列化方式,具体的序列化方式有三种版本,包括:Extended CDR version 1(XCDR1)、Extended CDR version 2(XCDR2)和XML(使用较少不再展开描述)。

同一种版本的序列化方式也会因为数据成员的类型进行细分,但是并不是由人为的选择序列化方式。针对某一个实例化的数据对象,当确定其序列化版本以后,根据其特性会执行对应的序列化方式。

Extended CDR Representation (encoding version 1)

XCDR v1包含两种序列化方式:PLAIN_CDR和PL_CDR,其中,PLAIN_CDR支持primitive、string类型且包括Extensibility为final和appendable的数据类型;PL_CDR支持则Extensibility为mutable的数据类型(只有Structure和Union可以设置为mutable)或者是被指定为optional的成员类型。

在这里插入图片描述

PLAIN_CDR

Primitive Types将序列化为和其本身等长度的结果,并按照其本身长度对齐,除float128(长度16字节,需要8字节对齐)

在这里插入图片描述
String Types中String按照UTF8序列化,添加length字段,长度为UTF-8编码字节数+结尾完结符,String按照UTF16序列化,添加length字段,长度为UTF-16编码字节数。(原字节数的二倍)

在这里插入图片描述
Constructed Types中涉及到的sequence、map类型的数据需要添加4个字节的长度字段,定长的array则按照成员顺序进行序列化,不需要添加长度字段,structure、union中需要按照成员的定义顺序进行序列化,具体可参考下图示例。

在这里插入图片描述

PL_CDR

对于PL_CDR,它能够支持Extensibility为mutable的数据类型和被指定为optional的成员类型。在PL_CDR中对于每个数据成员都添加Parameter header,需要注意Parameter header的头部格式。

在这里插入图片描述
Parameter header由ParameterId和ParameterLength组成,其中ParameterId为MemberId的映射,ParameterLength为序列化成员的长度(不包含Parameter header)。

Extended CDR Representation (encoding version 2)

XCDR v2包含三种序列化方式:PLAIN_CDR2、DELIMITED_CDR2和PL_CDR2,其中,PLAIN_CDR2支持primitive、string类型且包括Extensibility为final和appendable的数据类型;DELIMITED_CDR2支持则Extensibility为appendable的数据类型,包括enumerated type和 aggregated type;PL_CDR2支持则Extensibility为mutable的数据类型(只有Structure和Union可以设置为mutable)或者是被指定为optional的成员类型。

在这里插入图片描述

DELIMITED_CDR2

DELIMITED_CDR2中需要对于整个数据对象头部添加Delimiter Header,Delimiter Header为uint32类型的长度字段。

在这里插入图片描述

PL_CDR2

对于PL_CDR2,其支持则Extensibility为mutable的数据类型和被指定为optional的成员类型。在PL_CDR2中在整个序列化数据对象头部添加Delimiter Header,也需要对于每个数据成员都添加Member header。

在这里插入图片描述

XCDR2相比于XCDR1的不同主要有三点:

  1. 针对primitive和可扩展性为final的数据类型,PLAIN_CDR2和PLAIN_CDR除int64、uint64、float64、float128的对齐字节数不同外,其余类型一致。
  2. 针对可扩展性为appendable的数据类型,XCDR1使用PLAIN_CDR,XCDR2使用DELIMITED_CDR2,添加4字节的DHEADER。
  3. 对于可扩展性为mutable的数据类型,XCDR1使用PL_CDR,对于每个类型成员添加Parameter
    header,XCDR2使用PL_CDR2,相比于PL_CDR增加了4字节的DHEADER。

Language Binding

Language Binding指定用来构造和操作数据类型的对象的编程语言,主要包括:Plain Language Binding和Dynamic Language Binding。

Plain Language Binding

Plain Language Binding使用IDL表示类型,应用OMG标准IDL语言映射,通过映射生成特定编程语言的代码:IDL-> c / c++ / java等。

Dynamic Language Binding

提供了操作类型的API,包括构造新数据类型,如:Operation: create_array_type、Operation: delete_type等,且允许编译未知类型的数据对象。

▎结语

本文从序列化概念切入,介绍XTypes中对于DDS Datatypes和序列化规则,包括:DDS中可支持的数据类型及其分类、数据对象的文件定义格式、开发语言绑定规则、具体的序列化规则。

DDS作为一种灵活、可靠、低延迟且具有高安全性的通信方案,为汽车OEM提供了除SOME/IP之外的另一种选择。逐渐成为汽车通信系统的选择。更多有关DDS子协议的内容,会在后续文章中为大家进行介绍,敬请期待。

了解更多:请致电 010-64840808转6115或发邮件至market_dept@hirain.com(联系时请说明来自CSDN平台)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值