就是我们常说的通话路由,通过拨号计划,freeswitch将对应的channel转向固定的处理。
拨号计划并不是脚本语言,他的目标是简单帮你找到你需要的应用。我们可以把它简单叫做通话路由规则。
freeswitch 默认是多环境拨号计划,默认情况为 public 和default。
其中public context 主要是 开放给所有非认证请求,而default默认必须是需要注册的分机用户才能呼叫。
你可以把它和profile对应起来,但是并不是完全一一对应。 比如默认internel和external profile。
比如:你创建一个sip_profile 文件
<profile name="your_sip_profile">
<param name="context" value="your_sip_profile_context"/>
</profile>
对应的路由规则xml文件,可以通过context来区分
<context name="your_sip_profile_context">
<extension name="yourextension1">
<condition field="destination_number" expression="^1001$">
<action application="bridge" data="user/1001"/>
</condition>
</extension>
</context>
每一个context下都可以创建多个<extension> 表示不同的规则路由。
condition表示条件,expression和正则表达式进行结合,就可以创建很多有意思的电话路由。
《一》:sip对接运营商网关线路
a:在profile中创建gateway,用以描述指定运营商sip地址ip和端口,已经认证信息
</profile>
<settings>
……………………
</settings>
<gateways>
<gateway name="outbound">
<param name="realm" value="ip:port"/>
<param name="register" value="false"/>
</gateway>
</gateways>
</profile>
b: 外呼出去的简单dialplan
<extension name="call_out">
<condition field="destination_number" expression="(^[0-1][0-9]{10,11}$)">
<action application="log" data="22~~~~~~~~~~~~${caller_id_number}"/>
<action application="set" data="call_timeout=20"/>
<action application="set" data="hangup_after_bridge=true"/>
<action application="bridge" data="{origination_caller_id_number=yournumber**,hangup_after_bridge=true}sofia/gateway/outbound/$1"/>
<action application="set" data="test=${hangup_cause}"/>
<action application="log" data="1 A-leg hangup cause: ${hangup_cause}"/>
</condition>
</extension>
正则表达式:(^[0-1][0-9]{10,11}$) 表示0或者1开头,然后0-9之间的数字可以出现10-11次。
下方$1 代表的是整个这个正则表达式括号内的数字,即你呼叫的号码。
《二》:电话录音
<extension name="test-route1">
<condition field="destination_number" expression="(^99030135$)">
<action application="set" data="RECORD_COPYRIGHT=(c) 2011"/>
<action application="set" data="RECORD_SOFTWARE=FreeSWITCH"/> <action application="set" data="RECORD_ARTIST=FreeSWITCH"/> <action application="set" data="RECORD_COMMENT=FreeSWITCH"/> <action application="set" data="RECORD_DATE=${strftime(%Y-%m-%d %H:%M)}"/>
<action application="record_session" data="/data/recordings/archive/${call_uuid}.wav"/> <action application="bridge" data="user/99030135"/> </condition>
</extension>
电话录音application,使用record_session应用,同时使用${} 来表达freeswitch的通道变量。
《三》:dialplan转接ivr
比如你定义了自己的ivr后。
<menu name="welcome" greet-long="shout://xeducationfile-stg.oss-cn-hangzhou.aliyuncs.com/smartcall/dialogue/audio/mp3/101.mp3" greet-short="shout://xeducationfile-stg.oss-cn-hangzhou.aliyuncs.com/smartcall/dialogue/audio/mp3/101.mp3" invalid-sound="shout://xeducationfile-stg.oss-cn-hangzhou.aliyuncs.com/smartcall/dialogue/audio/mp3/101.mp3" exit-sound="shout://xeducationfile-stg.oss-cn-hangzhou.aliyuncs.com/smartcall/dialogue/audio/mp3/101.mp3" timeout="15000" max-failures="3" max-timeouts="3" inter-digit-timeout="2000" digit-len="4"> <entry action="menu-exec-app" digits="0" param="transfer 1000 XML default"/> <entry action="menu-exec-app" digits="/^(10[01][0-9])$/" param="transfer $1 XML default"/> </menu>
那我们的diaplan应该怎么写?
<extension name="incoming_call">
<condition field="destination_number" expression="^1234$"> <action application="answer" data=""/>
<action application="sleep" data="1000"/>
<action application="ivr" data="welcome"/> </condition>
</extension>
《四》:diaplan转接lua、python等脚本
<extension name="your-dialplan">
<condition field="destination_number" expression="^(.*)$">
<action application="set" data="ringback=${cn-ring}"/>
<action application="lua" data="dialplan.lua"/>
</condition>
</extension>
这里需要注意对应的dialplan.lua 脚本应该放入在script目录下
《五》:使用curl等application
freeswitch的diaplan拥有很多复杂的功能,比如anti-action与action的配合,condition嵌套condition,这些都可以在杜老师的权威指南中有详细介绍。
但是我仍然希望将复杂的逻辑交于代码实现,那么就可以借助curl来实现很多好玩的dailplan。
使用curl,首先得 load mod_curl, 然后我们写
我们可以通过http请求将对应的数据发送给我们写的后端服务,然后通过esl进行command形式,来实现我们想要的目的。
因此复杂的diaplan使用curl是一个非常好的选择,当然你可以尝试lua、python等脚本现实。
《六》:使用lua、python脚本语言
使用脚本语言lua、python来做复杂dialplan是一个非常好的选择,当然这需要掌握lua、python脚本语法。
我们不在这里介绍lua、python语言的语法基础,默认您已经掌握了对应的基础。
如果希望freeswitch支持lua、python语言,需要我们编译时候编译mod_lua和mod_python。然后在freeswitch的module里面配置启动加载mod_lua与mod_python。