Asterisk与AsterNet呼叫配置问题:如何直接接通本地手机号
解决Asterisk直接呼叫目标手机号的问题
首先,咱们得先定位问题根源:现在呼叫先接分机2001再转手机号,大概率是拨号计划(Dialplan)的路由规则或者AsterNet发起呼叫的目标参数配置不对,导致呼叫先进入分机,再触发转外线逻辑。下面分两种核心场景给你解决方案:
1. 修改AsterNet发起呼叫的代码逻辑
如果你的代码现在是先呼叫分机2001,再通过分机的Dialplan转手机号,那直接修改Originate的目标地址,跳过分机,直接指定USB dongle的通道+目标手机号即可。
常见错误代码示例(导致先接分机):
// 错误:先呼叫分机2001,依赖分机的Dialplan转手机号 var originateRequest = new OriginateRequest { Channel = "SIP/2001", Context = "default", Exten = "138xxxxxxx", Priority = 1, CallerId = "你的主叫号码" }; asteriskManager.SendAction(originateRequest);
修改后的正确代码:
直接将Channel指定为你的USB dongle对应的通道(比如DAHDI通道,或者dongle驱动的通道名,比如dongle0),格式为通道类型/通道号/目标手机号:
// 正确:直接通过USB dongle发起呼叫到目标手机号 var originateRequest = new OriginateRequest { // 替换成你的USB dongle实际通道,比如DAHDI/1 或者 dongle0 Channel = "DAHDI/1/138xxxxxxx", Context = "default", // 确保这个上下文有允许外线呼叫的权限 Priority = 1, CallerId = "你的主叫号码" // 必须是USB dongle支持的合法主叫号 }; asteriskManager.SendAction(originateRequest);
2. 检查并修改Asterisk的拨号计划(extensions.conf)
如果你的代码已经直接指向外线,但还是先接分机,那大概率是extensions.conf里的上下文规则把呼叫路由到了分机2001。需要检查以下几点:
步骤1:确认外线呼叫的上下文
找到你的USB dongle对应的配置文件(比如chan_dahdi.conf或者chan_dongle.conf),查看它的context参数,示例如下:
# chan_dongle.conf 示例配置 [dongle0] context=outgoing ; 这里的context要和拨号计划里的对应上
步骤2:修改拨号计划的outgoing上下文
确保extensions.conf里的outgoing上下文(或者你dongle配置的上下文)没有把呼叫路由到分机2001,而是直接允许拨打外线。示例配置:
[outgoing] ; 允许拨打11位手机号(根据本地号段调整匹配规则) exten => _1XXXXXXXXXX,1,Dial(DAHDI/1/${EXTEN},30) exten => _1XXXXXXXXXX,n,Hangup() ; 如果需要支持固定电话,添加对应规则 exten => _0XXXXXXXXXX,1,Dial(DAHDI/1/${EXTEN},30) exten => _0XXXXXXXXXX,n,Hangup()
需要删除的错误配置:
如果你的上下文里有类似这样的规则,会强制所有呼叫先转分机2001,务必删除或注释掉:
; 错误配置:所有呼叫先转到分机2001 exten => _X.,1,Dial(SIP/2001,20) exten => _X.,n,Dial(DAHDI/1/${EXTEN},30)
3. 快速验证配置的小技巧
- 修改完配置后,在终端执行
asterisk -rx "dialplan reload"重新加载拨号计划 - 在Asterisk控制台执行
asterisk -rx "originate DAHDI/1/138xxxxxxx extension s@outgoing"直接测试,如果能拨通手机号,说明Dialplan没问题,再排查AsterNet代码 - 检查USB dongle状态:如果用的是chan_dongle驱动,执行
asterisk -rx "dongle show status"确保dongle注册正常、能发起外线呼叫
内容的提问来源于stack exchange,提问作者Ankit
相关产品推荐
相关产品推荐

