一种数据通信协议的解析方法及系统与流程

文档序号:14725347发布日期:2018-06-19 06:10阅读:428来源:国知局

本发明涉及通信技术领域,特别涉及一种数据通信协议的解析方法及系统。



背景技术:

在网络应用系统中,模块与模块间的交互必不可少,它们通过不同的传输方式、不同的通信协议来进行数据交换,以实现不同的业务功能。在这个过程中,数据通信协议如同一种语言,定义了模块间通信的规则。从粒度来上划分,模块可以作为一个应用系统中的子系统,与同一个应用中的其它子系统进行内部交互,也可以作为一个应用系统的外部接口模块,与其它应用进行外部交互。那么,在这样不同的应用场景下,各个模块对数据交互的需求不同,对数据传输的安全性、稳定性要求也不同,用于定义数据交互的规则也自然不会相同,因此产生了多种数据通信协议。为了验证应用系统的功能及性能,需要对系统间传输的报文进行数据解析,而目前应用大多数为针对某一种协议单独定制一套解析方式,不具备通用性和扩展性,使得通信调试和检测难度增大。



技术实现要素:

本发明为了解决现有技术中因多种数据通信协议导致的解析方式不具备通用性和扩展性的技术问题,本发明提供技术方案如下:

第一方面,提供一种数据通信协议的解析方法,包括:

S1、将数据通信协议划分为多个数据域,将所述数据通信协议作为根节点,将所述多个数据域作为子节点生成树形结构的公共模型,其中,所述子节点包括多个叶子节点和多个组合节点,每个组合节点包括多个叶子节点和/或多个组合节点,所述公共模型中的第二层节点分别对应所述数据通信协议中的一个数据项;

S2、在数据库中创建元数据表,用于存储所述数据通信协议中的每个数据项的元数据,所述元数据包括每个数据项的标识ID、条件ID和计算表达式;

S3、构建所述公共模型中的根节点对应的解析抽象类、所有叶子节点对应的叶子节点类和所有组合节点对应的组合节点类,其中,所述解析抽象类为所述叶子节点类和所述组合节点类的公共父类;

S4、在所述解析抽象类中定义包括访问管理子类的方法和业务处理方法的纯虚方法,所述业务处理方法包括对所述叶子节点类和所述组合节点类的通用解析方法;

S5、分别在所述叶子节点类和所述组合节点类中定义所述纯虚方法对应的重载方法,在所述组合节点类中定义用于指向并通过扫描所述数据库动态获取自身的叶子节点对应的元数据的指针;

S6、接收所述数据通信协议的报文,并通过所述解析抽象类、所述叶子节点类和所述组合节点类对所述报文进行解析。

本发明的有益效果是:公共建模方式是在对多种数据通信协议的层次结构、数据包的格式进行深入分析后,提取出的公共模型;通用解析方法是在使用公共建模方式对数据通信协议进行描述后,采用设计模式中的“组合模式”设计解析类,对传输报文按照此模型通过递归调用进行自动解析,针对多种数据通信协议具备通用性和扩展性,降低了通信调试和检测难度。

在上述技术方案的基础上,本发明还可以做如下改进。

优选地,步骤S6包括:

S61、根据数据通信协议的报文对解析抽象类进行初始化,生成数据通信协议对象;

S62、通过所述数据通信协议对象的指针扫描所述数据库,从所述数据库的元数据表中获取的公共模型的第二层子节点对应的数据项的元数据;

S63、根据所述元数据生成多个子节点对象,将所述多个子节点对象存入所述数据通信协议对象的子节点列表中,所述多个子节点对象包括多个叶子节点对象和多个组合节点对象;

S64、循环获取所述数据通信协议对象的子节点列表中的子节点对象;

S65、当所述子节点对象为叶子节点对象时,调用所述叶子节点对象的解析方法,直至当前子节点列表中的所有叶子节点都被获取到;

S66、当所述子节点对象为组合节点对象时,将根据条件ID和计算表达式从所述数据库的元数据表中获取的所述组合节点对象的所有子节点对象存入所述组合节点对象的子节点列表;

S67、循环获取所述组合节点对象的子节点列表中的子节点对象,跳转至步骤S65。

上述技术方案的有益效果是:通过公共模型中的解析抽象类的对象依次生成相应的叶子节点类的对象和组合节点类的对象,每个叶子节点对象均包含有重载的解析方法,通过对组合节点进行递归调用,最终处理到叶子节点,调用所有叶子节点对象的解析方法,实现对数据通信协议的报文的解析。

优选地,所述多个数据域包括:起始域、长度域、控制域、信息域和结束域;

所述起始域和所述结束域用于判别数据包的完整性;

所述长度域用于表示所述数据包内报文的数据体的长度;

所述控制域包括多个控制字段,用于确定所述报文的数据流传输方向;

所述信息域包括多个信息字段,用于表示所述报文的信息内容。

优选地,所述起始域、所述长度域和所述结束域为叶子节点,所述控制域和所述信息域为组合节点,其中,所述控制域对应的组合节点的多个叶子节点分别对应所述控制域中的多个控制字段,所述信息域对应的组合节点的多个叶子节点分别对应所述信息域的多个信息字段。

优选地,所述数据库为嵌入式数据库。

上述技术方案的有益效果是:采用嵌入式数据库,主要是因为不需要进行网络配置,也不需要管理,因为客户端和服务器在同一进程空间运行。如SQLite的数据库权限只依赖于文件系统,没有用户账户的概念。非常便于使用,高效而且可靠。同时还能利用数据库的优势,当数据通信协议结构发生变化时,进行数据更新;在解析过程中对层次结构中的数据可以按条件进行查询。

第二方面,提供一种数据通信协议的解析系统,包括:

划分模块,用于将数据通信协议划分为多个数据域,将所述数据通信协议作为根节点,将所述多个数据域作为子节点生成树形结构的公共模型,其中,所述子节点包括多个叶子节点和多个组合节点,每个组合节点包括多个叶子节点和/或多个组合节点,所述公共模型中的第二层节点分别对应所述数据通信协议中的一个数据项;

创建模块,用于在数据库中创建元数据表,用于存储所述数据通信协议中的每个数据项的元数据,所述元数据包括每个数据项的标识ID、条件ID和计算表达式;

构建模块,用于构建所述公共模型中的根节点对应的解析抽象类、所有叶子节点对应的叶子节点类和所有组合节点对应的组合节点类,其中,所述解析抽象类为所述叶子节点类和所述组合节点类的公共父类;

第一定义模块,用于在所述解析抽象类中定义包括访问管理子类的方法和业务处理方法的纯虚方法,所述业务处理方法包括对所述叶子节点类和所述组合节点类的通用解析方法;

第二定义模块,用于分别在所述叶子节点类和所述组合节点类中定义所述纯虚方法对应的重载方法,在所述组合节点类中定义用于指向并通过扫描所述数据库动态获取自身的叶子节点对应的元数据的指针;

解析模块,用于接收所述数据通信协议的报文,并通过所述解析抽象类、所述叶子节点类和所述组合节点类对所述报文进行解析。

优选地,所述解析模块包括:

初始化子模块,用于根据所述数据通信协议的报文对解析抽象类进行初始化,生成数据通信协议对象;

第一获取子模块,用于通过所述数据通信协议对象的指针扫描所述数据库,从所述数据库的元数据表中获取的公共模型的第二层子节点对应的数据项的元数据;

生成子模块,用于根据所述元数据生成多个子节点对象,将所述多个子节点对象存入所述数据通信协议对象的子节点列表中,所述多个子节点对象包括多个叶子节点对象和多个组合节点对象;

第一循环获取子模块,用于循环获取所述数据通信协议对象的子节点列表中的子节点对象;

解析子模块,用于当所述子节点对象为叶子节点对象时,调用所述叶子节点对象的解析方法,直至当前子节点列表中的所有叶子节点都被获取到;

第二获取子模块,用于当所述子节点对象为组合节点对象时,将根据条件ID和计算表达式从所述数据库的元数据表中获取的所述组合节点对象的所有子节点对象存入所述组合节点对象的子节点列表;

第二循环获取子模块,用于循环获取所述组合节点对象的子节点列表中的子节点对象,调用所述解析模块。

优选地,所述多个数据域包括:起始域、长度域、控制域、信息域和结束域;

所述起始域和所述结束域用于判别数据包的完整性;

所述长度域用于表示所述数据包内报文的数据体的长度;

所述控制域用于确定所述报文的数据流传输方向,包括多个控制字段;

所述信息域用于表示所述报文的信息内容,包括多个信息字段。

优选地,所述起始域、所述长度域和所述结束域为叶子节点,所述控制域和所述信息域为组合节点,其中,所述控制域对应的组合节点的多个叶子节点分别对应所述控制域中的多个控制字段,所述信息域对应的组合节点的多个叶子节点分别对应所述信息域的多个信息字段。

优选地,所述数据库为嵌入式数据库。

附图说明

图1为本发明实施例提供的一种数据通信协议的解析方法的流程图;

图2为本发明另一实施例提供的一种数据通信协议的公共模型的结构图;

图3为本发明另一实施例提供的一种数据通信协议的解析方法的流程图;

图4为本发明另一实施例提供的组合节点的解析流程图;

图5为本发明另一实施例提供的叶子节点的解析流程图;

图6为本发明实施例提供的一种数据通信协议的解析系统的结构图;

图7为本发明另一实施例提供的一种数据通信协议的解析系统的结构图。

具体实施方式

以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。

如图1所示,一种数据通信协议的解析方法,包括:

S1、将数据通信协议划分为多个数据域,将数据通信协议作为根节点,将多个数据域作为子节点生成树形结构的公共模型,其中,子节点包括多个叶子节点和多个组合节点,每个组合节点包括多个叶子节点和/或多个组合节点,公共模型中的第二层节点分别对应数据通信协议中的一个数据项;

S2、在数据库中创建元数据表,用于存储数据通信协议中的每个数据项的元数据,元数据包括每个数据项的标识ID、条件ID和计算表达式;

S3、构建公共模型中的根节点对应的解析抽象类、所有叶子节点对应的叶子节点类和所有组合节点对应的组合节点类,其中,解析抽象类为叶子节点类和组合节点类的公共父类;

S4、在解析抽象类中定义包括访问管理子类的方法和业务处理方法的纯虚方法,业务处理方法包括对叶子节点类和组合节点类的通用解析方法;

S5、分别在叶子节点类和组合节点类中定义纯虚方法对应的重载方法,在组合节点类中定义用于指向并通过扫描数据库动态获取自身的叶子节点对应的元数据的指针;

S6、接收数据通信协议的报文,并通过解析抽象类、叶子节点类和组合节点类对报文进行解析。

公共建模方式是在对多种数据通信协议的层次结构、数据包的格式进行深入分析后,提取出的公共模型;通用解析方法是在使用公共建模方式对数据通信协议进行描述后,采用设计模式中的“组合模式”设计解析类,对传输报文按照此模型通过递归调用进行自动解析,针对多种数据通信协议具备通用性和扩展性,降低了通信调试和检测难度。

如图2所示,多个数据域包括:起始域、长度域、控制域、信息域和结束域;

起始域和结束域用于判别数据包的完整性;

长度域用于表示数据包内报文的数据体的长度;

控制域用于确定报文的数据流传输方向,包括多个控制字段;

信息域用于表示报文的信息内容,包括多个信息字段。

优选地,起始域、长度域和结束域为叶子节点,控制域和信息域为组合节点,其中,控制域对应的组合节点的多个叶子节点分别对应控制域中的多个控制字段,信息域对应的组合节点的多个叶子节点分别对应信息域的多个信息字段。

树形结构具有以下几个特点:

在一棵树里,除了根节点以外的所有节点有且只有一个父亲节点,根节点没有父亲节点。除了叶子节点外,所有的节点有一个或多个孩子节点,叶子节点没有孩子节点。

树是具有递归结构的。一个节点即是一棵树,而一棵有孩子节点的树,若其根节点为a节点,则其任意一个孩子节点b,与所有不用通过a节点即可和b相连的节点也构成一棵树,称为以b为根的a的一棵子树。b的任意一棵子树也是a的一棵子树。

大部分的数据通信协议可以分成起始域、长度域、控制域、信息域及结束域几部分内容。整体协议可以作为根节点,下面的数据域均作为根节点的孩子节点,数据域可以作为叶子节点,也可以作为组合节点,有自己的孩子节点。起始域与结束域一般用于数据包完整性的判别,通常选择一定长度的固定字节组成。长度域一般用于表示报文数据体的长度。控制域多用于确定数据流传输方向,以及保障数据传输的安全性和可靠性,防止报文丢失或重复传送的功能。信息域是整个报文中最复杂的部分,长度一般为变长,涉及的信息内容也可能是动态变化的。信息域通常会由多个子信息块构成,每个子信息块由各自固有的数据结构组成,或者某个子信息块又由若干个隶属于它的子信息块组成,如此嵌套多层。通过对数据通信协议的层次结构分析,可以发现与树形拓扑结构类似,均是由一个或多个节点组成,除了根节点以外的所有节点有且只有一个父亲节点,根节点没有父亲节点。除了叶子节点外,所有的节点有一个或多个孩子节点,叶子节点没有孩子节点。如起始域、长度域为叶子节点,控制域、信息域则是由不同的控制字段、信息字段组成,这些子字段可以视为它们的孩子节点,我们称控制域、信息域节点为组合节点。

从数据通信协议中抽取出来的这种公共层次结构我们可以通过数据库中的表结构来实现。数据库采用嵌入式数据库,如SQLite。之所以采用嵌入式数据库,主要是因为不需要进行网络配置,也不需要管理,因为客户端和服务器在同一进程空间运行。如SQLite的数据库权限只依赖于文件系统,没有用户账户的概念。非常便于使用,高效而且可靠。同时还能利用数据库的优势,当数据通信协议结构发生变化时,进行数据更新;在解析过程中对层次结构中的数据可以按条件进行查询。

如图3所示,一种数据通信协议的解析方法,包括:

S301、根据数据通信协议的报文对解析抽象类进行初始化,生成数据通信协议对象;

S302、通过数据通信协议对象的指针扫描数据库,从数据库的元数据表中获取的公共模型的第二层子节点对应的数据项的元数据;

S303、根据元数据生成多个子节点对象,将多个子节点对象存入数据通信协议对象的子节点列表中,多个子节点对象包括多个叶子节点对象和多个组合节点对象;

S304、循环获取数据通信协议对象的子节点列表中的子节点对象;

S305、当子节点对象为叶子节点对象时,调用叶子节点对象的解析方法,直至当前子节点列表中的所有叶子节点都被获取到;

S306、当子节点对象为组合节点对象时,将根据条件ID和计算表达式从数据库的元数据表中获取的组合节点对象的所有子节点对象存入组合节点对象的子节点列表;

S307、循环获取组合节点对象的子节点列表中的子节点对象,跳转至步骤S305。

通过公共模型中的解析抽象类的对象依次生成相应的叶子节点类的对象和组合节点类的对象,每个叶子节点对象均包含有重载的解析方法,通过对组合节点进行递归调用,最终处理到叶子节点,调用所有叶子节点对象的解析方法,实现对数据通信协议的报文的解析。

树形结构用于表示数据通信协议的整体结构,那么在树形结构中的每一个节点则代表着数据通信协议中的每一个数据项。每个数据项的元数据是对数据项属性的描述,通过对多种数据通信协议的分析,我们可以归纳数据项的元数据为下述表格所述:

下面结合数据通信协议对元数据定义做具体的描述,以IEC60870-5-104远动规约为实例进行说明,对该规约数据域的元数据定义如下:

下面对元数据进行具体描述:

ItemID作为数据项的唯一标识。

ItemName是数据项的名称,在IEC60870-5-104远动规约中可以用来表示“启动字符”、“APDU长度”等。

ItemType表示该数据项是否还有子数据项,如“控制域”的ItemType为“C”,表示其为组合节点,是由“发送序列号”和“接收序列号”两个子数据项组成。“启动字符”的ItemType为“L”,表示其为叶节点,无子数据项。

ItemLenType用来表示该数据项的长度是定长还是变长,如“启动字符”数据项的ItemLenType为“F”,因为此数据项在协议中被定义为1个字节。“信息体”数据项的ItemLenType为“V”,因为信息体是报文中变化的部分,根据信息对象类型、信息对象的个数不同而不同。

ItemSize用来表示数据项长度,当数据项为定长时,ItemSzie为数字用于表示长度,如“启动字符”的ItemSize为1.当数据项为变长时,ItemSize为表达式,与LenCondID结合,在数据解析过程中,动态计算该数据项长度。

StartBit表示数据项的起始位,与EndBit一起表示该数据项对应报文中的一个或者几个BIT位。如“发送序列号”的StartBit为1,EndBit为15,ItemSize为2,表示发送序列号对应报文该段2个字节中的第一位到第15位。

EndBit表示数据项的终止位,使用同StartBit.

SubItemID表示该数据项是否为子数据项,不是子数据项,值为0;是子数据项,则为该子数据项的顺序号。如“发送序列号”为“控制域”的第一个子数据项,它的SubItemID则为1,“接收序列号”为“控制域”的第二个子数据项,它的SubItemID则为2.

CondID作为数据项特殊的元数据,用于在解析算法中按照规定的表达式来计算子数据项的ItemID,解析算法计算子数据项表达式为ItemID.value+Item[CondID].value(此处+表示字符串连接)。下面分两种情况来对CondID的作用做具体说明:

1、如“控制域”的ItemID为3,其CondID默认值为0,通过计算可以得到“控制域”的子数据域ItemID为“30”。

2、当数据域的长度为变长,即其子数据域在报文中会根据某个数据项的具体数值而变化时,CondID存放的即为此条件数据项的ItemID.如“信息体”的CondID值为“4”,对应到IEC60870-5-104远动规约,ItemID为4的数据项是报文中的类型标识,信息体正是由此种类型标识的信息数据组成。假设实例报文中的类型标识为单点遥信,数值为1,即Item[4].value=1。“信息体”的ItemID为“9”,根据计算表达式,可以得出子数据项的ItemID为“91”。

注意,CondID使用字符串来表示条件数据项,既可以通过“4”这样单独的ItemID来表示数据项,也可以通过“(50,1)”的格式来表示某个子数据项。

LenCondID与CondID的作用类似,用于在解析算法中按照规定的表达式来计算变长数据项的长度。通过对多种数据通信协议的分析,定义两种获取动态长度的方式。

当ItemSize的值为“num”(注:num代表常数)时,表示此数据项由n个子数据项组成,n可以通过获取Item[LenCondID].value来获取。

当ItemSize为一个计算表达式,如“%1-10”,表示此数据项的总长度为”%1-10”,%1是动态参数item[LenCondID].value,解析算法将item[LenCondID].value代入此表达式,并进行计算获取总长度。

ExistExp仅用于叶子节点,表示该数据项在报文中是否存在,如“%1==1”或者“%1==0”,%1是动态参数item[CondID].value,解析算法将将item[LenCondID].value代入此表达式,并进行计算表达式结果真假。

ValueType表示数据项数值的类型,主要类型如下:

“BIT”表示该数据项位于报文某个字节中的某几位。

“INT”表示该数据项为整数,解析算法可以通过ValueType及ItemSize计算unit8、unit16、unit32等多种字节的整数值。如VauleType为INT型,ItemSize为1的话,则表明此数据域为一个字节的整数型即unit8;如ValueType为INT型,ItemSize为4的话,则表明此数据域为4字节的整数型即unit32。

“FLOAT”表示该数据项为单精度浮点数。

当使用如上模型对数据通信协议进行描述后,就可以对传输报文按照此模型进行自动解析了。由于数据通信协议遵循协议树形结构的特点而建模,那么在解析算法中,我们可以采用设计模式中的“组合模式”来设计解析类。

在模型中,协议的每个数据项以叶子节点或者组合节点存在,当对组合节点进行解析时,将遍历它的所有子节点(子节点可以是叶子节点也可以是组合节点),因此会使用递归调用的机制来对整个结构进行处理。由于组合节点和叶子节点在功能上的区别,在对它们的解析方法也有所不同,如果针对数据通信协议的每个数据项,都进行区别对待会使得解析算法非常复杂。组合模式可以帮助我们解决这个问题,它让叶子节点和组合节点的使用具有一致性。

在解析类设计图中,我们设计了一个抽象类TInfoItem,它是所有组合节点和叶子节点的公共父类,TInfoItem类主要起接口类的作用,包含所有子类共有行为的声明和实现,在抽象类中定义了访问管理子类的方法以及业务处理方法,如增加子类对象、删除子类对象、获取子类对象、数据项解析等,这些方法被定义为纯虚方法,以使得子类中必须予以重载来实现多态性。其中,Add(TInfoItem*in_pChildItem)()为增加子节点对象方法,TInfoItem*GetChild()为获取子节点对象方法,Parse()为数据项解析操作,TInfoItem*Parent()为获取父节点对象方法,其中的GetItemName()、GetItemID()、GetItemType()、GetItemLenType()、GetItemSize()、GetStartBit()、GetEndBit(),依次为获取当前节点的ItemID、ItemName、ItemType、ItemLenType、ItemSize、StartBit、EndBit数据项值的方法。TLeafItem类为叶子节点类,用于处理没有子节点的数据项解析。对于那些访问及管理子类对象的方法,可以通过异常等方式进行处理,同理,其中Parse()为数据项解析操作,TInfoItem*Parent()为获取父节点对象方法。TCompositItem类为组合节点类,其作用主要有两部分,它提供一个集合用于存储子节点,即QList<TInfoItem*>*指针,指向并通过扫描数据库中的协议模型,动态获取其子节点元数据的列表。实现在抽象类中定义的行为,包括那些访问及管理子类的方法,如增加子节点方法add(TinfoItem*in_pChildItem)()、获取子节点方法TInfoItem*GetChild(),在其解析方法Parse()中可以递归调用其子节点的解析方法,其中的TInfoItem*Parent()为获取其父节点对象方法,其中的GetItemName()、GetItemID()依次为获取当前节点的ItemID、ItemName数据项值的方法。

组合模式的关键是定义了一个抽象类TInfoItem,它既可以代表叶子节点,又可以代表组合节点,TLeafItem类和TCompositItem类都指向类TInfoItem,即TLeafItem类和TCompositItem类继承自抽象类TInfoItem,而解析算法针对该抽象类进行编程,无需知道它到底表示的是叶子节点还是组合节点,可以对其进行统一处理。同时组合对象与抽象类之间还建立一个聚合关联关系,在组合对象中既可以包含叶子节点,也可以包含组合节点,以此实现递归组合,形成一个树形结构。

在解析某种数据通信协议的报文前,先进行初始化,构建整体协议对象,该对象为组合节点,扫描数据库,将处在第一层的节点(即模型中SubItemID等于0的节点)元数据,存入整体协议对象的子节点列表中。然后,循环获取列表内的叶子节点对象,调用其解析方法Parse(),直至所有列表内的叶子节点都被获取到。对数据通信协议的解析即调用该组合节点的解析方法。

如图4所示,组合节点的解析流程,首先通过条件ID的取值,获取数据库中该组合节点的所有子节点集合,存入组合节点对象的子节点列表中,再对此列表的所有节点进行循环解析处理。如果子节点为叶子节点,则进行叶子节点的解析处理;如果子节点仍然为组合节点,则通过递归调用,最终处理到叶子节点。

组合节点在数据通信协议中还可能发生变化的部分为长度,有的组合节点长度为定长,有的组合节点因为叶子节点的不确定,而长度为变长。在解析算法中,处理这种情况依赖于长度表达式(计算表达式)和长度条件ID(条件ID),即将长度条件ID的取值代入长度表达式,以获取实际组合节点的长度,并依赖于此长度进行组合节点的循环解析调用,以保证报文被完整的解析。

如图5所示,叶子节点的解析流程主要关注数据域的属性,通过该节点的数值类型,来分别处理获取此节点不同类型的数值。如VauleType为INT型,ItemSize为1的话,则表明此数据域为一个字节的整数型;如ValueType为INT型,ItemSize为4的话,则表明此数据域为4字节的整数型;如ValueType为FLOAT型,ItmeSize为4,则解析流程会将4字节转为float数值。

叶子节点在数据通信协议中可能动态变化的部分,是有些协议某一个数据域会依赖于另一个数据域,我们称之为条件数据域,该数据域根据条件数据域的取值而存在。因此在叶子节点的解析方法中,会根据存在表达式及条件ID取值,来动态判断此叶子节点是否存在于报文中。

如图6所示,一种数据通信协议的解析系统,包括:

划分模块601,用于将数据通信协议划分为多个数据域,将数据通信协议作为根节点,将多个数据域作为子节点生成树形结构的公共模型,其中,子节点包括多个叶子节点和多个组合节点,每个组合节点包括多个叶子节点和/或多个组合节点,公共模型中的第二层节点分别对应数据通信协议中的一个数据项;

创建模块602,用于在数据库中创建元数据表,用于存储数据通信协议中的每个数据项的元数据,元数据包括每个数据项的标识ID、条件ID和计算表达式;

构建模块603,用于构建公共模型中的根节点对应的解析抽象类、所有叶子节点对应的叶子节点类和所有组合节点对应的组合节点类,其中,解析抽象类为叶子节点类和组合节点类的公共父类;

第一定义模块604,用于在解析抽象类中定义包括访问管理子类的方法和业务处理方法的纯虚方法,业务处理方法包括对叶子节点类和组合节点类的通用解析方法;

第二定义模块605,用于分别在叶子节点类和组合节点类中定义纯虚方法对应的重载方法,在组合节点类中定义用于指向并通过扫描数据库动态获取自身的叶子节点对应的元数据的指针;

解析模块606,用于接收数据通信协议的报文,并通过解析抽象类、叶子节点类和组合节点类对报文进行解析。

优选地,多个数据域包括:起始域、长度域、控制域、信息域和结束域;

起始域和结束域用于判别数据包的完整性;

长度域用于表示数据包内报文的数据体的长度;

控制域用于确定报文的数据流传输方向,包括多个控制字段;

信息域用于表示报文的信息内容,包括多个信息字段。

优选地,起始域、长度域和结束域为叶子节点,控制域和信息域为组合节点,其中,控制域对应的组合节点的多个叶子节点分别对应控制域中的多个控制字段,信息域对应的组合节点的多个叶子节点分别对应信息域的多个信息字段。

优选地,数据库为嵌入式数据库。

如图7所示,图6的解析模块包括:

初始化子模块701,用于根据数据通信协议的报文对解析抽象类进行初始化,生成数据通信协议对象;

第一获取子模块702,用于通过数据通信协议对象的指针扫描数据库,从数据库的元数据表中获取的公共模型的第二层子节点对应的数据项的元数据;

生成子模块703,用于根据元数据生成多个子节点对象,将多个子节点对象存入数据通信协议对象的子节点列表中,多个子节点对象包括多个叶子节点对象和多个组合节点对象;

第一循环获取子模块704,用于循环获取数据通信协议对象的子节点列表中的子节点对象;

解析子模块705,用于当子节点对象为叶子节点对象时,调用叶子节点对象的解析方法,直至当前子节点列表中的所有叶子节点都被获取到;

第二获取子模块706,用于当子节点对象为组合节点对象时,将根据条件ID和计算表达式从数据库的元数据表中获取的组合节点对象的所有子节点对象存入组合节点对象的子节点列表;

第二循环获取子模块707,用于循环获取组合节点对象的子节点列表中的子节点对象,调用解析子模块705。

以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

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