在freeswitch中比较重要的一个部分就是diaplan了,diaplan拨号计划简单的来说就是一种号码规则,他可以根据自己定义的规则,设置对应did(目标号码)或者设置匹配的规则,每一步如何实现,都在这里设置实现的。拨号计划一般都放在安装目录的:conf/dialplan下。首先我们拿一个比较有代表性的拨号计划进行拆分:
<extension name="jdconference">
<condition field="destination_number" expression="^01086465454_(\d{6})$">
<action application="set" data="vccid=8001"/>
<action application="set" data="servicekey=900005"/>
<action application="answer"/>
<action application="set" data="conference_enforce_security=false"/>
<action application="conference" data="${1}@default++flags{nomoh}"/>
</condition>
</extension>
这个拨号计划是一个简单的sip会议呼入的拨号计划。
<extension name="jdconference"></extension>
代表一个拨号计划的开始到结束,name表示设置一个拨号计划的名称,这个名称没有什么强制性的界定,只是方便可以在日志中查看到,在fs的日志匹配上可以看到,自己可以直观的看出匹配走了那个拨号计划,去哪里修改,所以这个名称自己可以设置的简单易懂,起码让人在日志中可以一眼看出。
<condition field="destination_number" expression="^01086465454_(\d{6})$">
这里就是写匹配规则了,condition field表示你需要匹配的信息是取什么参数进行匹配,freeswitch提供匹配的参数很多,有如下参数:
rdnis :重定向号
destination_number :被叫号码
caller_id_name :主叫名称(坐席名称)
caller_id_number:主叫号码
ani Automatic 自动号码(呼叫方主叫号码)
uuid Unique :号码的通话uuid
source :呼叫来源
network_addr :对端ip地址
Year:年
yday :1年的某一天(1-365)
mon :几月(1-12)
mday :1月的某一天(1-31)
week :1年的某一周(1-53)
mweek 1月的某一周(1-6)
wday :1周的某一天(1-7)
minute :1小时的某分钟(1-60)
date-time:详细时间范围 formatted: YYYY-MM-DD hh:mm[:ss]~YYYY-MM-DD hh:mm[:ss]
expression则是设置匹配的正则表达式,这里直接关乎的这个拨号计划是否可以匹配上,freeswitch的正则和平常我们使用的正则都是一样的,只要搞懂这些正则,即可写好一个拨号计划。
1. ^表示匹配以XXX开头的 如:^1234
- | 表示或的意思 比如 ^1234|5678
- [] 表示匹配一个范围 比如:[0-9] 表示匹配0-9的数字
- \d 表示匹配一个数字,比如 \d 就相同于匹配0-9
- + 表示匹配至少一个或者多个,比如 \d+ 表示匹配至少1个数字
- * 表示匹配任意0个或者多个 比如\d* 表示匹配0个或者多个
- $ 表示匹配什么结尾的,如: 456$ 表示匹配456结尾的
- {} 表示精确匹配位数,如 \d{5} 表示精确匹配5位数字
- . 表示匹配任意一个字符
平常我们写好拨号计划,不懂正则写的是否正确,我们可以通过进行fs_cli,使用regex 进行校验, 规则为 regex 目标号码|正则 ,如果正确的话,会返回true,如果写的错误的话,会返回false。
这一部分写完之后,其余中间的内容就是我们想实现的内容,执行的内容大体可以分2种类,一种叫action,一种叫anti-action,action是在condition匹配的时候执行,而anti-action是在condition不匹配的时候执行。
action有两个参数,一个是application,一个是data。其中application是指一个注册的应用程序。data是给这个应用程序传递的参数。
在anti-action里不能使用$1这样的变量,原因是expression没有匹配成功,所以$1没有值。
这里简单的介绍一些常用的action命令:
- set / unset 表示写入一个参数,或者取消写入一个参数,data则标识写入的内容,如: <action application="set" data="vccid=8001"/> ,表示写入一个vccid=8001的参数,这样的用法同第二部分在拨号计划中加入{vccid=8001}产生的效果是一样的,我们同样可以通过variable_vccid 在通道事件中取出这个通道变量。
- answer: 表示接听,这种app可以无需传递data信息,只需 <action application="answer"/>即可完成。
- confence:表示进入一个会议,data中填写相应的会议参数
- bridge:表示进行桥接,data中填写相应转接的相关信息
- sleep:睡眠,表示让通话休眠多长的时间,data中可以填写休眠的时间
- hangup:挂断,data是可选参数,里面可以填写挂断原因,单参数也不是自己随意设定的,仅可以填写freeswitch hangupcause中的任意参数。
等等,具体各种详细的action方法可以参考资料:https://freeswitch.org/confluence/display/FREESWITCH/XML+Dialplan 里也有详细介绍diaplan
本文详细解析Freeswitch的拨号计划(dia plan),重点介绍如何设置匹配规则和常用action命令,包括extension的name设定、condition字段的destination_number匹配、正则表达式的运用,以及answer、conference、bridge等action的应用。
1692

被折叠的 条评论
为什么被折叠?



