通信系统消息的编解码方法及编、解码器的制作方法

文档序号:7969875阅读:318来源:国知局
专利名称:通信系统消息的编解码方法及编、解码器的制作方法
技术领域
本发明涉及通信领域中的编解码技术,尤其涉及一种通信系统消息的编解码方法及编码器和解码器。
背景技术
通信系统中的消息一般以文档形式进行描述和定义,通过计算机将其转换为计算机能够处理的格式,从而实现对消息的编解码。在编码过程中,计算机将通信系统消息转换为通信系统设备能够处理的比特流;在解码过程中,计算机将消息比特流解码为人们能够识别的消息描述。
通信系统消息中包含若干信息单元(Information Element,IE),用于携带不同类型的信息。IE具有不同的属性,如可选、必选或可重复出现;IE之间还存在逻辑关系,如一个信息单元包含多个信息单元,前者作为组,后者作为该组的成员。可以说通信系统消息是由多个IE组合嵌套形成的。有些消息,如Diameter消息,IE数量较多、IE间的逻辑性较强,因此对编解码的效率要求也随之较高。
Diameter协议的最初提出是作为Radius协议的改进或者替代,它的引入是作为支持基于IP技术的AAA框架的AAA协议,其主要有如下功能认证(Authentication)用户在使用网络系统中的资源时对用户身份的确认;授权(Authorization)网络系统授权用户以特定的方式使用其资源;计费(Accounting)网络系统收集、记录用户对网络资源的使用,以便向用户收取资源使用费用,或者用于审计等目的。
参见图1,为Diameter的消息格式示意图。
Diameter消息由消息头和消息体组成,图1给出了消息头格式。Diameter消息的头部包括20个字节,头4个字节是8bit的版本信息(Version)和24bit的消息长度(Message Lenth,包括消息头长度)。随后的4个字节是8bit的消息标志位和24bit的命令代码(Command-Code)。应用标识(Application-Code)、逐跳标识(Hop-by-Hop Identifier)和端到端标识(End-to-End Identifier)都有4个字节,其中应用标识用以指示消息适用的应用,逐跳标识用于判断请求与应答的对应关系,而端到端标识主要用于重复消息的检查。
消息头部后的全部字节就是消息体的具体内容,以属性值对(AVP,Attribute-Value-Pair)的形式逐个头尾衔接。AVP的格式也是由头部和数据组成。
参见图2,为DiameterAVP格式示意图。
如图2所示,AVP的头结构为头4个字节是AVP代码(AVP Code),随后的4个字节由8bit的AVP标志和24bit的AVP长度(AVP Length,包括AVP头部长度)构成,AVP标志用于通知接收端如何处理这个属性。
头部后的字节就是数据内容。不同的AVP可能具有不同的数据类型,如UTF8string、Unsigned32、Unsigned64、Enumerated,以及Group等。
AVP中各部分的含义如下AVP CodeAVP的类别,例如Original-Host AVP的Code值为264;V标识本AVP头之中是否出现Vendor-ID字段;M标识本AVP是否属于必需AVP,就一个特定的Diameter命令而言,有一些AVP是必须出现的,例如Original-Host AVP和Original-Realm AVP在任何Diameter消息之中都是必须出现的,Session-ID AVP在Diameter的计费应用命令字之中必须出现;P标识本AVP的数据部分是否经过了加密;AVP Length本AVP包含数据部分的长度,任何AVP的数据部分长度都必须为4的整数倍,不够的以“\0”填充;Vendor-ID可选,标识生成本AVP值的设备的供应商;Data记录具体的数据值,具体数据的类型是由AVP Code决定的。
表1为一个Diameter消息内容的实例表1

由上表可知,AVP具有以下特点
1、AVP的逻辑性强,各AVP具有不同的数据类型,还具有必需/可选属性、是否可重复出现属性,GROUP类型的AVP还包含子AVP等;2、AVP的必需/可选属性、可重复出现属性使得AVP的排列顺序和Diameter消息的总长度是不确定的;3、一般应用中Diameter消息中需要携带数量较多的AVP,如在3GPP TS32.260 V6.2.0中为IMS定义的CCR(Credit Control Request)的AVP数量达一百多个;4、实际应用还需要根据业务需要去自定义AVP。
由于以上的原因使得Diameter消息体中对AVP编解码及其烦琐,并且误码率高。Diameter消息体中AVP编码的传统做法是针对消息定义中的每个AVP按一个一个字节填写消息体;Diameter消息体中AVP解码的传统做法是按消息体中字节顺序遍历所有AVP代码,获得需要的AVP时,再按字节获取孤立的AVP的值。由于Diameter消息体中AVP的数量和顺序的不确定的特点,现有技术中不能用传统的数据结构定义Diameter消息体。
这也就导致了在现有技术中存在以下不足应用不能按数据结构的形式操作Diameter消息体,需要根据每个AVP的逻辑进行处理生成Diameter消息体,这中间过程烦琐,且按字节填写消息体导致误码率高;同时还因存在按业务需要自定义AVP,这使得对消息体的维护很不容易,需要在消息定义中增删改AVP时修改量大。

发明内容
本发明提供一种通信系统消息编解码的方法,用以解决现有技术中存在的在处理结构复杂的通信系统消息时过程烦琐、误码率高、维护难度大的问题。
本发明另提供一种通信系统消息的编码器,用以解决现有技术中存在的在编码结构复杂的通信系统消息时过程烦琐、误码率高、维护难度大的问题。
本发明还提供一种通信系统消息的解码器,用以解决现有技术中存在的在解码结构复杂的通信系统消息时过程烦琐、误码率高、不易维护的问题。
本发明实施例的方法包括步骤按照所述通信系统消息中各信息元素的逻辑关系将所述通信系统消息定义为一个数据结构,所有信息元素为该结构的成员;并根据所述信息元素的属性定义相应数据结构成员的类型;当编码所述通信系统消息时,按照所述数据结构和其成员类型输入数据结构成员的编码数据,并逐一对所述数据结构成员进行编码,得到所述通信系统消息的消息流数据;当解码所述通信系统消息时,按照所述数据结构和其成员类型读取所述通信系统消息流数据,并逐一对读取到的所述数据结构成员进行解码,得到所述通信系统消息的解码数据。
根据本发明的上述方法,所述根据信息元素的属性定义相应数据结构成员的类型,包括将非组类型的信息元素定义为基本数据类型的数据结构成员,将组类型的信息元素定义为数据结构,其组成员作为该数据结构的成员;并若所述通信系统消息中的信息元素的属性为可重复,则定义对应的数据结构成员的类型为列表。
上述方法中,所述按照所述数据结构和其成员类型输入数据结构成员的编码数据,包括所述数据结构为所述通信系统消息的数据结构时,若该数据结构的成员类型为基本数据类型,则将对应的信息元素的编码数据记录到该数据结构成员中;若所述数据结构为组类型信息元素所对应的数据结构,则将其组成员信息元素的编码数据记录到该数据结构的成员中;并若数据结构成员的类型为列表,则将该数据结构成员每次的编码数据作为列表项记录到该列表中;所述按照所述数据结构和其成员类型读取所述通信系统消息流数据,包括所述数据结构为所述通信系统消息的数据结构时,若该数据结构成员类型为基本数据类型,则将对应的信息元素的消息流数据记录到该数据结构成员中;若所述数据结构为组类型信息元素所对应的数据结构,则将其组成员信息元素的消息流数据记录到该数据结构的成员中;并若数据结构成员的类型为列表,则将该数据结构成员每次出现的消息流数据作为列表项记录到该列表中。
所述列表的大小依据所述数据结构成员的重复出现的次数而变化。
根据本发明的上述方法,还进一步包括步骤若所述信息元素的属性为必选,当编码所述通信系统消息时,若对应的数据结构成员不存在,则返回错误信息;当解码所述通信系统消息时,若未获取到对应的消息流数据,则返回错误信息。
根据本发明的上述方法,还进一步包括步骤根据所述通信系统消息的数据结构和其成员类型生成编解码接口;当编码所述通信系统消息时,调用所述编码接口进行编码;当解码所述通信系统消息时,调用所述解码接口进行解码。
上述方法中,所述根据所述通信系统消息的数据结构和其成员类型生成编解码接口,包括分别为所述通信系统消息对应的数据结构,以及所有组类型信息元素所对应的数据结构生成编解码接口,并根据所述通信系统消息中各信息元素的逻辑关系生成所述编解码接口的调用关系,并为所有数据结构中的基本数据类型的数据结构成员指定编解码接口。
上述方法中,根据对应的信息元素的数据类型,为所述基本数据类型的数据结构成员指定相应数据类型的编解码接口。
根据本发明的上述方法,在按照所述通信系统消息中各信息元素的逻辑关系将所述通信系统消息定义为一个数据结构之前,还进一步包括步骤
配置所述通信系统消息的定义文件,所述文件中描述所述通信系统消息中的所有信息元素及其属性和逻辑关系;在按照所述通信系统消息中各信息元素的逻辑关系将所述通信系统消息定义为一个数据结构步骤中,按照所述定义文件将所述通信系统消息定义为一个数据结构。
所述通信系统消息的定义文件中用符号或格式,标识所述信息元素的属性和关系。
当通信系统消息的结构变化时,重新配置所述通信系统消息的定义文件。
本发明实施例提供的通信系统消息的编码器,包括结构定义模块,用于按照所述通信系统消息中各信息元素的逻辑关系将所述通信系统消息定义为一个数据结构,所有信息元素为该数据结构的成员;并根据所述信息元素的属性定义相应数据结构成员的类型;编码模块,用于按照所述结构定义模块定义的数据结构和其成员类型输入成员的编码数据,并逐一对所述成员进行编码,得到所述通信系统消息的编码代码。
上述编码器还包括编码接口生成模块,用于根据所述结构定义模块定义的通信系统消息的数据结构和其成员类型生成编码接口;当编码所述通信系统消息时,所述编码模块用于调用所述编码接口生成模块生成的编码接口进行编码。
上述编码器还包括文件定义模块,用于配置所述通信系统消息的定义文件,所述文件中描述所述通信系统消息中的所有信息元素及其属性和逻辑关系;所述结构定义模块用于按照所述文件定义模块中配置的定义文件对所述通信系统消息进行结构定义。
本发明实施例提供的通信系统消息的解码器包括结构定义模块,用于按照所述通信系统消息中各信息元素的逻辑关系将所述通信系统消息定义为一个数据结构,所有信息元素为该数据结构的成员;并根据所述信息元素的属性定义相应数据结构成员的类型;解码模块,用于按照所述结构定义模块定义的数据结构和其成员类型读取所述通信系统消息流数据,并逐一对读取到的所述成员进行解码,得到所述通信系统消息的解码数据。
上述解码器还包括解码接口生成模块,用于根据所述结构定义模块定义的通信系统消息的数据结构和其成员类型生成解码接口;当解码所述通信系统消息时,所述解码模块用于调用所述解码接口模块生成的解码接口进行解码。
上述解码器还包括文件定义模块,用于配置所述通信系统消息的定义文件,所述文件中描述所述通信系统消息中的所有信息元素及其属性和逻辑关系;所述结构定义模块用于按照所述文件定义模块中配置的定义文件对所述通信系统消息进行结构定义。
本发明有益效果如下(1)本发明通过将通信系统消息中的所有信息元素按照其属性和逻辑关系进行重新组织,建立数据结构并指定其结构成员,并定义数据结构成员的类型,从而能够依据该数据结构和其成员类型实现编码和解码过程,提高了通信系统消息的编解码效率,降低了误码率。
(2)本发明在对通信系统消息中的信息元素进行数据结构定义和数据结构成员类型定义的基础上,自动生成编解码接口,当编解码时只要调用相应的编解码接口即可实现通信系统消息的编解码,从而使编解码过程更加简捷。
(3)本发明通过配置通信系统消息的定义文件,描述通信系统消息中所有信息元素及其属性和逻辑关系,并依据该定义文件对通信系统消息进行结构定义和生成编解码接口,当通信系统消息结构改变时,只需重新配置该定义文件,重新生成编解码接口,从而提高了编解码过程的可维护性。


图1为Diameter的消息格式示意图;图2为Diameter AVP格式示意图;图3为本发明实施例的Diameter消息体AVP逻辑描述链表;图4为本发明实施例的Diameter消息体AVP逻辑描述的流程示意图;图5为本发明实施例的Diameter消息体的结构化定义过程示意图;图6为本发明实施例的Diameter消息体的编码接口实现的流程示意图;图7为本发明实施例的Diameter消息体的解码接口实现的流程示意图;图8为本发明实施例的通信系统消息的编码器的结构示意图;图9为本发明实施例的通信系统消息的解码器的结构示意图。
具体实施例方式
为了使本发明的目的、技术方案和有益效果清楚明白,下面结合附图对本发明的实施例进行详细描述。
本发明的实施例根据通信系统消息中的IE的属性和逻辑关系,将IE重新组织并定义通信系统消息的结构,并提供消息体编解码接口,以此实现对通信系统消息的编解码。
首先,按照通信系统消息中各信息元素的逻辑关系将通信系统消息定义为一个数据结构,所有信息元素为该结构的成员;并根据信息元素的属性定义相应数据结构成员的类型;当编码所述通信系统消息时,按照数据结构和其成员类型输入成员的编码数据,并逐一对成员进行编码,得到通信系统消息流数据;当解码所述通信系统消息时,按照数据结构和其成员类型读取所述通信系统消息流数据,并逐一对读取到的成员进行解码,得到通信系统消息的解码数据。
下面以Diameter消息的编解码过程为例,对本发明实施例进行详细描述。
根据上述描述,在对Diameter消息进行编码前,首先要定制Diameter消息体定义文件,以此作为Diameter消息体编解码源代码生成工具的输入。Diameter消息体定义文件对Diameter消息中所有的AVP进行描述,包括对AVP的所有属性(如必选/可选属性、是否可重复出现属性等)、AVP类型(AVPCode),以及AVP间的逻辑关系进行描述。Diameter消息体定义文件可以为文本文件、EXCEL文件等可方便读取及编辑的文件格式。表2是在EXCEL表格中定义的Diameter消息体的一个实例。
表2


表2中各AVP的属性由不同的符号和格式表示<AVP>表明是必选的AVP而且位置固定;{AVP}表明是必选的AVP;[AVP]表明是可选的AVP;*AVP表明这个AVP可以出现多次;AVP的缩进表示AVP组的成员。
Diameter消息体定义文件的作用是直观地描述Diameter消息,并依据该文件生成Diameter消息的逻辑描述,以此实现Diameter消息体结构化定义和编解码接口的实现。
Diameter消息的逻辑描述过程,即,将Diameter消息体定义文件组织为链表形式,并对各IE的属性和逻辑关系用参数进行描述。根据Diameter消息体定义文件生成Diameter消息体中AVP的逻辑描述的过程如下所述。
以C++为例,通过如下的数据结构来组织如表2中定义的Diameter消息体中的所有AVPtypedef std::vector<CAvpDic>TAvpDicList;typedef struct_CAvpDic{std::string m_strAvpName;//AVP名称short m_nAvpCode;//AVP codeint m_enAvpType;//AVP类型,如Unsigned32,UTF8String,Grouped等int m_enAvpFlag;//标记AVP必需且位置固定,必需,可选boolm_bRepetitious;//标记AVP是否可以重复出现
TAvpDicListm_GroupMemberList;//当AVP为Grouped时记录所有的子AVP项}CAvpDic在源代码生成工具中,读入Diameter消息体定义文件中的所有AVP及其属性,按照上述定义的数据结构生成Diameter消息体的AVP逻辑描述。如表2中定义的Diameter消息体可以组织为类似图3的链表,该链表的生成过程如图4所示。
参见图4,为本发明实施例的Diameter消息体AVP逻辑描述的流程示意图,具体步骤包括S401、读取Diameter消息体定义文件。
S402、遍历Diameter消息中所有的AVP。
S403、若AVPName列中含“*”,设置m_bRepetitious为TRUE,表示该AVP可以重复出现;S404、若AVPName列中含“<”,设置m_enAvpFlag为“位置固定”标记;若AVPName列中含“{”,设置m_enAvpFlag为“必需”标记;若AVPName列中含“[”,设置m_enAvpFlag为“可选”标记;S405、去除AVPName列中的“*“、“<”、“>”、“{”、“}”、“[”、“]”字符,记录到m_strAvpName中;S406、将AVP CODE列记录到m_nAvpCode;S407、将Value type列记录到m_enAvpType;S408、若该行没有缩进,将该AVP记录到Diameter消息的AVP列表(图3中表示为ROOT接点);若该行有缩进,将该AVP记录到上层AVP的m_GroupMemberList列表中。返回步骤S402。
S409、当完成对所有IE的描述后,结束流程。
为了实现Diameter消息的自动编码和自动解码,还要根据Diameter消息的AVP逻辑描述生成Diameter消息的结构化定义和编码和解码的目标源代码。编解码目标源代码旨在给业务提供Diameter消息体的成员结构定义和编解码接口。
Diameter消息体结构化定义的原则为1)将消息体定义为一个数据结构,各AVP为此结构的成员;2)将类型为Grouped的AVP定义为数据结构,其子AVP为该结构的成员;类型为Grouped的AVP所对应的数据结构可以作为消息体对应的数据结构的成员;3)将属性为可选的AVP以指针的形式定义,当指针为NULL时表示该AVP将不在消息体中出现;4)将属性为可重复出现的AVP以列表的形式定义,列表的大小可随重复出现的AVP的数量而变。
参见图5,为本发明实施例的Diameter消息体的结构化定义过程示意图,包括步骤S501、打开头文件。若处理的是Diameter消息,打开Diameter消息的.h文件,否则打开Grouped AVP的.h文件。
S502、生成数据结构名。若处理的是Diameter消息,生成Diameter消息的结构名称,否则生成AVP的结构名称。
S503、遍历m_GroupMemberList中的所有成员,若完成则转至步骤S512;否则执行步骤S504。
S504、判断m_enAvpFlag的值,若该值表明AVP为可选,则执行步骤S505;否则执行步骤S506。
S505、标记需要按指针定义成员。
S506、判断m_bRepetitious的值,若该值表明AVP可重复出现,则执行步骤S507;否则执行步骤S508。
S507、标记需要使用LIST定义成员。
S508、判断m_enAvpType的值,若该值表明AVP为Grouped,则转至步骤S509,否则转至步骤S511。
S509、递归本算法在Grouped AVP的.h文件生成本AVP的结构化定义代码。
S510、结合步骤S505和步骤S507的结果使用结构名称定义成员;转至步骤S503。
S511、结合步骤S505和步骤S507的结果使用基本类型定义成员;转至步骤S503。
S512、生成编解码接口申明。
S513、结束流程。
上述流程执行完成后,将生成2个.h文件,一个是Diameter消息定义的.h文件(其中必要时将引入Grouped类型的AVP),另一个是定义了所有Grouped类型的AVP的.h文件。
以C++为例,根据表2所列的Diameter消息体生成的结构化定义及编解码接口的.h文件源代码可以为class msg{publicstd::string session_id;//必选的AVP,以基本数据类型定义std::string origin_host;std::string origin_realm;std::string destination_realm;std::string *pdestination_host;//可选的AVP,以指针形式定义unsigned int auth_application_id;vendor_specific_application_id*pvendor_specific_application_id;//组AVP,以指针形式定义std::string service_context_id;...........................
std::list<subscription_id*>*psubscription_id;//可重复出现的AVP,且AVP为Grouped,可选,则以列表和指针形式定义............
msg(char*pBuff);//解码接口,其中将调用vendorspecific_application_id,subscription_id...的解码接口int Encode(char*pBuff);//编码接口,其中当pvendor_specific_application_id不为NULL时将调用vendor_specific_application_id的编码接口}其中vendor_specific_application_id的结构化定义及编解码接口class vendor_specific_application_id{publicunsigned int*pvendor_id;//可选的AVP,以指针形式定义unsigned int auth_application_id;unsigned int acct_application_id;vendor_specific_application_id(char*pBuff);//解码接口,可被msg的解码接口调用int Encode(char*pBuff);//编码接口,可被msg的编码接口调用........................
};以C++为例,按基本数据类型定义的公用编解码接口可以为STRING类型的编码接口int addStringAvp(short avpCode,std::string avpValue char*pBuff)STRING类型的解码接口std::string getStringAvp(short avpCode,char*pBuff)unsigned int类型的编码接口int addIntAvp(short avpCode,unsigned int avpValue char*pBuff)unsigned int类型的解码接口unsigned int getIntAvp(short avpCode,char*pBuff)........................
Diameter消息体编解码接口定义的原则为1)按基本数据类型(如UTF8String,Unsigned32,Unsigned64,Enumerated等)提供公用的编解码接口;2)为类型是Grouped的AVP对应的数据结构提供编解码接口,接口的实现中针对每个AVP成员编解码;若成员为Grouped,调用其对应数据结构提供的编解码接口;否则调用基本数据类型的编解码接口;3)为Diameter消息对应的数据结构提供编解码接口,接口的实现中针对每个AVP成员编解码;若成员为Grouped,调用其对应数据结构提供的编解码接口;否则调用基本数据类型的编解码接口。
参见图6,为本发明实施例的Diameter消息体的编码接口实现的流程示意图,具体步骤包括S601、打开编码工程文件。若处理的是Diameter消息,打开Diameter消息的.cpp文件,否则打开Grouped AVP的.cpp文件。
S602、生成编码接口函数头。若处理的是Diameter消息,生成Diameter消息的编码接口函数头,否则生成AVP的编码接口函数头。
S603、遍历m_GroupMemberList中所有成员,若完成转步骤S612,否则执行步骤S604。
S604、判断m_enAvpFlag的值,若该值表明AVP为可选,则执行步骤S605;否则执行步骤S606。
S605、生成代码若结构成员指针为NULL时返回错误。
S606、判断m_bRepetitious的值,若该值表明AVP为可重复,则执行步骤S607;否则执行步骤S608。
S607、生成代码遍历结构成员列表的所有项。
S608、判断m_enAvpType的值,若该值表明AVP为Grouped,则执行步骤S609,否则执行步骤S611。
S609、递归本算法在Grouped AVP的.cpp文件生成本AVP的编码接口代码。
S610、生成代码调用该AVP对应结构的编码接口;转至骤S603。
S611、生成代码按AVP的类型调用基本类型的编码接口;转至骤S603。
S612、编码接口代码生成完成。
执行完上述流程后,生成2个用于编码的.cpp文件,一个是实现Diameter消息编码的.cpp文件,另一个是实现所有Grouped类型的AVP编码的.cpp文件。
参见图7,为本发明实施例的Diameter消息体的解码接口的实现流程示意图,包括步骤S701、打开解码工程文件。若处理的是Diameter消息,打开Diameter消息的.cpp文件,否则打开Grouped AVP的.cpp文件。
S702、生成解码接口函数头。若处理的是Diameter消息,生成Diameter消息的解码接口函数头,否则生成AVP的解码接口函数头。
S703、遍历m_GroupMemberList中所有成员,若完成则转至步骤S714,否则执行步骤S704。
S704、生成代码根据AVP的CODE在消息体中搜索AVP。
S705、判断m_enAvpFlag的值,若该值表明AVP为非可选,则执行步骤S706,否则执行步骤S707。
S706、生成代码若未找到返回错误。
S707、判断m_bRepetitious的值,若该值表明AVP为可重复,则执行步骤S708,否则执行步骤S712。
S708、判断m_enAvpType的值,若该值表明AVP为Grouped,则执行步骤S709,否则执行步骤S711。
S709、递归本算法在Grouped AVP的.cpp文件生成本AVP的解码接口代码。
S710、生成代码调用该AVP对应结构的解码接口获得成员变量的值;转至步骤S703。
S711、生成代码按AVP的类型调用基本类型的解码接口获取AVP的值赋给成员变量;转至步骤S703。
S712、根据AVP的类型获取AVP的值(可参见步骤S708-711)增加到成员变量列表中。
S713、生成代码在消息体中循环搜索AVP,若找到则按AVP的类型调用编码接口获得AVP的值增加到成员列表;转至步骤S703。
S714、解码接口代码生成完成。
执行完上述流程后,生成2个用于解码的.cpp文件,一个是实现Diameter消息解码的.cpp文件,另一个是实现所有Grouped类型的AVP解码的.cpp文件。
可以将上述实现流程生成可执行命令,如MakeDiameterCode。在编解码Diameter消息前,通过该命令的执行生成Diameter消息体编解码的源代码。在命令中可以指定参数,用以表明生成指定类型的源代码。例如MakeDiameterCode MyDiameterMessage.txt-C说明使用当前目录下的MyDiameterMessage.txt文件中的Diameter消息定义生成diameter消息体编解码C++源代码。
MakeDiameterCode MyDiameterMessage.txt-J说明使用当前目录下的MyDiameterMessage.txt文件中的Diameter消息定义生成diameter消息体编解码JAVA源代码。
Diameter消息的应用可以引用Diameter消息的.h文件,调用编码接口,实现对Diameter消息的编码,例如#include″msg.h″//引用Diameter消息的.h文件//如下是Diameter消息编码样例代码msg*pMsg=new msg;//创建消息pMsg->session_id=″mySessionId″;//设置AVP session_id的值pMsg->origin_host=″origin_host″;//设置AVP origin_host的值.....
//设置可选AVP destination_realm的值pMsg->pdestination_realm=new std::string(″destination_realm″);
//设置可选的GROUP类型的AVP vendor_specific_application_id的值pMsg->pvendor_specific_application_id=newvendor_specific_application_id;pMsg->pvendor_specific_application_id->acct_application_id=1pMsg->pvendor_specific_application_id->auth_application_id=2;//申请编码后的消息流保存空间char msgBuff ={0};//调用编码接口int iResult=pMsg->Encode(msgBuff);//消息Msg编码后的消息流保存在msgBuff中,加入Diameter消息头就可以发送该Diameter消息了。
Diameter消息的应用可以引用Diameter消息的.h文件,调用解码接口,实现对Diameter消息的解码。例如#include″msg.h″//引用Diameter消息的.h文件//如下是解码样例代码,其中msgBuff中保存的是接收到的Diameter消息除去消息头部分的消息流//调用解码接口msg*pMsg=new msg(msgBuff);//可以引用消息中各AVP的值了cout<<″session_id″<<pMsg->session_id<<endl;cout<<″origin_host″<<pMsg->origin_host<<endl;cout<<″destination_realm″<<pMsg->pdestination_realm)<<endl;......
cout<<″vendor_specific_application_id->acct_application_id″<<pMsg->pvendor_specific_application_id->acct_application_id)<<endl;......
当Diameter消息体结构发生变化时,只要修改Diameter消息体定义文件,再使用源代码生成工具重新生成Diameter消息体的结构化定义和编解码接口源代码。当需要编解码时,只要调用新生成的编解码接口就可实现Diameter消息的编解码。
基于上述相同的技术构思,本发明实施例提供了一种通信系统消息的编码器和一种解码器。
参见图8,为本发明实施例的通信系统消息的编码装置的结构示意图,包括文件定义模块、结构定义模块、编码接口生成模块和编码模块。
文件定义模块用于配置通信系统消息的定义文件,该文件中描述了通信系统消息中的所有信息元素及其属性和逻辑关系。
结构定义模块用于按照文件定义模块中定义的通信系统消息中各信息元素的逻辑关系,将通信系统消息定义为一个数据结构,所有信息元素为该结构的成员;并根据信息元素的属性定义相应数据结构成员的类型。
编码接口生成模块用于根据结构定义模块生成的通信系统消息的数据结构和其成员类型生成编码接口。
编码模块用于按照结构定义模块生成的数据结构和其成员类型,输入数据结构成员的编码数据,并调用编码接口生成模块生成的编码接口逐一对数据结构成员进行编码,得到通信系统消息流数据。
参见图9,为本发明实施例的通信系统消息的解码装置的结构示意图,包括文件定义模块、结构定义模块、解码接口生成模块和解码模块。
文件定义模块用于配置通信系统消息的定义文件,该文件中描述了通信系统消息中的所有信息元素及其属性和逻辑关系。
结构定义模块用于按照文件定义模块中定义的通信系统消息中各信息元素的逻辑关系将通信系统消息定义为一个数据结构,所有信息元素为该结构的成员;并根据信息元素的属性定义相应数据结构成员的类型。
解码接口生成模块用于根据结构定义模块生成的通信系统消息的数据结构和其成员类型生成解码接口。
解码模块用于按照结构定义模块生成的数据结构和成员类型,读取通信系统消息流数据,并调用解码接口模块生成解码接口逐一对读取到的成员进行解码,得到通信系统消息的解码数据。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
权利要求
1.一种通信系统消息的编解码方法,其特征在于,包括以下步骤按照所述通信系统消息中各信息元素的逻辑关系将所述通信系统消息定义为一个数据结构,所有信息元素为该结构的成员;并根据所述信息元素的属性定义相应数据结构成员的类型;当编码所述通信系统消息时,按照所述数据结构和其成员类型输入数据结构成员的编码数据,并逐一对所述数据结构成员进行编码,得到所述通信系统消息的消息流数据;当解码所述通信系统消息时,按照所述数据结构和其成员类型读取所述通信系统消息流数据,并逐一对读取到的所述数据结构成员进行解码,得到所述通信系统消息的解码数据。
2.如权利要求1所述的方法,其特征在于,所述根据信息元素的属性定义相应数据结构成员的类型,包括将非组类型的信息元素定义为基本数据类型的数据结构成员,将组类型的信息元素定义为数据结构,其组成员作为该数据结构的成员;并若所述通信系统消息中的信息元素的属性为可重复,则定义对应的数据结构成员的类型为列表。
3.如权利要求2所述的方法,其特征在于,所述按照所述数据结构和其成员类型输入数据结构成员的编码数据,包括所述数据结构为所述通信系统消息的数据结构时,若该数据结构的成员类型为基本数据类型,则将对应的信息元素的编码数据记录到该数据结构成员中;若所述数据结构为组类型信息元素所对应的数据结构,则将其组成员信息元素的编码数据记录到该数据结构的成员中;并若数据结构成员的类型为列表,则将该数据结构成员每次的编码数据作为列表项记录到该列表中;所述按照所述数据结构和其成员类型读取所述通信系统消息流数据,包括所述数据结构为所述通信系统消息的数据结构时,若该数据结构成员类型为基本数据类型,则将对应的信息元素的消息流数据记录到该数据结构成员中;若所述数据结构为组类型信息元素所对应的数据结构,则将其组成员信息元素的消息流数据记录到该数据结构的成员中;并若数据结构成员的类型为列表,则将该数据结构成员每次出现的消息流数据作为列表项记录到该列表中。
4.如权利要求2所述的方法,其特征在于,所述列表的大小依据所述数据结构成员的重复出现的次数而变化。
5.如权利要求1所述的方法,其特征在于,还进一步包括步骤若所述信息元素的属性为必选,当编码所述通信系统消息时,若对应的数据结构成员不存在,则返回错误信息;当解码所述通信系统消息时,若未获取到对应的消息流数据,则返回错误信息。
6.如权利要求1所述的方法,其特征在于,还进一步包括步骤根据所述通信系统消息的数据结构和其成员类型生成编解码接口;当编码所述通信系统消息时,调用所述编码接口进行编码;当解码所述通信系统消息时,调用所述解码接口进行解码。
7.如权利要求6所述的方法,其特征在于,所述根据所述通信系统消息的数据结构和其成员类型生成编解码接口,包括分别为所述通信系统消息对应的数据结构,以及所有组类型信息元素所对应的数据结构生成编解码接口,并根据所述通信系统消息中各信息元素的逻辑关系生成所述编解码接口的调用关系,并为所有数据结构中的基本数据类型的数据结构成员指定编解码接口。
8.如权利要求7所述的方法,其特征在于,根据对应的信息元素的数据类型,为所述基本数据类型的数据结构成员指定相应数据类型的编解码接口。
9.如权利要求1所述的方法,其特征在于,在按照所述通信系统消息中各信息元素的逻辑关系将所述通信系统消息定义为一个数据结构之前,还进一步包括步骤配置所述通信系统消息的定义文件,所述文件中描述所述通信系统消息中的所有信息元素及其属性和逻辑关系;在按照所述通信系统消息中各信息元素的逻辑关系将所述通信系统消息定义为一个数据结构步骤中,按照所述定义文件将所述通信系统消息定义为一个数据结构。
10.如权利要求9所述的方法,其特征在于,所述通信系统消息的定义文件中用符号或格式,标识所述信息元素的属性和关系。
11.如权利要求9所述的方法,其特征在于,当通信系统消息的结构变化时,重新配置所述通信系统消息的定义文件。
12.如权利要求1-11任一权项所述的方法,其特征在于,所述通信系统消息为Diameter消息,所述信息元素为属性值对。
13.一种通信系统消息的编码器,其特征在于,包括结构定义模块,用于按照所述通信系统消息中各信息元素的逻辑关系将所述通信系统消息定义为一个数据结构,所有信息元素为该数据结构的成员;并根据所述信息元素的属性定义相应数据结构成员的类型;编码模块,用于按照所述结构定义模块定义的数据结构和其成员类型输入成员的编码数据,并逐一对所述成员进行编码,得到所述通信系统消息的编码代码。
14.如权利要求13所述的编码器,其特征在于,还包括编码接口生成模块,用于根据所述结构定义模块定义的通信系统消息的数据结构和其成员类型生成编码接口;当编码所述通信系统消息时,所述编码模块用于调用所述编码接口生成模块生成的编码接口进行编码。
15.如权利要求13所述的编码器,其特征在于,还包括文件定义模块,用于配置所述通信系统消息的定义文件,所述文件中描述所述通信系统消息中的所有信息元素及其属性和逻辑关系;所述结构定义模块用于按照所述文件定义模块中配置的定义文件对所述通信系统消息进行结构定义。
16.一种通信系统消息的解码器,其特征在于,包括结构定义模块,用于按照所述通信系统消息中各信息元素的逻辑关系将所述通信系统消息定义为一个数据结构,所有信息元素为该数据结构的成员;并根据所述信息元素的属性定义相应数据结构成员的类型;解码模块,用于按照所述结构定义模块定义的数据结构和其成员类型读取所述通信系统消息流数据,并逐一对读取到的所述成员进行解码,得到所述通信系统消息的解码数据。
17.如权利要求16所述的解码器,其特征在于,还包括解码接口生成模块,用于根据所述结构定义模块定义的通信系统消息的数据结构和其成员类型生成解码接口;当解码所述通信系统消息时,所述解码模块用于调用所述解码接口模块生成的解码接口进行解码。
18.如权利要求16所述的解码器,其特征在于,还包括文件定义模块,用于配置所述通信系统消息的定义文件,所述文件中描述所述通信系统消息中的所有信息元素及其属性和逻辑关系;所述结构定义模块用于按照所述文件定义模块中配置的定义文件对所述通信系统消息进行结构定义。
全文摘要
本发明公开了一种通信系统消息的编解码方法及其编码器和解码器,该方法包括按照通信系统消息中各信息元素的逻辑关系将通信系统消息定义为一个数据结构,所有信息元素为该结构的成员;并根据信息元素的属性定义相应数据结构成员的类型;当编码所述通信系统消息时,按照所述数据结构和其成员类型输入数据结构成员的编码数据,并逐一对所述数据结构成员进行编码,得到所述通信系统消息的消息流数据;当解码所述通信系统消息时,按照所述数据结构和其成员类型读取所述通信系统消息流数据,并逐一对读取到的所述数据结构成员进行解码,得到所述通信系统消息的解码数据。采用本发明方法,使通信系统消息的编解码过程易实现和维护,并降低了误码率。
文档编号H04L29/06GK1929461SQ200610140218
公开日2007年3月14日 申请日期2006年10月9日 优先权日2006年10月9日
发明者沈小荣 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1