Asterisk里调试SIP确实挺麻烦的,一般使用另外的网络协议分析工具。从1.8版本开始,可以直接在Dialplan里拿到详细的SIP交互信息,从而更加准确地获取拨号状态、网络状态、用户状态(UA)等。 gxmc|  
        以前版本里,拨号后的状态DIALSTATUS一般返回值有ANSWER、BUSY、NOANSWER、CANCEL、CONGESTION、CHANUNAVAIL、DONTCALL、TORTURE、INVALIDARGS。 # X/Q  
        我们都经常被CONGESTION这个返回值困扰。几乎每个呼叫故障都返回CONGESTION。这是因为Dial()函数适用很多种协议,SS7,Zap,SIP,IAX等等,因此不能返回某个协议指定的信息,比如SIP 404 响应。 G),db%,X2  
        Asterisk 1.8 增加了一个功能,可以从Dialplan里面调用 {HASH(SIP_CAUSE,<channel-name>)}来获取具体的SIP响应信息,不仅是拨号状态,也可以是挂机原因(${HANGUPCAUSE})。 sRq U]i8l  
        Asterisk 1.8还新增了一个'use_q850_reason' 配置选项来生成和分析Q.850协议信息。"Reason: Q.850;cause=<cause code>" 可以更好地通过SIP来传递 PRI/SS7原因编码。 Rd%0/ B  
具体应用在哪些场合呢? kcS6_l  
        * 比如你有一些中继网关(SIP <-> ISDN或者SIP <-> SS7),当然希望能够监测真正的“congestion”信令,以便路由到其它的中继网关上。但是如果每个呼叫失败的消息都反馈成“CONGESTION“,就不可能实现这个功能。 +< KNY  
        * 你的电话听筒不能给用户显示SIP错误响应信息,所以你需要使用信号音。比如Cisco 7960 SIP总是无用地响着重拨信号音 "boop, boop, boop, boop",无论对任何SIP呼叫建立故障都一样。美国的"Reorder"信号音并不是手机上的惯例,听起来很像英国的忙音。这让用户无法判断到底哪里出了问题。 2xTT)9Tq*  
        * 如果你不想依赖电话听筒,而是通过SIP错误代码来提供更加一致的用户体验。在调用Dial()之前先调用Answer()让Asterisk摘机,然后使用Playtones() Wait() 来播放地区特定的呼叫进展信号音。