家庭部署Ooma与Asterisk:如何避免双线路同时呼入振铃?
解决Asterisk多FXO线路同号码呼入重复振铃的最简方案
刚好之前处理过类似的场景,给你一个最直接的解决思路——利用Asterisk自带的GROUP()和GROUP_COUNT()函数,在拨号计划里加几行判断逻辑,就能把两条线路的重复呼入合并成一个。
核心逻辑
给共享同一号码的两条FXO线路的呼入标记同一个呼叫组,每次有呼入进来时,先检查该组内当前活跃的振铃呼叫数量:
- 如果数量大于1,说明已经有同号码的呼入在振铃了,直接挂断当前的重复呼叫
- 如果数量等于1,正常将呼叫转接到你的IP话机
具体拨号计划配置
在你的extensions.conf里找到处理FXO呼入的上下文(比如叫from_ooma_fxo),替换或添加如下配置:
[from_ooma_fxo] exten => _X.,1,NoOp(Incoming call from Ooma FXO line) ; 把当前呼叫加入名为shared_main_number的组 exten => _X.,n,Set(GROUP(ooma_line)=shared_main_number) ; 统计该组内的活跃呼叫数量 exten => _X.,n,Set(group_call_count=${GROUP_COUNT(ooma_line,shared_main_number)}) ; 如果数量大于1,跳转到挂断分支 exten => _X.,n,GotoIf($[${group_call_count} > 1]?duplicate_call,1) ; 正常转接到你的IP话机(把SIP/desk_phone换成你的话机设备名) exten => _X.,n,Dial(SIP/desk_phone,20) exten => _X.,n,Hangup() ; 处理重复呼叫的分支 exten => duplicate_call,1,NoOp(Duplicate incoming call detected, hanging up) exten => duplicate_call,n,Hangup()
为什么不用DEVICE_STATE()?
你之前尝试的DEVICE_STATE()方法可能踩了状态延迟的坑:当第二条线路的呼入刚进来时,第一条线路的DEVICE_STATE可能还没来得及更新为RINGING,导致判断失效。而GROUP_COUNT()是基于Asterisk内部的呼叫组统计,实时性更强,能准确捕捉到同一时刻的重复呼入。
额外优化(可选)
如果想在第一条呼叫被接听后,让后续呼入转去语音信箱,可以在判断里加个CHANNEL状态检查:
; 在GROUP_COUNT之后添加 exten => _X.,n,Set(active_calls=${GROUP_COUNT(ooma_line,shared_main_number,UP)}) exten => _X.,n,GotoIf($[${active_calls} > 0]?voicemail,1)
然后添加语音信箱的处理分支即可。
内容的提问来源于stack exchange,提问作者Slava
相关产品推荐
相关产品推荐

