You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过FreeSWITCH CHANNEL_HANGUP等事件判断呼叫主动挂断方

FreeSWITCH判定主动挂断方的实现方法

可以通过FreeSWITCH的CHANNEL_HANGUP事件及配套字段,准确判定呼叫链路中哪一方主动发起挂断。

核心判断逻辑

  • 首先明确呼叫的两条链路标识:每路正常通话在FreeSWITCH中会生成两条关联的channel:
    • A-leg(主叫侧):Call-Direction字段值为inbound,是主叫方向FS发起的呼叫链路
    • B-leg(被叫侧):Call-Direction字段值为outbound,是FS向被叫方发起的呼叫链路
      两条链路通过Other-Leg-Unique-ID字段互相关联,可通过该字段匹配同一路通话的两条通道。
  • 核心判断字段:
    主流SIP场景下直接读取CHANNEL_HANGUP事件中的variable_sip_hangup_disposition字段即可直接判定:
    • 若A-leg的该字段值为send_bye:代表主叫侧主动发送挂断请求,是主动挂断方
    • 若B-leg的该字段值为send_bye:代表被叫侧主动发送挂断请求,是主动挂断方
    • 若字段值为recv_bye:代表当前通道是被动接收对端的挂断请求,不是主动挂断方
  • 非SIP场景(如PSTN、WebRTC等)的判断方法:
    可结合Hangup-Source字段和CHANNEL_HANGUP_COMPLETE事件时序判断:同一路通话中,CHANNEL_HANGUP事件优先触发的一侧,且挂断原因不属于远端触发类,即可判定为主动挂断方。

特殊场景说明

如果是FreeSWITCH平台主动触发的挂断(比如通话超时、余额不足、拨号规则拦截),两条链路的variable_sip_hangup_disposition都会显示为send_bye,此时可通过Hangup-Cause字段区分:常见平台主动挂断的原因值包括NO_ANSWER(无应答超时)、CALL_REJECTED(呼叫拦截)、USER_BUSY(被叫忙)等,也可配合variable_hangup_cause_q850的标准Q850原因码做进一步判定。

参考事件示例

Event-Name: CHANNEL_HANGUP
Unique-ID: 7a9f2d4c-1e3b-4c5a-8d7e-9f8a7b6c5d4e
Other-Leg-Unique-ID: 2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e
Call-Direction: inbound
variable_sip_hangup_disposition: send_bye
Hangup-Cause: NORMAL_CLEARING

以上示例事件对应的通话,由A-leg所属的主叫方主动发起挂断。

内容的提问来源于stack exchange,提问作者toootooo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:06:01