Diaplan
在 Freeswitch
是指路由表
, 也可以称为 拨号方案
。
路由表 其实很简单,也是快速入门的首要学习内容。
路由表旨在接受呼叫请求,决定它应该转发到哪里,然后转发到应用程序。
1、支持类型
命令: show dialplan
获取支持的路由类型,以及支持模块。
freeswitch@ays-virtual-machine> 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
dialplan,signalwire,mod_signalwire
6 total.
2、工作流程
- 来电,通过注册用户
context
(默认:default
),或者sofia profile --> internal/external
指定context
(默认:public
),查找context
入口,这是呼叫处理的“路由
”阶段。 - context 就是一个 extension 列表,呼叫从头到尾处理每个 extension ,如果走到context尽头,那就自动挂断。
- 如果一个
extension
被评估为“匹配”,那么是否继续下一个extension,取决于当前extension
的"continue
"参数值,如果为true
,则继续执行,否则,终止。 - 每个
extension
由一个或多个条件(condition)组成,每个condition
包含一个或多个action / anti-action
。 - 定义呼叫的
特征
(比如说被叫号码)、配置(在vars.xml
或其它地方设置的变量),以及系统信息(一天中的时间),都可以通过变量访问。【详细可参考:Variables 篇】 - 每个条件(
condition
)都会检查一些特定的变量值与某些(正则)表达式的匹配。 - 根据表达式的匹配结果,条件(
condition
)值被评估为true
或false
,如果condition
值为true
,它的action
将被添加到TODO
列表;如果是false
,那么anti-action
将被添加到TODO
列表中。同时注意:只要进入了该condition
,无论当前condition
值为true
还是false
,continue
都会生效。 - 在一个
condition
内,"break
"参数值决定是否继续判断后续的condition
。值可取为:on-true
,on-false
,nerver
,always
(字面意思理解就行,比如:on-true
,就是当前condition
值为true
,就break
退出extension
,不继续执行)。actions
(和anti-actions
)都是拨号方案的APP(由FreeSWITCH及附加模块提供,大部分由mod_dptools
模块提供) - 遍历拨号方案的
context
并检查完extension
之后,结束“路由
”阶段,并进入“执行阶段
”。在“执行阶段”,所有堆积在TODO列表中的action
将挨个执行(先进先出)
-
“路由阶段”与“执行阶段”的分离
,意味着你不能在拨号方案同一阶段中同时设置并检查变量(不能在同一extension的下一个condition中检查,也不能在后续extension
的condition
中检查)。如果确实需要,使用"set
" APP提供的"inline
"参数。 - 初始进入拨号方案的呼叫称为"
A-leg
",FreeSWITCH发起的,并最终与"A-leg
“桥接的呼叫,称为”B-leg
"。(注:如果桥接的呼叫为多个,那么和这多个呼叫建立的连接,均称为"B-leg
")