FreeSWITCH拨号计划dialplan详解

一、多种dialplan介绍

1、xml dialplan

拨号计划由多个context组成,每个context中有多个extension。所以context就是多个extension的逻辑集合,它相当于一个分组。一个context的extension和其他context中的extension在逻辑上是隔离的

#dialplan的完整结构
<?xml version="1.0" encoding="utf-8"?>
<document type="freeswitch/xml">
  <section name="dialplan" description="Regex/XML Dialplan">
    <context name="default">
      <extension name="Test Extension" continue="true">
      </extension>
    </context>
  </section>
</document>

extension
#extension相当于路由表的表项,其中每一个extension都有一个name属性,name可以是任意合法的字符串,本身对呼叫流程
#没有任何影响,但给它取一个好听的名字有助于你在查看log时发现它

continue="true"
#continue默认值是false,在false情况下condition匹配规则找到对应的extension,就执行对应的action,而不会再继续
#再查找其他的extension了;若continue="true"则所有满足condition规则的action都能得到执行

condition
#在extension中可以对一些condition(测试条件)进行判断,如果满足测试条件所指定的表达式,则执行对应的action(动作)
#一般来说测试条件不可以嵌套,但可以叠加(叠加是逻辑与的关系),但FreeSWITCH于2012年底加入了嵌套dialplan的支持

<condition field="network_addr" expression="^192\.168\.1\.251$" break="on-true"></condition>
condition的break参数,为了方便讨论我们假设有两个条件A和B
break="on-false" #第一个次匹配失败时停止(但继续处理其他的extension),这是默认配置,结果相当于A and B
break="on-true" #在第一次匹配成功时停止(但会完成对应的Action,然后继续处理其他extension)
                #不成功则继续,所以结果相当于((not A)and B)
break="always" #不管是否匹配都停止
break="never" #不管是否匹配,都继续


action
#执行具体的APP或者API动作,一个action通常有两个属性,一个是application代表要执行的APP、另一个是data就是
#APP的参数,当APP没有参数时,data也可以省略

anti-action
#执行反动作,如下代码所示,符合条件就执行action的动作,不符合就执行anti-action动作
<extension name="anction and anti-action">
  <condition field="destination_number" expression="^1234$">
    <action application="playback" data="good-morning.wav"/>
    <anti-action application="playback" data="good-morning.wav"/>
    <action inline="true" application="playback" data="good-morning.wav"/>
  </condition>
</extension>

inline="true"
#正常情况下在hunting阶段是只解析dialplan,不执行action,如果加上inline="true"这一属性,则在hunting阶段就会
#直接执行,而不用等到execut阶段,当然并不是所有的的APP都能用inline执行,适合执行的APP必须能很快的执行,一般只是
#存取某个变量,并且不能改变当前Channel的状态,当然inline也不是解决所有问题的万能钥匙,由于它会打乱执行顺序
#所以使用不当也可能会产生非预期的效果

2、inline dialplan

inline dialplan称为内联拨号计划,当然它跟action中的inline属性是完全不同的概念,与xml dialplan不同,inline dialplan没有extension,也没有复杂的condition,只是简单的叠加action,它有一种很紧凑的语法:app1:arg1,app2:arg2:app3:arg3 APP直接用逗号分隔,参数用冒号分隔,如果参数中有空格,则整个字符串都需要使用单引号引起来

3、除了上述两种dialplan外,还有其他形式的dialplan,可以用命令查看所有支持的类型

freeswitch@internal> show dialplan
type,name,ikey
dialplan,LUA,mod_lua
dialplan,XML,mod_dialplan_xml
dialplan,asterisk,mod_dialplan_asterisk
dialplan,enum,mod_enum
dialplan,inline,mod_dptools

5 total.

 

二、常用的dialplan APP

1、简单APP

set #用于设置一个通道变量
<action application="set" data="my_var=123456"/>

echo #回声
<action application="echo"/>

info #打印全部的通道变量
<action application="info"/>

answer #用于应答一路呼叫,FreeSWITCH做被叫时,如果想给主叫放音,则必须应答后才可以,有些app(如conference或fifo)
#等会隐含应答,因而不需要明确的应答,但有些app(如playback和ivr等)不会隐含应答,因而需要明确的应答
<action application="answer"/>

bridge #负责桥接另一条腿(b-leg),它的参数是一个呼叫字符串,bridge操作是阻塞的,它会一直等到b-leg释放后才继续往下走
<action application="bridge" data="user/1000"/>

sleep #设置可以等待/暂停的一段时间,单位默认为毫秒
<acrion application="sleep" data="1000"/>

ring_ready #用于在SIP中给对方回183消息,即通知对方可以振铃了
<acrion application="ring_ready" data="1000"/>

pre_answer #用于在SIP中给对方回183消息,后续的playback之类的动作将作为早期媒体(early media)给对方发过去,如彩铃


read #用于实现播放声音并且等待接受DTMF按键

play_and_get_digits #与read类似,但它比read更高级,它的作用也是播放一段语音等待收号,与read不同的是,它收到后会
#跟正则表达式比较,如果不匹配则播放 invalid_file 所指定的声音,然后重新等待输入,重试次数由tries参数指定

2、playback用于给channel放音,它的参数是声音文件的路径,一般的声音文件是.wav格式的

<action application="playback" data="/tmp/test.wav"/>

#播放多个文件,可以串联操作,如下
<action application="playback" data="/tmp/test1.wav"/>
<action application="playback" data="/tmp/test2.wav"/>

#或者通过file_string协议来串联,如下"!"是文件名的分隔符
<action application="playback" data="file_string:///temp/test1.wav!/tmp/test2.wav"/>

#另外通过mod_shout模块,也可以支持本地或远程http或者shout cast服务器上的.mp3格式的文件,如下
<action application="playback" data="http://localhost/test1.wav"/>
<action application="playback" data="shout://localhost/test2.wav"/>

#在播放过程中,用户可以按“*”号键停止播放,或者在播放前通过设置其它按键完成此功能
<action application="set" data="playback_terminators=1"/>

 

三、dialplan执行API命令

Dialplan中一般执行的是APP,API本身与Channel或Session是不相关的,相当于是一个“第三者”,不过在某些特殊情况下,在Dialplan中也需要调用API提供的能力,这可以通过类似变量引用的方法来实现,如:${status()},它与变量引用的区别就是加了一对“()”,看起来类似于函数调用,括号内可以填写API命令的参数,如下命令所示都很直观,它们都是执行一个API,并将API的输入结果作为变量的值

#API调用一般是通过set来执行,如下
<action application="set" data="api_result=${status()}"/>
<action application="set" data="api_result=${version()}"/>
<action application="set" data="api_result=${strftime()}"/>
<action application="set" data="api_result=${expr(1+1)}"/>

 

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeSWITCHDialplan 是用 XML 文件编写的,它定义了呼叫路由、语音信箱、队列、语音菜单等呼叫中心功能。以下是编写 Dialplan 的基本步骤: 1. 创建 Dialplan 文件:在 FreeSWITCH 的配置文件夹中创建 Dialplan XML 文件,例如 `dialplan.xml`。 2. 定义 Dialplan:在 Dialplan 文件中定义 `<include>` 标签,引用其他 Dialplan 模块。 3. 定义 Context:在 Dialplan 文件中定义 `<context>` 标签,定义呼叫路由的上下文。 4. 定义 Extension:在 `<context>` 标签中定义 `<extension>` 标签,定义呼叫路由。 5. 定义 Action:在 `<extension>` 标签中定义 `<action>` 标签,定义呼叫路由的动作。 6. 定义变量:在 `<extension>` 标签中定义 `<var>` 标签,定义变量。 7. 使用条件语句:在 `<extension>` 标签中使用 `<condition>` 标签,定义条件语句。 8. 使用循环语句:在 `<extension>` 标签中使用 `<anti-action>` 标签,定义循环语句。 9. 定义语音信箱:在 `<context>` 标签中定义 `<mailbox>` 标签,定义语音信箱。 10. 定义语音菜单:在 `<context>` 标签中定义 `<menu>` 标签,定义语音菜单。 以上是 Dialplan 的基本编写步骤。需要注意的是,在编写 Dialplan 时,需要遵循 FreeSWITCH 的语法规则,并且需要考虑呼叫路由的优先级、呼叫转移、呼叫会议等各种情况。同时,需要结合 FreeSWITCH 的其他模块,如 IVR、语音信箱、队列等,实现完整的呼叫中心功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值