ubuntu环境下安装asterisk后,其配置文件 “extensions.conf” 包含了Asterisk的拨号方案(dial plan)。它的所有操作的控制和执行流程的主要方案。它控制呼入和呼出是如何被处理和路由。是配置连接行为的地方。
extensions.conf的内容以“节”的形式组织。它可以静态设置和定义,作为上下文被执行。设置节有general 和 globals 两种形式,由系统管理员完全定义。一种特殊类型的“contexts”是 macros,由用户自定义,命名前缀是“macro-”,这是可重用的模式,如同编程语言里的“过程”。extensions.conf中每一节都由 []中的节名开始。这使得extensions.conf具有和windows世界里传统的ini文件非常相似的结构。
[general]在extentions.conf文件的顶部,配置几个设置。接着在[globals]节中,你可以定义全局变量/常量,以及他们的初始值。在[general]和[globals]之后,extentions.conf文件的剩余部分就是拨号方案的(dial plan)的定义了。dial plan是由contexts的集合组成的。每个context是由extensions的集合组成。
当你在context中定义extension时,你不仅使用文字数字,字母,还要匹配extension模式。
一个extension context可以嵌套另一个,参考一下下面的范例:
Context "default":
Extension Description
101 Mark Spencer
102 Wil Meadows
0 Operator
Context "local":
Extension Description
_9NXXXXXX Local calls
include => "default"
Context "longdistance":
Extension Description
_91NXXNXXXXXX Long distance calls
include => "local"
这里我们定义三种 extension
第一种content: default 允许拨打三个电话extension: Mark, Wil, and the Operator.
第二种content: local 一个扩展模式:允许拨打7位数字号码(本地呼叫),同时也包括
“default” context,这样也允许用户拨打 Mark,Wil,或者是操作员。
第三种content: longdistance 一种允许拨打长途呼叫的扩展模式。它同时也包括上述的两种模式
(default 和 local)。
当Asterisk从一个通道上收到一个呼入连接,Asterisk从context定义中查询通道命令。context根据用户拨打的 extension定义了不同的命令集。例如,如果用户拨打“123”,context可以提供提供一套命令集来指导如何去做。如果用户拨“9”, context可以提供另一套命令集来指导做什么,同时context可以提供一套命令集来控制用户拨打的任何以“555”开头的号码。
extension 有两种类型: literal 和 pattern
literal extension 可以是一个号码,就像123。它也可以包括出现在传统电话中的标准的符号*和#,因此,12#89*是一个有效的extension.某些电话拨号盘有一 些特殊的标着 A,B,C 或者 D 的 DTMF键。extension也可以使用这些字母来定义。实际上,extension的名字可以包含任何字母和数字以及某些标点符号。
extension名字有时大小写敏感有时不敏感,当用户使用他们的VoIP电话拨打名为"OFFICE"的 extension 时,Asterisk不会执行名为“Office”的extension中定义的命令。另一方面,extension的名字不是大小写敏感的,因此你不能在一个content中
定义仅仅是大小写不同的extension.因此你不能为“OFFICE”extension定义一套程序集,同时为"office"extension也定义一套程序集
定义Extension
不同于传统的PBX,extension是和电话,接口,菜单等联系在一起的。在Asterisk中,一个extension是定义成命令执行列表的。就像Dial和GotoIf命令,具有基于不同的条件转到某个地方的能力。
当一个extension被拨叫,标为优先级1的命令被执行,紧接着是2,等等。
这将一直持续到:
呼叫被挂起。
命令返回代码-1(表示失败)
下一个更高优先级的命令不存在。(注意:Asterisk不会跳过丢失的优先级别)
呼叫被路由到一个新的extension
extension.conf 文件中的句法,一个extension执行的每一步是下面这个格式的:
exten =>extension,priority,Command(parameters)
extension中的执行步骤和命令行组件是下面的样子:
extension 是extension的标签,可以是字符串常量或者是动态的模式-匹配许多可能的电话号码。
priority 通常是正数(特例参见注意)。它是一个extension中的每个命令行的排序号码。第一个可执行命令的priority值为“1”。因此当 Asterisk将一个呼叫转入一个extension时,它将首先寻找priority值为1的命令。如果没有优先值为1的行,那么这个 extension将不会匹配这个拨入的号码。当执行完优先值为1的命令之后,Asterisk将把priority的值增加到2,除非命令本身决定下一 个要执行的优先值。如果extension中没有定义下一个priority,Asterisk将完成对这个 extension的处理,即使是存在一个比丢失的命令的优先级更高的命令。
注意:特殊情况下,字符串也会被用于指定优先级
command 是命令的名称(也被称为“应用程序”)。
parameters 依赖于命令。某些命令没有参数,在这种情况下省略参数。
范例
exten=>123,1,Answer
exten=>123,2,Playback(tt-weasels)
exten=>123,3,Voicemail(44)
exten=>123,4,Hangup
这是单个名为“123”的extension的定义。但一个呼叫被安排到 extension 123,Asterisk将自己回答这个呼叫,播放一个名为“tt-weasels”的声音文件,提示用户是否留下语音邮件,然后挂断电话。
应该注意的是,Asterisk没有关注这几行代码在extensions.conf文件中的顺序。你可以以不同的顺序混合这几行代码,就像下面的例子,它与之前的例子没有什么不同,因为Asterisk使用priority来标示每一行的执行顺序。
exten=>123,4,Hangup
exten=>123,1,Answer
exten=>123,3,Voicemail(44)
exten=>123,2,Playback(tt-weasels)
定义extension时的其它选项包括被称为“ex-girlfriend”逻辑的选项。这个逻辑将匹配extension,不管是来自外部还是内部,关键是看拨入人的呼叫ID(caller id).例如:
exten=>123/100,1,Answer()
exten=>123/100,2,Playback(tt-weasels)
exten=>123/100,3,Voicemail(123)
exten=>123/100,4,Hangup()
只有当呼入人的ID号为100时,这个extension才被匹配,并且执行接下来的选项。这个也可以通过模式匹配来完成,如下所示:
exten=>1234/_256NXXXXXX,1,Answer()
......
只有以256开头的Caller Id才会匹配“1234”这个模式。这在保持本地呼叫时是很有用的。
变量和表达式
支持变量的结构 ${VARIABLENAME}
使用表达式的结构${EXPRESSION} ,这里表达式可以是常用表达式,比较表达式,加法表达式等等。
载入
在设置发生了改变之后,如果想重新加载拨号方案,无需加载所有的Asterisk配置文件。可以使用extension加载命令dialplan reload加载extensions.conf文件。
以asterisk+linphone+sipdroid配置如下:
在sip.conf中添加用户如9001、9002(此处假设只有9001和9002用户在demo节中指定拨号规则)
[9001]
videosupport=yes
type=friend
username=9001
secret=9001
host=dynamic
context=demo ;对应extensions文件中规则名称
disallow=all
allow=h264,speex
dtmfmode=rfc2833
canreinvite=no
maxcallbitrate=384
[9002]
videosupport=yes
type=friend
username=9002
secret=9002
host=dynamic
context=demo ;对应extensions文件中规则名称
ubuntu环境下安装asterisk后,其配置文件 “extensions.conf” 包含了Asterisk的拨号方案(dial plan)。它的所有操作的控制和执行流程的主要方案。它控制呼入和呼出是如何被处理和路由。是配置连接行为的地方。
extensions.conf的内容以“节”的形式组织。它可以静态设置和定义,作为上下文被执行。设置节有general 和 globals 两种形式,由系统管理员完全定义。一种特殊类型的“contexts”是 macros,由用户自定义,命名前缀是“macro-”,这是可重用的模式,如同编程语言里的“过程”。extensions.conf中每一节都由 []中的节名开始。这使得extensions.conf具有和windows世界里传统的ini文件非常相似的结构。
[general]在extentions.conf文件的顶部,配置几个设置。接着在[globals]节中,你可以定义全局变量/常量,以及他们的初始值。在[general]和[globals]之后,extentions.conf文件的剩余部分就是拨号方案的(dial plan)的定义了。dial plan是由contexts的集合组成的。每个context是由extensions的集合组成。
当你在context中定义extension时,你不仅使用文字数字,字母,还要匹配extension模式。
一个extension context可以嵌套另一个,参考一下下面的范例:
Context "default":
Extension Description
101 Mark Spencer
102 Wil Meadows
0 Operator
Context "local":
Extension Description
_9NXXXXXX Local calls
include => "default"
Context "longdistance":
Extension Description
_91NXXNXXXXXX Long distance calls
include => "local"
这里我们定义三种 extension
第一种content: default 允许拨打三个电话extension: Mark, Wil, and the Operator.
第二种content: local 一个扩展模式:允许拨打7位数字号码(本地呼叫),同时也包括
“default” context,这样也允许用户拨打 Mark,Wil,或者是操作员。
第三种content: longdistance 一种允许拨打长途呼叫的扩展模式。它同时也包括上述的两种模式
(default 和 local)。
当Asterisk从一个通道上收到一个呼入连接,Asterisk从context定义中查询通道命令。context根据用户拨打的 extension定义了不同的命令集。例如,如果用户拨打“123”,context可以提供提供一套命令集来指导如何去做。如果用户拨“9”, context可以提供另一套命令集来指导做什么,同时context可以提供一套命令集来控制用户拨打的任何以“555”开头的号码。
extension 有两种类型: literal 和 pattern
literal extension 可以是一个号码,就像123。它也可以包括出现在传统电话中的标准的符号*和#,因此,12#89*是一个有效的extension.某些电话拨号盘有一 些特殊的标着 A,B,C 或者 D 的 DTMF键。extension也可以使用这些字母来定义。实际上,extension的名字可以包含任何字母和数字以及某些标点符号。
extension名字有时大小写敏感有时不敏感,当用户使用他们的VoIP电话拨打名为"OFFICE"的 extension 时,Asterisk不会执行名为“Office”的extension中定义的命令。另一方面,extension的名字不是大小写敏感的,因此你不能在一个content中
定义仅仅是大小写不同的extension.因此你不能为“OFFICE”extension定义一套程序集,同时为"office"extension也定义一套程序集
定义Extension
不同于传统的PBX,extension是和电话,接口,菜单等联系在一起的。在Asterisk中,一个extension是定义成命令执行列表的。就像Dial和GotoIf命令,具有基于不同的条件转到某个地方的能力。
当一个extension被拨叫,标为优先级1的命令被执行,紧接着是2,等等。
这将一直持续到:
呼叫被挂起。
命令返回代码-1(表示失败)
下一个更高优先级的命令不存在。(注意:Asterisk不会跳过丢失的优先级别)
呼叫被路由到一个新的extension
extension.conf 文件中的句法,一个extension执行的每一步是下面这个格式的:
exten =>extension,priority,Command(parameters)
extension中的执行步骤和命令行组件是下面的样子:
extension 是extension的标签,可以是字符串常量或者是动态的模式-匹配许多可能的电话号码。
priority 通常是正数(特例参见注意)。它是一个extension中的每个命令行的排序号码。第一个可执行命令的priority值为“1”。因此当 Asterisk将一个呼叫转入一个extension时,它将首先寻找priority值为1的命令。如果没有优先值为1的行,那么这个 extension将不会匹配这个拨入的号码。当执行完优先值为1的命令之后,Asterisk将把priority的值增加到2,除非命令本身决定下一 个要执行的优先值。如果extension中没有定义下一个priority,Asterisk将完成对这个 extension的处理,即使是存在一个比丢失的命令的优先级更高的命令。
注意:特殊情况下,字符串也会被用于指定优先级
command 是命令的名称(也被称为“应用程序”)。
parameters 依赖于命令。某些命令没有参数,在这种情况下省略参数。
范例
exten=>123,1,Answer
exten=>123,2,Playback(tt-weasels)
exten=>123,3,Voicemail(44)
exten=>123,4,Hangup
这是单个名为“123”的extension的定义。但一个呼叫被安排到 extension 123,Asterisk将自己回答这个呼叫,播放一个名为“tt-weasels”的声音文件,提示用户是否留下语音邮件,然后挂断电话。
应该注意的是,Asterisk没有关注这几行代码在extensions.conf文件中的顺序。你可以以不同的顺序混合这几行代码,就像下面的例子,它与之前的例子没有什么不同,因为Asterisk使用priority来标示每一行的执行顺序。
exten=>123,4,Hangup
exten=>123,1,Answer
exten=>123,3,Voicemail(44)
exten=>123,2,Playback(tt-weasels)
定义extension时的其它选项包括被称为“ex-girlfriend”逻辑的选项。这个逻辑将匹配extension,不管是来自外部还是内部,关键是看拨入人的呼叫ID(caller id).例如:
exten=>123/100,1,Answer()
exten=>123/100,2,Playback(tt-weasels)
exten=>123/100,3,Voicemail(123)
exten=>123/100,4,Hangup()
只有当呼入人的ID号为100时,这个extension才被匹配,并且执行接下来的选项。这个也可以通过模式匹配来完成,如下所示:
exten=>1234/_256NXXXXXX,1,Answer()
......
只有以256开头的Caller Id才会匹配“1234”这个模式。这在保持本地呼叫时是很有用的。
变量和表达式
支持变量的结构 ${VARIABLENAME}
使用表达式的结构${EXPRESSION} ,这里表达式可以是常用表达式,比较表达式,加法表达式等等。
载入
在设置发生了改变之后,如果想重新加载拨号方案,无需加载所有的Asterisk配置文件。可以使用extension加载命令dialplan reload加载extensions.conf文件。
以asterisk+linphone+sipdroid配置如下:
在sip.conf中添加用户如9001、9002(此处假设只有9001和9002用户在demo节中指定拨号规则)
[9001]
videosupport=yes
type=friend
username=9001
secret=9001
host=dynamic
context=demo ;对应extensions文件中规则名称
disallow=all
allow=h264,speex
dtmfmode=rfc2833
canreinvite=no
maxcallbitrate=384
[9002]
videosupport=yes
type=friend
username=9002
secret=9002
host=dynamic
context=demo ;对应extensions文件中规则名称
disallow=all
allow=h264,speex
dtmfmode=rfc2833
canreinvite=no
maxcallbitrate=384
相应的拨号规则的配置文件extensions.conf如下:
(1)配置成9开头的号码都可以互相拨号通话
在[demo]节中定义简单的拨号规则:
exten=>_9.,1,Dial(SIP/${EXTEN},20,r)
参照上面的叙述“_9”表示匹配上所有“9”开头的拨号,“.”表示不限长度的任意字符。“1”表示优先级
“Dial()”标识执行动作。括号中有分成3个部分,第一个SIP表示拨号动作中拨向的是SIP协议的通道。${EXTERN}是一个标量,其值是用户实际拨打的号码,如拨打9001则${EXTERN}就是9001.括号内的“20”表示等待时间单位秒。“r”标识强行播放振铃。
当然如果禁止他们之间相互拨号,可以不填加这句。
(2)9001和9002之间互相拨号通话
在[demo]节中定义简单的拨号规则:
exten=>9001,1,Dial(SIP/${EXTEN})
exten=>9002,1,Dial(SIP/${EXTEN})
另外为了防止另外号码拨打9001或者9002,可以在sip.conf中设定不能与9001和9002通信的号码的context在其他节设定拨号规则,并在extensions.conf的响应小节中设定拨号规则,不然会造成其他号码也能拨打9001和9002的情况。
(3)设定9001不能呼叫9002
同(2)在[demo]节中
exten=>9002,1,Hangup(SIP/${EXTEN})
如上是基本的配置,当然你也可以设定其他的拨号处理如:Playback(播放音乐),Voicemail(发送邮箱)等。
disallow=allallow=h264,speexdtmfmode=rfc2833canreinvite=nomaxcallbitrate=384相应的拨号规则的配置文件extensions.conf如下:(1)配置成9开头的号码都可以互相拨号通话在[demo]节中定义简单的拨号规则:exten=>_9.,1,Dial(SIP/${EXTEN},20,r)参照上面的叙述“_9”表示匹配上所有“9”开头的拨号,“.”表示不限长度的任意字符。“1”表示优先级“Dial()”标识执行动作。括号中有分成3个部分,第一个SIP表示拨号动作中拨向的是SIP协议的通道。${EXTERN}是一个标量,其值是用户实际拨打的号码,如拨打9001则${EXTERN}就是9001.括号内的“20”表示等待时间单位秒。“r”标识强行播放振铃。当然如果禁止他们之间相互拨号,可以不填加这句。(2)9001和9002之间互相拨号通话在[demo]节中定义简单的拨号规则:exten=>9001,1,Dial(SIP/${EXTEN})exten=>9002,1,Dial(SIP/${EXTEN})另外为了防止另外号码拨打9001或者9002,可以在sip.conf中设定不能与9001和9002通信的号码的context在其他节设定拨号规则,并在extensions.conf的响应小节中设定拨号规则,不然会造成其他号码也能拨打9001和9002的情况。(3)设定9001不能呼叫9002同(2)在[demo]节中exten=>9002,1,Hangup(SIP/${EXTEN}) 如上是基本的配置,当然你也可以设定其他的拨号处理如:Playback(播放音乐),Voicemail(发送邮箱)等。