两个YATE服务器互联的实现

来源:互联网 发布:excel增强软件 编辑:程序博客网 时间:2024/05/29 15:54
 

一、 引言
根据研究的进度,我们已经知道在一台YATE服务器上用简单的注册、认证模块:regfile,配置用户信息,同一个域内的用户可以成功注册到一个YATE服务器上,并呼叫成功。但我们没有完成的是如何使两台YATE服务器实现互联,让一台YATE的用户成功呼叫另一台YATE的用户。

案例如下,假设两台YATE服务器YA、YB,YA的IP地址192.168.114.51,YB的IP地址192.168.114.52,两台服务器的域和IP地址相同。YA服务器上开通101用户,YB服务器上开通202用户,现要求101和202能互相呼叫成功。

二、 实现方法
要实现两台YATE服务器互通,服务器则必须实现SIP Proxy功能。查看文档发现在YATE中Proxy功能是通过Route(路由)模块实现的,常见的Route模块是regexroute,另外可以自己编写路由模块。下面我们主要使用regexroute模块实现。

三、 Regexroute
Regexroute模块在YATE内部提供了一个简单的方法去路由电信呼叫。这个模块用一个配置文件进行配置。在regexroute中有两个消息被处理:

•Preroute
在Preroute消息处理中,模块把呼叫者进行分类,并归到一个上下文(context)中。

•Route
在Route消息中模块会根据被叫号码把呼叫映射到一个字符串描述的目标信道(channel)或模块。

a) Preroute阶段
在Preroute阶段,呼叫者会在[contexts]中依次对字符串进行匹配,匹配的结果是“context”,会在后面对应的“context”节进行进一步的处理。如:

[contexts]
^$=empty
^00=international
^0=longdistance
.*=default

上面每行=左边是欲匹配的正则表达式,右边是匹配的Context结果。具体的正则表达式规则参考“正则表达式”节。

上面的例子是说,所有以00打头的呼叫者用Context为international的进行处理,0打头的用longdistance进行处理,缺省情况用default处理。

然后可以在配置文件后面依次增加Context节,如:
[international]
[longdistance]
[default]

b) Route阶段
在Route阶段被叫号码会根据Context节依次对正则表达式进行匹配,匹配成功后执行匹配目标的动作。

匹配目标的第一个字符有特殊的含义:

•return – 从此Context立刻返回而不再进行路由
•include – 呼叫另外一个Context,如果另一个Context没有成功返回就从下一条目返回。
•jump – 跳转到另一个Context,但是就不再返回到这个Context了
•match – 修改匹配的字符串代替特定的目标
•echo – 只是显示置换的行
模块也允许通过name=value的形式设置消息的参数,各参数间用分号(;)分割

c) 例子
^00\(.*\)$=iax/\1@internat.ion.al/
匹配以00开头的所有字符,如果我们呼叫:0099123456,模块将返回:iax/99123456@internat.ion.al/009912
3456。后面目标中的、\1是参数,前面出现的字符为,例子中的0099123456,\1为匹配中第一个\( \)之间的参数,\2为匹配中第二个\( \)的参数。\1在例子中是:99123456。

将112和911路由到POTS(普通电话服务)上,也就是E1的任意通道上,并且强制指定特定的编码:
^112$=zap/1-31; format=alaw
^911$=zap/1-31; format=mulaw

通过SIP路由内部呼叫,并替换呼叫者名称:
^00\(.*\)$=sip/sip:\1@international.gateway ; callername = International call

通过IAX 路由增值业务:
^09\(.*\)$=iax/vap@gateway.for.vap/\1

其他一切以0开头的都通过H323网关
^0\(.*\)$=h323/\1@long.distance.gateway

其他非法呼叫,我们可以给用户放一段“你拨的是空号”的录音:
.*=wave/play/sounds/invalid_number.gsm

四、 具体配置
根据上面所述,我们按照要求对YA192.168.114.51服务器进行配置如下:

因为我们不用对呼叫者进行分类,Context节只开启缺省的就可以了,即所有的呼叫者都通过default Context进行处理;当然应该根据实际情况进行调节。要注意的是,这里匹配的是呼叫者(主叫用户)不是被叫者的字符串。

[contexts]
.*=default

default Context节的配置如下:
[default]
^99991001$=tone/dial
^99991002$=tone/busy
^99991003$=tone/ring
^99991004$=tone/specdial
^99991005$=tone/congestion
^99991006$=tone/outoforder
^99991007$=tone/milliwatt
^202$=sip/sip:@192.168.114.52

最后一行是我们添加的,意思很清楚,如果呼叫的是202,就通过SIP进行内部路由,并替换呼叫者的名称为202@192.168.114.52,因为我们知道202是注册在192.168.114.52域的,所以我们会告诉YATE把对202的呼叫路由(Proxy)到202@192.168.114.52,YATE就会充当SIP Proxy的角色将呼叫转到192.168.114.52(YB),192.168.114.52再呼叫用户到202。这样我们就可以成功的将101呼叫到202了,相反的过程也是类似的。

五、 正则表达式
Regexroute使用的正则表达式和Linux sed、grep中的类似。

^ 匹配字符串的开始
$ 匹配字符串的结束
. 匹配任意字符
[list] 匹配列表中的一个字符,如[a-z],匹配a-z间的任意字符
[^list] 匹配不是列表中的一个字符
列表可以是单独的字符,如[a,b,1,9],也可以是字符的一个间隔,如[a-z]。
* 匹配前面表达式的任意重复,包括0
\+ 匹配前面表达式的大于等于1次重复
\? 匹配前面表达式0或1次重复
\{N\} 匹配前面表达式准确的N次重复
\{N,\} 匹配前面表达式大于等于N次重复
\{N,M\} 匹配前面表达式N到M次重复
\( \) 捕获包含的子表达式

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kernelspirit/archive/2008/07/15/2655125.aspx