首页> 中国专利> 一种实时或离线解析DDS通信中RTPS协议的方法

一种实时或离线解析DDS通信中RTPS协议的方法

摘要

本发明公开了一种实时或离线解析DDS通信中RTPS协议的方法,获得符合DDS规范的数据结构定义IDL文件,使用语法解析工具构造每个IDL文件的解析树;递归解析获得每个IDL文件的Interfaces、Consts、Enums、Typedefs、Structs、Unions、Modules的结构;使用二进制数据构建器获得IDL文件中Interfaces、Consts、Enums、Typedefs、Structs、Unions对应的结构体;使用抓包工具实时从网络中获取DDS通信数据包,也可以使用离线抓取的DDS通信数据包;通过读取数据包中RTPS协议内的TopicInformation,找到已经构建好的对应类型的结构体;读取该数据包中RTPS协议内的SerializedData,对该二进制数据按照结构体进行解析,获得填充了具体属性值的结构体;递归读取该结构体,获得每一个属性对应的数据内容,并将信息输出/显示。

著录项

  • 公开/公告号CN114785877A

    专利类型发明专利

  • 公开/公告日2022-07-22

    原文格式PDF

  • 申请/专利权人 奥特酷智能科技(南京)有限公司;

    申请/专利号CN202210396385.2

  • 发明设计人 沈闽韬;陈诚;张旸;

    申请日2022-04-14

  • 分类号H04L69/22;H04L69/06;H04L65/65;

  • 代理机构南京行高知识产权代理有限公司;

  • 代理人李晓

  • 地址 211800 江苏省南京市浦口区桥林街道步月路29号12幢-289

  • 入库时间 2023-06-19 16:04:54

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-07-22

    公开

    发明专利申请公布

说明书

技术领域

本发明涉及DDS通信技术,尤其涉及一种实时或离线解析DDS通信中RTPS协议的方法。

背景技术

由于现有DDS技术中使用RTPS协议进行传输,用户需要通过OMG IDL语法自定义消息结构体,而RTPS协议在传输时会将IDL定义的消息结构体序列化为二进制字节流的形式进行传递,这带来了实时/离线调试中捕获的数据包无法解读的问题,也导致了无法快速定位DDS通信中由消息传递带来的问题。

当前DDS协议栈会在每一个DDS Publisher中提供一个特殊的Debug Topic,调试工具通过订阅该Topic获得调试信息。该方法需要占用一定的带宽,且DDS网络规模越大占用的带宽也就越大。且该方法只能进行实时监控,不能离线解析DDS通信数据。

发明内容

为解决现有技术中存在的不足,本发明的目的在于,提供一种实时或离线解析DDS通信中RTPS协议的方法。

为实现本发明的目的,本发明所采用的技术方案是:

一种实时或离线解析DDS通信中RTPS协议的方法,所述方法包括步骤:

(1)获得符合DDS规范的数据结构定义IDL文件及该文件依赖的其它IDL文件,使用语法解析工具构造每个IDL文件的解析树;

(2)递归解析每一个IDL文件的解析树,获得每个IDL文件的Interfaces、Consts、Enums、Typedefs、Structs、Unions、Modules的结构;

(3)基于步骤2中获得的结构,使用二进制数据构建器获得IDL文件中Interfaces、Consts、Enums、Typedefs、Structs、Unions对应的结构体;

(4)使用抓包工具实时从网络中获取DDS通信数据包,也可以使用离线抓取的DDS通信数据包;

(5)通过读取该数据包中RTPS协议内的Topic Information信息,找到步骤3中已经构建好的对应类型的结构体;

(6)读取该数据包中RTPS协议内的SerializedData,对该二进制数据按照结构体进行解析,获得填充了具体属性值的结构体;

(7)递归读取该结构体,获得每一个属性对应的数据内容,并将信息输出/显示,也可以转化为JSON串输出。

进一步地,步骤(1)中,使用语法解析工具构造每个IDL文件的解析树具体包括步骤:

(1.1)进行预处理,剔除并不属于IDL本身的语法的语句;

(1.2)对于预处理后的文件或字符串,递归读取IDL文件中代码块的内容,解析出对应的名称、类型;

(1.3)递归读取时,将当前代码块的名称与类型放入一个字典变量中,该字典变量的结构与IDL文件本身描述的各种代码块之间的结构相一致,这个字典变量即为解析树;

(1.4)递归读取结束后,该字典变量可以被解析为JSON或者XML对象,也可以传递给后续的步骤。

进一步地,步骤(2)中,将对象从树形结构拆分为多个数组结构,获得IDL文件中所有代码块的结构。

进一步地,步骤(3)中,根据步骤2中的具体代码块的结构与RTPS协议的序列化方法的描述,生成一系列符号表,表示这些结构与数据包数组中的对应关系。

进一步地,步骤(5)中,Topic Information中含有这次通信的topic的名称,以及该topic发送的数据的类型名称,通过遍历递归解析树对象后的数组,将类型的结构描述与名称进行匹配。

进一步地,步骤(6)中,通过名称查找出由Construct生成的符号表中对应该类型的所有符号信息;通过符号信息,将数据包中的二进制数组映射到由Construct创建的该类型对应的对象中,读取出该对象所包含的所有数据信息。

本发明的有益效果在于,与现有技术相比,本发明通过实时/离线解析DDS通信中RTPS协议的方式,为DDS实时/离线通信网络诊断提供了用户可读的信息,帮助用户快速查找/定位通信中的相关问题。且该方法可以通过旁路路由监听执行诊断,不占用任何网络带宽,同时可以将通信时的数据包提前记录下来进行离线分析,极大的方便了对DDS通信网络中的故障进行诊断。

附图说明

图1是本发明所述的实时或离线解析DDS通信中RTPS协议的方法流程图;

图2是IDL文件的语法结构;

图3是wireshark抓取的通信报文。

具体实施方式

下面结合附图和实施例对本发明的技术方案作进一步的说明。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本申请的保护范围。

如图1所示,本发明所述的实时或离线解析DDS通信中RTPS协议的方法,包含以下步骤:

(1)获得符合DDS规范的数据结构定义IDL文件及该文件依赖的其它IDL文件,使用语法解析工具构造每个IDL文件的解析树;

在具体实施例中,使用ANTLR4工具对IDL文件进行解析。

ANTLR4是一个基于LL算法实现的语法解析器生成器,它由3部分组成,分别是代码生成器,语法描述文件,运行时库。其中,语法描述文件用于描述IDL文件的语法结构。

如图2所示,左边的KW_STRUCT对应右边文件中的struct关键字,identifier为结构体名HelloWorldTopic,member_list对应结构体中的成员对象,member_list按行解析为member,member则有type_spec和declarators两部分,分别对应type名(例如Test1,td_char等),declarators则为该member的名称(例如t1,td_c等)。

IDL语法描述文件可以被代码生成器识别,并编译生成对应语言的代码文件(例如Python或C#),该文件内容为读取各种结构的方法的接口,例如可以返回identifier的名称之类的。这些接口需要进行重载,编写具体的代码实现读取不同内容的功能。

该代码作为解析工具的一部分,解析工具运行时需要加载ANTLR4另外提供的一个运行时库,包含基本定义与公共方法。当解析工具读取一个具体的IDL文件时,会进行如下步骤:

(1.1)预处理,有一些语句(例如#include或#ifndef)并不属于IDL本身的语法,需要进行额外操作后剔除;

(1.2)对于预处理后的文件或字符串,递归读取IDL文件中代码块的内容(例如,struct就是一个代码块,它中间还含有member_list这个代码块),解析出对应的名称、类型;

(1.3)递归读取时,将当前代码块的名称与类型放入一个字典变量中,该字典变量的结构与IDL文件本身描述的各种代码块之间的结构相一致,这个字典变量即为解析树;

(1.4)递归读取结束后,该字典变量可以被解析为JSON或者XML对象,也可以传递给后续的步骤。

注:任何一个语法解析器生成器都可以完成上述步骤,包括但不限于ANTLR4,以及Python的LARK。

(2)递归解析每一个IDL文件的解析树,获得每个IDL文件的Interfaces、Consts、Enums、Typedefs、Structs、Unions、Modules的结构;

以IDL文件的Interfaces为例,其在IDL文件中的原始代码块示例:

经过语法解析工具解析后的解析树对象格式:

递归解析树对象后获得的格式:

其目的在于增加层级信息,将对象从树形结构拆分为多个数组结构,方便后续读取。

(3)基于步骤2中获得的结构,使用二进制数据构建器获得IDL文件中Interfaces、Consts、Enums、Typedefs、Structs、Unions对应的结构体;

使用Python下的Construct库来完成构造。由于DDS通信数据包为二进制的byte数组,又由于前两步获得了IDL文件中所有代码块的结构,因此通过该结构可以计算出byte数组中从某一位到某一位对应代码块中某个结构的具体的值,而Construct的作用就是根据步骤2中的具体代码块的结构与RTPS协议的序列化方法的描述,生成一系列符号表,表示这些结构与数据包数组中的对应关系,这是反序列化的前半部分工作。

注:任何一个二进制数据构建器均可完成该工作。

(4)使用抓包工具实时从网络中获取DDS通信数据包,也可以使用离线抓取的DDS通信数据包;

(5)通过读取该数据包中RTPS协议内的Topic Information信息,找到步骤3中已经构建好的对应类型的结构体;

如图3所示,当wireshark抓取了包含DDS服务端与客户端握手信息的一系列通信报文后,每一次通信的数据包中就会被wireshark附带上Topic Information中,其中含有这次通信的topic的名称,以及该topic发送的数据的类型名称,后者就是解析时需要的信息。通过遍历递归解析树对象后的数组,即可以将类型的结构描述与名称进行匹配。

抓包是wireshark的一部分功能,使用其它的抓包工具例如tcpdump或者libpcap都可以抓取报文。

(6)读取该数据包中RTPS协议内的SerializedData,对该二进制数据按照结构体进行解析,获得填充了具体属性值的结构体;

在获得以上信息以后,我们就知道当前数据包里的数据对应的类型名称,通过名称可以查找出由Construct生成的符号表中对应该类型的所有符号信息。通过符号信息,就可以将数据包中的二进制数组映射到由Construct创建的该类型对应的对象中,也就可以读取出该对象所包含的所有数据信息。这是反序列化的后半部分工作。

(7)递归读取该结构体,获得每一个属性对应的数据内容,并将信息输出/显示,也可以转化为JSON串输出。

假设发送端与接收端之间的通信经过一个多网口的设备(例如一个路由器),该设备可以进行抓包,则可以通过该设备进行抓包,且在抓包过程中可以对于每一个经过的报文进行以上的解析操作。该操作对于发送端与接收端都是无感知的,也不需要传输额外的数据。同时抓包数据也可以保存下来,运用在后续的离线回放分析上。

本发明的有益效果在于,与现有技术相比,本发明通过实时/离线解析DDS通信中RTPS协议的方式,为DDS实时/离线通信网络诊断提供了用户可读的信息,帮助用户快速查找/定位通信中的相关问题。且该方法可以通过旁路路由监听执行诊断,不占用任何网络带宽,同时可以将通信时的数据包提前记录下来进行离线分析,极大的方便了对DDS通信网络中的故障进行诊断。

本发明申请人结合说明书附图对本发明的实施示例做了详细的说明与描述,但是本领域技术人员应该理解,以上实施示例仅为本发明的优选实施方案,详尽的说明只是为了帮助读者更好地理解本发明精神,而并非对本发明保护范围的限制,相反,任何基于本发明的发明精神所作的任何改进或修饰都应当落在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号