本发明专利涉及一种通用的基于字符串类型的i/o通讯协议的自动解析方法,能够对通讯过程中收发数据自动进行解析、识别和处理。典型应用如以太网通讯、串口通讯等。
背景技术:
在嵌入式软件自动化黑盒测试时,许多被测软件与外部进行通讯都是基于字符串类型数据包的通讯协议,而这往往需要对字符串类型数据包进行解析,从而解算出字符串里面各个字段的具体数值;虽然对一个被测软件来说,其通讯协议相对固定,可以在收到数据后按照此被测软件提供的通讯协议在测试程序中编写解码程序,但若一个被测软件中涉及到多种不同的通讯协议或要对多个被测软件进行测试,则在测试程序中实现通讯协议的解析功能是一件很麻烦且浪费时间的事情,因此引入一种能够针对不同的通讯协议都能自动进行解析的功能非常重要。
由于通讯数据包为字符串类型的数据包往往长度不固定,因此在收到数据后如何依据协议特性将数据包中的各个数据字段快速解析出来是最关键的问题。
技术实现要素:
鉴于目前存在的上述不足,本发明提供一种基于字符串类型数据的通讯协议解析方法,一方面解决了通讯数据包不定长的问题,另一方面也解决了自动按照通讯协议格式进行解析的问题。
为达到上述目的,本发明的实施例采用如下技术方案:
一种基于字符串类型数据的通讯协议解析方法,包括如下步骤:
步骤1,通讯协议的编辑,包括步骤1.1至1.3:
步骤1.1,提供一个通讯协议编辑工具给用户;
步骤1.2,用户将已有的通讯协议信息录入或导入所述通讯协议编辑工具;
步骤1.3,用户通过所述通讯协议编辑工具将录入或导入的通讯协议信息保存成指定格式的xml文件;
步骤2,通讯协议的解析,包括步骤2.1至2.9:
步骤2.1,开始;
步骤2.2,从被测件收到消息;
步骤2.3,协议解析模块开始实时通讯协议解析;
步骤2.4,在公共类协议格式信息集中进行协议格式匹配;
步骤2.5,判断是否匹配成功,若是则转到步骤2.8,否则转到步骤2.6;
步骤2.6,在当前信号下的协议格式中进行匹配;
步骤2.7,判断是否匹配成功,若是则转到步骤2.8,否则转到步骤2.9;
步骤2.8,自动解析出通讯包中每个协议单元的实际内容;
步骤2.9,结束。
依照本发明的一个方面,步骤1.1中,所述通讯协议编辑工具采用eclipse开发。
依照本发明的一个方面,步骤1.2中,所述通讯协议信息在所述通讯协议编辑工具中采用链表方式存储。
依照本发明的一个方面,步骤1.2中,所述通讯协议信息的构成包括通讯协议格式基类、协议单元信息类、协议单元位信息类、协议单元长度信息、协议单元数据内容信息、协议格式信息类、通讯协议信息类。
依照本发明的一个方面,步骤2.4中,所述公共类协议格式信息集定义的是不同被测系统或模块之间所有通用的通讯协议格式。
本发明实施的优点:
相比其它类似方法而言,本发明在嵌入式软件自动化黑盒测试领域具有较强的通用性、重用性和易用性,不管通讯双方采用tcp或udp或串口或其它方式进行通讯,只要是基于字符串类型的数据包,本发明均可对其进行快速自动的解析。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图 仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为通讯协议解析的原理图。
图2为通讯协议编辑界面图。
图3为通讯协议格式信息的主要构成类。
图4为通讯协议基类信息的构成。
图5为协议单元信息类信息的构成。
图6为协议单元位信息类信息的构成。
图7为协议格式信息类信息的构成。
图8为通讯协议信息类信息的构成。
图9为通讯协议的解析算法流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,本发明的原理为:首先提供一个通讯协议编辑工具给测试人员录入或导入已有的通讯协议信息,录入或导入的通讯协议信息能够自动通过通讯协议编辑工具保存成指定格式的xml文件,然后测试人员在进行自动化测试时,在接收到被测件的数据时,调用通讯协议解析模块,通讯协议解析模块即能自动地解析出当前收到的数据包属于哪种协议格式,以及该协议格式内各个协议字段的值,这样便于测试过程中进行测试判断和处理。
本发明由两个子模块组成,具体如下:
一、通讯协议编辑工具:提供友好的人机操作界面供用户将通讯协议导入进来。
通讯协议编辑工具采用eclipse开发,用户可在此设置或导入通讯协议格式,编辑界面的一个实施例如图2所示。
使用者可以在类似的编辑界面中编辑通讯协议的格式,然后将通 讯协议信息保存成可跨平台解析的xml格式文件,方便协议解析模块进行解析。
二、通讯协议解析模块:在通讯过程中,能够自动地解析出通讯包中的各个字段的具体数值;考虑到在实际使用时,对收到的数据包解析往往要求在很短的时间内给出响应,这就要求解析通讯数据包的时间越短越好,因此选择标准c++语言来实现通讯协议的解析功能。
通讯过程中,软件收到数据后自动调用解析函数进行解析,为了保证解析速度,用户在通讯协议编辑界面设置的通讯协议具体内容采用链表方式存储,解析之前首先加载此通讯协议所有的内容到内存中,解析时,一个一个的进行匹配,有碰到一个不匹配的,直接跳出匹配下一个,直到匹配到成功的为止,匹配结束后,同时返回匹配成功的各个字段的具体值。
通讯协议格式的主要构成以及各部件的c++类设计方法如下:
通讯协议信息的主要构成如图3所示,包括通讯协议格式基类、协议单元信息类、协议单元位信息类、协议单元长度信息、协议单元数据内容信息、协议格式信息类、通讯协议信息类、。
图3中的箭头是c++类之间继承的一种表示方法,在本实施例中表示“协议单元信息类”是从“通讯协议基类”继承过来的;“协议单元位信息类”也是从“通讯协议基类”继承过来的。没有这种箭头表明类之间没有这种继承关系。
协议单元长度信息、协议单元数据内容信息分别描述协议单元的长度信息和数据内容信息。
1、通讯协议基类的设计如图4所示。
通讯协议格式基类cprotocolunit_base
属性:
e_protocolunit_typem_eprotocolunit_type;//协议单元类型(字节/数据位)
charm_szname[max_name_length];//协议单元名称
charm_szdesc[max_string_len];//协议单元描述
unsignedlongm_uluniqueid;//协议单元唯一id值
boolm_breserved;//是否是保留字
boolm_breserved_autozero;//保留字是否自动填0
cprotocolunit_value*m_pvalue;//数据内容信息
方法:
无
2、协议单元信息类的设计如图5所示。
协议单元信息类cprotocolunit
属性:
boolm_bbitstruct;//是否是位域结构体
boolm_bcandivision;//是否还可以分解成子协议单元信息集
boolm_blittleendian;//是否将低序字节存储在起始地址
boolm_bexpand;//是否展开显示
boolm_barray;//是否是数组
list<cprotocolunit*>m_protocol_child;//子协议单元信息集,m_bcandivision=true时有效
clenbase_protocolunit*m_pprotocolunit_len;//长度信息
list<cprotocolunit_bit*>m_protocol_child_bits;//位域结构体信息,m_bbitstruct=true时有效
方法:
boolif_matched();//自动解析协议信息时,调用此函数判断是否协议的长度和内容信息与实际一致
3、协议单元位信息类的设计如图6所示。
协议单元位信息类cprotocolunit_bit
属性:
unsignedshortm_usstartbit;//起始位
unsignedshortm_usbitnum;//数据位数
主要方法:
boolif_matched();//自动解析协议信息时,调用此函数判断是否协议的长度和内容信息与实际一致
4、协议格式信息类的设计如图7所示。
协议格式信息类cprotocolform
属性:
e_protocoltypem_eprotocoltype;//协议格式类型(公共类/特定类)
charm_szprotocolname[max_name_length];//协议格式名称
list<cprotocolunit*>m_protocolinfo;//该协议格式下的具体协议信息,以递归方式存储
主要方法:
//自动解析协议信息时,调用此函数判断是否协议的长度和内容信息与实际一致
//函数功能:判断指定的协议单元的数据内容信息是否与实际的一致,若一致则匹配成功
boolmatch_protocolunit(unsignedlongullen,//协议包内容长度值
unsignedchar*pvalue,//协议包数据内容信息
unsignedlongulstartpos,//指定协议单元的内容在整个包内容中的起始位置(字节为单位)
cprotocolunit*pprotocolunit,//指定的协议单元
unsignedlong&ulprotocolunitlen);//协议单元的长度值
5、通讯协议信息类的设计如图8所示。
通讯协议信息类cprotocolinfo
属性:
vector<cprotocolform*>m_commrecvprotocol;//公共类协议格式信息集
map<char*,cprotocolparent*>m_recvprotocol;//特定类协议格式信息集
cprotocolform*m_pprotocolform_matched;//匹配成功的协议格式信息
主要方法:
//自动解析协议信息时,调用此函数判断是否协议的长度和内容信息与实际一致
//函数功能:匹配出指定的协议格式信息,并计算该协议格式内所有协议单元的数据内容信息
voidmatching_protocolunit(unsignedlongullen,unsignedchar*pvalue);
通讯协议的自动解析算法如图9所示:在测试执行时,测试系统接收到被测件发送过来的消息后,自动在接收类协议格式里进行协议的匹配和解析,解析成功后自动得出协议格式中所有协议单元的数据内容,便于后续的测试处理。
图7中的“公共类协议格式信息集”对应图8中的属性中的“公共类协议格式信息集”,指的是不同被测系统或模块之间所有相同的协议格式,就都归入到公共类协议格式信息集中,这样在进行协议解析时,首先在“公共类协议格式信息集”中进行匹配解析,有利于快速的解析出实际的协议格式及其数据内容。
在设计通讯协议时,尽量将一些通用的(多个信号均使用到的相同的通讯协议格式)通讯协议定义在公共类协议格式信息集中,便于提高协议解析速率。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本领域技术的技术人员在本发明公开的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。