Asterisk:基于多号码条件的来电显示(Caller ID)重写配置方法咨询
实现Asterisk来电显示(Caller ID)多条件重写配置
我来帮你搞定Asterisk多条件来电显示重写的需求~你现在的单条件代码能正常运行,但要扩展成多规则匹配的话,有两种清晰的实现方式,我给你详细拆解:
方式一:多分支GotoIf串联
这种方式是在现有代码基础上扩展,通过多个GotoIf逐个检查号码,匹配后跳转到对应的设置分支:
exten => _X.,1,GotoIf($[${CALLERID(num)}=1004]?set1004) exten => _X.,n,GotoIf($[${CALLERID(num)}=1005]?set1005) exten => _X.,n,GotoIf($[${CALLERID(num)}=1006]?set1006) ; 如果没有匹配到任何规则,直接跳转到结束分支 exten => _X.,n,Goto(end) ; 1004号码对应的重写规则 exten => _X.,n(set1004),SET(CALLERID(all)=My company<1234489>) exten => _X.,n,Goto(end) ; 1005号码对应的重写规则 exten => _X.,n(set1005),SET(CALLERID(all)=My company<383838>) exten => _X.,n,Goto(end) ; 1006号码对应的重写规则 exten => _X.,n(set1006),SET(CALLERID(all)=My company<848481>) exten => _X.,n,Goto(end) ; 结束分支,可在这里添加后续呼叫逻辑(比如Dial) exten => _X.,n(end),NoOp(Caller ID rewrite complete)
关键说明:
- 每个
GotoIf判断一个号码,匹配就跳转到对应的标记分支(比如set1004) - 设置完来电显示后,通过
Goto(end)跳转到结束分支,避免执行后续的条件判断 - 如果没有匹配任何规则,会直接进入
end分支,不修改来电显示
方式二:使用Switch语句(推荐)
当规则数量较多时,Switch语法的结构更清晰,可读性和可维护性更好,适合多条件场景:
exten => _X.,1,Switch(${CALLERID(num)}) exten => _X.,n,Case(1004) exten => _X.,n,SET(CALLERID(all)=My company<1234489>) exten => _X.,n,Break() exten => _X.,n,Case(1005) exten => _X.,n,SET(CALLERID(all)=My company<383838>) exten => _X.,n,Break() exten => _X.,n,Case(1006) exten => _X.,n,SET(CALLERID(all)=My company<848481>) exten => _X.,n,Break() exten => _X.,n,Default() ; 默认分支:没有匹配到任何号码时的处理(可选择不修改或设置默认显示) exten => _X.,n,NoOp(No matching Caller ID rewrite rule) exten => _X.,n,Break() exten => _X.,n,EndSwitch()
关键说明:
Switch(${CALLERID(num)})指定要匹配的变量(这里是来电号码)- 每个
Case对应一个号码规则,匹配后执行对应的SET操作 Break()用于跳出当前Case,避免执行后续规则Default()分支处理所有未匹配的情况,你可以在这里设置默认的来电显示,或者只做日志记录
额外注意事项
- 如果你的来电号码是固定长度,建议把匹配模式
_X.改成更精确的格式(比如_XXXX匹配4位号码),避免不必要的匹配 - 如果你只想重写号码或名称,可以单独设置
CALLERID(num)或CALLERID(name),而不是CALLERID(all) - 测试时可以通过
core show application Switch或core show application GotoIf查看Asterisk官方语法说明,确保配置正确
内容的提问来源于stack exchange,提问作者elbarna
相关产品推荐
相关产品推荐

