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的不同主要有三点:
- 针对primitive和可扩展性为final的数据类型,PLAIN_CDR2和PLAIN_CDR除int64、uint64、float64、float128的对齐字节数不同外,其余类型一致。
- 针对可扩展性为appendable的数据类型,XCDR1使用PLAIN_CDR,XCDR2使用DELIMITED_CDR2,添加4字节的DHEADER。
- 对于可扩展性为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平台)