走遍中国乌托邦电脑技术 → asterisk dialplan


  共有5916人关注过本帖树形打印复制链接

主题:asterisk dialplan

帅哥哟,离线,有人找我吗?
PABX
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:79 积分:960 威望:0 精华:0 注册:2011/4/16 21:27:45
asterisk dialplan  发帖心情 Post By:2017/11/25 20:35:26 [只看该作者]

 

1.Contexts  功能模块

           Context用来对extension的组命名,它把拨号方案不同部分进行分离,免得彼此交织在一起,在一个context中定义的extension完全独立于其他context中的extension。

           可以goto、Gosub跳转,进行不同的context中的extension进行交织。

           [Contexts] 名字在方括号内,名字可以有A-Z(大小写都可以)、0-9、下划线

           两个特殊的context  [general] [global]

           context的一个重要用途,加强系统安全性

 

2.extensions 参数:1,名字或者号码 2,priority(过程顺序)3,应用、命令

        在一个context内,可以定义一个或者多个extension。

extension是asterisk要执行的指令,由来电活在通道上所拨数字来触发。

extension的语法是单词exten后面跟着一个由等号和大于号组成的箭头。如下所示:

exten =>

之后跟的是extension的名字,在与电话系统打交道的时候,我们把extension看着是呼叫另一部电话所拨的号码。在Asterisk上,还意味着更多的东西,例如,extension的名字可以是字母和数字的组合。

一个完整的extension有三部分组成:

1.Extension的名字或者号码

2.Priority(每个extension可以有多个步骤,步骤的编号称作Priority)

3.应用(或者命令),针对呼叫完成的一些动作

实例:

exten => 123,1,NoOP(Welcome to the Asterisk dial plan)

exten => 123,2,Answer()

exten => 123,n,HangUp()

说明:123是extension的名字,1、2、n是priority,Answer()是应用

 

3.priorities   优先级

  每个extension有可以有多个步骤,称作priorities,每个priority都按顺序编号,从1开始,也可以理解为每一个priority执行一个规定的应用。

priority里面也可以带上参数,如:n(label)

 

4.applitations  方法    (不区分大小写,按照自己的命名规则)

   applications里面会有很多的方法:Answer(),HangUp(),Playback(/home/sounds/default_voice_mail),有些app不需要参数,有些需要传入参数才能使用此app,多个参数用英文逗号分隔。

    Background()  接收来自主叫放的输入  带音频参数

Answer()      应答一个呼叫,没有参数

Goto()        一般带三个参数,context、priority,传入值,跳转到指定的context

Playback()    播放传入的数字,当输入错误的时候(无效输入),exten => i,1,Playback(pbx-invalid),当超时输入的时候,exten => t,1,Playback(vm-goodbye)

 

 

**Dial()应用**

Dial需要4个参量:

第1个是呼叫的被叫地,由呼叫所采用的(传输)技术、反斜线、远地资源(通常是通道名称活编号)等组成。    exten => 123,1,Dial(Zap/1)

第2个参量为超时,单位为秒。如果给定了超时的参量,Dial()会一直对被叫地进行呼叫,直到超时后放弃,然后转移岛该extension中的下一个priority。如果没有指定超时时间,

Dial()会一直呼叫该通道,知道有人接听,或者主叫挂机。 exten => 123,1,Dial(Zap/1,10)

第3个参量是可选择的字符串。它包含一个或多个能够影响Dial()应用行为的字符。这里可选择的字符串列表有很多,最为常用的是字母r。如果把字母作为第3个参量,

在通知被叫方通道有来电时间内主叫方会听到振铃声音。 exten =>123,1,Dial(SIP/123,10,r)

第4个参量是URL。如果被叫通道支持在呼叫的同时接受URL,那么所指定的URL将被发送,这个参量很少使用!

 

 

*给内部呼叫增加Context

 

*使用变量   (除了全局变量之外,变量名都为小写,长变量名用下划线分隔 如:test 、hello_test)

  引用变量的两种方法。若要引用变量的名字,仅仅需要输入变量的名字就可以了,如果要引用变量的值,则必须输入美元符号,紧接着是大括号,在大括号内输入变量名。 

exten=>123,1,Dial(${x},,r)

三种变量:全局变量、通道变量、环境变量

全局变量:

全局变量适用于所有的context里的所有extensions。全局变量的好用之处在于它可以用于拨号方案中的任何地方,能够增加可读性和可管理性。

[globals]

JOHNNY=SIP/18611112222

JENNY =SIP/18622221111

exten =>_X.,1,Dail(${JOHNNY},10,r)

通道变量:

通道变量是特定的呼叫相关的变量(如 Caller*IDnumber),只能在当前呼叫存在期间定义,并且只能用于参与该呼叫的通道。有很多的预先定义的通道变量可以用于拨号方案,

在 Asterisk 源程序的中doc 子目录下 README 文件中有详细的说明。 通道变量使用 Set( )应用来设置:exten => 123,1,Set(MAGICNUMBER=42)

环境变量:

环境变量是一种在 Asterisk 中访问操作系统环境变量的方法。这些变量以${ENV(var)}形式引用,其中的 var 是所要引用的操作系统环境变量。非常少用到!

 

*模式匹配

在拨号方案中添加各种可能使用到的 extension 是非常繁琐的,尤其是在规划的时候。能够想象定义了你可以拨任何号码的 extension 的拨号方案吗?幸运的是,Asterisk有一个东西

适合这种情形:模式匹配可以使用一段代码来对应许多不同的 extensions

模式匹配语法:

如果在模式之前忘记了使用下划线,Asterisk 会认为它是一个命名的 extension,不会做任何模式匹配的动作。在下划线之后,可以使用一个或者多个下面列出来的字符:

X

匹配 0-9 的任何数字。

Z

匹配 1 - 9 的任何数字。

N

匹配 2 - 9 的任何数字。

如果发现有多个模式与所拨的extension匹配,它会使用最近的那一个模式。

 

*使用${EXTEN}通道变量

exten=>_X,1,SayDigits(${EXTEN}),asterisk会把通道变量${EXTEN}设置为所拨的数字。把extension的前面几位去掉对于处理${EXTEN}是很有用的。${EXTEN:x},其中x是要去掉的为数。例如,EXTEN的值是95551212,那么${EXTEN:1}等于5551212

 

*表达式和可变操作

set一个变量的值,set(COUNT=3);在用此变量值运算的时候,$[${COUNT}+1],这个地方需要用[]来括注表达式。

exten =>321,1 , set (COUNT=3)

exten=> 321,2 , set(NEWCOUNT=$[${COUNT}+1] )

exten=>321,3, SayNumber(${NEWCOUNT})

 

*运算符

1.Boolean类型

这些运算符是求一个语句的真假值。在计算机术语中,基本上语句就是 是和否(0和非0、开和关,等等)在Asterisk中Boolean运算符是:

或:expr1|expr2,如果expr1的值是真值,那么运算符将赋expr1的值,否则将赋expr2的值

与(且):expr1&expr2,如果两个表达式的值都为true,运算符将赋值为expr1.否则赋值为0

……

exten =>123,n,set(TEST=$[3 + 1])         TEST=4         数字运算

exten =>123,n,set(NEWTEST=$[blah${TEST}])    TEST=blah4     字符串组合

 

*拨号方案的函数    (函数全是大写形式)

1.语法

FUNCTION_NAME(argument)

非常像变量,你可以类似上面引用函数名,但是你如果要引用函数的值,就要用美元符号“$”放在前面,用花括号“{}”括起函数表达式。注意括号的对称!functions区分函数名大小写

 

*条件分支

GotoIf()应用

exten =>345,1,set(TEST=1)

exten =>345,2,GotoIf($[${TEST}= 1] ?10:20)

exten =>345,10,Playback(weasels-eaten-phonesys)

exten =>345,20,Playback(office-iguanas)

 

Goto和GotoIf()联合应用

exten =>123,1,set(COUNT=10)

exten =>123,2,GotoIf($[${COUNT} > 0]?:10)

exten =>123,3,SayNumber(${COUNT})

exten =>123,4,SET(COUNT=$[${COUNT} –1] )

exten =>123,5,Goto(2)

exten =>123,10,Hangup()

 

*使用 GotoIfTime( )实现基于时间的条件分支

在拨号方案中使用条件分支的另一种方法是 GotoIfTime()应用。鉴于 GotoIf()是对一个表达式求值来决定做什么,GotoIfTime()就设计为查看一个系统的时间并用它来决定是否跟随不同的分支。

这个程序最明显的应用是给拨打入你的系统的用户,在上班前、下班后的时间中,送出一个不同的语音问候。GotoIfTime()程序的语法如下:

GotoIfTime(times,days_of_week,days_of_month,months?label)

times:24小时值,比如:07:30-09:30

days_of_week:这是一周的一天或是多天的列表。这些天表示为 mon、tue、wed、thu、fri、sat 和 sun。周一到周五表示为 mon-fri。周二到周四表示为 tue,thu。

days_of_month:这是月的天数列表。天可以从 1 到 31,第七天到第 12 天表示为 7-12,第15 天到 30 天表示为 15-30。

Months:这是一年的一个或多个月的列表。月被写为 jan、feb、mar、apr 等等。如果你希望所有可能值与其他自变量匹配,简单输入*为自变量。

label:

相同的 extension(Exten)内的优先级,例如 10

相同上下文内的一个 extension 和优先级,如 123,10

一个上下文、extension 和优先级,如 incoming,123,10

在同一个 extension 内的命名过的 priority,如 passed

举例:

一个例子是:从上午 9 点到下午5:59,从周一到周五,一个月的任何一天,一年的任何一个月匹配。

Exten =>s,1,GotoIfTime(09:00-17:59, mon-fri, *, *? Open,5,1)

 

简而言之,当满足上述的时间的条件的时候,GotoIfTime()跳转主叫方到指定的 Label。

 

*语音邮件(Voicemail)

……

……

*宏指令(Macros)

*它包含多步的指令列表

拨号方案中的任何地方都会参考宏指令的改变而改变

现在假如在 Asterisk 系统中有一百个用户,这将涉及大量的复制的 extension。那么假设你需要改变一点你的 extension。那就涉及大量的编辑工作,你不能有任何错误相反,

你可以定义一个宏指令,它包含多步的指令列表,然后让所有的电话extension 指向这个宏指令。你要改变的就是这个宏指令,拨号方案中的任何地方都会参考宏指令的改变而改变。

*宏指令的名字必须以 macro-作为开始。这是他们与常规的上下文的区别。拨号方案中的宏指令的命令同其它任何命令很相似。*唯一的限制因素是宏指令只能用“s”extension。

我们增加语音邮件的逻辑到宏指令,改变 extension 为 s,如下:

[macro-voicemail]

exten =>s, 1, Dial ($ {JOHN}, 10, z)

exten =>s, 2, voicemail (u101@default)

exten =>s,102, voicemail (b101@default)

*调用宏指令:

exten =>101,1,Macro(voicemail)

Macor中几种特别的变量:

$ {MACRO_CONTEXT}  这个被调用的宏中,初始的上下文

${MACRO_EXTEN}     这个被调用的宏中,初始的 extension

${MACRO_PRIORITY}  这个被调用的宏中,初始的优先级

${ARGn}    传递到宏指令的第 n 个变量。例如第一个自变量是${ARG1},第二个是${ARG2}等等。

 

*Asterisk 数据库

Asterisk 提供了一个强大的机制,来存储数值,这叫做 Asterisk 数据库(AstDB)。这个数据库提供了一个简单的方式,用来存储拨号方案的数据。

存储:

exten =>456, 1, Set(${DB(test/count)=1})

我们使用 Set()应用,在 Asterisk 数据库中存储一个新的数值,而不是使用它去设置一个通道变量。

查询:

exten =>456, 1, Set(DB(test/count)=1)

exten =>456,2, Set(COUNT=${DB(test/count)})

exten =>456, 3, SayNumber(${COUNT})

删除:

Exten =>457, 1, DBdel(test/count)

也可以使用 DBdeltree()应用删除键值分组

 

*Asterisk特征

已经加入到Asterisk的流行的函数:

Zapateller()

call parking       有点咨询转的意思

 

使用MeetMe()进行会议

主要特性:

创建密码保护的会议

会议管理(将电话会场静音、锁定会议、断开某个参与者)

允许一个人讲话,其他的人安静的可选项(常常用在公司的会议,广播等情况)

创建动态或是静态会议

我们设置一个基本会议室,MeetMe 会议系统的配置项是在 meetme.conf 中。

例如,我们设置一个extension 为 600 的会议室。首先,我们将在 meetme.conf 中设置会议室,称作 600。而这次我们没有设置密码:[rooms]Conf => 600现在配置文件完成了,我们需要

重启 Asterisk 让他能重新读取 meetme.conf文件。下一步,我们使用 meetme()应用,把支持会议室的特性增加到拨号方案中。MeetMe()有三个参数:会议室的名字(定义在 meetme.conf)、

一组选项设置以及用户加入会议的密码。

exten => 600,1,MeetMe(600,i,54321)  房间是 600,“i”可选项(通知用户进入和退出会议) 54321是密码

 MeetMeCount()  记录会议室用户数量

 

 

**********VOIP协议*********通过 IP 分组网络传输电话连接*********

  IAX

IAX 协议是 Digium 开发用来与其他 Asterisk 服务器通信的(因此叫 Asterisk内部交换协议)。IAX 是一个传输协议(非常像 SIP),

它使用一个单独的 UDP端口(4569)来传输通道信号和实时传输协议(RTP)流。

 

SIP

H.323

MGCP

Skinny/SCCP

UNISRIM

编码的含义是它将语音转换成数字信号然后在因特网上传输。

带宽在任何地方都是有限的,

而任何特定连接的并发通话数目可以直接与使用的编解码类型有关。

G.711

G.726

G.723.1

G.729A

GSM

iLBC

168

Speex

MP3

VoIP 最基本的前提是为了在以因特网协议为基础的网络上传输而将语音流信息包化。

 

***Asterisk和VOIP***

Asterisk 喜欢 VoIP 应该是一件不让人感到惊讶的事情。但是为了这么做,Asterisk 需要知道它在执行哪个函数:包括客户端的,服务器端的,或者是它们两个的。

Asterisk 中最复杂并且经常容易混淆的概念就是出入系统的认证的命在名。

***Users,Peers 以及 Friends***

连接中对我们的认证,或者我们认证连接方,在 iax.conf 和 sip.conf 文件中以 users 和 peers 的方式定义。如果双方都要认证,那么使用 friends 进行定义。

*Users

定义为 user 的连接是我们允许对我们进行连接的任何一个系统、用户或终端。

*Peers

在一个连接中定义的 peer 类型是呼出连接。

 

 

********Asterisk网关接口(AGI)*********

Asterisk 网关接口(AGI)为外部程序控制 Asterisk 拨号方案提供了一个标准接口。

*AGI 通信的基本原则

AGI 脚本通过通信通道与 Asterisk 通信,而不是通过 API 方式来编程。这些通道是一些文件指针,实际编程中有标准输入 STDIN、标准输出 STDOUT 和标准错误 STDERR。

 

*呼叫详细纪录(Call Detail Record,CDR)

缺 省 情 况 下 , Asterisk 将 创 建 CSV* 文 件 , 这 些 文 件 存 放 在/var/log/asterisk/cdr-csv/目录中。

 

*从Dialplan录制声音

这一小段附加的文字能够使你的拨号方案支持你很容易的创建录音,录音将创建在系统的/tmp/文件夹(在这儿你可以重命名或者将其转移到别的地方):

exten => _66XX,1,Wait(2)

exten => _66XX,2,Record(/tmp/prompt${EXTEN:2}:wav)

exten => _66XX,3,Wait(1)

exten => _66XX,4,Playback(/tmp/prompt${EXTEN:2})

exten => _66XX,5,Wait(2)

exten => _66XX,6,Hangup()

 

 

 


 回到顶部