一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于kaitai的高效率协议解包组包方法、系统和可读存储介质与流程

2022-08-23 21:47:41 来源:中国专利 TAG:


1.本发明涉及计算机软件通信领域,更具体的,涉及一种基于kaitai的高效率协议解包组包方法、系统和可读存储介质。


背景技术:

2.2011年1月12日公开的中国专利cn101944025a提供了一种基于python语言的tcp/udp数据的自动组包与解包的方法,该方法以xml文件形式定义通讯的数据结构,形成数据包与配置结构建立一一对应关系的转换关系映射表并且常驻内存,通过转换关系映射表完成组包和解包。组包的过程是根据转换关系映射表生成协议的各个字段的数据然后再组合起来形成一个完整的数据报文。解包过程是根据转换关系映射表把一个完整的数据报文拆分为若干字段。
3.该发明可加快了tcp/udp数据通讯程序开发和测试的速度,使程序员更加专注于程序的业务逻辑的开发,而测试人员不需要一个字节一个字节的去对通讯的数据,可以提高测试的准确性及效率性。但是,该技术方案在开发时,开发人员在编写与plc通信软件时,需要自行定义描述协议格式的数据结构,组装数据包并发送,收到plc回复数据时需要对其进行解包处理。在此过程中,开发人员需要花费大量时间定义描述协议的数据结构。且定义好后维护起来较为复杂,不同人员定义方法不一样,交由其他人员来维护时间成本较高。
4.其中,plc指可编程逻辑控制器(programmable logic controller,plc),一种具有微处理器的用于自动化控制的数字运算控制器,可以将控制指令随时载入内存进行储存与执行。可编程控制器由cpu、指令及数据内存、输入/输出接口、电源、数字模拟转换等功能单元组成。早期的可编程逻辑控制器只有逻辑控制的功能,所以被命名为可编程逻辑控制器,后来随着不断地发展,这些当初功能简单的计算机模块已经有了包括逻辑控制、时序控制、模拟控制、多机通信等各类功能。
5.现在工业上使用的可编程逻辑控制器已经相当或接近于一台紧凑型电脑的主机,其在扩展性和可靠性方面的优势使其被广泛应用于目前的各类工业控制领域。不管是在计算机直接控制系统还是集中分散式控制系统dcs,或者现场总线控制系统fcs中,总是有各类plc控制器的大量使用。plc的生产厂商很多,如西门子、施耐德、三菱、台达等,几乎涉及工业自动化领域的厂商都会有其plc产品提供。


技术实现要素:

6.鉴于上述问题,本发明的目的是提供一种基于kaitai的高效率协议解包组包方法、系统和可读存储介质,通过编写统一的协议格式描述文件,使用协议格式编译器高效生成描述协议格式的数据结构,通过生成的数据结构对原始数据流进行处理。以节省开发时间,简化后续维护操作。
7.本发明第一方面提供了一种基于kaitai的高效率协议解包组包方法,所述方法包
括以下步骤:
8.根据需要处理的协议数据格式,编写对应的协议结构描述文件;
9.协议结构编译器根据协议结构描述文件,生产对应的协议描述结构体;
10.根据指令判断是需要执行组包还是解包;
11.若需执行组包,则根据实际情况填写协议各字段数据,然后调用组包函数将协议描述结构体还原成原始数据流;
12.若需执行解包,则调用解包函数读取并分解原始数据流,然后根据解包函数自动填入各字段的值。
13.本方案中,所述协议结构描述文件包括以下信息:
14.meta:元数据;
15.seq:协议格式的对象;
16.types:自定义的类型;
17.enums:seq中的枚举类型字段。
18.本方案中,所述meta包括:文件所描述的协议的名称、详细描述信息、协议默认的数据保存方式。
19.本方案中,所述seq由对象组成,每一个对象都代表着协议中一个字段;
20.所述seq包括:id、size、type;
21.其中,id表示字段名称,size表示字段长度,type表示字段类型。
22.本方案中,所述字段类型是预定义的字符串、整形的常见类型,或自定义的类型,或逻辑判断语句。
23.本方案中,所述enums部分每个对象下列举了所有可能的值对应的不同含义。
24.本发明第二方面提供一种基于kaitai的高效率协议解包组包系统,所述系统包括存储器和处理器,所述存储器中包括基于kaitai的高效率协议解包组包方法程序,所述基于kaitai的高效率协议解包组包方法程序被所述处理器执行时实现如下步骤:
25.根据需要处理的协议数据格式,编写对应的协议结构描述文件;
26.协议结构编译器根据协议结构描述文件,生产对应的协议描述结构体;
27.根据指令判断是需要执行组包还是解包;
28.若需执行组包,则根据实际情况填写协议各字段数据,然后调用组包函数将协议描述结构体还原成原始数据流;
29.若需执行解包,则调用解包函数读取并分解原始数据流,然后根据解包函数自动填入各字段的值。
30.本方案中,所述协议结构描述文件包括以下信息:
31.meta:元数据;
32.seq:协议格式的对象;
33.types:自定义的类型;
34.enums:seq中的枚举类型字段。
35.本方案中,所述meta包括:文件所描述的协议的名称、详细描述信息、协议默认的数据保存方式;
36.所述seq由对象组成,每一个对象都代表着协议中一个字段;
37.所述seq包括:id、size、type;
38.其中,id表示字段名称,size表示字段长度,type表示字段类型;
39.所述字段类型是预定义的字符串、整形的常见类型,或自定义的类型,或逻辑判断语句;
40.所述enums部分每个对象下列举了所有可能的值对应的不同含义。
41.本发明第三方面提供一种计算机可读存储介质,所述计算机可读存储介质中包括一种基于kaitai的高效率协议解包组包方法程序,所述一种基于kaitai的高效率协议解包组包方法程序被处理器执行时,实现如上所述任一项所述的一种基于kaitai的高效率协议解包组包方法的步骤。
42.本发明公开的一种基于kaitai的高效率协议解包组包方法、系统和可读存储介质,本发明通过编写统一的协议格式描述文件,使用协议格式编译器高效生成描述协议格式的数据结构,通过生成的数据结构对原始数据流进行处理。此方法可以节省开发时间,只需开发者编写协议格式描述文件,数据结构由编译器自动生成。由于采用统一的协议格式描述文件,后续维护简单方便。协议格式描述文件支持各种条件语句,各种数据类型,足以对复杂的协议进行描述。
附图说明
43.图1示出了本技术一种基于kaitai的高效率协议解包组包方法的流程图;
44.图2示出了本发明一种基于kaitai的高效率协议解包组包系统的框图。
具体实施方式
45.为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施方式对本发明进行进一步的详细描述。需要说明的是,在不冲突的情况下,本技术的实施例及实施例中的特征可以相互组合。
46.在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是,本发明还可以采用其他不同于在此描述的其他方式来实施,因此,本发明的保护范围并不受下面公开的具体实施例的限制。
47.图1示出了本技术一种基于kaitai的高效率协议解包组包方法。
48.如图1所示,本发明提供了一种基于kaitai的高效率协议解包组包方法,所述方法包括以下步骤:
49.s102:根据需要处理的协议数据格式,编写对应的协议结构描述文件;
50.s104:协议结构编译器根据协议结构描述文件,生产对应的协议描述结构体;
51.s106:根据指令判断是需要执行组包还是解包;
52.若需执行组包,则根据实际情况填写协议各字段数据,然后调用组包函数将协议描述结构体还原成原始数据流;
53.若需执行解包,则调用解包函数读取并分解原始数据流,然后根据解包函数自动填入各字段的值。
54.需要说明的是,所述kaitai即kaitai struct,是一种声明性语言,用于描述各种二进制数据结构,即二进制文件格式,网络流数据包格式等。
55.主要思想是用kaitai struct语言(文件)描述特定格式,然后可以用一种支持的编程语言编译成源文件。这些模块将包括为解析器生成的代码,该解析器可以从文件或流中读取所描述的数据结构,并在一个易于理解的api中授予对它的访问权限。
56.需要说明的是,所述协议即通信协议,通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过通信信道和设备互连起来的多个不同地理位置的数据通信系统,要使其能协同工作实现信息交换和资源共享,它们之间必须具有共同的语言。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议。
57.需要说明的是,协议格式描述文件由不同的对象组成,对象还可以包含对象键值对,每个协议格式描述文件必须含有meta对象和seq对象,meta对象主要用于为协议格式描述文件增加相关描述,seq对象主要用于按顺序描述协议格式。
58.根据本发明实施例,所述协议结构描述文件包括以下信息:
59.meta:元数据;
60.seq:协议格式的对象;
61.types:自定义的类型;
62.enums:seq中的枚举类型字段。
63.根据本发明实施例,所述meta包括:文件所描述的协议的名称、详细描述信息、协议默认的数据保存方式。
64.需要说明的是,作为一个具体的实施例,对meta对象举例说明:
65.meta:
66.id:foxboro
67.title:foxboro protocol
68.endian:be
69.meta对象包含id、title、endian三个对象键值对。含义分别为协议标识,协议名称,协议字节序。上面这个对象的含义是表示该协议格式描述文件的协议标识为foxboro,协议名称是foxboro protocol,协议字节序是大端序。
70.根据本发明实施例,所述seq由对象组成,每一个对象都代表着协议中一个字段;
71.所述seq包括:id、size、type;
72.需要说明的是,作为一个具体的实施例,下面对seq对象举例说明:
[0073][0074][0075]
seq对象下可以有多个元素,元素按顺序描述协议格式,每个元素有id、type、size
等属性,id为标识符,type为数据类型,type的值可以是有符号(s1、s2、s4、s8),无符号(u1、u2、u3、u4),字符串类型(str)等数据类型。size则表示数据长度,当数据类型不包含数据长度时,需要使用size属性表明。上面这个对象描述了一段数据长度为8字节(1 3 2 2)的数据格式:
[0076]
此段数据第1个字节是header_len(头部长度),数据类型为无符号,长度为1字节
[0077]
第2-4字节是保留字段,长度为3字节
[0078]
第5-6字节是长度,数据类型为无符号,长度为2字节
[0079]
第7-8字节是序号,数据类型为无符号,长度为2字节,字节序是小端序(le)。
[0080]
其中,id表示字段名称,size表示字段长度,type表示字段类型。
[0081]
根据本发明实施例,所述字段类型是预定义的字符串、整形的常见类型,或自定义的类型,或逻辑判断语句。
[0082]
根据本发明实施例,所述enums部分每个对象下列举了所有可能的值对应的不同含义。
[0083]
作为一个具体的实施例,下面以一份具体的协议格式描述文件进行说明:
[0084]
[0085]
[0086][0087]
上述协议格式描述文件(ksy),meta部分为此文件所描述的协议的名称、详细描述信息。endian表示此协议默认的数据保存方式为大端还是小端。
[0088]
seq部分为描述协议格式的主要部分,此部分由许多对象组成,每一个对象都代表着协议中一个字段,id表示字段名称,size表示字段长度,type表示字段类型。字段类型可以是预定义的字符串、整形等常见类型,也可以是自定义的类型。或者是逻辑判断语句,例如文件中展示的switch-case、if语句,用来描述较为复杂的协议。
[0089]
types部分表示自定义的类型,结构与seq部分类似,此部分可以嵌套多层。
[0090]
enums部分表示seq部分中的枚举类型字段,此部分每个对象下列举了所有可能的值对应的不同含义。
[0091]
需要说明的是,types和enums为协议格式描述文件可选对象,当seq对象里的某一元素的type属性为自定义类型时,需要在types对象中对自定义类型的格式进行描述,例:
[0101]
bytebuff =self._io.write_u1(self.header_len)
[0102]
bytebuff =bytearray(self.reserved)
[0103]
bytebuff =self._io.write_u2be(self.length)
[0104]
bytebuff =self._io.write_u2le(self.seq)
[0105]
return bytebuff
[0106]
按顺序将数据还原成字节流,涉及的数据处理函数如下
[0107]
def write_u1(self,data):
[0108]
return data.to_bytes(1,"big")
[0109]
def write_u2be(self,data):
[0110]
return data.to_bytes(2,byteorder="big",signed="unsigned")
[0111]
def write_u2le(self,data):
[0112]
return data.to_bytes(2,byteorder="little",signed="unsigned")
[0113]
解包函数如下:
[0114]
def_read(self):
[0115]
self.header_len=self._io.read_u1()
[0116]
self.reserved=self._io.read_bytes(3)
[0117]
self.length=self._io.read_u2be()
[0118]
self.seq=self._io.read_u2le()
[0119]
按顺序解析字节流,涉及的数据处理函数如下:
[0120]
def read_u1(self):
[0121]
return kaitaistream.packer_u1.unpack(self.read_bytes(1))[0]
[0122]
def read_u2be(self):
[0123]
return kaitaistream.packer_u2be.unpack(self.read_bytes(2))[0]
[0124]
def read_u2le(self):
[0125]
return kaitaistream.packer_u2le.unpack(self.read_bytes(2))[0]
[0126]
图2示出了本技术一种基于kaitai的高效率协议解包组包系统框图。
[0127]
如图2所示,本发明提供一种基于kaitai的高效率协议解包组包系统,所述基于kaitai的高效率协议解包组包2存储器21和处理器22,所述存储器21中包括基于kaitai的高效率协议解包组包方法程序,所述基于kaitai的高效率协议解包组包方法程序被所述处理器22执行时实现如下步骤:
[0128]
根据需要处理的协议数据格式,编写对应的协议结构描述文件;
[0129]
协议结构编译器根据协议结构描述文件,生产对应的协议描述结构体;
[0130]
根据指令判断是需要执行组包还是解包;
[0131]
若需执行组包,则根据实际情况填写协议各字段数据,然后调用组包函数将协议描述结构体还原成原始数据流;
[0132]
若需执行解包,则调用解包函数读取并分解原始数据流,然后根据解包函数自动填入各字段的值。
[0133]
需要说明的是,所述kaitai即kaitai struct,是一种声明性语言,用于描述各种二进制数据结构,即二进制文件格式,网络流数据包格式等。
[0134]
主要思想是用kaitai struct语言(文件)描述特定格式,然后可以用一种支持的编程语言编译成源文件。这些模块将包括为解析器生成的代码,该解析器可以从文件或流中读取所描述的数据结构,并在一个易于理解的api中授予对它的访问权限。
[0135]
需要说明的是,所述协议即通信协议,通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过通信信道和设备互连起来的多个不同地理位置的数据通信系统,要使其能协同工作实现信息交换和资源共享,它们之间必须具有共同的语言。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议。
[0136]
根据本发明实施例,所述协议结构描述文件包括以下信息:
[0137]
meta:元数据;
[0138]
seq:协议格式的对象;
[0139]
types:自定义的类型;
[0140]
enums:seq中的枚举类型字段。
[0141]
根据本发明实施例,所述meta包括:文件所描述的协议的名称、详细描述信息、协议默认的数据保存方式;
[0142]
所述seq由对象组成,每一个对象都代表着协议中一个字段;
[0143]
所述seq包括:id、size、type;
[0144]
其中,id表示字段名称,size表示字段长度,type表示字段类型;
[0145]
所述字段类型是预定义的字符串、整形的常见类型,或自定义的类型,或逻辑判断语句;
[0146]
所述enums部分每个对象下列举了所有可能的值对应的不同含义。
[0147]
作为一个具体的实施例,下面以一份具体的协议格式描述文件进行说明:
[0148]
[0149]
[0150][0151]
上述协议格式描述文件(ksy),meta部分为此文件所描述的协议的名称、详细描述信息。endian表示此协议默认的数据保存方式为大端还是小端。
[0152]
seq部分为描述协议格式的主要部分,此部分由许多对象组成,每一个对象都代表着协议中一个字段,id表示字段名称,size表示字段长度,type表示字段类型。字段类型可以是预定义的字符串、整形等常见类型,也可以是自定义的类型。或者是逻辑判断语句,例如文件中展示的switch-case、if语句,用来描述较为复杂的协议。
[0153]
types部分表示自定义的类型,结构与seq部分类似,此部分可以嵌套多层。
[0154]
enums部分表示seq部分中的枚举类型字段,此部分每个对象下列举了所有可能的值对应的不同含义。
[0155]
本发明第三方面提供一种计算机可读存储介质,所述计算机可读存储介质中包括一种基于kaitai的高效率协议解包组包方法程序,所述一种基于kaitai的高效率协议解包组包方法程序被处理器执行时,实现如上所述任一项所述的一种基于kaitai的高效率协议解包组包方法的步骤。
[0156]
本发明公开的一种基于kaitai的高效率协议解包组包方法、系统和可读存储介质,本发明通过编写统一的协议格式描述文件,使用协议格式编译器高效生成描述协议格式的数据结构,通过生成的数据结构对原始数据流进行处理。此方法可以节省开发时间,只需开发者编写协议格式描述文件,数据结构由编译器自动生成。由于采用统一的协议格式描述文件,后续维护简单方便。协议格式描述文件支持各种条件语句,各种数据类型,足以对复杂的协议进行描述。
[0157]
在本技术所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
[0158]
上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元;既可以位于一个地方,也可以分布到多个网络单
元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。
[0159]
另外,在本发明各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
[0160]
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0161]
或者,本发明上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本发明各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献