Asterisk11宏内匹配被叫分机 解决Fanvil话机麦克风音量低问题
问题根因
你当前的逻辑失效核心原因是:Asterisk的macro执行时,上下文的${EXTEN}固定为s(你定义的macro入口就是s extension),从你给出的日志也能看到EXTEN取值为s,根本无法获取到真实的被叫号码,所以对131做被叫的判断永远不成立。
解决方案
方案1:调用macro时传递被叫参数
你在dialplan中调用macro-fanvil的位置,修改调用语法,把当前上下文的真实被叫号作为参数传入:
; 原来的调用语句类似Macro(fanvil),改成下面的 Macro(fanvil,${EXTEN})
之后修改macro代码,用${ARG1}获取传入的被叫号码:
[macro-fanvil] exten => s,1,NoOp(catch: callerid: ${CALLERID(num)} - 传入被叫号: ${ARG1} - ${CHANNEL}) ; 判断是否为131做被叫的场景 exten => s,n,GotoIf($["${ARG1}" = "131"]?receive) ; 判断是否为131做主叫的场景 exten => s,n,GotoIf($["${CALLERID(num)}" = "131"]?iscalling) ; 非131相关通话直接退出 exten => s,n,MacroExit exten => s,n(iscalling),NoOp(alzachiamante: ${CALLERID(num)} - ${CHANNEL}) exten => s,n,Set(VOLUME(RX)=10) exten => s,n,MacroExit exten => s,n(receive),NoOp(alzaricevente: ${CALLERID(num)} - ${CHANNEL}) ; 注意:不需要额外加Answer(),会导致彩铃、回铃音等业务失效,VOLUME设置无需提前接听 exten => s,n,Set(VOLUME(TX)=10) exten => s,n,MacroExit
方案2:直接读取被叫变量无需传参
如果你不想修改macro调用逻辑,也可以直接使用Asterisk内置的${DIALEDPEERNUMBER}变量,这个变量会保存当前通话的被叫号码,直接修改判断条件即可:
; 把原来的EXTEN判断替换为 exten => s,n,GotoIf($["${DIALEDPEERNUMBER}" = "131"]?receive)
内容的提问来源于stack exchange,提问作者user2239318
相关产品推荐
相关产品推荐

