这个问题在电话网络的工作方式中很普遍,并不特定于 SIP 或 IP。这就是为什么当您拨打另一个国家的电话并且号码占线时,您有时可能会听到您所在国家/地区的忙音,或者您可能会听到来自其他国家/地区的不同忙音。在后一种情况下,除了通过音频分析之外,您无法检测到问题所在。在 SS7 和 ISDN 中,我们说的是 Q.931 原因码而不是 SIP 错误码,但原理是一样的。
将电话系统配置为发出状态代码而不是音频错误消息是有争议的。对于使用普通电话的呼叫者,始发交换机(离呼叫者最近的那个)然后可以将该代码映射到适当的语音错误消息或音频音调。这样,当呼叫是由软件而不是由人发出时,软件可以立即访问实际的错误代码。
另一方面,您也可以主张让远程开关(离目的地最近的开关或遇到问题的开关)说出自己的错误消息。该开关最清楚实际问题是什么。例如,移动运营商可以发出语音错误消息,说明您尝试拨打的手机当前超出范围。没有具有该含义的 Q.931 代码(或 SIP 错误代码)。它可能会返回 27=Destination 乱序??或者 35=无法到达的目的地??这两个代码都非常深奥,谁知道本地交换机会将它们翻译成什么错误消息(实际上:可能只是一个重新排序的音调,这对人类调用者来说确实是用户不友好的)。当您尝试将 Q.931 原因代码来回映射到 SIP 错误代码时,甚至更多的信息丢失了,因为代码真的完全不匹配。如果远程开关只是播放描述问题的信息丰富、适当的录音,那么对于呼叫者来说,这可能是一个更好的用户体验。
由于存在这种困境(双方都有争论),我们可以得出结论,短期内完全标准化一种或另一种方式不太可能解决这个问题。
无论如何,有时这是可配置的:您的 SIP 提供商可能能够为您的中继配置编码错误而不是记录消息。如果他们提供此功能(有些提供),则值得尝试设置此选项。但结果会有所不同:此选项仅影响其本地行为。一般来说,如果您想立即使用原因代码调用 clearing 并从另一端获取记录的错误消息,您将无法对此做任何事情,因为决定它将以哪种方式响应的开关是远程的。
使用音频消息方法时,通常最终会出现正确的 Q.931 原因代码或 SIP 错误代码(在录制完成后),但正如您指出的那样,到那时可能为时已晚。