asterisk学习资料(2)

拨号方案语法
   
    Asterisk的拨号方案在文件extensions.conf中定义(/etc/asterisk/extensions.con)
    extensions.conf(四部分:context,extension,priorities,application)
    context:用于对extensions组命名,把拨号方案的不同部分进行分离,免得交织在一起.
    表示方法是把名字放在[]的中间,名字只能用a~z,A~Z,0~9,以及连字号和下划线组成(空格不在允许的字符里面,context中不要使用空格).:[context1],[incoming],[default];所有放在context定义的之后的指令都是这个context一部分,直到下一个context定义的开始.
    context的一个重要用途就是加强安全性.如果没有仔细设计拨号方案,可能会造成别人盗用你的系统的不良后果.
    extensions:extensionsasterisk要执行的指令,由来电或通道上所拨数字来触发.可以定义电话分机  
    extension的语法是单词exten后面跟着一个由等号和大于号组成的箭头,:exten => extension的名字
    一个完整的extension由三部分组成:


extensions的名字或号码
priority(每个extension可以有多个步骤,步骤的编号称作priority)

    应用 ( 或者命令 ), 针对呼叫完成一些动作
    这三个部分用英文逗号分开 , :

    exten => name,priority,application()

    priorities : 每个 extension 都可以有几个步骤 , 称作 priorities 。如 :

exten=>50001,1,Answer()  #编号为1priority,执行接听电话
exten=>50001,2,Hangup()  #编号为2priority,然后挂电话

    必须确保 priority 1 开始并且连续的编号
    application : 动作 , 比如 : 播放声音 , 接受音频拨号输入或者挂断电话等 .
Application
Answer(),Playback() Hangup() 应用
    Answer() 应用于接听正在响铃通道 , 它不需要任何参数 .
    Playback() 应用在通道上播放事先录制好的语音文件 . 指定一个文件名 ( 不带扩展名 ), 可以使用绝对路径与相对路径 .
   Hangup() 应用在于挂断一个正在活动的通道 .
Background(),Goto() 应用
   Background() 它也播放事先录制好的语音文件 , 但它等待按键 , 然后执行对应 extension.
    防止 Background() 后超出按键范围 , 使用 i 来解决问题 .
    防止 Background 长时间没有选择 , 使用 t 来决解问题 .
   Goto() 应用使得在拨号方案的不同部分有序的转移非常容易 .
     Goto() 应用有三个参量分别是 context,extension, priority. Goto(context,extension,priority)
Dial() 应用
   Dial() 4 个参量 ,
    第一个是 : 呼叫的被叫地 ( 传输技术 / 远地资源 ) :SIP/50000 Zap/1. 可以同时拨打多个通道如 :

exten => 601,1,Dial(Zap/1&SIP/50000&IAX/60000)

    第二个是 : 超时 , 单位 " ". 给定超时参量 Dial 会一直对被叫地进行呼叫 , 直到超时后才放弃 , 如果没有给定 , 将直到接听或主叫挂机 , 如果呼叫在超时前接听 , 通道就被桥接 , 拨号完成
  补充 : 如果超时后被叫地没有应答 , 则会继续 Dial() extension 下一个 priority. 如果被叫地通道忙 ,Dial() 将转到 priority n+101(n Dial() 被调用的 priority), 如果存在的话 , 将能够处理被叫地忙的方式接叫未接电话 .
    第三个是 : 可选择参量 , 它会可以影响到 Dial() 的行为 , :

exten => 601,1,Dial(SIP/50000,30,Ttwr)

  其中 T 表示允许主叫用户按 "#" 转接呼叫 ;t 表示允许被叫用户按 "#" 转接呼叫 ;r 表示为被叫用户产生振铃声 ;w 用户按 "*" 键开始录音 .
    最后一个是 :URL 参量 . :

exten => 601,1,Dial()
exten => 602,1,Dial(Zap/1/5732381)

任何参量都可以为空如 :

exten => 601,1,Dial(SIP/60000,,T)

exten => 601,1,Dial(SIP/60000)

综合上面举个例子 :

[test]
exten => s,1,Answer()
exten => s,2,Background(enter-ext-of-person)
exten => 601,1,Dial(Zap/1,30,Ttrw)
exten => 601,2,Playback(vm-nobodyavail)
exten => 601,3,Hangup()
exten => 601,102,Playback(tt-allbusy)
exten => 601,103,Hangup()
exten => 602,1,Dial(SIP/50000,30,Ttrw)
exten => 602,2,Playback(vm-nobodyavail)
exten => 602,3,Hangup()
exten => 602,102,Playback(tt-allbusy)
exten => 602,103,Hangup( )
exten => i,1,Playback(pbx-invalid)
exten => i,2,Goto(test,s,1)
exten => t,1,Playback(vm-goodbye)
exten => t,2,Hangup()

Extension, 不能多于 80 个字符 , 也不能少于 1 个字符 (601/602) 
------2007-01-05- 修改
变量  
在拨号方案中使用变量可以减少打字、增加清晰度 , 也有助于在拨号方案中加入逻辑 .
这里的变量有全局变量 , 通道变量和环境变量 .
全局变量 :
  全局变量应该在 extensions.conf 文件的开始利用 [globals] 这个 context 定义或利用 SetGlobalVar() 应用 . :

[globals]
80000=Zap/1

[internal]
exten => 123,1,SetGlobalVar(80000=Zap/1)

通道变量
  通道变量与特定的呼叫相关的变量 , 通道变量只能在当前呼叫存在其间定义 , 并只能用于参与该呼叫的通道 . 通道变量使用 Set() 应用来设置 . :

exten => 601,1,Set(80000=Zap/1)

环境变量
  环境变量是一种在 Asterisk 中访问操作系统环境变量的方法 . 这些变量以 ${ENV(var)} 形式引用 , 其中的 var 是所要引用的操作系统环境变量 .
  综合上面举例 :

[globals]
PSTN=Zap/1
TEST=SIP/80000
[test]
exten => s,1,Answer()
exten => s,2,Background(enter-ext-of-person)
exten => 101,1,Dial(${PSTN},10)
exten => 101,2,Playback(vm-nobodyavail)
exten => 101,3,Hangup()
exten => 101,102,Playback(tt-allbusy)
exten => 101,103,Hangup()
exten => 102,1,Dial(${TEST},10)
exten => 102,2,Playback(vm-nobodyavail)
exten => 102,3,Hangup()
exten => 102,102,Playback(tt-allbusy)
exten => 102,103,Hangup()
exten => i,1,Playback(pbx-invalid)
exten => i,2,Goto(incoming,s,1)
exten => t,1,Playback(vm-goodbye)
exten => t,2,Hangup()
[default]
exten => 101,1,Dial(${PSTN},,r)
exten => 102,1,Dial(${TEST},,r)

模式匹配
模式匹配
  使用模式及匹配是用不同的字母和符号来代表可能要匹配的数字 . 模式总是用一个下划线 (_) 开始 , 它告诉 Asterisk 要做模式匹配 , 这不是一个 extension 名字 .( 这意味着不能使用下划线作为 extension 名字的开始字符 .)
模式匹配语法
  在下划线之后,可以使用一个或者多个下面列出来的字符 :

X:匹配 0-9 的任何数字;
Z:匹配 1-9 的任何数字;
N:匹配 2-9 的任何数字;
.(句号)通配符,匹配一个或多个字符;
[15-7]:匹配1,5,6,7; 

  使用 ${EXTEN} 通道变量 :Asterisk 会把通道变量 ${EXTEN} 设置为所拨的数字 . 通过 sayDigits() 检测拨到号码内容如 :

exten => _9XXXXXXX,1,SayDigits(${EXTEN})
;SayDigits()应用会把所拨的8extension读出来
exten => _9XXXXXXX,1,SayDigits(${EXTEN:1})
;只读出来后7位数,其中"1"表示不拨前面1位数
exten => _9XXXXXXX,1,SayDigits(${EXTEN:-1})
;只读出来最后1,其中"1"表示只拨出最后1位数

去话拨号 (PSTN)
举例 : "9" 后拨打外线 , 去电时 , 去除 "9"; 加放 "ignorepat => 9" 是为了使按完 "9" 后还可以听到拨号音 ; 加入 "Congestion()" 应用是挂机或忙的时候播放快忙音 ( 拥挤声音 ).

---本地去话拨号---
[outbound-local]
ignorepat => 9
exten => _9NXXXXXX,1,Dial(Zap/1/${EXTEN:1})
exten => _9NXXXXXX,2,Congestion()
exten => _9NXXXXXX,102,Congestion()
---再加入紧急电话拨号---
exten => 9119,1,Dial(Zap/1/119)
exten => 119,1,Dial(Zap/1/119)
exten => 9110,1,Dial(Zap/1/110)
exten => 110,1,Dial(Zap/1/110)
---长途电话拨号---
[outbound-long]
exten => _90NXXNXXXXXX,1,Dial(Zap/1/${EXTEN:1})
exten => _90NXXNXXXXXX,2,Congestion()
exten => _90NXXNXXXXXX,102,Congestion()

Includes
Asterisk 通过 Includes 实现在一个 context 中使用另一个 context. 格式 :includes => context

[internal]
include => outbound-local
include => outbound-long
exten => _80XXX,1,Dial(SIP/${EXTEN},30,r)
exten => _80XXX,2,Playback(vm-nobodyavail)
exten => _80XXX,3,Hangup()
exten => _80XXX,102,Playback(tt-allbusy)
exten => _80XXX,103,Hangup()

表达式和可变操作
表达式
  表达式是变量 , 运算符和数值的联合 , 当你把它们组合到一起就会得到一个表达式结果 . Asterisk 中,表达式总是以 $ 符合作为开始,以方括号 “[]” 来扩住表达式 . :

$[expression]
$[${COUNT} + 1]
$[${COUNT} / 2]
;引用变量,必须把这个变量名用花括号"{}"括起来,而且在前面加上美元符号"$" 标示出来

运算符
   布尔型运算符
   expr1 | expr2("|" 或运算 ): 如果 expr1 的值是真值 , 那么运算符将赋 expr1 的值 , 否则将赋 expr2 的值 .
   expr1 & expr2("&" 与运算 ): 如果两个表达式的值都为 true, 运算符将赋值为 expr1, 否则赋值为 0.
   expr1{=,>,>=,<,<=,|=}expr2: 如果自变量都是整数 , 这些运算符将得到一个整数的比较结果 ; 否则 , 它们将得到字符串的结果 . 如果给定的关系是正确地 , 这个结果是 1, 否则就是 0.
   数学运算符
   expr1{+, -}expr2: 运算符能得到整数自变量的加法或者减法地结果 .
   expr1{*,/,%}expr2: 运算符能分别得到整数自变量的乘法 , 除法或是余数的结果 .
  正则表达式运算符
   expr1 : expr2: 运算符匹配 expr2 expr1, 这里的 expr2 必须是一个正则表达式 .
   ***Asterisk 的分析程序非常简单 , 因此在你输入时 , 在运算符和其他数值之间至少需要一个空格 .
拨号方案函数
    拨号方案函数可以使你增加更多的功能到你的表达式中 .
语法
    基本语法 :FUNCTION_NAME(argument). 如果要引用函数的值 , 和引用变量的值一样 , 用美元符号 “ $” 加上花括号 “{}” 括起函数表达式 . :

${FUNCTION_NAME(argument)}

函数也可以嵌套封装其他的函数 , :

${FUNCTION_NAME(${FUNCTION_NAME(argument)})}

拨号方案函数  
  函数常常用来连接 set() 应用 , 来取得或者赋值一个变量的值 . 举个例子 , 计算一下一个字符串的长度 , 并读出这个长度 ;

exten=>123,1,set(TEST=example)      ;赋值example变量给TEST
exten=>123,2,saynumber(${LEN(${TEST})})  ;计算出变量TEST长度,并读出长度数
结果是:7

  如果我们要设置一个动态通道的超时 , 应该用 TIMEOUT() 函数 . 这个函数可以接受以下三个中的一个做为自变量 , 分别是 absolute,digit response. 他们对应的应用是 AbsoluteTimeout(),DigitTimeout() ResponseTimeout(). timeout() 函数 , 设置数字的超时 , 我们可以 set() 函数 , :

exten=>s,1,set(TIMEOUT(digit)=30) 

   *** 这个函数中没有 ${}. 它和给一个自变量赋值一样 , 我们就赋值给一个函数 , 是不使用 ${} 封装的 .

你可能感兴趣的:(职场,asterisk,休闲)