`
Asterium
  • 浏览: 4770 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

extensions.conf解读

 
阅读更多
1. Overview

在Asterisk PBX中,extensions.conf是一个最有用也是最重要的文件, 它包含拨号方案. 什么是拨号方案?拨号方案,或者我们称它为"Asterisk系统的心脏", 就是定义Asterisk如何处理呼入呼出呼叫的文件,它也包含所有的分机号码.一个拨号方案被分为几个称为context(上下文)的部分.每个context由超过一个分机组成.什么叫一个分机?分机就是一个电话号码,它可以是数字,字母或者数字和字母的混合体.每个分机有一个priority(执行优先级)和application(应用程序). 在context的协助执行可以让我们更好的组织整个拨号方案.

在general,拨号方案就像如下这样:

[general]

-->在这里设置一些参数

[globals]

-->在这里设置全局变量

[context1]

-->extension 1, priority 1, application
-->extension 1, priority 2, application

--> extension helpdesk, priority 1, application

...

[context2]
--> extension 999, priority 1, application
--> extension 999, priority 1, application

...

2. Contexts

2.1 [general]

在extensions.conf里,第一个context就是[general]. 有3个配置选项可以这里设置:

static = yes|no-当前只有选项yes是实现了的,(所以设置为no不会凑效). 与此同时,如果static=yes以及writeprotect=no, 你可以通过CLI命令`save dialplan`来保存拨号方案.

writeprotect = yes|no-如果你能够通过CLI命令保存拨号方案的话,这个选项是必要的.

autofallthrough = yes|no-如果设置了这个选项,当完成了需要做的事情时,Asterisk会挂断呼叫.如果没有设置,Asterisk会等待另外一个被呼叫的分机,强烈推荐将这个选项设置为yes.

2.2[globals]

在context[globals]中,你可以根据自己的拨号方案指定自己的变量. 注意:一个全局变量是不区分大小写的.因此${MYVAR}和${mYVaR}是同样的两个变量.在[globals]部分中编写全局变量的方法是:

The_name_of_my_variable => The_variable's_value

Example:

[general]

static = yes

writeprotect=no

[globals]

MyMusicOnHold =>/mp3/Test.mp3
2.3 "真正的" 呼叫context(上下文)
除了[general]和[globals]之外其他的context都被认定为呼叫context. context的基本架构是:
[context_name]
exten =>some_exten_number, priority, application(arg1,arg2,...)
exten =>some_exten_number,priority,application,arg1|arg2..
exten =>some_pattern,priority,application(arg1,arg2,...)
但`context`的目的是什么呢? 在一个context里边, 你可以利用这些分机建立一个IVR,给你的公司部门(财务,技术支持等)定义一个特定的context.
利用不同的context,公司财务部门的同事可以通过按`123`来呼叫他们的主管,技术支持部门的同事通过拨打`123`来呼叫他们的经理.
技术支持部门的同仁可能可以外呼,但财务部门的可能只限于内部呼叫.
利用context的协助, 可以很简单的管理所有分配好了的电话号码.
example:
[general]
;...skip...
[globals]
;...skip...
[Helpdesk]
exten =>232206,1,Dial(SIP/Helpdesk_agent01)
;...skip...
[Accounting]
exten =>443307,1,Dial(IAX2/Accounting_agent01)
;...skip...
IVR 菜单示例:
[default]
exten =>steve,1,Dial(SIP/steve)
exten =>mark,2,Dial(SIP/mark)
[mainmenu]
exten =>s,1,Answer()
exten =>s,n,Background(thanks); "感谢您的来电,销售部请按1,技术支持请按2.."
exten =>s,n,WaitExten
exten =>1,1,Goto(submenu,s,1)
exten =>2,1,Hangup()
[submenu]
exten =>s,1,Ringing; 2秒的回铃音让他们感觉舒服一点
exten =>s,n,Wait(2)
exten =>s,n,Background(submenuopts,s,1) ;"感谢您的来电,销售部, steve请按1, xx请按2.."
exten =>s,n,WaitExten
exten =>1,1,Goto(default,steve,1)
exten =>2,1,Goto(default,mark,2)
仔细看看上面几行做了些什么事情.
任何到达mainmenu上下文的呼叫都首先找到s分机.(为什么呢? 往下读你会在预定义分机部分章节中得到答案)
exten =>s,1,Ringing:
在这里的s 分机中,第一个执行优先顺序就是1. 应用就是给主叫提供振铃音.
exten=>s,n,Wait(2):
在这里,n表示"next"表示下一个优先级的意思. 2表示两秒.在执行下一个Background应用前等待两秒.
exten =>s,n,WaitExten:
在这里,表示等待主叫输入一些数字(例如按1找steve,按2找mark).如果按了按键,那么主叫将会进入新的extension(利用Goto函数,如果主叫按键1,那么呼叫将跳转到default的上下文的执行优先级为1的steve extension. 如果主叫按键2那么将跳转到default上下文的执行优先级为2的mark extension)
我们假设主叫按键2,那么呼叫将执行:
exten =>2,1,Goto(default,mark,2)
与此同时,呼叫流程将执行:
exten =>mark,2,Dial(SIP/mark)
拨打mark的SIP分机(SIP分机在sip.conf中定义)
3. Extension
Extension等于电话号码吗?是的,通常情况下这是对的. 这里有三种类似的extension: 文字的,预定义的,模式匹配的.
Litteral分机名字可以包含:数字[0-9], 字母A,B,C,D(一些硬电话有这些字母)或者所有字母(a-z).这些分机的名字是区分大小写的吗?这是分情况的.当Asterisk在一个被定义的context里必须匹配一个用户拨打的分机号时,分机名字是区分大小写的.

这里有一些预定义的分机名字:

-i -Invalid(无效的输入)

-s -Start(开始)

-h -Hangup(挂断)

-t -Timeout(超时)

-T -Absolute Timeout(精确的超时)

-o - Operator(操作员)

如果分机名从"_"开始的, 它被认为是模式匹配.

对于分机运用不同的模式匹配表示不同的特殊含义:

-X -表示任何0-9的数字

-Z -表示任何1-9的数字

-N -表示任何2-9的数字

-[12679] -表示任何在括号内的数字1,2,6,7或9

-. -点通配符,表示匹配任何剩余的字母或数字.

(_1234. -匹配任何以1234开始的大于或等于4位的号码)

注意: 不要使用'_.', 因为它将匹配所有一切,甚至包括预定义的分机的名字.

例如:

_359ZXXXXXXX -表示匹配所有以359开头的并且第四位号码为在1-9内任意数字的,整个号码长度总共包括10位数字的分机号码.

_0XXX. - 表示匹配所有以0开头的并且长度至少包含5位数字的分机号码.

因此借助模式匹配,可以很好的分配组群, 例如国内,国际或者本地号码.你需要做的仅仅是编写匹配模式.

4. 其他包含在extensions.conf里面的有用的东西.

4.1 ignorepat

另外一个被设置的选项就是ignorepat. 这个选项指示驱动在接收到特殊模式匹配时不要取消拨号音.

例如:

ignorepat =>8 -按了8号键依然可以听见拨号音

4.2 switch

Switch选项使得拨号方案在不同的服务器之间(ServerA > ServerB)共享成为了可能.注意的是两台服务器之间相互轮换是不允许的.

switch =>IAX2/<username>:[<password>@<myserver>|<mycontext>]

注意:需要在iax.conf中声明远端服务器(<myserver>)的用户名<username>和密码<password>.

4.3 include

可以用include将所有号码从一个context包含到另外一个context.例如:

include =>some_context_to_be_included

当然也可以用"#include"将一整个配置文件包含进来,例如:

#include "some_file_to_be_included.conf"



Cheers!
Joe.Yeung
www.voipevents.com
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics