关于H.248的树图规则

Posted Liubit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于H.248的树图规则相关的知识,希望对你有一定的参考价值。

 

一、H248数图

数图可以是一个字符串,我们不妨称之为数图字符串,它遵循了Unix系统命令中的规则表达式的语法规定,也可以是许多数图字符串的并集,之间用“|”分隔,我们不妨称之为数图字符串列表。以下是一个数图的例子: 

[2-8]xxxxxxx | 13xxxxxxxxx | 0xxxxxxxxx | 9xxxx | 1[0124-9]x | * | # | x.# | [0-9*#].T 

我们结合对该数图的分析,学习一下怎样读懂一个数图。首先,我们对一个数图字符串中可能出现的字符进行一下归纳。 

第一类:数字:0、1、2、3、4、5、6、7、8、9; 

第二类:定时器:数图中用大写的“T”匹配一个定时器的超时,称之为超时匹配,定时器的时长是由媒体网关主机软件自己控制的,一般是要比位间不拨号超时定时器短; 

第三类:字符:包括A、B、C、D、*、#,还包括定时器“T”,如果有其它的扩展字符,象我们前文所说的一些广义上的号码字符,也属于该类; 

第四类:通配符:x,匹配从0到9的任何一个数字; 

第五类:范围:数图中用一对中括号“[”、“]”括起一个或多个DTMF字符表示选择范围,在该范围中出现的任何一个DTMF都可以匹配; 

第六类:子范围:数图中用两个数字间通过一个连字号“-”相连表示一个范围,比如“2-4”表示匹配从2到4之间的任何一个数字,包括2和4。之所以称之为子范围,是因为这个结构只能出现在方括号中。比如“[1-578]”表示从1到5,或7、8任何一个匹配,排除了6; 

第七类:位置:小圆点“.”是一种位置匹配,它对在它之前出现的任何一个结构进行0次或多次匹配,注意它的匹配次数包括零次。比如“12.”匹配“1”、“12”、“122”、“1222”、„„。 

 

现在我们再对上文给出的数图进行分析: 

[2-8]xxxxxxx | 13xxxxxxxxx | 0xxxxxxxxx | 9xxxx | 1[0124-9]x | * | # | x.# | [0-9*#].T   

这是一个由9个数图字符串组成的数图字符串列表: 

 

第一个数图字符串“[2-8]xxxxxxx”匹配一个八位号码,第一位必须是数字2~8中的一位,其余七位号码可以是0~9中的任何一位; 

第二个数图字符串是“13xxxxxxxxx”,匹配一串11位号码,第一位必须匹配1,第二位必须匹配3,其余9位匹配0~9; 

第三个数图字符串是“0xxxxxxxxx”,匹配以0起始的10位号码; 

第四个数图字符串是“9xxxx”,匹配以9起始的5位号码; 

第五个数图字符串是1[0124-9]x,匹配三位号码,第一位必须匹配1,第二位匹配012中的任何一位或4~9中任何一位,也就是说只要第二位是除3之外的任何数字,都能匹配成功,第三位匹配0~9的任何数字; 

第六个数图字符串匹配DTMF字符“*”; 

第七个数图字符串匹配DTMF字符“#”; 

第八个数图字符串“x.#”,x后面加一点,表示对0~9中任何一位进行零次或多次匹配,除非遇到“#”,停止匹配; 

第九个数图字符串“[0-9*#].T”,T表示启动超时匹配,对0~9或“*”号或“#”号进行一次次或多次匹配,如果匹配定时器超时,停止匹配。

 

这里需要说明的是,本来小圆点表示的是零次或多次匹配,但这个数图子串比较特殊,由于至少输入一个字符才可能进入该子串,从而触发匹配定时器的启动,因此此处需要至少匹配一次0~9或*、#。 

 

我们已经知道怎样读懂一个数图了。但是用户号码毕竟是一位一位上报给媒体网关的,媒体网关怎样对每一位号码处理,最后统一上报呼叫代理?当号码同时符合数图中多个数图字符串匹配时,媒体网关以哪一个为准呢?这是本节讨论的问题。 

 

由于用户号码是逐位上报给媒体网关的,而媒体网关想要将号码收齐后统一上报给呼叫代理,必然需要将之前上报的号码先进行缓存。用户每上报一位号码,媒体网关将该号码添加到一个叫做“当前拨号串”的状态变量后面,替换掉原来的变量值,然后将该变量值交给数图进行分析。 


对数图的分析顺序是从左到右的,每分析一个数图字符串,给出一个匹配结果,匹配的结果可能有四种: 

完全匹配,即完全符合该数图字符串的匹配要求; 

超时匹配,即符合某个超时匹配的数图字符串; 

部分匹配,即部分匹配某个数图字符串; 

不匹配,即不匹配某个数图字符串。 

 

这四种匹配结果优先级由高到低依次为完全匹配、超时匹配、部分匹配、不匹配。优先级体现在当对数图从左到右先后匹配时,每个数图字符串都有一个匹配结果,优先级高的结果替换优先级低的结果,当所有数图字符串匹配结束后,给出一个最终的结果。

 

最终匹配结果如果是完全匹配,号码立即上报呼叫代理;如果是超时匹配,匹配定时器超时后号码上报呼叫代理;如果是部分匹配,号码缓存到“当前拨号串”状态变量中,等待用户下一位号码上报后再进行新一轮匹配;如果是不匹配,号码立即丢弃。如此循环,完成用户号码分析上报过程。 

 

下面结合两个数图实例理解一下媒体网关怎样利用数图对收到的号码进行号码分析。 

 

实例一:

(xxxxxxx | x11) 

当前媒体网关号码缓存中已有的号码是“41”,用户又拨入一个“1”,则,号码缓存中变成了“411”,先比较数图子集“xxxxxxx”,匹配结果应该是部分匹配,再比较数图子集“x11”,匹配结果应该是完全匹配,于是网关就会将本次匹配结果作为完全匹配,把“411”发送给呼叫代理。

 

实例二:

(0[12]. | 00 | 1[12].1 | 2x.#)   

用户输入“0”,立即产生一个完全匹配,因为第一个数图子集是“0[12].”,小圆点表示1、2出现零次或多次,本次匹配符合零次的要求,完全匹配。而第二个数图子集“00”虽然对于“0”来说是一个部分匹配,但按照匹配优先级,该匹配不会发生,号码会立即上报给呼叫代理。 

 

用户输入“1”,只有一个部分匹配存在,即第三个数图子集“1[12].1”,输入“12”仍然是一个部分匹配,输入“11”或“121”都是一个完全匹配。 

用户输入“2”,只有一个部分匹配存在,即“2x.#”,用户输入“23”、“234”、“2345”都属于部分匹配,因为该输入的x后有一个小圆点,表示对x进行零次或多次匹配,而x又是一个通配符,0~9任何数字都满足匹配条件。只有“#”出现时,才产生一次完全匹配事件,比如“23456789#”。而用户输入“2#”,也属于一个完全匹配。 


数图由于其灵活性和高效性,在号码分析中起到了很大的作用于实际应用中各种拨号方案千变万化。

 

二、 群内数图和号首集数图

群内数图不用配置,软交换按照群内字冠自动生成群内数图, 以下就是奥太乐的例子,用户摘机后,软交换根据配置群内字冠下发群内的数图。

dmap1{(9|1x|2xxx|3xxx|4xxxxx|5xxx|6xxx|7xxx|8xxx|E|F|x.F|[0-9EF].L)}  

用户拨9后,软交换下发号首集内的数图。

dmap1{([2-8]xxxxxxx|13xxxxxxxxx|15xxxxxxxxx|0xxxxxxxxx|9xxxx|1[0124-9]x|20x|E|F|x.F|[0-9].L)}    
[16:30:17.180]msg from mgc([10.49.0.70]:2944) to mg([10.49.32.90]:2944): !/1 [10.49.0.70]:2944   
T=943221130{C=-{MF=A13{E=939646479{dd/ce{DM=dmap1},al/*},SG{cg/dt},DM=dmap1{(9|1x|2xxx|3xxx|4xxxxx|5xxx|6xxx|7xxx|8xxx|E|F|x.F|[0-9EF].L)}}}}   
[16:30:17.180]msg  from mg([10.49.32.90]:2944) to  mgc([10.49.0.70]:2944): !/1 [10.49.32.90]:2944 P=943221130{C=-{MF=A13}}                                         
[16:30:17.570]msg  from mg([10.49.32.90]:2944) to  mgc([10.49.0.70]:2944): !/1 [10.49.32.90]:2944   
T=708875126{C=-{N=A13{OE=939646479{20090815T16301700:dd/ce{ds="9",meth=FM}}}}}                      
[16:30:17.600]msg from mgc([10.49.0.70]:2944) to mg([10.49.32.90]:2944): !/1 [10.49.0.70]:2944 P=708875126{C=-{N=A13}}                                            
[16:30:17.600]msg from mgc([10.49.0.70]:2944) to mg([10.49.32.90]:2944): !/1 [10.49.0.70]:2944   
T=943221132{C=-{MF=A13{E=939646465{dd/ce{DM=dmap1},al/*},SG{srvtn/rdt},DM=dmap1{([2-8]xxxxxxx|13xxxxxxxxx|15xxxxxxxxx|0xxxxxxxxx|9xxxx|1[0124-9]x|20x|E|F|x.F|[0-9].L)}}}}   
[16:30:17.600]msg  from mg([10.49.32.90]:2944) to  mgc([10.49.0.70]:2944): !/1 [10.49.32.90]:2944 P=943221132{C=-{MF=A13}}   

三、 定时器:(在ONU上设置) 

长定时器(L):若号码串至少还需要一位号码来匹配DigitMap中的任意拨号方案,则数字间的定时器值应设置为长定时器。  

短定时器(S):若号码串至少已经匹配了DigitalMap中的一种拨号方案,但还有可能接收更多数的号码而匹配其它不同的拨号方案,则不应立即报匹配情况,MG必须使用短定时器(S)等待接收更多位数的号码。  

初始定时器(T):初始定时器T用于任何已拨号码之前,即从摘机到收到第一个号码之间的时长。 

举例: 

[2-8]xxxxxxx|13xxxxxxxxx|15xxxxxxxxx|0xxxxxxxxx|9xxxx|1[0124-9]x|20x|E|F|x.F|[0-9].L

拨打020114,或则02010000,都是匹配0xxxxxxxxx的树图,但还没有匹配上,而且也没有其他的可匹配,这时候就要等长定时器超时才能上报。按照一般用户一秒拨一位计算,拨完020114已经花费了6秒,还要等4秒才上报。(假定长定时器为10秒) 

 

拨打200,匹配了两个数图:[2-8]xxxxxx和20x,如果不再拨号,等短定时器超时即可上报。就是说拨完200等待4秒不再拨号才上报,如果200后(4秒内)又拨了其他号码,就不再匹配20x。(假定短定时器为4秒)

MA5616(config-if-h248-0)#display digitmap-timer   
-----------------------------------------------------     
Start     Timer length(s): 20     
Short     Timer length(s): 4     
Long      Timer length(s): 10     
Duration  Timer length(ms):3000   
-----------------------------------------------------

四、数图匹配方式:(在ONU上设置) 

为提高AG对数图的适应性,华为可以通过参数设置匹配方式(mg-software) 。

有下面两个数图存在:

1xx 1xxx 

如果你拨1000,按照最长匹配,他就应该匹配1xxx然后立即上报1000 

 

如果是最短匹配,匹配上1xx就上报,也就是会上报100然后再逐位收号,上报一个0。 但是该配置和定时器有很大的相关性。 

拨100,已经匹配上了1xx,也可能会匹配1xxx,所以要等待短定时器超时。 拨1000,只有1xxx得到了匹配,如果没有其他数图影响,应该立即上报。  

 

、SIP数图:(在终端上设置) 

SIP本身没有数图概念,华为沿用了H248协议的习惯。并且数图设置是在SIP终端上,每台终端一个设置(H.248是在软交换上设置,全局),所以提前规划就变得非常重要。 SIP要求终端一次送全号码,不能像H248那样(收到部分就可以上报,然后软交换再次发一个收号),sip要求一个invite上报全部号码。所以数图非常重要。

 

一、建议“号码匹配方式”设置为“最大匹配”,这样的话,那个+号才能起作用。 

二、建议“号间超时”设置为“3”,这样的话,可以缩短等待时间。因为不能设置为最小匹配,实在没有办法。 

三、请根据各自区域情况(7、8位),选择SIP数图 

 
如果本地号码是7位的, 请用下面的拨号规则 

[*#]x[0-9*]+#|**xx|*#x[0-9*]+#|#*x[0-9*]+#|#300##|#500##|[*#]96#xx+|[*#]95#xx+|*99*xx+#xx+|*66*x[0-9*]+#x[0-9*]+|##|010xxxxxxxx|02xxxxxxxxx|0[3-9]xxxxxxxxx|0311xxxxxxxx|037[179]xxxxxxxx|04[135]1xxxxxxxx|051[0-9]xxxxxxxx|052[37]xxxxxxxx|053[12]xxxxxxxx|057[1345679]xxxxxxxx|059[15]xxxxxxxx|0731xxxxxxxx|075[457]xxxxxxxx|076[09]xxxxxxxx|0898xxxxxxxx|00xxx+|[2-8][1-9]xxxxx   
|1[358]xxxxxxxxx|01[358]xxxxxxxxx|11[02479]|12[0268]|11[13568]x+|125xx|12[13479]x+|100[015678]x|100[2349]x+|10[1-9]xx+|14xx+|1[79]xx+|160|168xxxxx|16[1-79]x+|[48]00xxxxxxx|[48]0[1-9]x+|[23567]0xx+|955xx|95[0-46-9]xxx+|9[0-46-9]xxxx+   

如果本地号码是8位,用下面的拨号规则 

[*#]x[0-9*]+#|**xx|*#x[0-9*]+#|#*x[0-9*]+#|#300##|#500##|[*#]96#xx+|[*#]95#xx+|*99*xx+#xx+|*66*x[0-9*]+#x[0-9*]+|##|010xxxxxxxx|02xxxxxxxxx|0[3-9]xxxxxxxxx|0311xxxxxxxx|037[179]xxxxxxxx|04[135]1xxxxxxxx|051[0-9]xxxxxxxx|052[37]xxxxxxxx|053[12]xxxxxxxx|057[1345679]xxxxxxxx|059[15]xxxxxxxx|0731xxxxxxxx|075[457]xxxxxxxx|076[09]xxxxxxxx|0898xxxxxxxx|00xxx+   
|[2-8][1-9]xxxxxx|1[358]xxxxxxxxx|01[358]xxxxxxxxx|11[02479]|12[0268]|11[13568]x+|125xx|12[13479]x+|100[015678]x|100[2349]x+|10[1-9]xx+|14xx+|1[79]xx+|160|168xxxxx|16[1-79]x+|[48]00xxxxxxx|[48]0[1-9]x+|[23567]0xx+|955xx|95[0-46-9]xxx+|9[0-46-9]xxxx+  

以上数图唯一不同在:

7位号码:[2-8][1-9]xxxxx

8位号码:[2-8][1-9]xxxxxx

 

 

第一段,解决特殊业务  :

[*#]x[0-9*]+#|**xx|*#x[0-9*]+#|#*x[0-9*]+#|#300##|#500##|[*#]96#xx+|[*#]95#xx+|*99*xx+#xx+|*66*x[0-9*]+#x[0-9*]+|##  

 

第二段,解决长途区号是3位的:

0[3-9]xxxxxxxxx|0311xxxxxxxx|037[179]xxxxxxxx|04[135]1xxxxxxxx|051[0-9]xxxxxxxx|052[37]xxxxxxxx|053[12]xxxxxxxx|057[1345679]xxxxxxxx|059[15]xxxxxxxx|0731xxxxxxxx|075[457]xxxxxxxx|076[09]xxxxxxxx|0898xxxxx

0[3-9]XXXXXXXXX,是总纲,解决绝大多数长途电话。

其他,是解决区号是4位,本地电话是8位的。 00XXX+ 解决00国际长途 

以上,将01、02、03/4/5/6/7/8/9,已经描述全了。应该没有011、012等区号。就是说0开头的都全了。  

 

第三段,解决了188、189手机号段问题: 

1[358]xxxxxxxxx|01[358]xxxxxxxxx

紧急号码,+号表示超时上报 :

11[02479]|11[13568]x+ 

专门将125xx,比如12580单列:

12[0268]|125xx|12[13479]x+

同上的处理:

10[1-9]xx+

14,17,19:

14xx+|1[79]xx+

同上的处理:

160|168xxxxx|16[1-79]x+

分的更细,能缩短168xxxxx的接通时间,差别应该不大。 

14、16、17、19也都全了。

 

第四段,突出了400、800。另外要说明的是[2-8][1-9]xxxxxx,这最后一个x要根据本地网是7位还是8位来定。 

第四段将2、3、4、5、6、7、8,开头的全部搞定。加上上面已经搞定了0、1开头,就剩下9了。

[48]00xxxxxxx|[48]0[1-9]x+|[23567]0xx+|[2-8][1-9]xxxxxx  

 

第五段,突出了95539等特殊号码,能缩短接通时间:

955xx|95[0-46-9]xxx+|9[0-46-9]xxxx+   

 

8245数图里面不能有+,应该用. 

对于以.结尾的子方案需要显示加一个S(.表示0个或多个的重复)定时器,否则后面的号就收不了,下面是帮你修改好的数图(下面这个是本地网8位号码的,如果是7位的区域:[2-8][1-9]xxxxxx要少一个x) 

[*#]x[0-9*].#|**xx|*#x[0-9*].#|#*x[0-9*].#|#300##|#500##|[*#]96#xx.S|[*#]95#xx.S|*99*xx.#xx.S|*66*x[0-9*].#x[0-9*].S|##|010xxxxxxxx|02xxxxxxxxx|0[3-9]xxxxxxxxx|0311xxxxxxxx|037[179]xxxxxxxx|04[135]1xxxxxxxx|051[0-9]xxxxxxxx|052[37]xxxxxxxx|053[12]xxxxxxxx|057[1345679]xxxxxxxx|059[15]xxxxxxxx|0731xxxxxxxx|075[457]xxxxxxxx|076[09]xxxxxxxx|0898xxxxxxxx|00xxx.S|[2-8][1-9]xxxxxx|1[358]xxxxxxxxx|01[358]xxxxxxxxx|11[02479]|12[0268]|11[13568]x.S|125xx|12[13479]x.S|100[015678]x|100[2349]x.S|10[1-9]xx.S|14xx.S|1[79]xx.S|160|168xxxxx|16[1-79]x.S|[48]00xxxxxxx|[48]0[1-9]x.S|[23567]0xx.S|955xx|95[0-46-9]xxx.S|9[0-46-9]xxxx.S  

 

以上是关于关于H.248的树图规则的主要内容,如果未能解决你的问题,请参考以下文章

树图布局算法

了解 TreeMap

echarts 树图问题

实现矩形树图代码统计工具源代码

echarts2.*版本tree树图点击节点加载数据(或点击节点收缩)实现参考

统一区块链应用接口,加速新场景落地