1.XML Dialplan
XML Dialplan是一系列XML的配置文件组成, 这些XML可以是静态的, 也可以使动态的
Freeswitch通过解析相关的结构, 对Dialplan进行路由的呼叫, 决定何种动作
1) 配置文件的结构
在Freeswitch.xml中定义
<X-PRE-PROCESS cmd="include" data="dialplan/*.xml" />
每个Context有多个Extension
Extension的name可以是任意合法字符
condition可以对一些条件进行判断,满足指定表达式,执行相应Action
1.Processing说明是处理Dialplan,<1000>主叫号码,1234是被叫号码
2.parsing 解析XML,根据呼叫来源找到Context
3.condition条件是否匹配,匹配成功,进入执行阶段
2) 默认的配置文件简介
default, features, public
default: 默认的Dialplan, 注册用户都可以通过它打电话
public: 接收外来呼叫, 外来呼叫不可信, 更严格控制
3) 正则表达式
^1234$:
^,开头 $,结尾
^1234|5678$:
|,或
^123[0-9]$:
-,一个区间
^123\d$:
\d,[0-9]
^123\d $:
,匹配1个或多个它前面的字符,1230,12300....
^123\d*$:
*,匹配0个或多个它前面的字符,123
^123:
没有$结尾,匹配任何以123开头字符
123$:
匹配以123结尾的字符串
^123\d{5}$:
{5},精确匹配5位,包含前面的一个字符,它匹配以123开头的所有8位电话号码
4) 通道变量
使用info,可以查看所有的通道变量
<extension name="Show Channel Variable">
<condition field="destination_number" expression="^1235|info$"> #呼叫1235或info
<action application="info" data=""/>
</condition>
</extension>
所有通道变量都可以在Dialplan中访问,格式是${变量名},${destination_number}
<action application="log" data="INFO I know you called ${destination_number}" />
Log级别
0 CONSOLE
1 ALERT
2 CRIT
3 ERR
4 WARNING
5 NOTICE
6 INFO
7 DEBUG
部分通道变量
state
当前Channel的状态
channel_name
Channel名称
direction
呼叫方向
read_codec
读Codec
read_rate
读采样率
username
用户名
caller_id_name
主叫名称
caller_id_number
主叫号码
network_addr
主叫IP
destination_number
被叫号码
uuid
Channel UUID
source
呼叫来源,mod_sofia,mod_freetdm
context
Dialplan Context
rdnis
原被叫号码,一般用于呼叫转移
channel_name
Channel的名字
5) 测试条件
大部分针对被叫号码, 但也可以针对IP地址
<condition field="network_addr" expression="^192\.168\.7\.7$">
测试条件可以迭加
错误:
<condition field="network_addr" expression="^192\.168\.7\.7$">
<condition field="destination_number" expression="^1234$">
<action application="log" data="INFO I know you called ${destination_number}"/>
</condition>
</condition>
正确:
<extension name="Testing Stacked Conditions">
<condition field="network_addr" expression="^192\.168\.7\.7$"/>
<condition field="destination_number" expression="^1234$">
<action application="log" data="INFO Hahaha, I know you called ${destination_ number}"/>
</condition>
</extension>
6) 动作与反动作
<extension name="Anction and Anti-Action">
<condition field="destination_number" expression="^1234$"/>
<condition field="network_addr" expression="^192\.168\.7\.7$">
<action application="playback" data="good-morning.wav"/>
<anti-action application="playback" data="good-night.wav"/>
</condition>
</extension>
如果呼叫来自192.168.7.7,则播放good-morning.wav,否则播放good-night.wav
7) 工作机制深入剖析
NEW: 新建一个Channel
INIT
ROUTING: 解析Dialplan
EXECUTE: 执行一系列动作
HANGUP: 挂机
REPORTING: 统计,计费
DESTORY: 销毁,释放资源
8) 内联执行
把带有set的Action加上 in-line="true"
<action inline="true" application="set" data="greeting=no-greeting.wav"/>
在Hunting阶段,发现带有inline的Action,Freeswitch会直接执行,不用等到Execute
由于它会打乱执行顺序, 使用不当会产生预期外的结果
9) 实例
应答类型
被叫应答
被叫忙
被叫无应答
被叫拒绝
其他情况
挂机原因
NORMAL_RELEASE,正常释放
USER_BUSY,拒接,忙
NO_ANSWER,无应答
NORMAL_TEMPORARY_FAILURE,临时故障
TIMEOUT,超时,一般是SIP超时
NO_ROUTE_DESTINATION,呼叫不可达
回声和延迟
echo,delay_echo: 让回声有一定延迟
会议,nb_conference
<extension name="nb_conferences">
<condition field="destination_number" expression="^(30\d{2})$">
<action application="answer" data=""/>
<action application="conference" data="$1-${domain_name}@default"/>
</condition>
</extension>
所有呼叫30xx的电话均可加入一个会议
假设呼叫3000,IP是192.168.7.2
3000-192.168.7.2@default
3000-IP是会议室的名字,@default表示一个会议的profile
2.inline Dialplan
内联拨号,在测试或编写程序时,经常用到一些临时或简单的 Dialplan,每次修改XML,效率太低
短小,轻便的Dialplan更高效的完成任务,动态生成Dialplan,无需使用reloadxml
直接在命令行写inline Dialplan
originate user/1000 echo inline
originate user/1000 answer,echo inline
3.其他Dialplan
show dialplan
4.常用的Dialplan App
1) set
设置一个通道变量
<action application="set" data="my_var=1234"/>
2) echo
回声,调试用
<action application="echo"/>
3) info
打印通道变量
<action application="info"/>
4) answer
应答一路呼叫
<action application="answer"/>
5) bridge
负责桥接另一路腿,阻塞操作,直到b-leg释放才继续往下走
<action application="bridge" data="user/1000">
6) playback
给Channel放音,对主叫放音
<action appliaction="playback" data="/tmp/test.wav"/>
<action appliaction="playback" data="/tmp/test2.wav"/>
串联
<action application="playback" data="file_string:///tmp/test.wav!/tmp/test2.wav"/>
远程HTTP
<action application="playback" data="http://loaclhost/test.mp3"/>
中断播放,用户按*号键停止
7) sleep
设置等待/暂停的一段时间,默认毫秒
<action application="sleep" data="1000"/>
8) ring_ready
用于在SIP中给对方回180消息,通知对方振铃
<action application="ring_ready" data="1000"/>
9) pre_answer
用于在SIP给对方回183消息,后续的play-back如彩铃
<action application="ring-ready" data="1000"/>
<action application="playback" data="/tmp/music.wav"/>
10) read
实现播放声音并且等待接受DTMF
11) play_and_get_digits
比read更高级
5.在Dialplan使用API命令
6.深入理解通道变量及相关操作
set对单腿赋值
<action application="set" data="my_var=123"/>
export对a,b腿同时赋值(即使b不存在)
<action application="export" data="my_var=123"/>
截取Variable值的部分操作
${var:位置:长度}
${var} #原始变量值:1234567890
${var:1} 234567890
${var:4:2} 56
${var:-4:2} 78
7.小结
拨号计划三个核心要素:
Dialplan,Context和Extension
拨号计划最终目的就是为了给我们返回一组App以及它们的参数
实际呼叫的应答,放音,收号,录音都是由这些APP控制
来源张永光的博客