您的位置:首页 > 其它

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到主叫方或者被叫方,当被叫应答但是通道还没有桥接的时候。

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: