基于XML的ASTERIX报文解析代码生成方法与流程

文档序号:19589461发布日期:2020-01-03 10:04阅读:883来源:国知局
基于XML的ASTERIX报文解析代码生成方法与流程

本发明涉及雷达数据解析,尤其涉及欧洲标准的航管雷达数据交换报文解析方法,具体的说是基于xml的asterix报文解析代码生成方法。



背景技术:

asterix为通用结构化雷达数据交换,是欧洲航管组织为了使不同厂商提供的雷达监视设备或空管自动化系统之间进行数据交互而提出的标准化数据传输规范。随着越来越多的厂商提供对asterix格式接口支持,它也逐渐成为雷达数据交换格式的国际标准。

asterix标准化数据传输规范,包含了多种类型数据协议(如cat21、cat048等),同时随着需求的不断变化,每种类型协议又分为多个协议版本(如cat21包含0.26、0.25等多个协议版本)。传统模式下,在使用asterix协议进行雷达数据交换或增加通信协议时,通信双方都需要为所使用的协议类型和版本进行相应的解析代码编写,包含了对不同协议类型和版本的程序设计,以及对各种不同类型数据项的逻辑处理编写;当修改协议类型或数据版本时,需要对原有的解析程序重新进行设计,同时asterix随着发展,所携带的信息越来越多,所需解析的数据越来越大。而在处理不同类型协议的和版本的报文时,所编写的代码又有许多相似之处。导致在使用手工完成代码过程中存在开发繁琐、工作量大、重复性工作较多等问题。



技术实现要素:

本发明的目的在于提供基于xml的asterix报文解析代码生成方法,用于解决背景技术中所描述的现有技术的问题和缺陷。本发明实现将使用xml进行配置的协议类型版本直接生成该报文解析代码,当出现增加协议类型、修改协议类型或版本时,无需手动编写程序,直接使用相应xml配置文件生成即可,方便、快捷、准确。

本发明通过下述技术方案实现:

一种基于xml的asterix报文解析代码生成方法,其特征在于,包括以下四个步骤:

步骤一:根据icd配置通信协议各种参数并保存为xml文件;

步骤二:读取步骤一中所得xml配置文件并解析生成计算机程序识别的内存对象;

步骤三:根据步骤二中所得内存对象生成对应的数据结构体文件;

步骤四:根据步骤二中所得内存对象生成对应的解析代码文件,同时,将解析代码文件对应存放至步骤三中所述的数据结构体文件中,最后生成一个有序调用其他解析函数的主函数,以供外部程序通过主函数调用对应的报文解析代码文件。

优选地,所述步骤一具体为:根据asterix为每一个类型协议和版本提供的icd提取出所需信息,这些信息包含:协议名称、协议版本、协议类型、数据项等,其中数据项信息包含数据项类型(数据项长度固定、数据项长度可变、重复型数据项、混合型数据项四种类型)、数据项初始长度、数据项id、数据项序号(frn)以及数据项下所包含的所有字段等,其中字段信息又包含了字段所处字节组、字段id、起始比特位、终止比特位、字段数据类型(包含int、uint、ascii、targetident、hex)等;提取出这些信息时,将信息按照特定的格式组织,并保存至xml中。值得说明的是,所述特定的格式组织是指:按照不同协议项目信息、数据类型以及数据字段等不同信息按照保存xml文件需要的常规手段进行保存即可。

值得说明的是,若在进行上述步骤之前已经存在了该类型和版本协议的配置文件,则该步骤一可以省略。

进一步地,所述步骤二读取xml配置文件,通过对xml的解析,将xml配置文件中所保存的数据信息转换成类型为asterix类对象存放在计算机内存中。其中dataitem对应数据项,subitem对应dataitem子数据项,field对应具体字段即具体数据值。在该类图中可以看到,dataitem、subitem、field对象都包含了id属性,该属性用于对象的唯一标识,id不能够重复,同时id规范应符合编程语言对变量的要求。其中asterix包含一个或多个dataitem,dataitem中包含一个或多个field或包含多个subitem,subitem中包含一个或多个field。

更进一步地,所述步骤三中结构体文件生成过程具体如下:

3.1循环取出asterix对象中的dataitem。asterix对象中包含多个dataitem对象,每个对象都应生成相应的结构体,该步骤使用循环方式取出asterix对象中的dataitem;

3.2生成以dataitem的id为结构体名称的结构体。该步骤生成结构体的声明,此时该结构体中还未包含任何成员变量;

3.3判断dataitem类型是否为混合型。dataitem为混合类型时,该类型下只包含了多个subitem,其他类型包含多个field,所以此处应对dataitem的类型进行判断处理;

3.4循环取出dataitem中的field。当dataitem类型不为混合类型时,该dataitem包含了多个field,每个field对应了具体的数据。使用循环方式取出field;

3.5根据field的id和类型生成对应结构体的成员变量。该步骤生成该field所在的dataitem生成的结构体的成员变量,成员变量的生成规则如上所述。当dataitem下所有的field都生成了结构体的成员变量时,此时就完成了该dataitem向结构体的转化,继续下一个dataitem;

3.6循环取出dataitem对象中的subitem。当dataitem类型为混合类型时,该dataitem包含了多个subitem,每个subitem都应生成相应的结构体,该步骤使用循环方式取出dataitem对象中的subitem;

3.7生成以subitem的id为结构体名称的结构体,并将该结构体生成dataitem结构体的成员变量;

3.8循环取出subitem的field。该步骤与第3.4步类似,使用循环方式取出field;

3.9根据field的id和类型生成对应结构体的成员变量。该步骤与第3.5步类似;

3.10生成主结构体。经过以上步骤完成了asterix下所有的dataitem结构体的生成,现在根据所有生成的结构体名生成结构体。按上文提供的规则生成。

3.11输出至结构体文件。

优选地,所述步骤四具体包括以下步骤:

4.1循环取出asterix对象中的dataitem。该步骤使用循环方式取出asterix中的dataitem;

4.2根据dataitem对象的id生成解析函数。生成一个用于解析该dataitem对象的函数定义;

4.3判断dataitem类型。对取出的dataitem类型进行判断,根据相应的类型为函数生成用于解析此数据项的函数体;

4.4生成针对固定长度型解析函数体。该类型特征在于,数据项所占字节长度固定,如果报文中包含该数据项,则该数据项下所有的field均含值。循环取出该类型下的field,而每一个field对应与此时函数参数中retdata结构体中的一个成员变量,根据field提供的信息为对应的成员变量生成一段求值并赋给该成员变量的代码,直至循环结束,最后生成返回dataitem所占字节长度的代码,因为dataitem数据项长度固定,则返回值即为此长度值;

4.5生成针对可变长度型解析函数体。该类型特征在于,数据项所占字节长度不固定,根据报文中数据而决定,每个字节最后一个比特位标识后一个字节是否还属于该数据项,为1属于,0结束。根据这一特征,首先生成求数据项长度的代码,求数据项长度代码说明:使用循环由小到大取出字节,使用&运算符,将字节和0x01做与运算,结果为1则数据项长度加一,否则结束循环,这样就得到了该数据项所占字节总长度。接下来循环取出该类型下的field,而每一个field对应与此时函数参数中retdata结构体中的一个成员变量,根据field提供的信息为对应的成员变量生成一段求值并赋给该成员变量的代码,因为数据项所占长度是可变的,所有在该数据项下不是所有的field都有值,所以在这段代码前应加上准入条件代码,只有当求出的数据项总长度大于当前field所处字节组时,才执行成员变量赋值求值代码。最后生成返回dataitem所占字节长度的代码,返回值应为求出的数据总长度;

4.6生成针对重复型解析函数体。该类型特征在于,数据项所占字节长度由一个字节数据重复标识跟着至少一组表示数据的字节组成(以下称为字节组),由数据重复标识决定数据的字节具体有多少组,每一组数据长度由数据项初始长度决定。根据这一特征,首先生成获取重复次数的代码,重复次数由表示数据项的原始数据第一个字节决定,取出第一个字节得到重复次数。接下来生成解析每个field的代码,如参考上文成员变量的生成规则,此时每个field生成的成员变量类型为数组,循环取出该类型下的field,根据field提供的信息为对应的成员变量生成一段求值并添加至成员变量数组中的代码,直至循环结束,最后生成返回dataitem所占字节长度的代码,则返回值应为字节组长度乘以数据重复标识加1;

4.7循环取出dataitem对象中的subitem。该步骤使用循环方式取出dataitem对象中的subitem;

4.8根据subitem对象的id生成解析函数。生成一个用于解析该subitem对象的函数定义;

4.9判断subitem类型。对取出的subitem类型进行判断,根据相应的类型为函数生成解析此子数据项的函数体;

4.10生成针对固定长度型解析函数体。与步骤4.4处理方式一致;

4.11生成针对可变长度型解析函数体。与步骤4.5处理方式一致;

4.12生成针对重复型解析函数体。与步骤4.6处理方式一致;

4.13生成针对混合类型解析函数体。当dataitem对象类型为混合型时,该类型特征在于,数据项所占长度由数据项标识字节和数据项下的subitem长度决定,每一个subitem包含一个frn,由frn决定subitem排列的先后顺序;数据项标识字节为可变数据,每个字节最后一位标识后一个字节是否还为数据项标识字节,1为继续,0为结束,数据项标识每个字节每一位标识subitem在报文中是否被包含,如数据项标识为0x9db0,则使用二进制表示如下:

按照这样的方式frn与原始数据二进制进行对照,就能判断报文中是否包含某frn的subitem。根据以上的特征,首先生成求数据项标识的字节长度代码,数据项标识字节长度的获取算法与步骤4.5求数据项长度一致;通过之前的步骤已经生成了解析每一个subitem的函数,接下来生成依frn顺序,结合subitem的frn与数据项标识进行判断数据subitem是否包含,调用subitem对应的解析函数代码。最后生成返回数据项长度的代码,返回值应为每个包含的subitem的长度之和加上数据项标识的字节长度。

4.14生成对外调用的解析函数。通过以上步骤生成了对每个dataitem的解析函数,但这些解析函数都是针对具体的dataitem进行解析,无法解析整个报文,本步骤生成一个对外提供解析报文的函数代码。首先生成一个函数定义,以前文提供的主函数定义参考为例,对如何生成函数体内容进行说明;接下来生成主函数的解析函数体代码,该步骤与步骤4.13类似,每一条asterix报文包含了一个字节的协议类型、两个数据长度、数据项标识字节和数据域,数据项标识与步骤4.13提到的数据项标识含义和表示方式一致,生成求数据项标识字节长度代码,每个dataitem也包含一个frn,与步骤4.13类似,生成根据frn由小到大顺序,结合dataitem的frn与数据项标识进行判断报文中是否包含dataitem数据,调用dataitem对应的解析函数代码;

4.15输出至报文解析代码文件。

本发明与现有技术相比,具有以下优点及有益效果:

(1)本发明通过将使用xml进行配置的协议类型版本直接生成该报文解析代码,当出现增加协议类型、修改协议类型或版本时,无需手动编写程序,直接使用相应xml配置文件生成;解决了现有的手动输入,编写程序的繁琐过程,避免了编写过程中人为出错的问题,使得报文解析代码生成过程更加方便、快捷、准确。

(2)本发明适用于不同协议类型和协议版本,便于修改,使用xml配置文件生成可运行的报文解析程序,使用者只需按照icd编写配置文件,通过本发明生成asterix报文解析代码。该方案大大的提高了原有工作效率,该方案将该解析部分模块化,符合现代对问题处理方式的模块化趋势。

附图说明

图1为基于xml生成asterix报文解析程序方法流程图;

图2为asterix(协议信息模型)、dataitem(数据项模型)、subitem(子数据项模型)、field(字段模型)类之间关系图;

图3为结构体文件生成流程图;

图4为解析代码文件生成流程图;

具体实施方式

下面结合本发明的优选实施例对本发明作进一步地详细说明,但本发明的实施方式不限于此。

实施例1:

结合附图1-4所示,基于xml的asterix报文解析代码生成方法,其特征在于,包括以下四个步骤:

步骤一:根据icd配置通信协议各种参数并保存为xml文件;

步骤二:读取步骤一中所得xml配置文件并解析生成计算机程序识别的内存对象;

步骤三:根据步骤二中所得内存对象生成对应的数据结构体文件;

步骤四:根据步骤二中所得内存对象生成对应的解析代码文件,同时,将解析代码文件对应存放至步骤三中所述的数据结构体文件中,最后生成一个有序调用其他解析函数的主函数,以供外部程序通过主函数调用对应的报文解析代码文件。

上述步骤一根据asterix为每一个类型协议和版本提供的icd提取出所需信息,这些信息包含:协议名称、协议版本、协议类型、数据项等,其中数据项信息包含数据项类型(数据项长度固定、数据项长度可变、重复型数据项、混合型数据项四种类型)、数据项初始长度、数据项id、数据项序号(frn)以及数据项下所包含的所有字段等,其中字段信息又包含了字段所处字节组、字段id、起始比特位、终止比特位、字段数据类型(包含int、uint、ascii、targetident、hex)等。

提取出这些信息时,将信息按照特定的格式组织,并保存至xml中。使用xml格式的icd描述文件示例参考格式如下:

该步骤非必须,如果已经存在了该类型和版本协议的配置文件,则该步骤可以省略。

上述步骤二读取xml配置文件,通过对xml的解析,将xml配置文件中所保存的数据信息转换成类型为asterix类对象存放在计算机内存中。关于asterix相关类图参见图2,其中dataitem对应数据项,subitem对应dataitem子数据项,field对应具体字段即具体数据值。在该类图中可以看到,dataitem、subitem、field对象都包含了id属性,该属性用于对象的唯一标识,id不能够重复,同时id规范应符合编程语言对变量的要求。其中asterix包含一个或多个dataitem,dataitem中包含一个或多个field或包含多个subitem,subitem中包含一个或多个field。

上述步骤三使用asterix对象生成用于数据解析之后存储数据的结构体。由步骤二得到了asterix对象,将asterix对象生成结构体规则:

将dataitem、subitem对象生成以对象id属性值为类型名的结构体或类,将field对象生成为所属dataitem或subitem生成的结构体或简单类以id为变量名称的变量,类型为字段数据类型转换成的所使用的编程语言数据类型,以qt(c++编程库)为例转换关系参考如下表:

当dataitem类型为混合型时,此时需将该数据项下所有的subitem生成的结构体或类添加为该数据项下的成员变量,变量类型为subitem生成的结构体名称,变量名称为“_结构体名称”。如id为i021_110的混合型dataitem,该dataitem下包含id为trajectoryintentstatus和trajectoryintentdata的subitem,此时生成的结构体格式为:

将asterix下所有的dataitem生成完成结构体之后,生成主结构体或主类,主结构体或主类用于生成的解析函数返回的解析结果。主结构体或主类的类型名为“cat协议类型_版本号整数部分_版本号小数部分_data”。如协议类型为21,版本号为0.26,该类型下包含id为i021_010、i021_030、i021_110的dataitem,此时生成的结构体格式为:

以上介绍了结构体的生成规则,下面结合图3对结构体的生成过程进行说明:

3.1循环取出asterix对象中的dataitem。asterix对象中包含多个dataitem对象,每个对象都应生成相应的结构体,该步骤使用循环方式取出asterix对象中的dataitem;

3.2生成以dataitem的id为结构体名称的结构体。该步骤生成结构体的声明,此时该结构体中还未包含任何成员变量;

3.3判断dataitem类型是否为混合型。dataitem为混合类型时,该类型下只包含了多个subitem,其他类型包含多个field,所以此处应对dataitem的类型进行判断处理;

3.4循环取出dataitem中的field。当dataitem类型不为混合类型时,该dataitem包含了多个field,每个field对应了具体的数据。使用循环方式取出field;

3.5根据field的id和类型生成对应结构体的成员变量。该步骤生成该field所在的dataitem生成的结构体的成员变量,成员变量的生成规则如上所述。当dataitem下所有的field都生成了结构体的成员变量时,此时就完成了该dataitem向结构体的转化,继续下一个dataitem;

3.6循环取出dataitem对象中的subitem。当dataitem类型为混合类型时,该dataitem包含了多个subitem,每个subitem都应生成相应的结构体,该步骤使用循环方式取出dataitem对象中的subitem;

3.7生成以subitem的id为结构体名称的结构体,并将该结构体生成dataitem结构体的成员变量;

3.8循环取出subitem的field。该步骤与第3.4步类似,使用循环方式取出field;

3.9根据field的id和类型生成对应结构体的成员变量。该步骤与第3.5步类似;

3.10生成主结构体。经过以上步骤完成了asterix下所有的dataitem结构体的生成,现在根据所有生成的结构体名生成结构体。按上文提供的规则生成。

3.11输出至结构体文件。由以上步骤生成了具有一定规则的字符串,该步骤使用编程语言提供的文本操作将字符串输出至文件中,文件名称可以以主结构体名称的小写字符串+文件类型后缀,生成的文件内容应参考相应编程语言要求。如主结构体名称为cat21_0_26_data生成c头文件,则文件名称为cat21_0_26_data.h,文件内容以qt为例,参考格式如下:

综上,该步骤完成了从内存对象向数据结构体文件的转换与输出。

上述步骤四使用asterix对象生成用于解析指定协议类型和版本的报文解析代码。由步骤三得到了每个dataitem或subitem生成对应的结构体,该步骤将为根据每个dataitem或subitem生成解析函数,并将解析后的数据存放至对应的结构体中,生成一个有序调用其他解析函数的主函数,供外部程序调用。根据asterix各类协议相关规则,这里提供一种解析函数定义格式供参考,以id为i021_010的dataitem,以qt为例进行说明,生成的解析函数定义如下:

返回值:以int类型为返回值,返回该数据项在报文中所占的实际字节长度;

函数名称:以parse+dataitem的id为函数名称;

函数参数:生成的函数包含了两个参数,data为解析的原始数据,retdata为解析后的数据所存放的结构体,该结构体应与步骤三dataitem或subitem所生成的结构体一致。

主函数定义格式参考,以协议类型为21,版本为0.26,以qt为例进行说明,生成的主函数定义参考如下:

返回值:空;

函数名称:以parse为函数名称;

函数参数:主解析函数包含两个参数,data为所需解析报文原始数据,retdata为解析后数据所存放的主结构体,该结构体应与步骤三所生成的主结构体一致。

以上对所需生成的函数定义进行了说明,同时对个函数定义格式提供了相应参考。下面结合图4对报文解析代码生成过程进行说明:

4.1循环取出asterix对象中的dataitem。该步骤使用循环方式取出asterix中的dataitem;

4.2根据dataitem对象的id生成解析函数。生成一个用于解析该dataitem对象的函数定义;

4.3判断dataitem类型。对取出的dataitem类型进行判断,根据相应的类型为函数生成用于解析此数据项的函数体;

4.4生成针对固定长度型解析函数体。该类型特征在于,数据项所占字节长度固定,如果报文中包含该数据项,则该数据项下所有的field均含值。循环取出该类型下的field,而每一个field对应与此时函数参数中retdata结构体中的一个成员变量,根据field提供的信息为对应的成员变量生成一段求值并赋给该成员变量的代码,直至循环结束,最后生成返回dataitem所占字节长度的代码,因为dataitem数据项长度固定,则返回值即为此长度值;

4.5生成针对可变长度型解析函数体。该类型特征在于,数据项所占字节长度不固定,根据报文中数据而决定,每个字节最后一个比特位标识后一个字节是否还属于该数据项,为1属于,0结束。根据这一特征,首先生成求数据项长度的代码,求数据项长度代码说明:使用循环由小到大取出字节,使用&运算符,将字节和0x01做与运算,结果为1则数据项长度加一,否则结束循环,这样就得到了该数据项所占字节总长度。接下来循环取出该类型下的field,而每一个field对应与此时函数参数中retdata结构体中的一个成员变量,根据field提供的信息为对应的成员变量生成一段求值并赋给该成员变量的代码,因为数据项所占长度是可变的,所有在该数据项下不是所有的field都有值,所以在这段代码前应加上准入条件代码,只有当求出的数据项总长度大于当前field所处字节组时,才执行成员变量赋值求值代码。最后生成返回dataitem所占字节长度的代码,返回值应为求出的数据总长度;

4.6生成针对重复型解析函数体。该类型特征在于,数据项所占字节长度由一个字节数据重复标识跟着至少一组表示数据的字节组成(以下称为字节组),由数据重复标识决定数据的字节具体有多少组,每一组数据长度由数据项初始长度决定。根据这一特征,首先生成获取重复次数的代码,重复次数由表示数据项的原始数据第一个字节决定,取出第一个字节得到重复次数。接下来生成解析每个field的代码,如参考上文成员变量的生成规则,此时每个field生成的成员变量类型为数组,循环取出该类型下的field,根据field提供的信息为对应的成员变量生成一段求值并添加至成员变量数组中的代码,直至循环结束,最后生成返回dataitem所占字节长度的代码,则返回值应为字节组长度乘以数据重复标识加1;

4.7循环取出dataitem对象中的subitem。该步骤使用循环方式取出dataitem对象中的subitem;

4.8根据subitem对象的id生成解析函数。生成一个用于解析该subitem对象的函数定义;

4.9判断subitem类型。对取出的subitem类型进行判断,根据相应的类型为函数生成解析此子数据项的函数体;

4.10生成针对固定长度型解析函数体。与步骤4.4处理方式一致;

4.11生成针对可变长度型解析函数体。与步骤4.5处理方式一致;

4.12生成针对重复型解析函数体。与步骤4.6处理方式一致;

4.13生成针对混合类型解析函数体。当dataitem对象类型为混合型时,该类型特征在于,数据项所占长度由数据项标识字节和数据项下的subitem长度决定,每一个subitem包含一个frn,由frn决定subitem排列的先后顺序;数据项标识字节为可变数据,每个字节最后一位标识后一个字节是否还为数据项标识字节,1为继续,0为结束,数据项标识每个字节每一位标识subitem在报文中是否被包含,如数据项标识为0x9db0,则使用二进制表示如下:

按照这样的方式frn与原始数据二进制进行对照,就能判断报文中是否包含某frn的subitem。根据以上的特征,首先生成求数据项标识的字节长度代码,数据项标识字节长度的获取算法与步骤4.5求数据项长度一致;通过之前的步骤已经生成了解析每一个subitem的函数,接下来生成依frn顺序,结合subitem的frn与数据项标识进行判断数据subitem是否包含,调用subitem对应的解析函数代码。最后生成返回数据项长度的代码,返回值应为每个包含的subitem的长度之和加上数据项标识的字节长度。

4.14生成对外调用的解析函数。通过以上步骤生成了对每个dataitem的解析函数,但这些解析函数都是针对具体的dataitem进行解析,无法解析整个报文,本步骤生成一个对外提供解析报文的函数代码。首先生成一个函数定义,以前文提供的主函数定义参考为例,对如何生成函数体内容进行说明;接下来生成主函数的解析函数体代码,该步骤与步骤4.13类似,每一条asterix报文包含了一个字节的协议类型、两个数据长度、数据项标识字节和数据域,数据项标识与步骤4.13提到的数据项标识含义和表示方式一致,生成求数据项标识字节长度代码,每个dataitem也包含一个frn,与步骤4.13类似,生成根据frn由小到大顺序,结合dataitem的frn与数据项标识进行判断报文中是否包含dataitem数据,调用dataitem对应的解析函数代码;

4.15输出至报文解析代码文件。由以上步骤生成了具有一定规则的字符串,该步骤使用编程语言提供的文本操作将字符串输出至文件中,生成的文件内容应参考相应编程语言要求。

以上所述,仅是本发明的较佳实施例,并非对本发明做任何形式上的限制,凡是依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化,均落入本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1