asterisk——变量、模式匹配、表达式

变量

1.引用变量(两种方式)

        要引用变量,只需要输入变量的名字。要引用变量的,则必须输入美元符号、左花括号、变量名和右花括号。

same => n,Set(SomeDigits=543)
same => n,SayDigits(${SomeDigits})

2.变量的三种类型

        在dialplan中使用三种类型的变量:全局变量信道变量环境变量

全局变量

        设置全局变量:设置全局变量有两种方法:
 方法一:全局变量应该在extensions.conf文件开头[globals]这个上下文中声明。定义方法如下:

  [global]
  jhon=sip/8003
  smith=sip/8002

 方法二:在extension中使用SetGlobalVar(),或者Set( ,g)来定义全局变量:

  exten => s,1,SetGlobalVar(A=1)  ;一种写法
  exten => s,1,Set(A=1,g)  ;另一种写法,这个g就是global的意思。

信道变量

        信道变量是一种只与特定呼叫关联的变量。与全局变量不同,信道变量只在当前呼叫发生期间定义,并且只对参与该呼叫的信道有效。通道变量使用 Set( )应用来设置 :

  exten => 123,1,Set(MAGICNUMBER=42)

环境变量

        环境变量是一种在Asterisk中访问Unix环境变量的方法。在dialplan中使用ENV()函数引用Unix环境变量。语法类似于${ENV(var)}。

3.拼接变量

        要把变量拼接起来,只需要将它们放在一起就可以了,例如:

same => n,Set(ONETWO=12)
same => n,Set(THREEFOUR=34)
same => n,SayDigits(${ONETWO}${THREEFOUR})
same => n,SayDigits(2${ONETWO}3)

4.继承信道变量

        信道变量总是与设置它们的源信道相关联,一旦发生信道转移,相应的信道变量就不能再使用。 为了让信道变量能够跟随信道一起转移,必须使用信道变量继承机制。有两个修饰符可以实现:单下划线(_)和双下划线(__)。

        使用单下划线(_)修饰的信道变量在发生信道转移时只能够被继承一次,之后再发生信道转移就不能再。shi例:

exten => example,1,Set(_MyVariable=thisValue)

        使用双下划线(__)修饰的信道变量在信道的整个生命周期内始终能够被继承。实例:

exten => example,1.Set(__MyVariable=thisValue)

        在读取信道变量的值时,不要使用下划线:

exten => example,1,Verbose(1,,Value of MyVarialbe is: ${MyVariable})

模式匹配

        模式总是从一个下划线(_)开始,这告诉Asterisk我们是在匹配一个模式,而不是一个具体的分机名字。

模式匹配的字符
X表示匹配0-9之间的任意一个数字
Z表示匹配1-9之间的任意一个数字
N表示匹配2-9之间的任意一个数字
.(period)表示匹配一个或多个字符,不管它们是什么字符。
[15-7]匹配指定范围的一个数字。在这个例子中的样式要求匹配一个 1,以及 5,6,7 中的任意一个数字 。
!(bang)通配符;匹配零个或多个字符,不论它们是什么字符。还有一种说法是这个“!”表示:“只要清楚的不满足context中其他的类型匹配,就会执行此匹配对应的动作。 (this is known as 'overlap dialing'). 感觉像却缺省路由。

        关于模式匹配,还有一件重要的事情需要了解,如果Asterisk发现有不止一个模式匹配分机,它会使用最精确的那个(从左到右)。假设你已经定义了以下两种模式,此时一个呼叫者拨打555-1212:

exten => _555XXXX,1,Answer()
          same => n,SayDigits(${EXTEN})

exten => _55512XX,1,Answer()
          same => n,Playback(tt-monkeys)

        在这个实例中会选择第二个分机,因为它更精确。

使用${EXTEN}信道变量

        如果你使用了匹配模式,但又想知道实际拨打的号码是什么,输入${EXTEN}信道变量。当拨打一个分机时,Asterisk将${EXTEN}信道变量设置为接收到的数字。我们用SayDigits()来证明这一点,SayDigits()会回读所拨打的分机。

exten => _555XXXX,1,Answer()
          same => n,SayDigits(${EXTEN})

        有时候需要将${EXTEN}的前几个数字剥离掉,可以通过使用${EXTEN:x}语法来实现,其中x表示的是要返回的字符串的起始位置(从左往右数)。例如,如果${EXTEN}的值是95551212,${EXTEN:1}就等于5551212。再举个例子:

exten => _XXX,1,Answer()
      same => n,SayDigits(${EXTEN:1})

        ${EXTEN}变量还有一种${EXTEN:x:y}语法,其中x起始位置y是要返回的数字个数。对于下面这个拨号字符串:94169671111
        我们可以使用${EXTEN:x:y}表达式提取以下数字字符串:

${EXTEN:1:3}提取出416。
${EXTEN:4:7}提取出9671111。
${EXTEN:-4:4}从倒数第四个数字开始,并且返回四个数字,提取出1111。
${EXTEN:2:-4}跳过前两个数字,并且不包括最后四个数字,提取出16967。
${EXTEN:-6:-4}从倒数第六个数字开始,并且不包括最后四个数字,提取出67。
${EXTEN:1}返回第一个数字后的所有数字,提取出4169671111(如果返回的数字个数为空的话,就会返回所有剩余的字符串)。

        这是一个非常强大的表达式,但在正常使用中,大部分用法并不多见。多数情况下,如果你需要删除外部访问代码 ,将使用${EXTEN}(或可能是${EXTEN:1})。

表达式

在asterisk中表达式要使用“$[]”给括起来,也就是$[表达式] ,例如:

$[${num} + 1]  ;将变量num的值加1
$[${num} / 3]  ;将变量num的值除以3

看下面的一个exten:

exten=>321,1,set(num=3)
exten=>321,2,set(newnum=$[${num} + 1])
exten=>321,3,SayNumber(${newnum})

要注意的是:运算符要和数字之间隔开

文章内容参考和来源于:《Asterisk权威指南(第5版)》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值