如何在Asterisk呼叫文件中配置TtM(MyMacro)拨号选项
我懂你现在的困扰——想用呼叫文件发起外呼,同时触发自定义的MyMacro来做AMD检测,但之前调整Channel字段的几种写法都没起效。其实问题出在呼叫文件里Channel字段的参数格式上,咱们来一步步修正:
1. 修正Channel字段的正确格式
Asterisk呼叫文件的Channel字段支持附加拨号选项,但参数位置和分隔符有严格要求:格式是通道地址,超时,呼叫组,拨号选项,如果不需要前两个参数,要用连续的逗号跳过。
你需要把Channel字段改成这样:
Channel: SIP/Algar_AMD/$phoneNumber,,TtM(MyMacro)
这里的两个连续逗号是跳过了「超时」(第一个参数)和「呼叫组」(第二个参数),直接指定第三个位置的参数为拨号选项TtM(MyMacro)——这才是Asterisk识别拨号选项的正确方式,你之前的写法要么参数位置错了,要么用了错误的分隔符(比如竖线),所以没生效。
2. 确保MyMacro宏的定义正确
要让AMD检测正常工作,你的宏必须正确调用AMD()应用并处理检测结果。比如在extensions.conf里的宏定义应该类似这样:
[macro-MyMacro] exten => s,1,NoOp(启动AMD检测流程) exten => s,n,AMD() ; 根据AMD检测结果分支处理 exten => s,n,GotoIf($["${AMDSTATUS}" = "HUMAN"]?human_handle,1:machine_handle,1) ; 真人应答后的逻辑 exten => s,n(human_handle),NoOp(检测到真人应答) exten => s,n,Goto(from-internal,${ARG1},1) ; 跳转到指定内部分机 exten => s,n,Hangup() ; 机器应答后的逻辑 exten => s,n(machine_handle),NoOp(检测到机器应答) exten => s,n,Hangup() ; 直接挂机,或者添加留言逻辑
注意:如果需要把内部分机号传递给宏,可以在拨号选项里写成TtM(MyMacro,$internalExtension),这样宏里就能用${ARG1}获取到内部分机号。
3. 调整呼叫文件的其他配置
因为宏会处理后续的路由逻辑,你可以考虑把原来的Context、Extension、Priority字段注释掉,避免重复跳转;如果保留的话,要确保宏的最后跳转逻辑和这些配置不冲突。另外,把WaitTime调整到30秒以上,给AMD检测足够的语音分析时间。
4. 排查问题的小技巧
如果还是没生效,去查看Asterisk的全量日志(/var/log/asterisk/full),搜索呼叫相关的日志条目,看看宏是否被触发,有没有报错信息——比如宏名称写错、AMD应用未加载之类的问题,日志里都会有提示。
内容的提问来源于stack exchange,提问作者Rubens Gasparotto Filho

