摘要:该文首先对拨号数图匹配的规则语法进行了分类讲解,通过对规则语法的分析,给出了数图匹配的算法分析,并以伪代码的形式进行了算法实现。整个算法过程包含规则预处理和拨号匹配两个过程,该文对算法实现的流程图进行了详细的描述。
关键词:VoIP;数图(digitmap);超越匹配(over matched)
中图分类号:TP312 文献标识码:A 文章编号:1009-3044(2013)04-0807-04
Research & Efficient Implementation of Digitmap Matching Algorithm
WANG Xiao-lan
(Electromechanical Department, Suzhou Institute of Trade&Commerce, Suzhou 215009, China)
Abstract: The digitmap matching rules was classified and discussed in this paper. By analyzing the rules, the digitmap matching algorithm is illustrated and implemented in the form of pseudo-code. The whole process of algorithm holds two phases: rules preprocessing and digit matching. Further more, this paper described in details the flow chart of implementation of the algorithm.
Key words: VoIP; digitmap; over matched
网络技术与多媒体技术的发展,促进了通信技术的综合化、数字化、智能化的发展,使得在单一网络平台上实现语音、数据、图像等多种业务成为可能,其中IP语音技术(VoIP)已经被广泛应用于通信领域,IP话机、VoIP网关、PBX设备等,也逐步地得到商业化[1]。
在传统的公共交换电话网PSTN中,电话拨号是通过电流传到局端设备进行匹配的,VOIP网关则同时充当了IP网络的终端设备和普通话机的局端设备。如图1所示,VOIP网关1接收电话机1的拨号,收集号码,并于配置的数图(digitmap)规则进行匹配,匹配成功后,就会通过VOIP语音信令的方式上报呼叫请求,服务器通过对号码的分析,将呼叫请求转到被叫网关2,电话机2振铃,用户2摘机,IP电话接通。所以VOIP网关需要实现号码收集过程中的数图匹配算法,该文首先对数图规则进行了描述,基于该数图规则,对数图匹配算法的两个过程进行了理论分析,并给出了实现的思路。算法的实现过程包括对数图规则的预处理过程和号码收集的匹配过程。
1 数图规则
数图的设置需要遵循规则,如表1所示[2]。
表1 数图规则语法描述
[规则\&说明\&举例\&举例说明\&数字(Digit)\&一个从0到9的数字\&95538\&只有收集到95538才能成功匹配\&双音频(DTMF)\&一个数字、计时器或符号A,B,C,D,#或*\&*95538A#\&只有收集到*95538A#才能成功匹配\&通配符(Wildcard)\&符号x可以匹配任何数字(0到9)\&12xxxx\&可以匹配12开头的6位号码,如123987或124568等\&序列(Range)\&一个或几个DTMF符号包含在方括号[ ]中,取其中一个\&12[389]\&可以匹配123,128或129\&区域(Subrange)\&两个数字被连字符 "-" 隔开,表示可以取自该范围内的一个数字\&12[3-5]\&“-”需要跟”[ ]”结合使用,可以匹配123,124或125\&点(Dot)\&“ . ”表示前面的数字等可以出现任意次数,包括“0”次\&123.\&可以匹配12,123,1234,12335等\&计时器(Timer)\&符号T 匹配一个计时器的时长\&123T\&匹配到123后,会启动T定时器\&分隔符(Seperator)\&“|”,用于分隔多个数图规则\&123|95538
|021xxxxx#\&数图组包含123,95538和021xxxxx#三个数图规则\&]
2 数图规则的预处理
在收集号码,进行数图匹配之前,首先需要对设置的数图组进行预处理,从而能够在匹配时高效执行。以下通过伪代码结合流程图的方式描述处理的过程。
定义需要的结构参数:
struct DMAP_RULE
{
struct DMAP_SUBRULE
{
UINT32 token;
BOOL required;
BOOL timer;
}subrules[MAX_SUBRULES];
int subrules_num;
BOOL valid;
BOOL timer;
}rules[MAX_RULES];
DMAP_RULE指单个规则,一个数图组可以配置多个规则,每个规则包含多个子规则DMAP_SUBRULE以及子规则数量、是否有效和是否开启定时器三个属性。子规则DMAP_SUBRULE是对单个规则串进行分析后建立的,是关键所在,每个子规则包含以32位bit标示的标记,以及是否必须(subrules.required)和是否有定时器(subrules.timer)两个属性。
图2描述的就是对一个数图规则组进行预处理的流程,预处理的目的就是将数图规则组转换为rules结构,用于数图匹配。以下对该预处理流程进行分步解析。
1)每个数图规则由‘|’分隔,对每个数图规则进行遍历;
2)对当前数图规则中字符串(子规则)进行遍历;
3)当前子规则如果为“+#*0123456789ABCD”中某个字符,则设置rules[i].subrules[j].token对应bit为1,设置rules[i].subrules[j].required为1,设置rules[i].subrules[j].timer为0,跳到(2)继续匹配下一子规则;否则进入步骤(4);
4)当前子规则如果为‘X’,则设置rules[i].subrules[j].token为0x3FF,即0-9bit为1,说明可以匹配0-9内的数字,设置rules[i].subrules[j].required为1,设置rules[i].subrules[j].timer为0,跳到(2)继续匹配下一子规则;否则进入步骤(5);
5)当前子规则如果为‘[’,则查找是否有‘]’对应,没有则说规则错误,直接退出;否则进入步骤(6);如果不是‘[’,则跳到步骤(10);
6)遍历“[]”内每个字符(注意,“[]”内属于一个子规则),遍历结束则跳到(2)继续匹配;
7)“[]”内当前字符如果为‘T’,则设置rules[i].subrules[j-1].timer为1(注意‘T’的属性会加在前一规则上),rules[i].timer为1,跳到(6);
8)“[]”内当前字符如果为‘-’,则设置rules[i].subrules[j].token在‘-’区间内的bit为1,比如[3-5]Vjafp6p7Hwx2WVJ4a5PM8g==,则设置bit3、4、5为1,设置rules[i].subrules[j].required为1,设置rules[i].subrules[j].timer为0,跳到(6)继续遍历;否则进入步骤(9);
9)其他情况则设置相应bit为1,设置rules[i].subrules[j].required为1,设置rules[i].subrules[j].timer为0,跳到(6)继续遍历;
10)当前子规则如果为‘T’,则设置rules[i].subrules[j-1].timer为1(注意‘T’的属性会加在前一规则上),rules[i].timer为1,该规则处理结束,跳到(1)处理下一规则;否则跳到(11);
11)当前子规则如果为‘.’,则是上一子规则的0次或多次的重复,则将rules[i].subrules[j].required设置为0,跳到(2);
3 数图匹配
在收集号码时,预处理生成的rules就被用于对所拨的号码串进行匹配,匹配的总体过程是对每个有效的数图规则进行匹配,rules[i].valid初始为1,匹配不成功则置rules[i].valid为0,说明该规则失效,下次拨号就不参加匹配。图3描述的是拨号数图匹配的流程图,具体步骤如图3。
1)每收到一个拨号数字,则串在digits尾部;
2)遍历rules中的每个规则,检查rules[i].valid如果为1(该规则有效),则跳到(3),否则跳回步骤(1),匹配下一规则;
3)同时遍历digits和rules[i].subrules,遍历结束,如果当前digits长度已超出当前规则的子规则数,则为超越匹配,这种情况下该规则将置为无效;否则该规则有效,并跳回(1);
4)检查rules[i].subrules[j].token相应bit位如果为1,则说明匹配上,跳到(5);否则该规则无效,并跳回(1);
5)检查rules[i].subrules[j].required如果为0,则说明该规则后面跟的是‘.’,可以匹配0个或多个当前子规则,所以跳到(3),继续用下一个digits[k]匹配当前规则;否则跳到(6);
6)检查rules[i].subrules[j].timer如果为1,则设置该规则有效,并开启定时器,跳回(1);否则跳回(3)继续匹配子规则,直到匹配结束。
4 结束语
本文基于数图规则的语法,对数图匹配算法进行了研究,并采用伪代码结合流程图的形式给出了实现原理,整个过程包含规则预处理和拨号时匹配两个过程。该匹配算法可用于带voip的网关、IPPBX和IPTV机顶盒等设备上,具有很好的实用价值。
参考文献:
[1]卜巍.VoIP的原理、标准和技术浅析[J].计算机与网络,2004(12).
[2] 百度文库[EB/OL].http://wenku.baidu.com/view/7981cc492e3f5727a5e962b8.html.