Dialplan Fundamentals(拨号方案基本纲要)

如下是我根据Asterisk Wiki: https://wiki.asterisk.org/wiki/display/AST/Dialplan+Fundamentals翻译的。大家凑合着看吧.如果有翻译错误或者不到位的.请大家批评指正.

愿与大家共同交流,共同进步!

Dialplan是任何成功的Asterisk系统运作必不可少的. 在这个模块中,我们将会协助你学习Asterisk拨号方案的基本组件,以及如何将他们联合在一起来编写你自己的拨号方案.我们也会在拨号方案中添加语音信箱和一个通过姓名拨号的目录功能.

 

Contexts, Extensions, and Priorities

被组织在拨号方案中的每个部分我们称它为context(上下文). Context是拨号方案的最基本的组织单位,正因为如此,这些context在拨号方案中不同的部分中都保持着相互独立.在拨号方案的每个不同部分之间,我们将会利用context来加强安全边界,也给组群用户提供不同类别的服务.

Context的语法和之前的其他章节提到的配置文件一样,将Context的名字设置在一个方括号内部.例如:

[users]

在每个context内部,我们可以定义一个或多个extensions. 正如前面模块所描述的那样, 一个extension只不过是一个执行动作的命名.当extensions号码被拨打的时候, Asterisk会依次执行每个动作.extension的语法如下:

 

exten => number,priority,application([parameter[,parameter2...]])

 

作为一个例子,我们回顾一下之前提到的分机6001. 类似如:

 

exten => 6001,1,Dial(SIP/demo-alice,20)

 

在这个案例中, 分机号码是6001,优先级顺序是1,执行的应用就是Dial(),另外两个在应用里面的参数是SIP/demo-alice和20. 在每个extension内,必须有一个或多个priority. 一个priority 仅仅是一个次序的号码。在一个extension被执行完毕时,将会执行第二个,以此类推。

 

优先级号码:

优先级号码必须以1开始,而且必须按顺序递增。如果Asterisk不能找到下一个优先号码,那么它将会终止这一路呼叫。我们称这个为自动落空

假定有如下一个例子:

 

exten =>6123,1,do something

exten =>6123,2,do something else

exten =>6123,4,do something different

 

在这个案例中,Asterisk将执行优先级1和2,但此后将会终止这路呼叫,因为它找不到优先级3.

 

当然优先级也可以简单的用字母n来代替一个比它前面的优先顺序大的数字。因为n表示next的意思。它总是在前面优先级的基础上再加1. 需要注意的是:你依然必须明确声明优先级1.

 

exten => 6123,1,do something

exten =>6123,n,do something else

exten =>6123,n,do something different


你也可以在优先顺序后面的圆括号内分配一个标签(或别名) ,正如下面的例子中,标签使得在往后的extension内跳到特定的位置更加容易。你也可以在优先级后面的圆括号内分配一个标签(或别名) ,正如下面的例子中,标签使得在往后的extension内跳到特定的位置更加容易。

 

exten =>6123,1,do something

exten =>6123,n(repeat),do something elase

exten =>6123,n,do something different

 

在这个例子中,我们给第二个优先级分配了一个名为repeat的标签。

 

包括Asterisk 1.6.2(或往后的)在内的分支版本,利用same=>prefix方法可以用避免重复extension名字/号码 或匹配模式。

 

exten =>_1NXXNXXXXXX,1,do something

same =>n(repeat),do something else

same =>n, do something different

 


ApplicationsApplicationsApplicationsApplications

在拨号方案的每个优先顺序称为一个应用程序(application),在通道中一个应用程序会执行一些动作,比如应答一路通话或者播放一个语音提示。在Asterisk里有很多可用的拨号方案应用程序.在Asterisk的控制台里执行`core show applications`可以查看到一个完整的可用的拨号方案应用程序列表.这个列表在你安装Asterisk的时候生成的.

 

大多数应用程序带一个或多个参数,这些参数提供额外的信息给应用程序或者改变应用程序的行为.这些参数用逗号将它们隔开.

 

参数的语法:

当你在网上寻找Asterisk拨号方案代码的时候,在一些例子里的参数之间会使用管道字符|或者垂直的条码字符(|),如下面的例子:

 

exten => 6123,1,application(one|two|three)

 

这是一个过时的语法,而且将会在Asterisk未来的版本中无法使用了。使用逗号代替管道字符|即可.如:

 

exten =>6123,1,application(one,two,three)


 

 

 

Answer,Playback,and Hangup

顾名思义,Answer()应用就是用于应答一路内呼的呼叫.Answer()应用用延时(用毫秒)作为它的第一个参数.添加一个短暂的延时来确认远端在你播放一段语音提示之前拥有时间来启动音频处理通常是有用的。否则,你或许无法听到最前面的语音提示。

 

了解什么时候应答一路呼叫

当你首次学习Asterisk拨号方案的时候,对于什么时候该用Answer()应用,什么时候不使用,这会令人感到头晕。

如果Asterisk是简单的利用Dial()应用发起一路呼叫至另外一个设备,那么你或许没有必要使用。另外一方面,假如你想让Asterisk播放一个语音提示或者抓取来自主叫的输入信息,这时在做任何其他应用之前,启用Answer()应用或许是个好主意。

Playback()应用加载一个来自硬盘的语音提示并给主叫播放,在播放的过程当中忽略所有来自主叫的输入.拨号方案 应用程序的第一个参数是这个你想播放的语音文件的文件名,无需文件扩展名.如果呼叫的通道没有被接听,Playback()就会在拨回语音提示前应答这一路呼叫,除非你传递noanswer作为第二个参数。

 

为了避免最前面几毫秒的语音提示被切掉,你可以事先播放时长为一秒的无声文件.例如假设你想播放一个hello-world文件:

 

exten =>1234,1,Playback(hello-world)

 

为了避免前面几秒的语音提示被切掉,可以事先播放一个silence/1 文件. 如:

 

exten =>1234,1,Playback(silence/1)

exten =>1234,n,Playback(hello-world)

 

或者你也可以将所有需要播放的语音文件放在同一个extension中来完成,相邻的语音文件名之间用&符合连接起来。如:

 

exten =>1234,1,Playback(silence/1&hello-world)


 

 

 

Early Media and the Progress Application(前期媒体以及progress应用)

在Asterisk内部有许多拨号方案应用支持常见的VOIP功能--前期媒体.前期媒体是与SIP通道联系最紧密的,但是它也是其他通道驱动的一个功能,比如H323.在简单的情况下,任何在Asterisk内的呼叫将会涉及到调用与语音有关的应用Progress()或Answer()。

通过利用progress应用,一路呼叫应该在应答之前播放一段语音或者甚至没打算应答一路完整的呼叫.

 

调用playback的简单例子:

 

exten => 500,1,Progress()

exten => 500,n,Wait(1)

exten => 500,n,Playback(WeAreClosedGoAway,noanswer)

exten => 500,n,Hangup()

 

在上述的例子中,我们启动了一个等待了一秒的前期媒体, 这时在挂断前播放了一个命名相当粗鲁的消息示意着所要求的服务已经关闭.值得留意的是Playback应用运用了`noanswer`参量.如果没有这个参量,Playback可能会自动地应答了呼叫并且不在启用前期媒体模式了。


在上述的例子中,我们启动了一个等待了一秒的前期媒体, 这时在挂断前播放了一个命名相当粗鲁的消息示意着所要求的服务已经关闭.值得留意到是Playback应用运用了`noanswer`参量.如果没有这个参量,Playback可能会自动地应答了呼叫并且不在启用前期媒体模式了。严格来讲,Asterisk会通过RTP发送声音给任何呼叫设备,无论Asterisk是否接听了呼叫或者这路呼叫正在进行中.可以能在不发送进展消息的情况下,发起前期媒体呼叫至一些设备也是可能的。然而这是不标准的,因为它在设备之间会导致很多令人讨厌的问题. 譬如,在内部的测试中,包含如下这个extension将会暴露出一个阻止着Queue应用的问题.

 

exten => 500,1,Queue(queuename)

 

当然这是个简单的例子而已.Queue应用并没有执行任何类型自动应答.在这个情况之下,Asterisk会发送一些电话语音包,但它不会让呼叫正常地应答或发送进展指示消息.这种情况下,不同的电话有不同的行为.在案例的内部测试中,我们的Polycom Soundpoint IP 330电话不播放任何东西,但SNOM360电话在它不断产生ring-back提示音前给这路呼叫播放了大约1分钟的语音文件. 这两种情况均没有错. 它们仅仅是对这额外形成的SIP会话做出反应而已。

 

exten => 500,1,Progress()

exten =>500,n,Queue(queuename)

 

熟练掌握运用Progress()和Answer()是需要技巧的,而且在应用之间会有很多不同.出于安全起见,你可以简单地一直应答所有的呼叫.但是有一下案例比较适当地用前期媒体,而且大多数人确实意识到了需要这个功能是很必要的。

 

一个运用前期媒体且不自动应答的应用清单(不全)

 

SayAlpha/SayDigits/SayNumber/etc

Playback(conditionally)

MP3

MixMonitor

MorseCode

Echo

Queue

MusicOnHold


 

 

Exploring Sound Prompts

Asterisk自带了各种各样的预录制的语音提示。但你在安装Asterisk的时候,在若干个不同格式文件中,你可以选择安装core和extra sound packages 两个包. 在这若干种语言中这些语音提示文件都是可用的.为了研究你系统中的这些语音文件,找到声音文件的目录(在绝大多数系统在/var/lib/asterisk/sounds目录 )和对应的文件名。你将会找到有用的语音提示文件(“请输入你所要找的客户的分机号”),以及一些不太寻常的提示.

 

声音提示格式

有各种各样的格式作为声音的提示格式,例如.wav 和.ulaw文件. 当被问到从硬盘中播放一段语音提示时,Asterisk就立即寻找一个最容易转换为与当前呼叫编码格式一致的语音文件来播放。例如,假设当前内呼的呼叫使用的是alaw 编码,但可用的语音提示文件格式只有.gsm和.ulaw。这时Asterisk会播放.ulaw格式的文件,因为它需要消耗用来转换成alaw 格式的CPU周期最短.

你可以通过在控制台中执行`core show translation`来查看各种编码之间转换的时间.上面被播报的时间(Asterisk 1.6.0或者以后的发行版)大概就是几微秒,这个时间就是Asterisk采用编码转换所用的时间.这个些时间从Asterisk加载对应的编解码模块开始算起,在不同的机器之间会有微小的不同. 执行命令`core show translation recalc 60` 来计算当前编码转换所需要的时间.

Asterisk是如何基于通道语言寻找声音提示的?

在Asterisk中,每一种通道都通过通道驱动分配了一种语言。通道语音代码是分割开的,一块一块的(用下划线隔开),用于构建寻找语音提示的通道. 这时Asterisk会采用第一个被找到的文件.

 

这意味着如果我们将语言设置为: en_GB_female_BT.例如 Asterisk会在如下目录寻找文件:

 

.../sounds/en/GB/female/BT

.../sounds/en/GB/female

.../sounds/en/GB

.../sounds/en

.../sounds

当回落到一个更普通的语音提示时,如果在更具体的语言变体中没有被录制的语音提示,这个方案使得给各种语言变体添加新的语音提示变得更加容易.

Hangup()应用挂断当前的呼叫,由于auto-fallthrough(自动落空),hangup()显得没有严格必要.但通常我们推荐你添加Hangup()应用作为最后的一个执行优先顺序.

 

当回落到一个更普通的语音提示时,如果在更具体的语言变体中没有被录制的语音提示,这个方案使得给各种语言变体添加新的语音提示变得更加容易.

Hangup()应用挂断当前的呼叫,由于auto-fallthrough(自动落空),hangup()显得没有严格必要.但通常我们推荐你添加Hangup()应用作为最后的一个优先级.

 

现在我们将Answer(),Playback()和Hangup放在一起来实现执行一个简单的语音文件的拨号方案:

 

exten => 6000,1,Answer(500)

exten => 6000,n,Playback(hello-world)

exten =>6000,n,Hangup()


 

 

Dial Application

既然你已经学习了拨号方案的基本应用的用法,那让我们一起具体的看看之前分机6001和6002尝试给一个外部设备振铃的Dial()应用吧. 如果这路呼叫被应答了,它将会将两个通道桥接在一起并做一些必要的协议或编解码的转换.它也会处理一些进展回应消息(忙,无人接听,一直振铃)。

Dial()和拨号方案

请注意,如果Dial()应用成功地将两个通道桥接在一起,那么这路呼叫将不在往下执行剩下的拨号方案了.如果Dial()应用不能够将呼叫通道和被拨打的设备桥接起来,那么这路呼叫将会继续执行下一个优先级.

Dial()应用自带四个参数:

一. Devices

  1. 你想呼叫的设备清单。设备被指定为技术或通道驱动,斜线以及设备或账户名字.例如,SIP/demo-alice用的是SIP通道驱动来呼叫在sip.conf的demo-alice部分中被指定的设备.IAX2通道驱动的设备采用IAX2/demo-george 的形式,DAHDI通道采用DAHDI/1的形式.
  2. 当呼叫时通过一个设备(比如网关)或运营商到达另一个号码时,语法形式是technology/device/number比如SIP/my_provider/5551212或者DAHDI/4/5551212.
  3. 为了一次拨打多个设备,采用符号字符(&)简单地将多个设备串联在一起即可.应答第一个的设备将会桥接主叫,并且其他端点会停止振铃.
  4. exten => 6003,1,Dial(SIP/demo-alice&SIP/demo-bob,30)

二 . 超时

在放弃或者执行下一个优先级前允许设备振铃的时间.

三.  选项

有大量的可以设置用于外呼,屏蔽内呼,区别振铃音或更多功能的参数. 在Asterisk控制台输入`core show application dial`可以获取一张完整的可用参数的清单.如果你想指定多个参数,简单地将它们串联起来即可. 例如,你想同时用*m*和H选项,则将它设置为mH.

四. URL

第四个参数就是一个发送给端点的URL.很少端点可以利用URL做任何事情,但有很多(大多数软电话)可以在URL上做到这点一样功能.

 

 

 

Adding Voice Mail to Dialplan Extensions

给分机添加语音留言功能很简单,Asterisk语音留言模块提供了两个关键的用于处理语音邮件的应用.第一个命名为VoiceMail(),它允许主叫给知道的语音信箱留下语音口信. 第二个命名为VoiceMailMain(),它允许邮箱拥有者找回他们的口信并修改它们的问候语.

VoiceMail Application(语音留言应用)

  1. Mailbox: 这个参数指定了语音留言信息应该留下的语音信箱.它应该是一个语音信箱号码和用@符号(像6001@default)将语音邮件context串联在一起的.语音邮箱会被许多语音邮件context分开,就像extension被拨号方案的context分开一样.
  2. options: 一个或多个用来控制问候语的参数. 最流行的选项包括用来播放不可用消息的u选项, b选项用于播放忙消息,s选项用于跳过由系统产生的指示.

Configuring Voice Mail Boxes

既然我们涵盖了两个主要的语音邮件应用,那我们来看看voicemail的配置吧。voicemail的选项邮件箱均在voicemail.conf中设置。这个文件有三大主要的部分:

[general]部分

在voicemail.conf的顶端,你可以找到[general]部分,这部分配置文件主要控制语音邮件系统的的基本部分.比如每个邮箱能支持信息量的最大数量, 语音邮件的最大长度等等。想了解更多信息,请看看voicemail.conf示例里的参数设置.

[zonemessages]部分

[zonemessages]部分用来定义世界各地的时区设置. 每个邮箱可以分配一个特定的时区,以致使得发布的时间和日期都与他们当地的一致.在该部分指定的时区也可以控制发布时间和日期的方法.比如用哪种方式格式读取一天24小时。

Voice Mail Contexts

除了[general]和[zonemessages]之外,其他用括弧括起来的部分均为voicemail的context. 在每个context内,你可以定义一个或多个邮件箱.为了定义一个邮件箱,我们设置一个邮件箱号码,PIN号码,邮箱拥有者的名字,主邮箱地址,从邮箱地址,还有一系列的邮箱选项(用管道符号隔开).如下所示:

 

exten =>pin,full name,email address,short email address, mailbox options

 

通过分析,short email address是一个用于接收较短的邮件,通常比较适合移动设备比如手机或者手持设备。它不接收带附件的邮件.

为了给分机6001和6002添加voicemail功能,将如下两行添加到voicemail.conf的底部.

 

[vm-demo]

6001 =>8762,Alice Jones,alice@example.com,alice2@example.com,attch=n0|tz=central|maxmsg=10

6002 =>9271,Bob Smith,bob@example.com,bob2@example.conf,attach=yes|tz=eastern

 


既然我们定义了语音信箱了,我们就到Asterisk控制台执行voicemail reload命令来使Asterisk重新加载voicemail.conf文件。我们也可以通过执行voicemail show users来确认已经创建的邮箱用户.既然我们定义了语音信箱了,我们就到Asterisk控制台执行voicemail reload命令来使Asterisk重新加载voicemail.conf文件。我们也可以通过执行voicemail show users来确认已经创建的邮箱用户.既然我们定义了语音信箱了,我们就到Asterisk控制台执行voicemail reload命令来使Asterisk重新加载voicemail.conf文件。我们也可以通过执行voicemail show users来确认已经创建的邮箱用户.

 

server*CLI> voicemail reload
Reloading voicemail configuration...
server*CLI> voicemail show users
Context    Mbox  User                      Zone       NewMsg
default    general New User                                0
default    1234  Example Mailbox                           0
other      1234  Company2 User                             0
vm-demo    6001  Alice Jones               central         0
vm-demo    6002  Bob Smith                 eastern         0
5 voicemail users configured.

 

既然我们定义了邮件箱了,我们给分机6001和6002分机添加一个优先级,这个优先级允许主叫在他们各自的邮箱里留下语音邮件。我们也定义了分机6500,这个分机允许Alice和Bob查看他们的语音邮件信息。在extensions.conf里将你的[users]context修改成如下:

 

[users]

exten => 6000,1,Answer(500)

exten =>6000,n,Playback(hello-world)

exten =>6000,n,Hangup()

exten => 6001,1,Dial(SIP/demo-alice,20)

exten =>6001,n,VoiceMail(6001@vm-demo,u)

exten =>6002,1,Dial(SIP/demo-bob,20)

exten =>6002,n,VoiceMail(6002@vm-demo,u)

exten =>6500,1,Answer(500)

exten =>6500,n,VoiceMailMain(@vm-demo)

在Asterisk CLI中执行`dialplan reload`来重新加载拨号方案. 通过从一个分机拨打到另外一个分机并等待20秒测试这个语音邮件系统.你将会被连接到一个语音邮件系统并在那里留下一个口信.你也可以拨打6500来重新收回那个口信.当听到提示时,输入邮箱号码和邮箱的PIN号码即可.

在VoiceMailMain()应用中,你也可以在语音邮箱菜单中通过按0键录下邮箱拥有者的名字,电话不可用时的问候语,或者忙音问候语等.在继续下一部分前,请在Alice和Bob之间录下至少一个问候语.

当然还有更多的Voicemail功能,例如如何在语音消息之间移动,在语音储存文件夹之间移动或者一些前向消息等等。

在Asterisk CLI中执行`dialplan reload`来重新加载拨号方案. 通过从一个分机拨打到另外一个分机并等待20秒测试这个语音邮件系统.你将会被连接到一个语音邮件系统并在那里留下一个口信.你也可以拨打6500来重新收回那个口信.当听到提示时,输入邮箱号码和邮箱的PIN号码即可.

在VoiceMailMain()应用中,你也可以在语音邮箱菜单中通过按0键录下邮箱拥有者的名字,电话不可用时的问候语,或者忙音问候语等.在继续下一部分前,请在Alice和Bob之间录下至少一个问候语.

当然还有更多的Voicemail功能,例如如何在语音消息之间移动,在语音储存文件夹之间移动或者一些前向消息等等。

 

 

Directory Application

我们下一个要讲述的应用就是Directory(), 它呈献的是主叫可以根据姓名拨打的目录. 它询问主叫输入前面的几位数字或者被叫到名字, 然后在文件voicemail.conf的指定语音邮件上下文尝试寻找到匹配的名字. 如过在已录制的问候语中寻找到了,那么Asterisk将会播放这个问候语.否则Asterisk会将被叫名字逐个字母读出.

 

Directory([voicemail_context,[dialplan_context,[options]]])


Directory()应用自带三个参数:Directory()应用自带三个参数:Directory()应用自带三个参数:Directory()应用自带三个参数:Directory()应用自带三个参数:

 

voicemail_context

在voicemail.conf内,voicemail_context是用于搜索匹配的目录项(directory entry).如果没有指定,那么将会搜索到默认的上下文[docs:default].

dialplan_context

当主叫找到了他们的要寻找的目录项,Asterisk将会在这个context中拨打对应的extension。

options

有一整套用于根据姓名拨打的目录选项参数, 通常使用的参数有f-用于搜索基于第一个名字而不是第二个。还有参数e-读取分机号码以及名字。

Directory() Options

为了能够看到Directory()应用的参数里,在Asterisk CLI中输入`core show application Directory`即可.

 

exten =>6501,1,Directory(vm-demo,users,ef)

 

现在你可以拨打6501来测试你的通过姓名拨打的目录功能了。


现在你可以拨打6501来测试你的通过姓名拨打的目录功能了。现在你可以拨打6501来测试你的通过姓名拨打的目录功能了。现在你可以拨打6501来测试你的通过姓名拨打的目录功能了。现在你可以拨打6501来测试你的通过姓名拨打的目录功能了。现在你可以拨打6501来测试你的通过姓名拨打的目录功能了。

这是我第一次尝试着翻译.如果有不足地方请大家见谅。

 

Cheers!

MSN: yangjiazhi@live.com

Website: www.voipevents.com

 

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值