ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-22 19:00:36  阅读:418  来源: 互联网

标签:教程 python 拨号 lua freeswitch curl 路由 mod


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

标签:教程,python,拨号,lua,freeswitch,curl,路由,mod
来源: https://blog.csdn.net/u010901046/article/details/122641720

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有