Asterisk实时SIP分机无法呼出问题排查求助
从你的描述和配置细节来看,问题主要集中在呼叫逻辑错误和测试方式导致的Asterisk崩溃干扰两个核心点,下面一步步拆解解决:
1. 先排除console拨号的崩溃干扰
你用console dial edwin@internal测试时,日志显示chan_oss.c找不到/dev/dsp设备,这直接导致了Asterisk崩溃。这是因为console拨号依赖系统的OSS音频设备,而当前系统没有该设备(现在主流用ALSA音频架构),这个测试方式本身就会触发异常,无法反映真实的呼叫问题。
解决方式:
- 立刻停止用console拨号测试!改用你已经配置好的正常SIP分机(比如7001)拨打7006,同时查看Asterisk的完整日志文件(比如
/var/log/asterisk/messages),这里会记录真实的呼叫失败原因,不会被console崩溃打断。 - 如果一定要用console测试,可以安装ALSA兼容OSS的工具(如
alsa-oss),或者直接在Asterisk中禁用chan_oss模块。
2. 修复Extensions表的逻辑错误(核心问题)
你的psql Extensions表中,呼叫edwin的流程顺序完全颠倒了:
当前流程:Answer → Dial → Playback → Hangup
正常的呼叫逻辑应该是先尝试拨号给目标分机,只有当拨号无人接听/失败时,才执行后续的提示音播放和挂断动作。现在你先执行Answer,相当于提前接通了主叫的呼叫,再去拨号给edwin,这会导致逻辑混乱,甚至触发异常断开。
修复步骤:
修改psql的Extensions表,调整动作优先级和内容:
- 删除优先级1的
Answer动作(完全不需要提前接听) - 将
Dial动作设为优先级1,并且建议用分机ID7006替代nameedwin,避免Realtime配置的lookup问题 - 调整后续动作的优先级,最终表结构应为:
"1";"internal";"edwin";1;"Dial";"SIP/7006,60" "2";"internal";"edwin";2;"Playback";"vm-nobodyavail" "3";"internal";"edwin";3;"Hangup";" "
修改完成后,在Asterisk CLI执行dialplan reload让配置生效。
3. 修正Realtime SIP分机的配置冲突
对比你的Realtime分机(7006)和sip.conf测试用户,发现Realtime分机里包含了一些全局配置参数,这些参数应该放在sip.conf的[general]段,而不是单个分机的配置中,会导致配置冲突:
- 移除Realtime分机中的
localnet、bindport、bindaddr字段,这些是全局设置,不需要每个分机重复配置。 - 检查
rtcachefriends yes:这个参数如果在Realtime分机中单独设置,可能导致分机缓存异常,建议移到sip.conf的[general]段,或者暂时注释掉,执行sip reload后观察分机状态。
4. 验证Realtime分机的可达性
在Asterisk CLI中执行以下命令,确认分机的注册状态:
sip show peers
查看edwin(或7006)的状态是否为OK,IP地址是否正确显示为192.168.123.122,端口是否为63806。如果状态异常:
- 执行
sip reload刷新Realtime配置 - 检查分机端的SIP客户端是否正常注册,确认没有防火墙阻止了63806端口的流量
5. 最终测试
完成以上所有步骤后,用7001拨打7006,同时查看/var/log/asterisk/messages日志,如果还有错误,截取相关日志片段可以进一步排查。
内容的提问来源于stack exchange,提问作者pranav harish

