具体实施方式
为使本发明实施例的目的、技术手段和优点更加清楚明白,以下结合附图对本发明实施例作进一步详细说明。
本发明实施例的基本思想是:一方面采用灵活的数据配置方式,在数据库中根据各个计费事件的种类和编号,配置计费事件所需要的所有记录,以方便对各种计费模型的灵活处理;另一方面,采用哈希(HASH)数组邻接链表结构作为一般性解码的中间转换数据结构,从而为外部使用方提供信息协商和交互的接口。
图2为本发明实施例中提供的diameter消息解码方法的总体流程图。如图1所示,该方法包括:
步骤201,接收以AVP二进制码流形式表示的diameter消息。
步骤202,根据AVP码流中的各个根到叶子节点的AVP数组的代码字段,将需要进行提前解码的AVP数组及其对应的信息插入计费事件对应的类型长度值(TLV)+HASH链表中,得到前提信息;将不需要进行提前解码的AVP数组及其对应的信息插入计费事件的HASH数组邻接链表结构体中。
本步骤中,根据RFC3588协议的规定,某些AVP信息是需要进行提前解码的,将这些AVP的值称为前提信息,对前提信息进行解码的过程称为硬解码。其它AVP数组在进行解码时要参考前提信息进行,这些AVP数组的解码过程称为一般性解码。根据AVP数组的代码字段可以确定哪些AVP需要进行提前解码,解码后的前提信息包括计费事件的编号、时间信息等。
步骤203,根据得到的数据映射前提信息,在数据库中查询为计费事件配置的代表根到节点路径组合的记录,根据该记录,将HASH数组邻接链表结构体中的数据插入TLV+HASH链表中。
在上述流程中,对AVP二进制码流进行解码时,依据不同AVP的解码类型,采用不同的解码方式。对于携带计费事件编号、时间信息等的AVP采用硬解码,对于携带实际计费信息的AVP采用一般性解码。对于硬解码的AVP,将其AVP数组及其对应的信息直接插入TLV+HASH链表中,并获取数据映射的前提信息,即完成硬解码操作。对于一般性解码的AVP,则首先将AVP数组及其对应的信息插入HASH数组邻接链表中,然后,根据硬解码后得到的数据映射的前提信息,在数据库中查找计费事件对应的记录,再根据这些记录,将HASH数组邻接链表中的数据插入TLV+HASH链表中,完成一般性解码操作。
由上述过程可以看出,本发明实施例中对diameter消息的解码过程还可以分为前期解码过程和数据映射过程。前期解码过程实际上是扫描diameter的二进制码数据包的过程,该过程包括两个分支,对于携带前提信息的AVP数组,即需要进行提前解码的AVP数组,将其对应的信息直接插入TLV+HASH链表中;对于携带非前提信息的AVP数组,即不需要进行提前解码的AVP数组,根据扫描分析将其对应的信息投放到一个HASH数组邻接链表中,作为通过数据库表中记录扫描的数据源。然后在数据映射过程中,依据数据库表中的记录将前期解码过程得到的HASH邻接链表中的内容插入TLV+HASH链表中完成全部解码过程,解码的最终结果是TLV+HASH链表。计费系统可以利用TLV+HASH链表实现高效地提取计费信息。
下面通过一个具体的实施例说明本发明实施例的具体实施方式。图3为本发明实施例的diameter消息解码方法的具体流程图。如图3所示,该方法包括:
步骤301:在数据库中预先根据计费事件的种类和编号,为该计费事件配置所有需要的记录。
本步骤中,为计费事件配置的记录中包括:记录编号、AVP数组查询路径函数和获取AVP数组对应值函数。其中,AVP数组查询路径函数,用于确定该记录代表的AVP数组是否存在于HASH数组邻接链表中;获取AVP数组对应值函数,用于将该记录对应的叶子节点信息插入TLV+HASH链表。记录代表的AVP数组是指记录表示的根到节点的路径组合中包括的所有AVP节点。为计费事件配置记录,即配置该计费事件中,所有可能出现的层次关系,具体就是所有根到父亲节点或者根到叶子节点的路径组合的记录,以及这些记录对应的函数。
随着各种各样新型业务的推出,在计费事件中,出现了大量AVP的重复现象,为兼容在不同计费事件中出现的重复AVP和非重复AVP的现象,本发明实施例在数据库中进行数据配置时,针对重复AVP和非重复AVP分别进行了不同的配置。下面就分别对这两类数据配置方式进行介绍。
(一)非重复AVP配置方式
当外部传入的码流中含有图4所示情况的树型结构AVP的时候,属于没有重复情况的AVP组合。对于图4中(001,101,202,301)和(001,101,202,302)这2条表示根到叶子节点路径组合的记录,在数据库中将做如下配置:
记录编号 | AVP数组查询路径函数 | 获取AVP数组对应值函数 |
记录1 | 设置AVP数组查询路径函数(001) | 属于根到父亲的AVP组合没有TAG |
记录2 | 设置AVP数组查询路径函数(001,101) | 属于根到父亲的AVP组合没有TAG |
记录3 | 设置AVP数组查询路径函数(001,101,202) | 属于根到父亲的AVP组合没有TAG |
记录4 | 设置AVP数组查询路径函数(001,101,202,301) | 获取AVP数组对应值函数(TAG1) |
记录5 | 设置AVP数组查询路径函数(001,101,202,302) | 获取AVP数组对应值函数(TAG2) |
表1
设置AVP数组查询路径函数实现的功能是确定记录代表的AVP数组是否存在于HASH数组邻接链表中。在该函数中,输入变量是记录代表的AVP数组,该函数根据输入的所有AVP的数值,在HASH数组邻接链表中进行HASH查找和匹配搜索,判断当前记录代表的AVp数组是否在HASH数组邻接链表中存在。
获取AVp数组对应值函数实现的功能是将该记录对应的叶子节点信息插入TLV+HASH链表。该函数同样是在本步骤中设置,在后续对AVP进行一般性解码的数据映射过程中调用。在该函数中,输入的变量是TAG,TAG为计费系统内部标识计费元素的标签,每个AVP数组可对应一个TAG标签,可利用TAG标签作为AVP数组在TLV+HASH链表中的索引。首先,根据当前记录对应的AVP数组,在HASH数组邻接链表中找到相应的AVP数组以及其最底叶子节点AVP所携带的AVP代码(CODE),AVP长度(LENGTH)和AVP值(VALUE),再配合外部输入的TAG标签,将查找到的叶子节点的AVP CODE,AVP LENGTH和AVP VALUE插入到TLV+HASH链表中。
(二)重复AVP配置方式
重复的AVP分为重复的父亲节点和重复的叶子节点,如图5所示。对于图5所示的记录在数据库中做如下配置:
记录编号 | AVP数组查询路径函数函数 | 获取AVP数组对应值函数 |
记录1 | 设置AVP数组查询路径函数(001) | 属于根到父亲的AVP组合没有TAG |
记录2 | 设置AVP数组查询路径函数(001,101) | 属于根到父亲的AVP组合没有TAG |
记录3 | 设置AVP数组查询路径函数(001,101,202) | 属于根到父亲的AVP组合没有TAG |
记录4 | 设置AVP数组查询路径函数(001,101,202,301) | 获取AVP数组对应值函数(TAG1) |
记录5 | 取下一个相同AVP数组(001,101,202,301) | 获取AVP数组对应值函数(TAG2) |
记录6 | 取下一个相同AVP数组(001,101) | 属于根到父亲的AVP组合没有TAG |
记录7 | 设置AVP数组查询路径函数(001,102,202) | 属于根到父亲的AVP组合没有TAG |
记录8 | 设置AVP数组查询路径函数(001,102,202,301) | 获取AVP数组对应值函数(TAG3) |
记录9 | 取下一个相同AVP数组(001,102,202,301) | 获取AVP数组对应值函数(TAG4) |
表2
数据库中为重复AVp设置的记录中,取下一个相同AVP数组函数实现的功能是确定记录代表的重复AVP数组是否存在于HASH数组邻接链表中。在该函数中,输入变量为当前记录对应的AVP数组,由于该AVP数组前面已经出现过了至少一次,因此在计数器上做一次累加的操作,用这个计数器的数值结合AVP数组所有AVP的数值,在HASH数组邻接链表中进行HASH查找和匹配搜索,判断当前记录对应的AVP数组是否在HASH数组邻接链表中存在。
步骤302:接收以AVP二进制码流形式表示的diameter消息。
本步骤中,接收到的diameter消息是以多个AVP构成的二进制码流形式表示的。
步骤303:根据AVP码流中的各个根到叶子节点的AVP数组的代码字段进行判断,对于需要进行提前解码的AVP数组,执行步骤304,对于不需要进行提前解码的AVP数组,执行步骤305。
需要进行提前解码的AVP数组解码得到的AVP值为前提信息,进行的解码过程称为硬解码。对于不需要进行提前解码的AVP数组,进行的解码过程称为一般性解码,一般性解码过程要参考前提信息进行。
步骤304:将AVP数组以及其所对应的信息提前插入TLV+HASH链表中完成硬解码的格式转化并做适当的校验。
对于计费事件编号,时间等信息可以采用硬解码。具体地,硬解码的过程包括:
步骤304a:对前提信息的组合关系进行校验。这些前提信息的组合关系是根据RFC3588和RFC4006协议规定的AVP长度、大小、类型和取值范围进行前期设置的。
步骤304b:直接将硬解码的前提信息存储到一个数组结构体中,再将这个数组结构体中的信息插入TLV+HASH链表中。
至此,对于预先约定采用硬解码的AVP,便完成了解码过程。
步骤305:将预先约定采用一般性解码的AVP以及其所对应的信息保存到计费事件对应的HASH数组邻接链表结构体中。
本步骤中,具体将AVP及其对应的信息保存到HASH数组邻接链表结构体中的方式包括:
步骤305a:将AVP码流中采用一般性解码的从根到叶子的路径组合形成的AVP数组作为当前AVP数组;
步骤305b:判断当前AVP数组是否为第一次出现,若是,则代表目前还没有遇到相同的兄弟,则执行步骤305c,当前AVP数组不是第一次出现,则表示遇到了相同的兄弟AVP,执行步骤305d;
所谓相同的兄弟即AVP数组中包含的AVP相同。
步骤305c:设置与当前AVP数组相关联的计数器,转到步骤305e;
本步骤中,设置的计数器用于记录本路径组合形成的AVP数组的出现次数,以便于后面的统计;
步骤305d:确定当前AVP数组是第几次重复出现的兄弟,修改步骤305c中计数器的值,转到步骤305e;
本步骤中,由于在相同的兄弟AVP中,只有在第一次出现的AVP数组中保存有计数器,因此需要根据先前第一次出现的一组从根到叶子的路径组合形成的avp数组查找计数器的值,从而确定当前AVP数组是第几次重复出现的兄弟,并修改第一次出现的相同AVP数组对应的计数器的值,具体的修改操作为累加操作,以便于后续相同兄弟的统计;
步骤305e:对当前AVP数组计算HASH。
步骤305f:判断步骤305e计算出来的HASH值是否重复,若没有重复,则直接将当前AVP数组及其对应的信息放到HASH数组邻接链表的HASH数组头上;如果有重复,则直接将当前AVP数组及其对应的信息放到HASH数组邻接链表的邻接链表上。
本步骤中,AVP数组对应的信息包括AVP数组中最外层AVP的长度和值。其中,AVP数组中最外层AVP即该AVP数组代表的根到节点的路径组合中最底层的AVP节点,如对于AVP数组(001,101),其最外层AVP为AVP101。
至此,除预先约定采用硬解码的AVP数组外,其它非硬解码方式的AVP数组均转换为HASH数组邻接链表的形式。由于HASH数组邻接链表是可控的并且也提供了相关接口给外部使用方进行信息协商和交互,因此便于使用方通过这种中转式的解码机制,采取灵活配置的方式彻底解决diameter的二进制码流数据包中重复出现的计费信息AVP的问题,并且获取灵活配置解码各项参数的能力,获取灵活配置解码各项校验的能力,获取灵活配置容错机制的能力,获取灵活配置解码各项在原定流程新增主要或者附加功能的能力,获取灵活配置解码各项新需求的能力。
上述即完成了前期解码过程,接下来要进行数据映射,即对HASH数组邻接链表中的数据进行处理,以最终完成解码操作。
步骤306:确定计费事件在数据库中的索引编号。
步骤307:根据步骤304中的硬解码过程获取进行数据映射的前提信息,比如计费事件编号,时间等等。
步骤308:根据获取的数据映射前提信息,在数据库中索引编号对应的一组记录,将计费事件对应的HASH数组邻接链表中的内容写入TLV+HASH链表中。
本步骤中,具体操作包括以下步骤:
步骤308a:根据前提信息和获取的数据库中索引编号,找到步骤301中为计费事件配置的一组记录。
步骤308b:将计费事件对应的第一条记录作为当前记录;
步骤308c:根据表中的当前每条记录关联的函数,在计费事件对应的HASH数组邻接链表结构体中进行查询当前记录对应的AVP数组是否存在,若是,则执行步骤308d及其后续步骤,否则执行步骤308e;
步骤308d:直接在HASH数组邻接链表结构体中,根据当前记录对应的AVP数组,获取其对应的长度和值(也即该AVP数组中最外层AVP的长度和值),并且根据数据库表中这条记录对应的TAG信息,利用获取AVP数组对应值函数,将该AVP数组及其对应的信息插入到TLV+HASH链表中。
步骤308e:判断当前记录是否为最后一条记录,若是,则结束本流程,否则将下一条记录作为当前记录进行遍历,返回步骤308c。
上述即为整个解码的全过程。利用该过程,即可以对任何复杂的diameter消息进行效率高,功能全的格式转化,最终形成了适合计费的TLV类型的数据结构。
应用本发明实施例的方法,对于数据库中以非重复方式配置的记录组合,进行解码时的操作举例如下:
假定diameter的2进制码流数据包中包括AVP数组(001,101,202,301)代表根到叶子节点的路径组合,且对该组合进行一般性解码,则将该记录进行解码的过程为:
1:在前期解码过程中,把该AVP组合投放到HASH数组邻接链表中存储起来。
2:然后根据事先数据库中的如下记录予以转化(映射关系如下):
记录编号 | 确定记录代表的AVP数组是否存在于HASH数组邻接链表中的函数 | 将该记录对应的叶子节点信息插入TLV+HASH链表的函数 |
记录1 | 设置AVP数组查询路径函数(001,101,202,301) | 获取AVP数组对应值函数(TAG1) |
3:调用TLV+HASH链表上相应的插入函数setTag将(001,101,202,301)这条AVP组以及其携带的信息插入到TLV+HASH链表上。
对于数据库中以重复方式配置的记录组合,进行解码时的操作举例如下:
假定diameter的2进制码流数据包中包括两个AVP数组,分别是(001,101,202,301)和(001,101,202,301),有这样一条从根到叶子节点的组合:
1:先将在前期递归扫描的解码过程中把这条AVP组合投放到HASH数组邻接链表中存储起来。
2:然后根据事先数据库中的如下记录予以转化(映射关系如下):
记录编号 | 确定记录代表的AVP数组是否存在于HASH数组邻接链表中的函数 | 将该记录对应的叶子节点信息插入TLV+HASH链表的函数 |
记录1 | 设置AVP数组查询路径函数(001) | 属于根到父亲的AVP组合没有TAG |
记录2 | 设置AVP数组查询路径函数(001,101) | 属于根到父亲的AVP组合没有TAG |
记录3 | 设置AVP数组查询路径函数(001,101,202) | 属于根到父亲的AVP组合没有TAG |
记录4 | 设置AVP数组查询路径函数(001,101,202,301) | 获取AVP数组对应值函数(TAG1) |
记录5 | 取下一个相同AVP数组(001,101,202,301) | 获取AVP数组对应值函数(TAG2) |
记录6 | 取下一个相同AVP数组(001,101) | 属于根到父亲的AVP组合没有TAG |
记录7 | 设置AVP数组查询路径函数(001,102,202) | 属于根到父亲的AVP组合没有TAG |
记录8 | 设置AVP数组查询路径函数(001,102,202,301) | 获取AVP数组对应值函数(TAG3) |
记录9 | 取下一个相同AVP数组(001,102,202,301) | 获取AVP数组对应值函数(TAG4) |
如上所示,根据表2中所示的数据库中记录的先后顺序来确定的记录遍历顺序,同时由于AVP数组(001,101,202,301)和(001,101,202,301)代表的根到叶子节点路径组合都是隶属于AVP数组(001,101,202)代表根到父亲节点路径组合下的,且叶子节点相同,因此AVP数组(001,101,202,301)和(001,101,202,301)是重复的AVP。
至此,本发明实施例中diameter消息的解码方法具体流程结束。本发明实施例还提供了一种diameter消息的解码器,可以用于实施上述方法。图6即为本发明实施例的diameter消息解码器的具体结构图。如图6所示,该解码器600包括:数据库配置单元601、数据库602、前期解码单元603和数据映射单元604。
在该解码器600中,数据库配置单元601,用于在数据库602中根据计费事件的种类和编号,为该计费事件配置所有需要的代表根到节点路径组合的记录。
数据库602,用于保存为计费事件配置的所有需要的代表根到节点路径组合的记录。
前期解码单元603,用于接收以AVP二进制码流形式表示的diameter消息,根据AVP码流中的各个根到叶子节点的AVP数组的代码字段,将需要进行提前解码的AVP数组及其对应的信息插入计费事件对应的TLV+HASH链表中,得到前提信息,并将该前提信息发送给数据映射单元604;将不需要进行提前解码的AVP数组及其对应的信息插入计费事件的HASH数组邻接链表结构体中。
数据映射单元604,用于根据接收的前提信息,在数据库602中查询为计费事件配置的记录,根据该记录,将HASH数组邻接链表结构体中的数据插入TLV+HASH链表中。
图7即为TLV+HASH链表的数据结构图。如图7所示,这个最终形成的数据结构TLV+HASH链表是一个数组邻接链表的结构,它的访问方式是先遍历左边的HASH数组,然后根据找到HASH再遍历右边的链表,因此比直接访问树型AVP的速度快,处理也更灵活。
上述即为本发明实施例提供的diameter消息的解码方法和解码器的具体实施方式。可以看出,本发明实施例采用了便于灵活配置的中转式解码,并将解码结果表示成便于计费信息提取的数据结构。
首先,本发明实施例中的diameter解码方式并不是直接格式转化成计费最终需要的数据结构,而是先把接收到的diameter的二进制码流数据包,先格式转化到一个HASH数组邻接链表中,再转化到计费最终需要的数据结构。因为采取中转的这种策略及其相关的数据结构介质HASH数组邻接链表是可控的并且也提供了相关接口给外部使用方进行信息协商和交互,因此便于使用方通过这种中转式的解码机制,采取灵活配置的方式彻底解决diameter的二进制码流数据包中重复出现的计费信息AVP的问题,并且获取灵活配置解码各项参数的能力,获取灵活配置解码各项校验的能力,获取灵活配置容错机制的能力,获取灵活配置解码各项在原定流程新增主要或者附加功能的能力,获取灵活配置解码各项新需求的能力。
其次,应用本发明实施例中的diameter消息的解码方法和解码器后,将把一个diameter的二进制码流数据包格式转化后,最终形成TLV+HASH链表,将便于高效快速地灵活计费。由于diameter的二进制码流数据包的数据结构是一种根据不同运营商的不同业务以及电信设备提供厂商的不同功能而制定的结构各不相同并且极其不规则不规律的树型结构,因此每次要获取数据包中各项计费信息就必须每次遍历这个树型结构,这样将很不便于计费操作的前期工作即计费信息的提取。而通过本发明实施例的diameter解码方式最终形成的序列型数组结构体TLV+HASH链表,将能够让计费操作的前期工作即计费信息的提取变得很高效,因为每次访问这样的序列型的数组结构体(TLV)比每次访问那样一种复杂的树型数据包的效率显然要高得多,而且访问的方式也灵活得多。
以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。