asterisk拨号规则
2016-09-18 08:47
155 查看
原文地址:asterisk拨号规则作者:胡思乱想的磊子asterisk拨号规则
--Leizi
一、前言
本文档以asterisk-1.4.32为基础写作而成,可能和其他版本有些区别。其中参考了一些别的书籍和文章。因为写的比较仓促,而且基本都是晚上写的,里面的内容逻辑性和语句没有仔细斟酌,就是想到什么写什么,难免有什么遗漏和错误的地方,大家发现请及时通知我修改。另外这是我第一次写技术性的文章还很嫩涩,算是一个开始,希望大家多多支持。
二、Asterisk dialplan 基本结构
Asterisk
dialplan 的语法可以分为四个关键点,也就是语法结构的四个组成部分,四个部分分别context ,extensionnum
,priority 和 action。由这四个组成部分dialplan的结构为:
[context]
exten
=> extensionnum,priority,action
1、context
context是指dialplan的流程块,整个dialplan就是由每个context的内容组成,他们协作完成整个asterisk命令逻辑的运转。context的名字必须放在中括号之中,比如PSTN外线打进系统所执行的流程我们都习惯叫from-pstn,在语法里面就写做"[from-pstn]"。所有属于这个流程的内容都写在这个下面。每一个命令都由换行符来隔开,也就是说每一行就是一个命令,每一行命令都必须由"exten
=> "(这个里面的空格可以没有)开头。流程的结尾就是遇到到下一个流程标识截止。
2、extensionnum
extensionnum是指流程块里面的流程匹配标识(也就是asterisk里面说的extension),这个匹配标识其实通常就是我们要拨的号码(当然这个匹配标识不光是数字也可以是字母或者一些特殊字符)。比如你拨分机101,而你设置的拨分机的流程块是dial-ext,那么asterisk就会在dial-ext流程块里面寻找能匹配101的流程,找到了就会执行。说到匹配大家就会想到通配符吧,哈哈,asterisk里面也有类似的通配符,下面我就介绍一下asterisk里面关于extension的通配符。
X和x表示单个0-9的数字
N和n表示单个1-9的数字
Z和z表示单个2-9的数字
.表示单个的任何字符和数字
[]中括号里面可以是你想任意的匹配的数字或者字母,比如你想匹配1、3或者6,那么你就可以这样[136]或者[1,3,6],在中括号里面还支持这样[1-8]是指匹配1到8的任意一个数字。
当你的extensionnum中含有任何通配符的时候你就要用一个短的下划线"_"来作为extensionnum的开头除了这些以外asterisk还有一些特殊意义的匹配字符,
s :是指Start
extension,也就是当没有extension的时候就会执行这个流程(例如在模拟外线进线没有收到callerID的情况下就会转到这个extension来执行),另外在zapata.conf的channels段里面如果设定了immediate=yes程序就会自动找到s这流程来执行。
t :是指timeout
extension,也就是说如果等待用户输入超时后就会转到t这个流程来执行,在这里你可以设置一些提示音来告诉客户超时了。
i :是指invalid extension,也就是说如果客户输入无效的时候会转到i这个流程来执行
fax :是指fax calls,也就是说如果asterisk检测到传真信号的时候就会自动转到这个流程里面来执行。
h :是指hangup
extension,就是说呼叫终止后执行的流程,在这里通道已经终止,放音、发送DTMF等命令都不可用了,只能做一些呼叫结束后处理的一些工作。
需要注意的是,不管你设置的流程是什么都是属于某个流程块的,在不相互包含的情况下,流程块与流程块之间是相互独立的,流程或者变量是不会冲突的。
3、priority
priority是指流程里面的命令的执行优先级,除了跳转的情况,都是按照priority值的之从小到大执行的。在流程里面你会经常看见"n"这个priority,它是指next也就是上一个priority+1.我们通常还会给某个priority取个名字,来方便我们流程跳转,也方便流程的阅读。语法是这样的
exten => extensionnum,priority(name),action
,name就是这个priority的名字。
exten =>
_123409XX,1,GotoIf($[${EXTEN}=12340910]?ivr1:normal)
exten => _123409XX,n(normal),Dial(SIP/101)
exten => _123409XX,n,Goto(end)
exten =>
_123409XX,n(ivr1),BackGround(MyVox/Greeting)
exten => _123409XX,n(end),Hangup
上面这段代码就是当匹配的号码是12340901时就跳转到ivr1这个priority上否则就跳转到normal这个priority上。上面这段流程也可以写成:
exten =>
_123409XX,1,GotoIf($[${EXTEN}=12340910]?4:2)
exten => _123409XX,2,Dial(SIP/101)
exten => _123409XX,3,Goto(5)
exten =>
_123409XX,4,BackGround(MyVox/Greeting)
exten => _123409XX,5,Hangup
4、action
action就相对好理解多了就是流程里面你要执行的命令,asterisk支持的命令很多,我就介绍几个比较常用的。所有命令的规则里中括号里面是可选的部分,没有中括号的必须填加的。参数之间的分隔符是"|",其实","来分隔也可以,但是1.6版本的asterisk不行,1.6的只能用"|"。还应该注意的是action的命令名有大小写之分,写错将会出现错误,当命令没有参数时可以不用写小括号。
1)、Answer
语法:Answer([delay])
应答一个振铃的Channel。如果呼叫没有被应答此方法将应答这个呼叫,如果delay这个参数指定那么应答成功后将等待delay秒后再返回执行下条命令,应答不成功就会直接返回错误返回值而不执行delay延迟。这个命令用于呼入的情况,呼出的时候不会真正执行answer操作但是会执行delay延迟。
2)、Playback
语法:Playback(filename[&filename2...][|option])
给当前Channel播放语音文件。第一个参数是语音文件,语音文件的格式asterisk默认的是gsm,其他wav、sln、vox、pcm等也都支持,但是最好用gsm格式的文件,如果没有gsm格式的可以用sox这个工具把格式变为gsm的,一般变成gsm格式的语音播放起来就不会有什么问题了。播放的语音文件也可以是多个,每个之间用"&"来分隔,语音文件的扩展名不用写,语音文件中不能有空格,最好就是字母和数字的组合,为了语义的需要可以用下划线来分隔。当一个语音文件出现问题时命令就会停止,后面的语音文件就不会再被播放了。语音文件是相对地址也可以是绝对地址,相对地址的默认路径是/var/lib/asterisk/sounds/。
第二个参数是一些控制变量,这个参数是可选的:
skip :如果这个变量设置,而且当前通道没有UP,命令就会立刻结束,不播放任何语音。
noanswer :如果设置这个变量,在当前通道没有UP的时候,就不会执行anwser来UP这个通道。
say :如果设置这个变量,在播放语音之前会把要播放的语音文件名都出来。
j :如果设置这个变量,当语音文件播放出现问题的时候,流程就会跳转到priority+101这个priority继续执行。
通道变量PLAYBACKSTATUS,通道变量的值通常都是一个字符串,当语音播放成功后PLAYBACKSTATUS为SUCCESS,否则为FAILED。当播放多个文件时只要有一个文件播放失败PLAYBACKSTATUS即为FAILED。
3)、BackGround
语法:Background(filename1[&filename2...][|options[|langoverride][|context]])
给当前Channel播放语音文件,并等待客户输入,来执行相应的extension。第一个参数是语音文件,这个参数的用法跟Playbcak的第一参数用法一样。
第二个参数是一些控制变量,这个参数是可选的:
s :如果这个变量设置,而且当前通道没有UP,命令就会立刻结束,不播放任何语音。
n :播放语音前不用answer这个通道
m :只有当用户输入的能和参数context中的流程匹配才结束。
p :只播放不接受用户输入。
第三个参数是指播放声音的语言,这个参数是可选的。
第四个参数是指当用户输入后要去寻找匹配并执行的context,在多层的IVR中这个参数是关键,这个参数是可选的。
4)、Dial
语法:Dial(Technology/resource[&Tech2/resource2...][|timeout][|options][|URL])
这个命令会是当前通道呼叫一个或多个Channel,其中有一个Channel应答,当前通道就会和这个Channel桥接在一起,其他Channel就会挂断。
第一个参数是要呼叫的通道可以是多个每个之间用"&"来分隔。
第二个参数是超时时间,单位为秒,如果不设置超时时间,呼叫就会一直等到对方应答为止。
第三个参数是一些控制变量:
A(x) :当被叫方应答的时候给被叫方播放一段语音,x为要播放的语音文件
C :重新设置CDR
d
:允许主叫方在等待被叫方应答的时候,按一个数字键跳转到这个数字所能匹配的流程中,新的流程是指定在EXITCONTEXT变量中设置的流程,如果EXITCONTEXT没有被指定那么就在当前context中寻找。
D([called][:calling]) :发送DTMF到主叫方或者被叫方,当被叫应答但是通道还没有桥接的时候。
--Leizi
一、前言
本文档以asterisk-1.4.32为基础写作而成,可能和其他版本有些区别。其中参考了一些别的书籍和文章。因为写的比较仓促,而且基本都是晚上写的,里面的内容逻辑性和语句没有仔细斟酌,就是想到什么写什么,难免有什么遗漏和错误的地方,大家发现请及时通知我修改。另外这是我第一次写技术性的文章还很嫩涩,算是一个开始,希望大家多多支持。
二、Asterisk dialplan 基本结构
Asterisk
dialplan 的语法可以分为四个关键点,也就是语法结构的四个组成部分,四个部分分别context ,extensionnum
,priority 和 action。由这四个组成部分dialplan的结构为:
[context]
exten
=> extensionnum,priority,action
1、context
context是指dialplan的流程块,整个dialplan就是由每个context的内容组成,他们协作完成整个asterisk命令逻辑的运转。context的名字必须放在中括号之中,比如PSTN外线打进系统所执行的流程我们都习惯叫from-pstn,在语法里面就写做"[from-pstn]"。所有属于这个流程的内容都写在这个下面。每一个命令都由换行符来隔开,也就是说每一行就是一个命令,每一行命令都必须由"exten
=> "(这个里面的空格可以没有)开头。流程的结尾就是遇到到下一个流程标识截止。
2、extensionnum
extensionnum是指流程块里面的流程匹配标识(也就是asterisk里面说的extension),这个匹配标识其实通常就是我们要拨的号码(当然这个匹配标识不光是数字也可以是字母或者一些特殊字符)。比如你拨分机101,而你设置的拨分机的流程块是dial-ext,那么asterisk就会在dial-ext流程块里面寻找能匹配101的流程,找到了就会执行。说到匹配大家就会想到通配符吧,哈哈,asterisk里面也有类似的通配符,下面我就介绍一下asterisk里面关于extension的通配符。
X和x表示单个0-9的数字
N和n表示单个1-9的数字
Z和z表示单个2-9的数字
.表示单个的任何字符和数字
[]中括号里面可以是你想任意的匹配的数字或者字母,比如你想匹配1、3或者6,那么你就可以这样[136]或者[1,3,6],在中括号里面还支持这样[1-8]是指匹配1到8的任意一个数字。
当你的extensionnum中含有任何通配符的时候你就要用一个短的下划线"_"来作为extensionnum的开头除了这些以外asterisk还有一些特殊意义的匹配字符,
s :是指Start
extension,也就是当没有extension的时候就会执行这个流程(例如在模拟外线进线没有收到callerID的情况下就会转到这个extension来执行),另外在zapata.conf的channels段里面如果设定了immediate=yes程序就会自动找到s这流程来执行。
t :是指timeout
extension,也就是说如果等待用户输入超时后就会转到t这个流程来执行,在这里你可以设置一些提示音来告诉客户超时了。
i :是指invalid extension,也就是说如果客户输入无效的时候会转到i这个流程来执行
fax :是指fax calls,也就是说如果asterisk检测到传真信号的时候就会自动转到这个流程里面来执行。
h :是指hangup
extension,就是说呼叫终止后执行的流程,在这里通道已经终止,放音、发送DTMF等命令都不可用了,只能做一些呼叫结束后处理的一些工作。
需要注意的是,不管你设置的流程是什么都是属于某个流程块的,在不相互包含的情况下,流程块与流程块之间是相互独立的,流程或者变量是不会冲突的。
3、priority
priority是指流程里面的命令的执行优先级,除了跳转的情况,都是按照priority值的之从小到大执行的。在流程里面你会经常看见"n"这个priority,它是指next也就是上一个priority+1.我们通常还会给某个priority取个名字,来方便我们流程跳转,也方便流程的阅读。语法是这样的
exten => extensionnum,priority(name),action
,name就是这个priority的名字。
exten =>
_123409XX,1,GotoIf($[${EXTEN}=12340910]?ivr1:normal)
exten => _123409XX,n(normal),Dial(SIP/101)
exten => _123409XX,n,Goto(end)
exten =>
_123409XX,n(ivr1),BackGround(MyVox/Greeting)
exten => _123409XX,n(end),Hangup
上面这段代码就是当匹配的号码是12340901时就跳转到ivr1这个priority上否则就跳转到normal这个priority上。上面这段流程也可以写成:
exten =>
_123409XX,1,GotoIf($[${EXTEN}=12340910]?4:2)
exten => _123409XX,2,Dial(SIP/101)
exten => _123409XX,3,Goto(5)
exten =>
_123409XX,4,BackGround(MyVox/Greeting)
exten => _123409XX,5,Hangup
4、action
action就相对好理解多了就是流程里面你要执行的命令,asterisk支持的命令很多,我就介绍几个比较常用的。所有命令的规则里中括号里面是可选的部分,没有中括号的必须填加的。参数之间的分隔符是"|",其实","来分隔也可以,但是1.6版本的asterisk不行,1.6的只能用"|"。还应该注意的是action的命令名有大小写之分,写错将会出现错误,当命令没有参数时可以不用写小括号。
1)、Answer
语法:Answer([delay])
应答一个振铃的Channel。如果呼叫没有被应答此方法将应答这个呼叫,如果delay这个参数指定那么应答成功后将等待delay秒后再返回执行下条命令,应答不成功就会直接返回错误返回值而不执行delay延迟。这个命令用于呼入的情况,呼出的时候不会真正执行answer操作但是会执行delay延迟。
2)、Playback
语法:Playback(filename[&filename2...][|option])
给当前Channel播放语音文件。第一个参数是语音文件,语音文件的格式asterisk默认的是gsm,其他wav、sln、vox、pcm等也都支持,但是最好用gsm格式的文件,如果没有gsm格式的可以用sox这个工具把格式变为gsm的,一般变成gsm格式的语音播放起来就不会有什么问题了。播放的语音文件也可以是多个,每个之间用"&"来分隔,语音文件的扩展名不用写,语音文件中不能有空格,最好就是字母和数字的组合,为了语义的需要可以用下划线来分隔。当一个语音文件出现问题时命令就会停止,后面的语音文件就不会再被播放了。语音文件是相对地址也可以是绝对地址,相对地址的默认路径是/var/lib/asterisk/sounds/。
第二个参数是一些控制变量,这个参数是可选的:
skip :如果这个变量设置,而且当前通道没有UP,命令就会立刻结束,不播放任何语音。
noanswer :如果设置这个变量,在当前通道没有UP的时候,就不会执行anwser来UP这个通道。
say :如果设置这个变量,在播放语音之前会把要播放的语音文件名都出来。
j :如果设置这个变量,当语音文件播放出现问题的时候,流程就会跳转到priority+101这个priority继续执行。
通道变量PLAYBACKSTATUS,通道变量的值通常都是一个字符串,当语音播放成功后PLAYBACKSTATUS为SUCCESS,否则为FAILED。当播放多个文件时只要有一个文件播放失败PLAYBACKSTATUS即为FAILED。
3)、BackGround
语法:Background(filename1[&filename2...][|options[|langoverride][|context]])
给当前Channel播放语音文件,并等待客户输入,来执行相应的extension。第一个参数是语音文件,这个参数的用法跟Playbcak的第一参数用法一样。
第二个参数是一些控制变量,这个参数是可选的:
s :如果这个变量设置,而且当前通道没有UP,命令就会立刻结束,不播放任何语音。
n :播放语音前不用answer这个通道
m :只有当用户输入的能和参数context中的流程匹配才结束。
p :只播放不接受用户输入。
第三个参数是指播放声音的语言,这个参数是可选的。
第四个参数是指当用户输入后要去寻找匹配并执行的context,在多层的IVR中这个参数是关键,这个参数是可选的。
4)、Dial
语法:Dial(Technology/resource[&Tech2/resource2...][|timeout][|options][|URL])
这个命令会是当前通道呼叫一个或多个Channel,其中有一个Channel应答,当前通道就会和这个Channel桥接在一起,其他Channel就会挂断。
第一个参数是要呼叫的通道可以是多个每个之间用"&"来分隔。
第二个参数是超时时间,单位为秒,如果不设置超时时间,呼叫就会一直等到对方应答为止。
第三个参数是一些控制变量:
A(x) :当被叫方应答的时候给被叫方播放一段语音,x为要播放的语音文件
C :重新设置CDR
d
:允许主叫方在等待被叫方应答的时候,按一个数字键跳转到这个数字所能匹配的流程中,新的流程是指定在EXITCONTEXT变量中设置的流程,如果EXITCONTEXT没有被指定那么就在当前context中寻找。
D([called][:calling]) :发送DTMF到主叫方或者被叫方,当被叫应答但是通道还没有桥接的时候。
相关文章推荐
- 关于asterisk拨号规则中使用的变量
- asterisk拨号计划中Hangup() App执行规则
- asterisk拨号规则
- Asterisk 中 拨号规则 之 Read()和SayDigits()命令详解
- Asterisk拨号计划之匹配规则和优先级详解
- Asterisk 拨号计划之匹配规则和优先级详解
- asterisk拨号规则
- asterisk 系统变量,研究拨号规则的需要用到
- 转 asterisk拨号规则
- 通过修改asterisk拨号规则,结合freepbx 设置,禁止某些分机拨打长途电话
- Asterisk拨号方案二
- asterisk学习笔记7--宏定义规则
- 用lua给Asterisk写拨号方案
- Asterisk拨号方案语法基础
- Asterisk拨号方案常用函数说明
- 用lua给Asterisk写拨号方案
- Asterisk权威指南/第六章 拨号计划基础
- (asterisk)dialplan 中 函数介绍 --拨号方案
- Asterisk拨号方案中变量的应用
- 在一台asterisk服务器上拨号,电话从另一台打出