Asterisk之Dialplan编程一般规则

1. 变量设置

使用 Set() 来创建和修改变量:

exten => 1002,1,Set(Favoriteanimal = "Tiger")
exten => 1002,n,Set(Favoritenumber = 23)

使用 ${VARIABLENAME} 来读取和打印变量值. 可以在CLI界面打印变量名,通过NoOp()函数。 (verbosity level >=3 ):

exten => 1003,1,NoOp(${Favoriteanimal})
exten => 1003,n,NoOp(${Favoritenumber})
2.几种变量类型
	2.1全局变量,在Dialplan的所有条目中均有效,其设置为:<span style="font-family:Courier New;">Set(<variable>=<content>,g)</span>
<span style="font-family:Courier New;">	exten => 1004,1,Set(READABLEANYWHERE = 23,g)
	exten => 1004,n,NoOp(${READABLEANYWHERE})</span>
<span style="font-family:Courier New;">	2.2通道(channel)变量,只在当前通道中有效,<span style="font-family:Verdana;">其设置为:</span><span style="font-family:Courier New;">Set(<variable>=<content>)</span></span>
<span style="font-family:Courier New;">	e</span><span style="font-family:Courier New;">xten => 1005,1,Set(READABLEHEREONLY= 42)
	exten => 1005,n,NoOp(${READABLEHEREONLY})</span>
<span style="font-family:Courier New;">	2.3系统变量,是指Asterisk预先定义的变量,可以在Dialplan中直接使用,其中的EXTEN表示当前被叫号码</span>
<span style="font-family:Courier New;">	exten => 1006,1,NoOp(Dialed number: ${EXTEN})</span>
<span style="font-family:Courier New;">	对于如下的语句:</span>
<span style="font-family:Courier New;">	exten => 100,1,Dial(SIP/100)
	exten => 101,1,Dial(SIP/101)
	exten => 102,1,Dial(SIP/102)
	exten => 103,1,Dial(SIP/103)
	exten => 104,1,Dial(SIP/104)
	exten => 105,1,Dial(SIP/105)
	exten => 106,1,Dial(SIP/106)
	exten => 107,1,Dial(SIP/107)
	exten => 108,1,Dial(SIP/108)
	exten => 109,1,Dial(SIP/109)
	可以用变量一句话就可以搞定了:</span>
<span style="font-family:Courier New;">	exten => _10X,1,Dial(SIP/${EXTEN})</span>
  • <span style="font-family:Courier New;">对于字符串变量,定义时最好用双引号括起来:</span>
<span style="font-family:Courier New;">	exten => 1234,1,Set(FRUITTYPES="Apple, Pear, etc.")</span>
  • <span style="font-family:Courier New;">保留的字符:[ ] $ " /</span>
<span style="font-family:Courier New;">	如果要使用保留字符的时候,使用/前置,如:</span>
<span style="font-family:Courier New;">	exten => 1234,1,Set(AMOUNT="/$10.00")</span>
  • <span style="font-family:Courier New;">在extensions.conf中定义全局变量</span>
<span style="font-family:Courier New;">	全局变量的定义必须放在[globals]中,[globals]放在[general]后,如下例所示:</span>
<span style="font-family:Courier New;">	[general]

	[globals]
	RINGTIME=90

	[from-intern]
	exten => _XXX,1,Dial(SIP/${EXTEN},${RINGTIME})
	exten => _XXX,n,VoiceMail(${EXTEN})
	</span>
  • <span style="font-family:Courier New;">Set()函数的格式:Set(<variable1>=<value1>[,<variable2>=<value2>][,<option>]) </span>
<span style="font-family:Courier New;">	; Set a global variable:
	exten => 10,1,Set(RINGTIME=90,g)

	; Set a local channel variable:
	exten => 10,2,Set(FAVORITEFRUIT="Apple")

	; Set two channel variables at once:
	exten => 10,3,Set(VAR1=10,VAR2=23)

	; Print variables to the CLI
	exten => 10,4,NoOp(RINGTIME = ${RINGTIME})
	exten => 10,5,NoOp(FAVORITEFRUIT = ${FAVORITEFRUIT})
	exten => 10,6,NoOp(VAR1 = ${VAR1})
	exten => 10,7,NoOp(VAR2 = ${VAR2})</span>
  • <span style="font-family:Courier New;">系统定义的一些变量:</span>
<span style="font-family:Courier New;">	</span><dt><span class="term"><code class="code">${ANSWEREDTIME}</code> :通话时长(以秒为单位)</span></dt>

${BLINDTRANSFER} :盲转的通道名称(The name of the channel on the other side of a blind transfer.)

<dt><span class="term"><code class="code">${CHANNEL}</code> :当前通道名称</span></dt><dt>
</dt><dt><span class="term"><code class="code">${CONTEXT}</code> :当前的上下文</span></dt>

${EPOCH} :当前的Unix时间(从Unix“epoch"运行开始的总秒数,1970,1,1,0点)

<dt><span class="term"><code class="code">${EXTEN}</code> :当前的被叫号码</span></dt><dd><p> </p></dd><dt><span class="term"><code class="code">${ENV(VARIABLENAME)}</code> :系统环境变量VARIABLENAME的值</span></dt>

${HANGUPCAUSE} :拆线的原因

${INVALID_EXTEN}Used in the i extension and contains the dialed extension.

<dt><span class="term"><code class="code">${PRIORITY}</code> :当前分机的优先值(</span>Current priority in the current extension.)</dt><dt>
</dt><dt><span class="term"><code class="code">${TRANSFER_CONTEXT}</code> :被转移的呼叫的上下文(</span>Context of a transferred call.)</dt><dt>
</dt><dt><span class="term"><code class="code">${UNIQUEID}</code> :当前连接的唯一ID值(</span>The unique ID for the current connection.)</dt><dt>
</dt><dt><span class="term"><code class="code">${SYSTEMNAME}</code> :定义在<span style="font-family:Courier New;">/etc/asterisk/asterisk.conf中的systemname值</span></span></dt>
  • 字符串的操作:${VARIABLENAME[:start[:length]]}
<dd>例子1:如果用户拨9出局引示号,然后拨被叫号码,9不应该发出局。</dd><dd>exten => _0X.,1,Set(OUTGOINGNUMBER=${EXTEN:1})  //此时OUTGOINGNUMBER=实际的被叫号码</dd><dd>例子2:如果只需被叫号码的后7位的话,那么应该如此:</dd><dd>exten => _0X.,1,Set(LOCALNUMBER=${EXTEN:-7})</dd><dd>例子3:截取被叫号码从第2位开始,3位号码长度:</dd><dd>exten => _0X.,1,Set(AREACODE=${EXTEN:2:3})</dd>

3. Label 和 Goto()语句

<p>在一个条目中的跳转:</p><pre name="code" class="programlisting">	exten => 1007,1,Answer()
	exten => 1007,n(Start),Wait(1)
	exten => 1007,n,Playback(hello-world)
	exten => 1007,n,Goto(Start)
  • 在两个条目中的跳转:

    	exten => 1008,1,Answer()
    	exten => 1008,n,Goto(1009,Ping)
    
    	exten => 1009,1(Ping),Playback(hello-world)
    	exten => 1009,n,Wait(2)
    	exten => 1009,n,Goto(1010,Pong)
    
    	exten => 1010,1(Pong),Playback(tt-weasels)
    	exten => 1010,n,Wait(2)
    	exten => 1010,n,Goto(1009,Ping)
  • 在 contexts 之间跳转:

    	[hq]
    	exten => 1011,1,Answer()
    	exten => 1011,n,Playback(hello-world)
    	exten => 1011,n,Goto(sales,1012,1)
    
    	[sales]
    	exten => 1012,1,Playback(hello-world)
    	exten => 1012,n,Hangup()
     
    4. While()循环
    	exten => 1013,1,Answer()
    	exten => 1013,n,Set(i=1)
    	exten => 1013,n,While($[${i} < 10])
    	exten => 1013,n,SayNumber(${i})
    	exten => 1013,n,Wait(1)
    	exten => 1013,n,Set(i=$[${i} + 1])
    	exten => 1013,n,EndWhile()
    	exten => 1013,n,Hangup()
    5. GotoIf()条件判断
    	exten => 1014,1,Answer()
    	exten => 1014,n,Set(Favoritestation = 0815)
    	exten => 1014,n,NoOp(Check to see if ${Favoritestation} is calling.)
    	exten => 1014,n,GotoIf($[${CALLERID(num)} = ${Favoritestation}]?yes,no)
    
    	exten => 1014,n(yes),Playback(hello-world)
    	exten => 1014,n,Hangup()
    
    	exten => 1014,n(no),Playback(tt-monkeys)
    	exten => 1014,n,Hangup()
    6. Gosub()子程序
    	exten => 1015,1,Gosub(cid-set)      // 1 <------------ 
    	exten => 1015,n,Dial(SIP/${EXTEN})   //4 <-----------
    
    	exten => 1015,n(cid-set),Set(CALLERID(all)=Apfelmus GmbH <012345678>)   //2 <------
    	exten => 1015,n,Return()      //3 <---------
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值