CN113835750B - 一种基于自定义规则的通用数据帧快速解码方法 - Google Patents

一种基于自定义规则的通用数据帧快速解码方法 Download PDF

Info

Publication number
CN113835750B
CN113835750B CN202111132216.XA CN202111132216A CN113835750B CN 113835750 B CN113835750 B CN 113835750B CN 202111132216 A CN202111132216 A CN 202111132216A CN 113835750 B CN113835750 B CN 113835750B
Authority
CN
China
Prior art keywords
packet
decoding
matcher
rule
data
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202111132216.XA
Other languages
English (en)
Other versions
CN113835750A (zh
Inventor
张立民
王婷婷
唐志强
张华�
陈永健
张墨
黄芳
陈露凌
秦志刚
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
UNIT 63620 OF PLA
Original Assignee
UNIT 63620 OF PLA
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by UNIT 63620 OF PLA filed Critical UNIT 63620 OF PLA
Priority to CN202111132216.XA priority Critical patent/CN113835750B/zh
Publication of CN113835750A publication Critical patent/CN113835750A/zh
Application granted granted Critical
Publication of CN113835750B publication Critical patent/CN113835750B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/72Code refactoring
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Data Exchanges In Wide-Area Networks (AREA)

Abstract

本发明属于航天发射测控与计算机信息处理领域,针对多种结构类似的传感器测量数据包,研究提出了一种用户可以自定义解码规则的测量数据帧通用快速解码方法。该方法第一步定义解码规则结构及组成;第二步终端用户按定义的解码规则结构编写解码规则文件;第三步是读取解码规则并生成规则列表;第四步是按规则列表生成包匹配器(PacketMatcher)列表;第五步是根据规则列表生成包解码器;第六步是对需解码的数据帧选择匹配的包解码器并解码;第七步是按要求输出解码后的数据。本发明能够有效解决多类型测量传感器测量数据帧解码问题,还允许用户自定义解码规则以便适应新传感器和新的帧结构,本发明方法把解码规则预先转化为解码方法,极大提高了解码效率。

Description

一种基于自定义规则的通用数据帧快速解码方法
技术领域
本发明属于航天发射测控与计算机信息处理领域,涉及一种用户可以自定义解码规则的测量数据帧通用快速解码方法。
背景技术
在航天发射过程中,有多种传感器对运载火箭飞行过程进行实时跟踪测量,这些传感器获取的测量数据,组装成特定的数据帧后,通过网络实时传送至处理中心,处理中心从数据帧中解出传感器各测元数据后完成相关处理功能。
由于每个不同的传感器具有不同的测量能力和功能,其获取的测量数据类型、数量都不相同,因而,这些测量数据被打包成中心可识别的数据帧后,其具体帧结构也不太相同。中心处理设备接收到这些数据帧后,要从这些不同结构的数据帧中解码出所需的测量数据,然后进行处理。
传统的解码方法就是针对不同的帧结构,编写不同的解码代码。这种方法的优点在于需求明确、开发简单,针对不同的帧结构,编写不同的代码段即可。但这种方法缺点也非常明显:1)需要针对每种帧结构编写不同的代码,代码量巨大;2)即使两种帧结构差别不大,也需要独立的代码,由此造成到处都是重复或类似的代码;3)不能有效适应帧结构的变化,帧结构发生轻微的变化,都需要重新编写代码;4)不能适应新的传感器加入测控网络,针对每一个新加入的传感器都需要添加新的解码方法。
中心处理软件一般使用C++语言开发,虽然可以针对类似的帧结构进行一定的抽象,使用C++的类继承关系简化开发工作量和代码结构。但是航天任务中由于参与测量的传感器数量众多,类型多样,并且不同类型的航天任务,参与测量的传感器也不尽相同;而且随着技术的发展和任务需求的变化,新传感器的加入和新的帧结构的使用,这种传统的解码方法往往会导致代码量越来越大,结构越来越复杂,使的中心解码程序越来越难以维护。
发明内容
鉴于上述技术问题,本发明提供了一种用户可以自定义解码规则的测量数据帧通用快速解码方法,解决了在航天任务中,多类型测量传感器不同结构测量数据帧的统一解码问题。
为实现上述目的,本发明的技术方案如下:
一种基于自定义规则的通用数据帧快速解码方法,该方法包括如下步骤:
步骤一:定义解码规则的结构及其组成;
定义解码规则由包匹配字段、偏移量、目标序号、时间、径向距离、方位、俯仰、径向速度、AGC、RCS字段组成,其中包匹配字段位于规则的第一个位置,用来指定该规则可以解析的包类型,其他字段前后顺序可以自由交换,可选字段按照帧实际情况可以省略;
步骤二:编写解码规则文件;
1)在解码规则文件中开始新的非“#”开头的一行,“#”开头的行为注释行,可以说明下面行解码哪种类型的数据包;
2)确定包匹配字段的位置P,长度L和判断值V,以分号分割顺序书写,如果需要判断多个字段值,则用逗号分割;
3)确定两组相邻测元之间的间隔值,计算方法为后一组测元的起始位置P1减去前一组测元的起始位置P0,即len=P1-P0;如果len≠0,则添加一个空格后,记为offset:len;如果len=0,则可以省略不写;
4)确定第一个目标序号起始位置P,长度L和数据类型Type,添加空格后记为targetNo:P:type;
5)确定第一个时间标识起始位置P,长度L和数据类型Type,以及量纲d,添加空格后记为time:P:d:type;
6)确定诸测元R、A、E、Vr、AGC、RCS的起始位置P,长度L和数据类型Type,以及量纲d,添加空格后记为测元名称:P:d:type,测元名称为R、A、E、Vr、AGC、RCS之一。
步骤三:读取解码规则文件,生成规则列表;
步骤四:利用规则列表生成包匹配器和包匹配器列表;
包匹配器PacketMatcher由一个或多个字段匹配器FieldMatcher的列表FieldMatchers及IsMath函数组成,其中,字段匹配器是一种由匹配值MatchValue和方法IsMath组成的结构,字段匹配器可以分为uint型字段匹配器和ushort型字段匹配器两种,uint型字段匹配器表示32位无符号整形匹配器,用来匹配数据包的4字节无符号整数性字段值,ushort型字段匹配器表示16位无符号整形匹配器,用来匹配2字节无符号整数性字段值;
步骤五:利用规则列表和包匹配器列表,生成包解码器集合PacketDecoders;
包解码器PacketDecoder是一种由表示包匹配器PacketMatcher的字段Matcher和一种用于解码时间、目标编号、诸测元的解码方法构成的列表Decoder组成的数据结构;
步骤六:选择匹配的包解码器并解码;
当接收到需要解码的帧数据后,从PacketDecoders集合中选择匹配的包解码器进行解码;
步骤七:输出解码数据;
按要求将步骤六解码得到数据发送到指定的网络或写入磁盘,完成所需的解码工作。
进一步地,所述步骤三进一步包括:
3.1创建一个空字符串数组列表;
3.2读取一行解码规则,判断是否是“#”开头的注释行,如果是,读取下一行;如果不是,进入步骤3.3;
3.3以空格为分隔符,做字符串分割,生成该行规则对应的字符串数组;
3.4将刚生成的字符串数组添加到列表尾部;
3.5重复步骤3.2至步骤3.4直到解码规则文件全部读取完毕;最终生成的列表称为规则列表。
进一步地,所述步骤四中,包匹配器的生成方法如下:
4.1取得步骤三生成的规则列表的头位置;
4.2从当前位置读取规则列表获取字符串数组;
4.3从字符串数组中取得第一个字符串;
4.4使用逗号(,)为分割符,做字符串分割,获得包匹配规则字符串数组;
4.5针对包匹配规则字符串数组,从第一个字符串开始,逐个解析生成字段匹配器,直到全部字符串解析完毕;
4.6按照步骤4.5生成的字段匹配器,组合生成包匹配器;
4.7把生成的包匹配器添加到包匹配器列表尾部;
4.8移动到规则列表的下一个位置,重复步骤4.2至4.7,生成全部的包匹配器及其列表。
进一步地,所述步骤4.5进一步包括:
(1)取第一个冒号(:)前字符进行解析,取得开始位置P;
(2)取第一个冒号(:)第二个冒号(:)之间的字符进行解析,取得长度L;
(3)取第二个冒号(:)之后部分字符进行解析,取得匹配值MatchValue;
(4)判读步骤(2)中的长度L,如果L=2,则根据P,L和MatchValue构建ushort型字段匹配器,如果L=4,则根据P,L和MatchValue构建uint型字段匹配器。
进一步地,所述步骤五进一步包括:
5.1取得步骤三生成的规则列表的头位置;
5.2从规则列表当前位置读取字符串数组ruleLines;并从步骤四生成的包匹配器列表中取相应位置的包匹配器,创建包解码器PacketDecoder;
5.3设ruleLines数组中当前位置为curPosition=1;ruleLines是0基数组,即元素位置从0开始;
5.4从ruleLines数组中读取curPosition位置的元素curElement;
5.5判断curPosition是否等于1:
如果不等于1,则进入步骤5.6;
如果等于1,则检查curElement是否以“offset”开头:如果是“offset”开头,解析其冒号后的数值取得offset的值,然后,置curPosition=curPosition+1,返回至步骤5.4;否则设offset=0,进入步骤5.6;
5.6以冒号(:)为分隔符,切割curElement得单个测元解码规则数组curElRule;
5.7从curElRule数组中解析得到单个测元解码方法;
5.8添加步骤5.7构建的单个测元解码方法到包解码器PacketDecoder中;
5.9置curPosition=curPosition+1并重复步骤5.4至5.8直到ruleLines数组结尾,形成完整的单个包解码器PacketDecoder;
5.10规则列表当前位置加1,重复步骤5.2至5.9,直到规则列表全部解析完毕,形成全部的PacketDecoder集合PacketDecoders。
进一步地,所述步骤五中,从curElRule数组中解析得到单个测元解码方法的步骤如下:
(1)取curElRule中第1个元素,解析得测元名称,测元名称可以是TargetNo、Time、R、A、E、Vr、AGC、RCS之一;
(2)取curElRule中第2个元素,解析得测元所在位置P;
(3)取curElRule中第3个元素,并判断curElRule长度;
如果长度为3,解析得到测元在帧中的数据类型Type,并设测元的量纲D=1,进入步骤(5);
如果长度为4,则解析得到测元的量纲D,进入步骤(4);
(4)取curElRule中第4个元素,解析得测元在帧中的数据类型DataType;
(5)按步骤(1)取得测元名称和步骤(2)、(3)、(4)取得通用单个测元解码方法ElementDecode所需的全部参数P,Type和D,构建单个测元解码方法:
El=ElementDecode(Packet,P,Type,D)
其中,Packet为解码时输入参数,即需要解码的接收到的字节序列;El为测元TargetNo、Time、R、A、E、Vr、AGC、RCS之一;
进一步地,所述步骤六进一步包括:
6.1遍历PacketDecoders集合,用包解码器的包匹配器逐个测试能否通过检测,如果全部包解码器都没有通过检测,则该帧数据不需解码;如果某个包解码器通过了包匹配器的测试,则选择该包解码器;
6.2用选择的包解码器解码数据帧,得到解码后的数据。
进一步地,所述步骤6.1进一步包括:
(1)调用当前包解码器的包匹配器PacketMatcher的IsMatch(Packet)方法,Packet是接收数据的基地址;
(2)IsMatch(Packet)方法逐个检查它的字段匹配器,如果全部字段匹配器都匹配,返回真,否则返回假;
返回真意味着通过测试,返回假意味着没有通过;
进一步地,所述步骤6.2进一步包括:
(1)判断包解码器offset是否为0,若为0执行第(2)步,若不为0则执行第(3)步;
(2)直接调用包解码器解码方法Decode得到解码数据,下式中Packet为解码数据基地址,result为解码后数据;
result=Decode(Packet)
(3)循环调用解码方法Decode直到数据尾部,设当前循环次数为i,i=0,1,2…,则输入数据基地址为Packet+i*offset,最终按照下式得到解码结果:
result+=Decode(Packet+i*offset)
式中,+=表示拼接解码后数据。
本发明的优点是:通过允许用户自定义解码规则来解码不同类型传感器测量数据,有效解决了以往不同设备、不同类型帧需要软件开发人员单独编写解码代码的问题,一方面提高了软件研发效率,另一方面降低了代码数量,从而提高了代码质量。此外,由于允许用户自定义规则,当新测量传感器投入使用或使用新的帧类型时,只需要增加新的解码规则而不需要更改解码代码或新增解码代码,从而有效提高了程序适应性和质量,极大降低了软件维护成本。
附图说明
图1一种用户可以自定义解码规则的测量数据帧通用快速解码方法流程图
图2字段匹配器(FieldMatcher)UML图
图3包匹配器(PacketMatcher)UML图
图4 PacketDecoder UML模型图
图5包匹配器列表生成流程图
图6字段匹配器生成流程图
图7解码方法的组合生成步骤
图8单个测元解码方法构建流程
具体实施方式
本发明提出的一种用户可以自定义解码规则的测量数据帧通用快速解码方法能够有效解决传统解码方法所面临的问题,并且能够简化解码程序开发难度,良好适应各种新传感器和新的帧结构的加入,极大降低中心解码程序的维护难度。
本发明提供了一种用户可以自定义解码规则的测量数据帧通用快速解码方法,如图1所示,包括如下步骤:
步骤一:定义解码规则的结构及其组成。
定义解码规则由包匹配字段、偏移量、目标序号、时间、径向距离、方位、俯仰、径向速度、AGC、RCS等字段组成。其中包匹配字段是必须的并且必须位于规则的第一个位置,用来指定该规则可以解析的包类型,其他字段前后顺序可以自由交换,可选字段按照帧实际情况可以省略。表解释了各字段作用及编写规则。
表1解码规则各字段说明
Figure BDA0003274976130000071
Figure BDA0003274976130000081
备注:类型(type)包括无符号长整数(64位)ulong、长整数(64位)long、无符号整数(32位)uint、整数(32位)int、无符号短整数(16位)uint16、短整数(16位)int16,无符号字节(8位)byte、字节(8位)sbyte,共8中类型。
步骤二:编写解码规则文件。
根据步骤一定义的解码规则的结构及其组成,按照实际测量传感器的帧结构,编写解码规则。每一种结构不相同的数据包对应一行解码规则。
针对每一种需要解码的数据包,解码规则文件编写方法如下:
1)在解码规则文件中开始新的非“#”开头的一行,“#”开头的行为注释行,可以说明下面行解码哪种类型的数据包;
2)确定包匹配字段的位置P,长度L和判断值V,以分号分割顺序书写,形如P:L:V,如果需要判断多个字段值,则用逗号分割,形如P1:L1:V1,P2:L2:V2;
3)确定两组相邻测元之间的间隔值(字节值),计算方法为后一组测元的起始位置P1减去前一组测元的起始位置P0,即len=P1-P0。如果len≠0,则添加一个空格后,记为offset:len;如果len=0,则可以省略不写;
4)确定第一个目标序号起始位置P,长度L和数据类型Type,添加空格后记为targetNo:P:type;
5)确定第一个时间标识起始位置P,长度L和数据类型Type,以及量纲d,添加空格后记为time:P:d:type;
6)确定诸测元(R、A、E、Vr、AGC、RCS)的起始位置P,长度L和数据类型Type,以及量纲d,添加空格后记为测元名称:P:d:type,测元名称为R、A、E、Vr、AGC、RCS之一。
一般情况下,同一传感器帧结构自始至终都会保持一致,但是某些特殊情况下,帧结构会发生变化,这需要重新编写解码规则。每个解码规则占一行,多行解码规则组成解码规则文件。
举例说明,某测量设备测量数据帧中,设备ID从第9字节开始,长度4字节,值为0x20201151,以该设备ID作为帧匹配依据;测元由目标编号、时间、R、A、E、Vr和AGC组成,第一个测元中的目标编号从34字节开始,时间位于42字节开始,其余测量值依次往后;第二个测元中的目标编号从66字节开始;时间类型为uint,量纲为0.01,其余所有测元均为int类型,R和Vr量纲为0.001,A,E量纲为0.02,AGC量纲为0.05。
通过计算可知,offset为66-34=32。则该测量设备数据帧解码规则为:
9:4:0x20201151 offset:32 targetNo:34:uint time:42:0.01:uint R:46:0.001:int A:50:0.02:int E:54:0.02:int Vr:58:0.001:int AGC:62:0.05:int
步骤三:读取解码规则文件,生成规则列表。
分4步进行:
3.1创建一个空字符串数组列表;
3.2读取一行解码规则,判断是否是“#”开头的注释行,如果是,读取下一行;如果不是,进入步骤3.3;
3.3以空格为分隔符,做字符串分割,生成该行规则对应的字符串数组;
3.4将刚生成的字符串数组添加到列表尾部;
3.5重复步骤3.2至步骤3.4直到解码规则文件全部读取完毕。
最终生成的列表称为规则列表。
步骤四:利用规则列表生成包匹配器和包匹配器列表。
包匹配器(PacketMatcher)由一个或多个字段匹配器(FieldMatcher)的列表FieldMatchers及IsMath函数组成,如图3所示。其中,字段匹配器是一种由匹配值MatchValue和方法IsMath组成的结构,如图2所示。字段匹配器可以分为uint型字段匹配器和ushort型字段匹配器两种。uint型字段匹配器表示32位无符号整形匹配器,用来匹配数据包的4字节无符号整数性字段值,ushort型字段匹配器表示16位无符号整形匹配器,用来匹配2字节无符号整数性字段值。
包匹配器的生成方法如下,见图5:
4.1取得步骤三生成的规则列表的头位置;
4.2从当前位置读取规则列表获取字符串数组;
4.3从字符串数组中取得第一个字符串;
4.4使用逗号(,)为分割符,做字符串分割,获得包匹配规则字符串数组;
4.5针对包匹配规则字符串数组,从第一个字符串开始,逐个解析生成字段匹配器,直到全部字符串解析完毕,见图6,方法如下:
(1)取第一个冒号(:)前字符进行解析,取得开始位置P;
(2)取第一个冒号(:)第二个冒号(:)之间的字符进行解析,取得长度L;
(3)取第二个冒号(:)之后部分字符进行解析,取得匹配值MatchValue;
(4)判读步骤(2)中的长度L,如果L=2,则根据P,L和MatchValue构建ushort型字段匹配器,如果L=4,则根据P,L和MatchValue构建uint型字段匹配器;
4.6按照步骤4.5生成的字段匹配器,组合生成包匹配器;
4.7把生成的包匹配器添加到包匹配器列表尾部;
4.8移动到规则列表的下一个位置,重复步骤4.2至4.7,生成全部的包匹配器及其列表。
步骤五:利用规则列表和包匹配器列表,生成包解码器。
包解码器PacketDecoder是一种由表示包匹配器PacketMatcher的字段Matcher和一种用于解码时间、目标编号、诸测元的解码方法构成的列表Decoder组成的数据结构,如图4所示。
包解码器的生成步骤如下(见流程图7):
5.1取得步骤三生成的规则列表的头位置;
5.2从规则列表当前位置读取字符串数组ruleLines;并从步骤四生成的包匹配器列表中取相应位置的包匹配器,创建包解码器PacketDecoder;
5.3设ruleLines数组中当前位置为curPosition=1;ruleLines是0基数组,即元素位置从0开始;
5.4从ruleLines数组中读取curPosition位置的元素curElement;
5.5判断curPosition是否等于1:
如果不等于1,则进入步骤5.6;
如果等于1,则检查curElement是否以“offset”开头:如果是“offset”开头,解析其冒号后的数值取得offset的值,然后,置curPosition=curPosition+1,返回至步骤5.4;否则设offset=0,进入步骤5.6;
5.6以冒号(:)为分隔符,切割curElement得单个测元解码规则数组curElRule;
5.7从curElRule数组中解析得到单个测元解码方法(见流程图8),具体步骤如下:
(1)取curElRule中第1个元素,解析得测元名称,测元名称可以是TargetNo、Time、R、A、E、Vr、AGC、RCS之一。
(2)取curElRule中第2个元素,解析得测元所在位置P。
(3)取curElRule中第3个元素,并判断curElRule长度。
如果长度为3,解析得到测元在帧中的数据类型Type,并设测元的量纲D=1,进入步骤(5)。
如果长度为4,则解析得到测元的量纲D,进入步骤(4)。
(4)取curElRule中第4个元素,解析得测元在帧中的数据类型DataType。
(5)按步骤(1)取得测元名称和步骤(2)、(3)、(4)取得通用单个测元解码方法(ElementDecode)所需的全部参数P,Type和D,构建单个测元解码方法:
El=ElementDecode(Packet,P,Type,D)
其中,Packet为解码时输入参数,即需要解码的接收到的字节序列;El为测元TargetNo、Time、R、A、E、Vr、AGC、RCS之一;ElementDecode由开发人员提前写好并经过大量的测试,其准确性和效率都非常高,其解码的基本步骤是:首先,根据Type得到测元长度L;其次,获取Packet位于P位置,长度为L的字节序列el;然后,转化el为Type类型的值elVal;最后,计算elVal*D得到最终解码值。
5.8添加步骤5.7构建的单个测元解码方法到包解码器PacketDecoder中。
5.9置curPosition=curPosition+1并重复步骤5.4至5.8直到ruleLines数组结尾,形成完整的单个包解码器PacketDecoder。
5.10规则列表当前位置加1,重复步骤5.2至5.9,直到规则列表全部解析完毕,形成全部的PacketDecoder集合PacketDecoders。
步骤六:选择匹配的包解码器并解码。
当接收到需要解码的帧数据后,从PacketDecoders集合中选择匹配的包解码器进行解码。具体方法是:
6.1遍历PacketDecoders集合,用包解码器的包匹配器逐个测试能否通过检测,如果全部包解码器都没有通过检测,则该帧数据不需解码;如果某个包解码器通过了包匹配器的测试,则选择该包解码器。
具体测试方法是:
(1)调用当前包解码器的包匹配器PacketMatcher的IsMatch(Packet)方法,Packet是接收数据的基地址;
(2)IsMatch(Packet)方法逐个检查它的字段匹配器,如果全部字段匹配器都匹配,返回真,否则返回假;
返回真意味着通过测试,返回假意味着没有通过;
6.2用选择的包解码器解码数据帧,得到解码后的数据。
具体方法如下:
(1)判断包解码器offset是否为0,若为0执行第(2)步,若不为0则执行第(3)步;
(2)直接调用包解码器解码方法Decode得到解码数据,下式中Packet为解码数据基地址,result为解码后数据。
result=Decode(Packet)
(3)循环调用解码方法Decode直到数据尾部,设当前循环次数为i,i=0,1,2…,则输入数据基地址为Packet+i*offset,最终按照下式得到解码结果:
result+=Decode(Packet+i*offset)
式中,+=表示拼接解码后数据。
步骤七:输出解码数据。
按要求将步骤六解码得到数据result发送到指定的网络或写入磁盘,完成所需的解码工作。
方法第一步、第二步主要用于定义解码规则结构组成和用户如何编写解码规则,第三步、第四步、第五步主要用于根据用户编写的解码规则生成快速包解码器,第六步用于解码接收到的数据帧,第七步用于输出解码后的数据。
本发明不但能够有效解决多类型测量传感器测量数据帧解码问题,还允许用户自定义解码规则以便适应新传感器和新的帧结构,此外,本方法把解码规则预先转化为解码方法,极大提高了解码效率。

Claims (9)

1.一种基于自定义规则的通用数据帧快速解码方法,其特征在于,该方法包括如下步骤:
步骤一:定义解码规则的结构及其组成;
定义解码规则由包匹配字段、偏移量、目标序号、时间、径向距离、方位、俯仰、径向速度、AGC、RCS字段组成,其中包匹配字段位于规则的第一个位置,用来指定该规则可以解析的包类型,其他字段前后顺序可以自由交换,可选字段按照帧实际情况可以省略;
步骤二:编写解码规则文件;
1)在解码规则文件中开始新的非“#”开头的一行,“#”开头的行为注释行,可以说明下面行解码哪种类型的数据包;
2)确定包匹配字段的位置P,长度L和判断值V,以分号分割顺序书写,如果需要判断多个字段值,则用逗号分割;
3)确定两组相邻测元之间的间隔值,计算方法为后一组测元的起始位置P1减去前一组测元的起始位置P0,即len=P1-P0;如果len≠0,则添加一个空格后,记为offset:len;如果len=0,则可以省略不写;
4)确定第一个目标序号起始位置P,长度L和数据类型Type,添加空格后记为targetNo:P:type;
5)确定第一个时间标识起始位置P,长度L和数据类型Type,以及量纲d,添加空格后记为time:P:d:type;
6)确定诸测元R、A、E、Vr、AGC、RCS的起始位置P,长度L和数据类型Type,以及量纲d,添加空格后记为测元名称:P:d:type,测元名称为R、A、E、Vr、AGC、RCS之一。
步骤三:读取解码规则文件,生成规则列表;
步骤四:利用规则列表生成包匹配器和包匹配器列表;
包匹配器PacketMatcher由一个或多个字段匹配器FieldMatcher的列表FieldMatchers及IsMath函数组成,其中,字段匹配器是一种由匹配值MatchValue 和方法IsMath组成的结构,字段匹配器可以分为uint型字段匹配器和ushort型字段匹配器两种,uint型字段匹配器表示32位无符号整形匹配器,用来匹配数据包的4字节无符号整数性字段值,ushort型字段匹配器表示16位无符号整形匹配器,用来匹配2字节无符号整数性字段值;
步骤五:利用规则列表和包匹配器列表,生成包解码器集合PacketDecoders;
包解码器PacketDecoder是一种由表示包匹配器PacketMatcher的字段Matcher和一种用于解码时间、目标编号、诸测元的解码方法构成的列表Decoder组成的数据结构;
步骤六:选择匹配的包解码器并解码;
当接收到需要解码的帧数据后,从PacketDecoders集合中选择匹配的包解码器进行解码;
步骤七:输出解码数据。
按要求将步骤六解码得到数据发送到指定的网络或写入磁盘,完成所需的解码工作。
2.如权利要求1所述的基于自定义规则的通用数据帧快速解码方法,其特征在于,所述步骤三进一步包括:
3.1创建一个空字符串数组列表;
3.2读取一行解码规则,判断是否是“#”开头的注释行,如果是,读取下一行;如果不是,进入步骤3.3;
3.3以空格为分隔符,做字符串分割,生成该行规则对应的字符串数组;
3.4将刚生成的字符串数组添加到列表尾部;
3.5重复步骤3.2至步骤3.4直到解码规则文件全部读取完毕;最终生成的列表称为规则列表。
3.如权利要求2所述的基于自定义规则的通用数据帧快速解码方法,其特征在于,所述步骤四中,包匹配器的生成方法如下:
4.1取得步骤三生成的规则列表的头位置;
4.2从当前位置读取规则列表获取字符串数组;
4.3从字符串数组中取得第一个字符串;
4.4使用逗号(,)为分割符,做字符串分割,获得包匹配规则字符串数组;
4.5针对包匹配规则字符串数组,从第一个字符串开始,逐个解析生成字段匹配器,直到全部字符串解析完毕;
4.6按照步骤4.5生成的字段匹配器,组合生成包匹配器;
4.7把生成的包匹配器添加到包匹配器列表尾部;
4.8移动到规则列表的下一个位置,重复步骤4.2至4.7,生成全部的包匹配器及其列表。
4.如权利要求3所述的基于自定义规则的通用数据帧快速解码方法,其特征在于,所述步骤4.5进一步包括:
(1)取第一个冒号(:)前字符进行解析,取得开始位置P;
(2)取第一个冒号(:)第二个冒号(:)之间的字符进行解析,取得长度L;
(3)取第二个冒号(:)之后部分字符进行解析,取得匹配值MatchValue;
(4)判读步骤(2)中的长度L,如果L=2,则根据P,L和MatchValue构建ushort型字段匹配器,如果L=4,则根据P,L和MatchValue构建uint型字段匹配器。
5.如权利要求4所述的基于自定义规则的通用数据帧快速解码方法,其特征在于,所述步骤五进一步包括:
5.1取得步骤三生成的规则列表的头位置;
5.2从规则列表当前位置读取字符串数组ruleLines;并从步骤四生成的包匹配器列表中取相应位置的包匹配器,创建包解码器PacketDecoder;
5.3设ruleLines数组中当前位置为curPosition=1;ruleLines是0基数组,即元素位置从0开始;
5.4从ruleLines数组中读取curPosition位置的元素curElement;
5.5判断curPosition是否等于1:
如果不等于1,则进入步骤5.6;
如果等于1,则检查curElement是否以“offset”开头:如果是“offset”开头,解析其冒号后的数值取得offset的值,然后,置curPosition=curPosition+1,返回至步骤5.4;否则设offset=0,进入步骤5.6;
5.6以冒号(:)为分隔符,切割curElement得单个测元解码规则数组curElRule;
5.7从curElRule数组中解析得到单个测元解码方法;
5.8添加步骤5.7构建的单个测元解码方法到包解码器PacketDecoder中;
5.9置curPosition=curPosition+1并重复步骤5.4至5.8直到ruleLines数组结尾,形成完整的单个包解码器PacketDecoder;
5.10规则列表当前位置加1,重复步骤5.2至5.9,直到规则列表全部解析完毕,形成全部的PacketDecoder集合PacketDecoders。
6.如权利要求5所述的基于自定义规则的通用数据帧快速解码方法,其特征在于,所述步骤五中,从curElRule数组中解析得到单个测元解码方法的步骤如下:
(1)取curElRule中第1个元素,解析得测元名称,测元名称可以是TargetNo、Time、R、A、E、Vr、AGC、RCS之一;
(2)取curElRule中第2个元素,解析得测元所在位置P;
(3)取curElRule中第3个元素,并判断curElRule长度;
如果长度为3,解析得到测元在帧中的数据类型Type,并设测元的量纲D=1,进入步骤(5);
如果长度为4,则解析得到测元的量纲D,进入步骤(4);
(4)取curElRule中第4个元素,解析得测元在帧中的数据类型DataType;
(5)按步骤(1)取得测元名称和步骤(2)、(3)、(4)取得通用单个测元解码方法ElementDecode所需的全部参数P,Type和D,构建单个测元解码方法:
El=ElementDecode(Packet,P,Type,D)
其中,Packet为解码时输入参数,即需要解码的接收到的字节序列;El为测元TargetNo、Time、R、A、E、Vr、AGC、RCS之一。
7.如权利要求6所述的基于自定义规则的通用数据帧快速解码方法,其特征在于,所述步骤六进一步包括:
6.1遍历PacketDecoders集合,用包解码器的包匹配器逐个测试能否通过检测,如果全部包解码器都没有通过检测,则该帧数据不需解码;如果某个包解码器通过了包匹配器的测试,则选择该包解码器;
6.2用选择的包解码器解码数据帧,得到解码后的数据。
8.如权利要求7所述的基于自定义规则的通用数据帧快速解码方法,其特征在于,所述步骤6.1进一步包括:
(1)调用当前包解码器的包匹配器PacketMatcher的IsMatch(Packet)方法,Packet是接收数据的基地址;
(2)IsMatch(Packet)方法逐个检查它的字段匹配器,如果全部字段匹配器都匹配,返回真,否则返回假;
返回真意味着通过测试,返回假意味着没有通过。
9.如权利要求7所述的基于自定义规则的通用数据帧快速解码方法,其特征在于,所述步骤6.2进一步包括:
(1)判断包解码器offset是否为0,若为0执行第(2)步,若不为0则执行第(3)步;
(2)直接调用包解码器解码方法Decode得到解码数据,下式中Packet为解码数据基地址,result为解码后数据;
result=Decode(Packet)
(3)循环调用解码方法Decode直到数据尾部,设当前循环次数为i,i=0,1,2…,则输入数据基地址为Packet+i*offset,最终按照下式得到解码结果:
result+=Decode(Packet+i*offset)
式中,+=表示拼接解码后数据。
CN202111132216.XA 2021-09-23 2021-09-23 一种基于自定义规则的通用数据帧快速解码方法 Active CN113835750B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111132216.XA CN113835750B (zh) 2021-09-23 2021-09-23 一种基于自定义规则的通用数据帧快速解码方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111132216.XA CN113835750B (zh) 2021-09-23 2021-09-23 一种基于自定义规则的通用数据帧快速解码方法

Publications (2)

Publication Number Publication Date
CN113835750A CN113835750A (zh) 2021-12-24
CN113835750B true CN113835750B (zh) 2022-10-14

Family

ID=78970505

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111132216.XA Active CN113835750B (zh) 2021-09-23 2021-09-23 一种基于自定义规则的通用数据帧快速解码方法

Country Status (1)

Country Link
CN (1) CN113835750B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115834736A (zh) * 2022-11-14 2023-03-21 四川启睿克科技有限公司 一种二进制报文的声明式报文解码方法

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107025125A (zh) * 2016-01-29 2017-08-08 上海大唐移动通信设备有限公司 一种原始码流解码方法和系统
CN107291522A (zh) * 2016-04-11 2017-10-24 中国科学院信息工程研究所 一种面向自定义规则文件的编译优化方法及系统

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107025125A (zh) * 2016-01-29 2017-08-08 上海大唐移动通信设备有限公司 一种原始码流解码方法和系统
CN107291522A (zh) * 2016-04-11 2017-10-24 中国科学院信息工程研究所 一种面向自定义规则文件的编译优化方法及系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
北斗电文编码与解码的研究;易晨晖等;《电子世界》;20170908(第17期);全文 *

Also Published As

Publication number Publication date
CN113835750A (zh) 2021-12-24

Similar Documents

Publication Publication Date Title
CN113835750B (zh) 一种基于自定义规则的通用数据帧快速解码方法
CN103547998A (zh) 用于编译正则表达式的方法和设备
CN109614329B (zh) 一种基于接口控制文件的软件测试用例辅助设计方法
CN109032577B (zh) 一种数据仿真方法
CN111176991B (zh) 一种嵌入式软件接口用例自动化生成方法
CN113591093A (zh) 基于自注意力机制的工业软件漏洞检测方法
US7085964B2 (en) Dynamic test program generator for VLIW simulation
CN112181426B (zh) 一种汇编程序控制流路径检测方法及装置
White et al. Reassert: Deep learning for assert generation
US7958422B2 (en) Method and apparatus for generating self-verifying device scenario code
CN105005496B (zh) 一种跨语言转换网络数据包定义文件的处理系统及方法
CN111651363A (zh) 测试数据获取方法、装置、电子设备及介质
CN115422865B (zh) 仿真方法及装置、计算设备、计算机可读存储介质
CN112380133B (zh) 一种指令集模拟器利用功能库仿真的方法及装置
CN115525555A (zh) 测试脚本的生成方法、装置、电子设备及存储介质
CN116301875A (zh) 一种基于学习模型可触发性的代码语义冗余度量验证方法
CN114816516A (zh) 基于多重源码表示和循环神经网络的代码注释生成方法
CN114327614A (zh) 参考模型数据流记录和分析的方法及应用
KR102319403B1 (ko) 컴퓨터 장치 및 컴퓨터 장치의 바이너리 프로그램 실행 속도 측정방법
CN101615209B (zh) 基于内存监视的处理器验证方法
CN107678742B (zh) 卫星遥测反演算法在线编辑方法
CN118035088A (zh) 一种基于遗传算法的故障复现方法及装置
CN115543676A (zh) 故障检测方法及装置、计算机可存储介质
JP2002055854A (ja) 計算機プログラム計測装置
CN108614680A (zh) 一种信息查询命令程序的自动生成方法和系统

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant