1. 整体介绍
Asterisk的拨号方案在文件extensions.conf 中定义。文件 extensions.conf 通常在/etc/asterisk/目录下。拨号方案由4 部分组成:contexts、extensions、priorities和 applications。
(1) Context :
l Context 用来对 extension的组命名。简单说来,它把拨号方案的不同部分进行分离,免得彼此交织在一起。在一个context中定义的extension完全独立于在另一个context中定义的extensiont。Contexts 的表示方法是把名字放在方括号([])的中间。这个名字可以由A-Z(大小写都可以)、数字0-9,以及连字号和下划线组成[*]
l 设置节有general 和 globals 两种形式,由系统管理员完全定义。一种特殊类型的“contexts”是 macros,由用户自定义,命名前缀是“macro-”,这是可重用的模式,如同编程语言里的“过程”。extensions.conf中每一节都由[]中的节名开始。
l [general] extentions.conf文件的顶部,配置几个设置。
l [globals] 接着,在[globals]节中,你可以定义全局变量/常量,以及他们的初始值
(2) Extension :
l 在每一个 context 内,可以定义一个或者多个extension。 Extension是Asterisk要执行的指令,由来电或者通道上所拨数字来触发。Extension 规定了在呼叫通过拨号方案是,对其采取哪些处理。
l extension 的语法是单词exten 后面跟着一个由等号和大于号组成的箭头,如下所示:exten=>之后是 extension 的名字。在与电话系统打交道的时候,我们把extension 看作是呼叫另一部电话所拨的号码。
l 特殊的extension:i:Invalid ;s:Start ;h:Hangup;t:Timeout T:AbsoluteTimeout ;o:Operator
l extension.conf 文件中的句法,一个extension执行的每一步是下面这个格式的:exten =>name,priority,application(parameters)
1. 每个 extension 都可以有多个步骤,称作priorities。每个priority都按顺序编号,从1开始 (实际上,这个规定有个例外,如在Unnumbered Priorities Actually所介绍的那样)。每个 priority执行一个规定的应用。
2.Priority编号增加了新的变化,引入了npriority,表示“下一个”的意思。每次Asterisk遇“n”这个priority的时候,就取出前一个priority的编号加上1
(3)Application:
l 应用是拨号方案中的劳动力。每个应用针对当前通道完成规定的动作,比如播放声音、接受音频拨号输入,或者挂断电话等。
l 具体的应用使用见Asterisk DialPlan中文翻译
l 详细介绍一下常用的应用函数
1. Answer( )应用用于接听正在振铃的通道。
2. Playback()应用用于在通道上播放事先录制好的语音文件。在使用Playback( )应用时,系统不会理会来自用户的输入。若要使用Playback( ),要指定一个文件名(不要带扩展名)作为参量。要特别说明的事,您也可以在文件名上包括完整的路径。
3. Hangup( )应用挂断一个正在活动的通道
4. Background()应用播放事先录制好的语音文件当主叫方按下电话键(1 个或者多个)的时候,会中断语音的播放,转到与所按数字对应的extension。Background( )应用通常用于创建语音菜单。
5. Goto( )应用它用于把呼叫发送到另一个context、extension 以及 priority。
6. 需要一个 extension来处理主叫方没有及时(默认的时间是10 秒)输入的情况。如果主叫方在Background( )完成语音文件播放之后很久才按键,呼叫将被转移到t extension。需要一个用来处理非法输入的extension,从而在主叫方按下一个无效输入
7. Dial( )应用把不同的主叫方连接到一起。Dial( ) 需要 4 个参量。第 1 个是呼叫的被叫地,由呼叫所采用的(传输)技术、反斜线、远地资源(通常是通道名称或编号)等组成。Dial( )应用的第2 个参量是超时,单位为秒。如果给定了超时参量, Dial( ) 会一直对被叫地进行呼叫,直到超时后才放弃,然后转移到该extension 中的下一个priority。如果没有指定超时时间,Dial( )会一直呼叫该通道,直到有人接听,或者主叫挂机。Dial( )应用的第 3 个参量是可选择的字符串。它包含一个或多个能够影响Dial( )应用行为的字符。选项地列表太长,不能在这里逐一列出。最常用的一个是字母r。如果把字母作为第 3 个参量,在通知被叫通道有来电的这段时间内,主叫方会听到振铃声音。Dial( )应用的最后一个参量是URL。如果被叫通道支持在呼叫的同时接受URL,那么所指定的 URL将被发送。这个参量很少使用。
2 . 简单的例子和说明
(1) 应答,播放语音,挂掉
exten=>s,1,answer ; 接听
exten=>s,2,Playback(hello-world);播放语音文件
exten=>s,3,hangup();挂断
(2) 添加两个分机,
l 在sip.conf中添加两个分机
[1000]
type=friend
username=1000
accountcode=1000
secret=1000
context=from-exten-sip
;followed advance settings
host=dynamic
nat=yes
qualify=2000
canreinvite=no
callgroup=0,
pickupgroup=0,
setvar=
call-limit=1
[1001]
type=friend
username=1001
accountcode=1001
secret=1001
context=from-exten-sip
;followed advance settings
host=dynamic
nat=yes
qualify=2000
canreinvite=no
callgroup=0,
pickupgroup=0,
setvar=
call-limit=1
l 实现用一个分机呼叫另一分机,
在extension.conf中添加[incoming]上下文。
[incoming]
exten=>_X.,1,Dial(SIP/${EXTEN});说明_X.模式匹配,匹配任何电话号码。${EXTEN}通道变量,拨了某个extension,Asterisk会把通道变量${EXTEN}设置为所拨的数字。
exten=>_X.,2,Playback(vm-nobodyavail);被叫地没有应答,Dial() 会继续到该 extension 的下一个priority。
exten=>_X.,3,Hangup(); 挂断
exten=>_X.,102,Playback(tt-allbusy);但是,如果被叫通道忙,Dial()将转到priority n+101,如果其存在的话(其中的 n 是 Dial( )被调用的priority)
exten=>_X.,103,Hangup();挂断
l 简单的语音菜单的设计
[test]
exten=>s,1,Answer(); 应答
exten=>s,2,Background(enter-ext-of-person);在等待分机的时候播放声音文件
exten=>101,1,Playback(101); 播放号码101
exten=>101,2,Playback(goodbye); 播放语音goodbye
exten=>101,3,Hangup(); 挂断
exten=>102,1,Playback(102) 播放号码101
exten=> 102,2,Playback(goodbye) 播放语音goodbye
exten=>102,3,Hangup() 挂断
exten=>i,1,Playback(pbx-invalid); 输入不可用信息 播放语音pbx-invalid
exten=>i,2,Goto(test,s,1); 跳转到起始
exten=>t,1,Playback(vm-goodbye); 超时时播放语音goodbye
exten=>t,2,Hangup(); 挂断
l 语音信箱的使用(在FreePBX中可以实现)
在voice.conf中建立语音信箱
8001=>1234,8001,8001@device;说明:箭头左边的8001是邮箱号码,箭头右边1234是邮箱的密码,8001是邮箱主人的名字,8001@device是邮箱所有者的email地址
8002=>1234,8002,8002@device
在extension.conf中添加语句
[vm]
exten=>_X.,1,Dial(SIP/${EXTEN},r,10) ;呼叫连接当前的通道
exten=>_X.,2,Voicemail(u${EXTEN}@default) ;在十秒钟内没有接听电话,不可用的信息能被播放
exten=>_X.,102,Voicemail(b${EXTEN}@default) ;它将我们的呼叫送往语音邮件,将听到忙的消息
l 电话会议(在FreePBX中可以实现)
在meetme.conf中添加会议
Conf=>400,1234,5678 ;说明400是会议名称,1234是进入会议的密码,5678是管理员的密码
在extension.conf中添加命令
Exten=>18,1,Answer()
exten=>18,2,MeetMe(400,i,1234)
exten=>18,3,Playback(vm-goodbye)
exten=>18,4,Hangup()