概述
freeswitch是一款简单好用的VOIP开源软交换平台。
某些呼叫场景中,我们有2条出中继线路可选,2条出中继需要按照主备模式来配置,优先使用主中继呼叫,当主中继出现问题时,呼叫自动转移到备用中继呼叫。
本节中,我们利用gateway的option检测配置和正则表达式,组合实现中继线路的主备方案。
环境
centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.10.7
GCC:4.8.5
APP接口
sofia模块接口,可以查看“<profile>”下对应的“UP”状态的gateway列表。
sofia profile <profile> gwlist up
mod_dptools模块接口,正则表达式规则匹配。
regex value expression results*
下面的表达式含义是,查看“external”下“UP”状态的gateway列表,如果其中包含名称为“gw-138-5080”的gateway,则返回“true”。
${regex(${sofia(profile external gwlist up)}|^(.*)(gw-138-5080)(.*)$)}
配置&测试
配置conf/sip_profile/external/gw-138-5080.xml,设置网关参数,gw-138-5090.xml和gw-138-15090.xml设置方法一样。
<include>
<gateway name="gw-138-5080">
<param name="username" value="not-used"/>
<param name="realm" value="10.55.55.138:5080"/>
<param name="password" value="not-used"/>
<param name="register" value="false"/>
<!--send an options ping every x seconds, failure will unregister and/or mark it down-->
<param name="ping" value="20"/>
<param name="ping-min" value="3"/>
<param name="ping-max" value="6"/>
<param name="ping-user-agent" value="proxy"/>
</gateway>
</include>
修改配置文件conf/dialplan/test.xml,设置拨号计划。
先检查“gw-138-15090”gateway是否“UP”状态,如果是则使用“gw-138-15090”呼出,如果不是再检查“gw-138-5090”gateway是否“UP”状态并呼出。
<extension name="test-gw-master" continue="true">
<condition field="${regex(${sofia(profile external gwlist up)}|^(.*)(gw-138-15090)(.*)$)}" expression="^true$" break="on-true">
<action application="bridge" data="{sip_invite_call_id=${sip_call_id}}sofia/gateway/gw-138-15090/${destination_number}"/>
</condition>
<condition field="${regex(${sofia(profile external gwlist up)}|^(.*)(gw-138-5090)(.*)$)}" expression="^true$" break="on-true">
<action application="bridge" data="{sip_invite_call_id=${sip_call_id}}sofia/gateway/gw-138-5090/${destination_number}"/>
</condition>
</extension>
发起呼叫10011->1002,测试日志如下,符合预期流程,使用“gw-138-5090”gateway呼出。
2022-12-15 11:27:15.896136 [INFO] mod_dialplan_xml.c:637 Processing 10011 <10011>->1002 in context public
...
Dialplan: sofia/external/10011@10.55.55.138 parsing [public->test-gw-master] continue=true
Dialplan: sofia/external/10011@10.55.55.138 Regex (FAIL) [test-gw-master] ${regex(${sofia(profile external gwlist up)}|^(.*)(gw-138-15090)(.*)$)}(false) =~ /^true$/ break=on-true
Dialplan: sofia/external/10011@10.55.55.138 Regex (PASS) [test-gw-master] ${regex(${sofia(profile external gwlist up)}|^(.*)(gw-138-5090)(.*)$)}(true) =~ /^true$/ break=on-true
Dialplan: sofia/external/10011@10.55.55.138 Action bridge({sip_invite_call_id=${sip_call_id}}sofia/gateway/gw-138-5090/${destination_number})
...
EXECUTE sofia/external/10011@10.55.55.138 bridge({sip_invite_call_id=36bdeb5a-f6cb-123b-7d99-000c29a63969}sofia/gateway/gw-138-5090/1002)
总结
freeswitch中功能接口繁多,组合使用会有意想不到的收获。
fs在设计之初,应该也是考虑到通过不同的功能接口以搭积木的方式实现灵活复杂的呼叫流程。
空空如常
求真得真