走遍中国乌托邦电脑技术 → 一些SET的参数,DIAL的。


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

主题:一些SET的参数,DIAL的。

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


加好友 发短信
等级:超级版主 帖子:79 积分:960 威望:0 精华:0 注册:2011/4/16 21:27:45
一些SET的参数,DIAL的。  发帖心情 Post By:2018/1/1 13:21:17 [只看该作者]


X            匹配0-9的任何数字.
Z            匹配1-9的任何数字
N            匹配2-9的任何数字
[15-7]      匹配任何数字或者指定的数字范围.在这个例子中,匹配1,5,6或7.
.(句号)      通配符,匹配一个或多个字符.

9|.是去掉号码前面的9,
0755|.是去掉号码前面的0755
X代表一个0-9中的任意一个数字
Z代表一个1-9中的任意一个数字
N代表一个2-9中的任意一个数字
|号代表去掉号码前面的指定数字
+号代表在号码前面加指定数字

‘s’是个特别的分机——它处理环境中任何的输入,没有特定目标。S意味着开始。
 
应该在匹配了其他数字之后在使用通配符,如:
_.     实际上,如果你试图使用它,Asterisk会警告你.如果可能,尽量使用下面的模式:
_X.
   若要在拨号方案中使用模式匹配,只要把模式放在extension名字的位置:

! -      非匹配



Background() 应用程序: 它与 playback() 非常像, 只是在播放语音的时候,如果用户拨打号码,语音中断,然后呼叫那个分机。



调用Congestion()应用,播放"快忙音"(拥挤声音)让主叫方知道呼叫不成功.


[outbound-local]
exten=>_9NXXXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN:1})       ;
OUTBOUNDTRUNK表示从哪里出局

exten=>_9NXXXXXX,2,Congestion()
exten=>_9NXXXXXX,102,Congestion()

exten=>911,1,Dial(${OUTBOUNDTRUNK}/911)                             ;可以拨打911
exten=>9911,1,Dial(${OUTBOUNDTRUNK}/911)



[outbound-long-distance]
exten=>_9NXXXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN:1})
exten=>_91NXXNXXXXXX,2,Congestion()
exten=>_91NXXNXXXXXX,102,Congestion()


${VARIABLENAME[:start[:length]]}

1、exten => _0X.,1,Set(OUTGOINGNUMBER=${EXTEN:1})  //此时OUTGOINGNUMBER=实际的被叫号码,把0删除了。

2、如果只需被叫号码的后7位的话,那么应该如此:exten => _0X.,1,Set(LOCALNUMBER=${EXTEN:-7})

3、截取被叫号码从第2位开始,3位号码长度:exten => _0X.,1,Set(AREACODE=${EXTEN:2:3})

Set()函数的格式:Set(<variable1>=<value1>[,<variable2>=<value2>][,<option>]) 

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

exten => 1002,1,Set(Favoriteanimal = "Tiger")
exten => 1002,n,Set(Favoritenumber = 23)
exten => 1004,1,Set(READABLEANYWHERE = 23,g)
exten => 1004,n,NoOp(${READABLEANYWHERE}
exten => 1005,1,Set(READABLEHEREONLY= 42) exten => 1005,n,NoOp(${READABLEHEREONLY})

使用 ${VARIABLENAME} 来读取和打印变量值.

可以在CLI界面打印变量名,通过NoOp()函数。

exten => 1003,1,NoOp(${Favoriteanimal})
exten => 1003,n,NoOp(${Favoritenumber})
exten => 1006,1,NoOp(Dialed number: ${EXTEN}) ;${EXTEN}表示当前被叫号码

对于字符串变量使用“”括起来,保留的字符:[ ] $ "
exten => 1234,1,Set(FRUITTYPES="Apple, Pear, etc.")
exten => 1234,1,Set(AMOUNT="/$10.00") ;使用保留的字符串,应该使用/前置。

全局变量的定义必须放在[globals]中,[globals]放在[general]后
[general] [globals] RINGTIME=90 [from-intern]

exten => 10,2,Set(FAVORITEFRUIT="Apple") ;设置 exten => 10,3,Set(VAR1=10,VAR2=23) ;设置 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>

${ANSWEREDTIME} :通话时长(以秒为单位)
${BLINDTRANSFER} :盲转的通道名称
${CHANNEL} :当前通道名称
${CONTEXT} :当前的上下文
${EPOCH} :当前的Unix时间(从Unix“epoch"运行开始的总秒数,1970,1,1,0点)
${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值

exten=>123,1,Goto(context,extension,priority) ;可以到三个地方,[]、分机、序号

exten => 1007,1,Answer() exten => 1007,n(Start),Wait(1) exten => 1007,n,Playback(hello-world) exten => 1007,n,Goto(Start) ;回跳到Start

exten => 1008,1,Answer() exten => 1008,n,Goto(1009,Ping) ;跳到1009 exten => 1009,1(Ping),Playback(hello-world) exten => 1009,n,Wait(2) exten => 1009,n,Goto(1010,Pong) ;跳到1010 exten => 1010,1(Pong),Playback(tt-weasels) exten => 1010,n,Wait(2) exten => 1010,n,Goto(1009,Ping) ;跳到1009


[hq] exten => 1011,1,Answer() exten => 1011,n,Playback(hello-world) exten => 1011,n,Goto(sales,1012,1) ;跳到 contexts的[sales] [sales] exten => 1012,1,Playback(hello-world) exten => 1012,n,Hangup()

While()循环 e
xten => 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()

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()

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 <---------

  • exten => 321,1, set (COUNT=3)                                  //第一步,把COUNT变量设置了为3
  • exten => 321,2, set(NEWCOUNT=$[${COUNT}+1] )     //第二步,我们可以分解成  1:set(NWECOUNT=$[(3+1)]) 实际=set(NWECOUNT=$[4]) 2:即变量NWECOUNT=4
  • exten => 321,3,SayNumber(${NEWCOUNT})   

  • [aaa]  
  • exten => s,1,Answer()  
  • exten => s,n,Wait(3)  
  • exten => s,n,Set(voip=9)                                              ;赋值变量voip=9  
  • exten => s,n,Set(num=$[${voip}+1])                            ;这时候已通过运算加1,num的值为10  
  • exten => s,n,Goto(aaa,s,${num})                                  ;引用变量值.Goto到10  
  • exten => s,10,Playback(cn/111)                                      ;然后到了这一步

  • [aaa] 

    exten => s,1,Answer() 

    exten => s,n,Wait(3)                                                   ;等待3秒 

    exten => s,n,Set(voip=1)                                             ;设置变量voip=1 

    exten => s,n,GotoIf($[${voip}=1]?:10:11)                     ;这里引用变量值运算,测试值1=1 为真 返回 1  转人 流程 10 

    exten => s,10,Playback(cn/111) 

    exten => s,11,Playback(cn/222) 

    exten => Hangup() 



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


    times: 表示时间段,如: 9:00-18:00

    days_of_week :表示为一周中的哪一天,如果: mon-fri  周一到周日分别为: mon,tue,wed,thu,fri,sat,sun  全部则可以用  "*"号代替
    days_of_month :表示一个月的多少天,可以理解为没个月的多少号,如:1号到 8号 即:1-8  全部则可以用  "*"号代替
    months : 表示为 一年中的月份:如jan.....==,  一般情况下 代表全部 用 “*” 号比较多


    [text] 

    exten => _x.,1,Answer() 

    exten => _x.,n,GotoIfTime(9:00-18:00,mon-fri,*,*?to,${EXTEN},1) 

    exten => _x.,n,Goto(go,${EXTEN},1) 

    [to] 

    exten => _x.,1,Answer() 

    exten => _x.,n,Dial(SIP/${EXTEN}) 

    exten => _x.,n,Hangup() 

    [go] 

    exten => _x.,1,Answer() 

    exten => _x.,n,playback(xiab) 

    exten => _x.,n,Hangup() 

    ;这个时间条件说明,当前设定的时间和系统时间去判断,如果匹配的话,就转到to ,接通电话,不匹配则转到goto ,执行下面的流程,这样子 

    如果有上班时间段是 9:00-12:00 下午两点到六点 (14:00-18:00) 

    那么我们需要改下时间条件就OK,如下: 

    exten => _x.,n,GotoIfTime(9:00-12:00,mon-fri,*,*?to,${EXTEN},1) 

    exten => _x.,n,GotoIfTime(14:00-18:00,mon-fri,*,*?to,${EXTEN},1) 

    ;也就是说先让系统验证上午时间,然后在执行下面的流程,下面还有这样的一个流程,当然通话每一通电话会去一个一个做匹配判断的。所以就怎么简单 




    ; s 和 t分机
    exten => s,1,Background(enterux/welcome)
    exten => t,1,Hangup()
    ; 接受对201的呼叫
    exten => 201,1,Goto(s,1)
    ; GotoIf() 函数
    exten => 345,1,Set(TEST=greet)
    exten => 345,n,GotoIf([{TEST}=greet]?10:20)
    ; Asterisk 给 GotoIf传递一串参数
    exten => 345,10,Playback(weasels-eaten-phonesys)
    exten => 345,20,Playback(office-iguanas)
    ; 倒数,使用 GotoIf() 和命名的优先级
    exten => 346,1,Set(COUNT=10)
    exten => 346,n(say),SayNumber(${COUNT})
    exten => 346,n,Set(COUNT=[{COUNT}-1])
    exten => 346,n,GotoIf([{COUNT}>0]?say:thank)
    exten => 346,n(thank),Playback(auth-thankyou)
    exten => 346,n,Hangup()
    ; 基于Caller Id 识别的呼叫拒绝
    exten => 347,1,Set(REJECT_NUM=201) ; The number to be rejected (can also be done without a variable)
    exten => 347,n,Set(CALLER=${CALLERIDNUM})
    exten => 347,n,GotoIf([{CALLER}=${REJECT_NUM}]?reject-messege:welcome)
    exten => 347,n(reject-messege),Playback(abandon-all-hope)
    exten => 347,n,Hangup()
    exten => 347,n(welcome),Playback(welcome)
    exten => 347,n,Hangup()
    ; 不同的呼叫拒绝示例347
    exten => 348,1,GotoIf([{CALLERIDNUM}=201]?30:20)
    exten => 348,20,Goto(201,1)
    exten => 348,30,Playback(abandon-all-hope)
    exten => 348,n,Hangup()
    ; 按时间播放语音,利用GotoIfTime()函数
    exten => 349,1,Playback(good)
    exten => 349,n,GotoIfTime(04:00-11:59,*,*,*?good-morn)
    exten => 349,n,GotoIfTime(12:00-16:59,*,*,*?good-aft)
    exten => 349,n,GotoIfTime(17:00-03:59,*,*,*?good-eve)
    exten => 349,n(good-morn),Playback(morning)
    exten => 349,n(good-aft),Playback(afternoon)
    exten => 349,n(good-eve),Playback(evening)
    exten => 349,n,Hangup()
    ; Planning on holiday
    exten => 350,1,GotoIfTime(*,*,26,jan?closed,s,1)
    ; 以上的意思是说,如果是1月 26,按照以下的优先级别 1 of s 的close context分机优先级别,否则是open context的 1 of s extension
    ; 如下所示
    exten => 350,n,Goto(open,s,1)
    exten => 350,n,Hangup()
    [open]
    exten => s,1,Playback(welcome)
    exten => s,n,Hangup()
    [closed]
    exten => s,1,Playback(sorry2)
    exten => s,n,Hangup()



    s :是指Start extension,也就是当没有extension的时候就会执行这个流程(例如在模拟外线进线没有收到callerID的情况下就会转到这个extension来执行),另外在zapata.conf的channels段里面如果设定了immediate=yes程序就会自动找到s这流程来执行。
       

    t :是指timeout extension,也就是说如果等待用户输入超时后就会转到t这个流程来执行,在这里你可以设置一些提示音来告诉客户超时了。
       

    i :是指invalid extension,也就是说如果客户输入无效的时候会转到i这个流程来执行
        

    fax :是指fax calls,也就是说如果asterisk检测到传真信号的时候就会自动转到这个流程里面来执行。
        

    h :是指hangup extension,就是说呼叫终止后执行的流程,在这里通道已经终止,放音、发送DTMF等命令都不可用了,只能做一些呼叫结束后处理的一些工作。
       

     需要注意的是,不管你设置的流程是什么都是属于某个流程块的,在不相互包含的情况下,流程块与流程块之间是相互独立的,流程或者变量是不会冲突的。



    exten => _123409XX,1,GotoIf($[${EXTEN}=12340910]?ivr1:normal)        ;?YES:NO
    exten => _123409XX,n(normal),Dial(SIP/101)
    exten => _123409XX,n,Goto(end)
    exten => _123409XX,n(ivr1),BackGround(MyVox/Greeting)
    exten => _123409XX,n(end),Hangup
    上面这段代码就是当匹配的号码是12340901时就跳转到ivr1这个priority上否则就跳转到normal这个priority上。上面这段流程也可以写成:
    exten => _123409XX,1,GotoIf($[${EXTEN}=12340910]?4:2)                ;YES:NO

    exten => _123409XX,2,Dial(SIP/101)
    exten => _123409XX,3,Goto(5)
    exten => _123409XX,4,BackGround(MyVox/Greeting)
    exten => _123409XX,5,Hangup



    Playback(filename[&filename2...][|option])


    第二个参数是一些控制变量,这个参数是可选的:
    skip :如果这个变量设置,而且当前通道没有UP,命令就会立刻结束,不播放任何语音。
    noanswer :如果设置这个变量,在当前通道没有UP的时候,就不会执行anwser来UP这个通道。
    say :如果设置这个变量,在播放语音之前会把要播放的语音文件名都出来。
    j :如果设置这个变量,当语音文件播放出现问题的时候,流程就会跳转到priority+101这个priority继续执行。


    Background(filename1[&filename2...][|options[|langoverride][|context]])


    给当前Channel播放语音文件,并等待客户输入,来执行相应的extension。

    第一个参数是语音文件,这个参数的用法跟Playbcak的第一参数用法一样。
    第二个参数是一些控制变量,这个参数是可选的:
    s :如果这个变量设置,而且当前通道没有UP,命令就会立刻结束,不播放任何语音。
    n :播放语音前不用answer这个通道
    m :只有当用户输入的能和参数context中的流程匹配才结束。
    p :只播放不接受用户输入。
    第三个参数是指播放声音的语言,这个参数是可选的。
    第四个参数是指当用户输入后要去寻找匹配并执行的context,在多层的IVR中这个参数是关键,这个参数是可选的。


    Dial(Technology/resource[&Tech2/resource2...][|timeout][|options][|URL])


    这个命令会是当前通道呼叫一个或多个Channel,其中有一个Channel应答,当前通道就会和这个Channel桥接在一起,其他Channel就会挂断。
    第一个参数是要呼叫的通道可以是多个每个之间用"&"来分隔。
    第二个参数是超时时间,单位为秒,如果不设置超时时间,呼叫就会一直等到对方应答为止。
    第三个参数是一些控制变量:
    A(x) :当被叫方应答的时候给被叫方播放一段语音,x为要播放的语音文件
    C :重新设置CDR
    d :允许主叫方在等待被叫方应答的时候,按一个数字键跳转到这个数字所能匹配的流程中,新的流程是指定在EXITCONTEXT变量中设置的流程,如果EXITCONTEXT没有被指定那么就在当前context中寻找。
    D([called][:calling]) :发送DTMF到主叫方或者被叫方,当被叫应答但是通道还没有桥接的时候。
    f :强制为被叫方Channel设置CallerID,用当前的extension
    g :当对方挂机的后,接着当前的context执行
    G(context^exten^pri) :当呼叫被应答之后,将主叫方跳转到指定的priority中执行,被叫跳转到指定的priority+1中执行,指定的priority由G的参数指定。
    h :允许被叫方按"*"结束会话
    H :允许主叫方按"*"结束会话
    i :忽略任何forwarding请求
    j :当所有呼叫请求都忙的时候跳转到当前priority+101处
    k :允许被叫使用parking功能
    K :允许主叫使用parking功能
    L(x[:y][:z]) :限定呼叫'x'ms,当剩下'y'ms时播放一个警告,重复这个警告每隔'z'ms。下面这些变量是用于这个操作:
      LIMIT_PLAYAUDIO_CALLER    yes|no (default yes) 对主叫播放语音
      LIMIT_PLAYAUDIO_CALLEE    yes|no     对被叫播放语音
      LIMIT_TIMEOUT_FILE     时间到的时候播放的语音
      LIMIT_CONNECT_FILE     呼叫开始时播放的语音
      LIMIT_WARNING_FILE     y定义的那个警告的语音,一般都是播放还剩多少时间
    m([class]) :为主叫提供hold music在Channel应答之前。
    M(x[^arg]) :为被叫Channel执行指定的宏,在还未和主叫桥接之前。被指定的参数可以用"^"来分隔。宏执行完后后会返回一个变量MACRO_RESULT来指示接下来要执行的命令:
    ABORT    通话两端都挂断
    CONGESTION 当线路催挂的时候执行,也就是设置完CONGESTION状态,然后继续执行流程

    BUSY    当线路忙的时候执行,如果j这个参数被设置则,跳转到priority+101处执行
    CONTINUE  挂断被叫,主叫继续执行流程
    GOTO:<context>^<exten>^<priority>   跳转到指定的流程处继续执行
    注意:TIMEOUT()函数不能用在宏中
    n([x])和N :修改screen/privacy模式. ;screen/privacy就是在被叫应答后还没有桥接之前给被叫播放一段IVR来让它做一些操作,其中就有选择是否愿意接受这个呼叫
    p和P([x]) :设置screen/privacy模式.
    o :指定主叫Channel的callerID为被叫Channel的CallerID。
    O([x]) :设置Operator Services模式,只对zaptel和dahdi通道有效
    r :主叫等待应答是为主叫播放回铃音
    S(x) :应答后x秒挂断通话
    t :允许被叫发送DTMF实现transfer主叫  详细信息在features.conf中设置
    T :允许主叫发送DTMF实现transfer被叫 详细信息在features.conf中设置
    w :允许被叫发送DTMF为通话录音    详细信息在features.conf中设置
    W :允许主叫发送DTMF为通话录音    详细信息在features.conf中设置
     

    第四个参数是一个url地址,如果通道支持这个url将发送给被叫
    通道变量:
    DIALEDTIME      这个变量是指从呼叫开始到会话结束的时间

    ANSWEREDTIME    这个变量是指应答开始到会话结束的时间
    DIALSTATUS     这个变量显示的是呼叫的结果状态有以下一些值CHANUNAVAIL | CONGESTION | NOANSWER | BUSY | ANSWER | CANCEL | DONTCALL | TORTURE | INVALIDARGS ,在Privacy和Screening模式中,被叫选择发送主叫到'Go Away'脚本时状态变为DONTCALL;发送到'torture'脚本时状态变为TORTURE。


    Hangup([causecode])
       

    这个命令是挂断一个Channel。可选的参数是指定挂机的原因。


    GotoIf(condition?[labeliftrue]:[labeliffalse])
      

    这个命令是有条件的跳转,跟c语言中的?:语句有点类似,当condition的条件为1时跳转到labeliftrue处,否则跳转到labeliffalse处。label的格式为[[context|]extension|]priority。其他就跟Goto命令一样。


    EXTEN就是一个asterisk已经预先定义的变量,他表示的就是当前的extension。既然提到了EXTEN变量在这里顺便就说一下变量的截取,语法是这样的:${variable_name[:offset[:length]]}。举个例子俩说明一下:


    exten => 12340900,1,Set(INCOMING=${EXTEN})
     

    这个里面${EXTEN}就是12340900,如果我只想要后四位那怎么办那?${EXTEN:4}就表示0900了,也就是去掉了${EXTEN}的前四位;那要是想要前四位怎么办那?很简单${EXTEN:0:4}就表示1234了。offset和length也可以是负数,offset是负数表示要的是从后面数|offset|个数,length是负数表示要的是除了从后面数的|length|个数。哈哈,说的不太明白举个例子吧。${EXTEN:-4}也表示0900,${EXTEN:-2}就表示00,${EXTEN:2:4}表示3409,${EXTEN:2:-2}也表示3409,${EXTEN:-6:-2}也表示3409.



    环境变量是一种在asterisk里面访问操作系统环境变量的一种方法。这些变量以${ENV(var)}的形式引用,其中var就是要引用的操作系统环境变量。
        b、逻辑表达式,你应该没有忘记${var}表示变量,逻辑表达式和这个差不多$[expression].$[1 + 2]就表示1+2的结果3.中括号中运算符和变量之间最好用空格分开,否则可能会出现错误的结果。当然中括号里面可以是任意运算符。这些预算符包括:
        1)、逻辑运算符
        expr1 | expr2     当expr1为真,赋值为expr1的值,否则为expr2的值
        expr1 & expr2   当expr1和expr2的值都为真时,赋值为expr1的值,否则赋值为0
        expr1 {=, >, >=, <, <=, !=} expr2    如果自变量都是整数,将得到一个整数的比较结果;否则他们将得到字符串的结果,如果给定的关系是正确的,这个结果是1,否则就是0.
        ! expr1      取反,当expr1是NULL、0、一个空字符串、或者一个字符串"0",返回1;否则返回0.
        2)、数学运算符
        expr1 {+, -, *, /, %} expr2   加减乘除余数
        - expr1             取负
        3)、正则表达式运算符
        expr1 : expr2    这个运算符expr2匹配到expr1,expr2必须是个表达式,如果匹配成功,被匹配的表达式包括了至少一个正则表达式的字表达式,整个表达式对应返回(1 or \1);另外,匹配操作符返回字符匹配上的数量。如果匹配失败,返回空值。其他情况返回0.
        expr1 =~ expr2   这个运算符和:很像,唯一区别就是这个可以不从字符串的开始匹配。
       4)、三态运算符
        expr1 ? expr2 : expr3    这个用法就不用说了,说说expr1的否的条件就行了,数字的话是0,字符串时""(空串)。
      c、运算符优先级
       1)、(,)
       2)、!,-
       3)、:,=~
       4)、*,/,%
       5)、+,-
       6)、=,!=,<,>,<=,>=
       7)、|,&
       8)、?:



     回到顶部