asterisk学习笔记5--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的所有条目中均有效,其设置为:Set(<variable>=<content>,g)
	exten => 1004,1,Set(READABLEANYWHERE = 23,g)
	exten => 1004,n,NoOp(${READABLEANYWHERE})
	2.2通道(channel)变量,只在当前通道中有效,其设置为:Set(<variable>=<content>)
	exten => 1005,1,Set(READABLEHEREONLY= 42)
	exten => 1005,n,NoOp(${READABLEHEREONLY})
	2.3系统变量,是指Asterisk预先定义的变量,可以在Dialplan中直接使用,其中的EXTEN表示当前被叫号码
	exten => 1006,1,NoOp(Dialed number: ${EXTEN})
	对于如下的语句:
	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)
	可以用变量一句话就可以搞定了:
	exten => _10X,1,Dial(SIP/${EXTEN})
  • 对于字符串变量,定义时最好用双引号括起来:
	exten => 1234,1,Set(FRUITTYPES="Apple, Pear, etc.")
  • 保留的字符:[ ] $ " /
	如果要使用保留字符的时候,使用/前置,如:
	exten => 1234,1,Set(AMOUNT="/$10.00")
  • 在extensions.conf中定义全局变量
	全局变量的定义必须放在[globals]中,[globals]放在[general]后,如下例所示:
	[general]

	[globals]
	RINGTIME=90

	[from-intern]
	exten => _XXX,1,Dial(SIP/${EXTEN},${RINGTIME})
	exten => _XXX,n,VoiceMail(${EXTEN})
	
  • Set()函数的格式:Set(<variable1>=<value1>[,<variable2>=<value2>][,<option>]) 
	; 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})
  • 系统定义的一些变量:
	
  
  
   
   ${ANSWEREDTIME} :通话时长(以秒为单位)
  
  

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

 
 
  
  ${CHANNEL} :当前通道名称
 
 
 
 
 
 
  
  ${CONTEXT} :当前的上下文
 
 

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

 
 
  
  ${EXTEN} :当前的被叫号码
 
 
 
 

 

${ENV(VARIABLENAME)} :系统环境变量VARIABLENAME的值

${HANGUPCAUSE} :拆线的原因

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

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

3. Label 和 Goto()语句

在一个条目中的跳转:

	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 <---------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值