一个关于freeswitch的公开教程-拨号计划

就是我们常说的通话路由,通过拨号计划,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>

一个关于freeswitch的公开教程-拨号计划

那我们的diaplan应该怎么写?

一个关于freeswitch的公开教程-拨号计划

<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, 然后我们写

一个关于freeswitch的公开教程-拨号计划

我们可以通过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。

上一篇:实用的curl命令整理


下一篇:curl: (7) Failed connect to 192.168.56.10:80; Connection refused