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

注册到运营商服务器
我们可以在FreeSWITCH中添加一些网关,以便注册到运营商的SIP服务器上去(应该是一个SBC)。
网关的配置文件如下,为了使用方便,我们让网关名称(name)的后两位与号码的最后两位相同:
<gateway name="gw30">
 <param name="realm" value="218.56.x.x"/>
 <param name="username" value="xxxxxx30"/>
 <param name="password" value="xxxx"/>
 <param name="register" value="true"/>
</gateway>
<gateway name="yt31">
 <param name="realm" value="218.56.x.x"/>
 <param name="username" value="xxxxxx31"/>
 <param name="password" value="xxxx"/>
 <param name="register" value="true"/>
</gateway>
......
上面我们仅列出了两个网关账号的配置,其他账号依此类推。

通过单个号码呼出
    配置的网关注册成功后,我们就可以通过这个号码(又称为线路)打入打出电话了。我们可以使用
如下命令快速试一下是否能通过某一条线路(如gw30)成功呼出:
freeswitch> originate sofia/gateway/gw30/1860535xxxx &echo
测试成功后,就可以设置如下的Dialplan让所有分机都可以通过该网关呼出了:
 <extension name="Outbound Call">
 <condition field="destination_number" expression="^(1[358].*)$">
 <action application="bridge" data="sofia/gateway/gw30/$1"/>
 </condition>
</extension>

使用随机数做号码连选
为了能自动选择一个网关呼出,我们想办法从这10个网关中自动选择一个进行呼出。这种选择的过程就称为
选线,也称为号码连选。当然,号码连选最简单的实现方法是使用一个随机数。见下面的Dialplan:
<action application="set" data="gw=gw${expr(randomize(&x);ceil(random(30,39,&x)))"/>
<action application="bridge" data="sofia/gateway/${gw}/$1"/>
其中,“expr”是一个API,我们用它的randomize方法产生一个从30到39之间的随机数(如33),在该随机
数前面加上“gw”字符(变为gw33),并把它赋值给一个“gw”通道变量(使用“set”)实现。有了该通道变量
后,在“bridge”的参数中就可以使用“${gw}”引用该变量(在本例中它的值就是gw33),实现动态选择一个随
机的网关。
当然,这种选线算法有一个缺点,就是它不记录实际号码的忙闲状态,如果选到正在通话的号码时,通话还
是会失败。通过下面的方式,我们可以做一个改进的算法:
<action application="set"
 data="gw1=gw${expr(randomize(&x);ceil(random(30,39,&x)))"/>
<action application="set"
 data="gw2=gw${expr(randomize(&x);ceil(random(30,39,&x)))"/>
<action application="bridge"
 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 name="dist1" total-weight="10">
<node name="30" weight="1"/>
<node name="31" weight="1"/>
<node name="32" weight="1"/>
<node name="33" weight="1"/>
<node name="34" weight="1"/>
<node name="35" weight="1"/>
<node name="36" weight="1"/>
<node name="37" weight="1"/>
<node name="38" weight="1"/>
<node name="39" weight="1"/>
</list>
其中,我们配置了一个列表(list),它的名字是“dist1”,总体的权重(total-weight)是“10”。该列
表有好多节点(node)组成,其中每个节点的权重(weight)为“1” [1]。可以看出,这些节点的名字跟我们线
路号码的最后两位相同。
FreeSWITCH加载该模块后,我们就可以先用如下的命令进行一下测试:
freeswitch> distributor dist1
32
freeswitch> distributor dist1
35
distributor是该模块提供的一个API命令,它可以用于从预定义的列表中根据权重选择一个节点,并返回该
节点的名称。然后,我们就可以在Dialplan中使用它来帮助我们选线了:
<extension name="gw">
 <condition field="destination_number" expression="^(01[358].*)$">
 <action application="bridge"data="sofia/gateway/gw${distributor(dist1)}/$1" loop="2"/>
 </condition>
</extension>
其中,我们使用${distributor(dist1)}让mod_distributor帮我们选择一个节点,并使用它作为网关的名字
向外呼出。当然,与上一节使用的随机数的方案相比,它也聪明不了许多,因为,该模块也没有记录线路是空闲
还是忙的。因此,我们使用了Dialplan Action中的loop属性,如果第一次呼叫失败,它将再试一次(重新执行该
Action)。
当然,与上一节的随机数方案比起来,它还是聪明一点的。例如,虽然我们配置了10个网关,但并不一定所
有时间所有的网关都能正常注册上。通过如下方法,就可以让distributor在生成选择节点时,排除掉处于down状
态(即不可用状态)的网关:
<action application="bridge"
data="sofia/gateway/gw${distributor(dist1 ${sofia(profile internal gwlist down)})}/$1"/>

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值