You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:18:04