freeswitch学习笔记:注册到运营商服务器、作为网关呼出、随机选线等操作

注册到运营商服务器
我们可以在FreeSWITCH中添加一些网关,以便注册到运营商的SIP服务器上去(应该是一个SBC)。
网关的配置文件如下,为了使用方便,我们让网关名称(name)的后两位与号码的最后两位相同:

 
 
 
 


 
 
 
 

......
上面我们仅列出了两个网关账号的配置,其他账号依此类推。

通过单个号码呼出
    配置的网关注册成功后,我们就可以通过这个号码(又称为线路)打入打出电话了。我们可以使用
如下命令快速试一下是否能通过某一条线路(如gw30)成功呼出:
freeswitch> originate sofia/gateway/gw30/1860535xxxx &echo
测试成功后,就可以设置如下的Dialplan让所有分机都可以通过该网关呼出了:
 
 
 
 

使用随机数做号码连选
为了能自动选择一个网关呼出,我们想办法从这10个网关中自动选择一个进行呼出。这种选择的过程就称为
选线,也称为号码连选。当然,号码连选最简单的实现方法是使用一个随机数。见下面的Dialplan:


其中,“expr”是一个API,我们用它的randomize方法产生一个从30到39之间的随机数(如33),在该随机
数前面加上“gw”字符(变为gw33),并把它赋值给一个“gw”通道变量(使用“set”)实现。有了该通道变量
后,在“bridge”的参数中就可以使用“${gw}”引用该变量(在本例中它的值就是gw33),实现动态选择一个随
机的网关。
当然,这种选线算法有一个缺点,就是它不记录实际号码的忙闲状态,如果选到正在通话的号码时,通话还
是会失败。通过下面的方式,我们可以做一个改进的算法:
 data="gw1=gw${expr(randomize(&x);ceil(random(30,39,&x)))"/>
 data="gw2=gw${expr(randomize(&x);ceil(random(30,39,&x)))"/>
 data="sofia/gateway/${gw1}/$1|sofia/gateway/${gw2}/$1"/>
该方法的思路是,同时选择两个网关(gw1和gw2),如果一个失败,则走另一个(该方法不能从根本上解决
选到正在通话的线路问题,但可以大大减少失败的概率)。

使用mod_distributor进行连选
除随机数外,FreeSWITCH也提供了一个mod_distributor模块模块,专门实现这种连选功能。首先,要安装该
模块,进入FreeSWITCH的源代码目录,执行如下命令:
make mod_distributor-install
然后,在conf/autoload_configs/distributor.conf.xml中进行如下设置:












其中,我们配置了一个列表(list),它的名字是“dist1”,总体的权重(total-weight)是“10”。该列
表有好多节点(node)组成,其中每个节点的权重(weight)为“1” [1]。可以看出,这些节点的名字跟我们线
路号码的最后两位相同。
FreeSWITCH加载该模块后,我们就可以先用如下的命令进行一下测试:
freeswitch> distributor dist1
32
freeswitch> distributor dist1
35
distributor是该模块提供的一个API命令,它可以用于从预定义的列表中根据权重选择一个节点,并返回该
节点的名称。然后,我们就可以在Dialplan中使用它来帮助我们选线了:

 
 
 


其中,我们使用${distributor(dist1)}让mod_distributor帮我们选择一个节点,并使用它作为网关的名字
向外呼出。当然,与上一节使用的随机数的方案相比,它也聪明不了许多,因为,该模块也没有记录线路是空闲
还是忙的。因此,我们使用了Dialplan Action中的loop属性,如果第一次呼叫失败,它将再试一次(重新执行该
Action)。
当然,与上一节的随机数方案比起来,它还是聪明一点的。例如,虽然我们配置了10个网关,但并不一定所
有时间所有的网关都能正常注册上。通过如下方法,就可以让distributor在生成选择节点时,排除掉处于down状
态(即不可用状态)的网关:
data="sofia/gateway/gw${distributor(dist1 ${sofia(profile internal gwlist down)})}/$1"/>

你可能感兴趣的:(freeswitch)