如何通过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字段互相关联,可通过该字段匹配同一路通话的两条通道。
- A-leg(主叫侧):
- 核心判断字段:
主流SIP场景下直接读取CHANNEL_HANGUP事件中的variable_sip_hangup_disposition字段即可直接判定:- 若A-leg的该字段值为
send_bye:代表主叫侧主动发送挂断请求,是主动挂断方 - 若B-leg的该字段值为
send_bye:代表被叫侧主动发送挂断请求,是主动挂断方 - 若字段值为
recv_bye:代表当前通道是被动接收对端的挂断请求,不是主动挂断方
- 若A-leg的该字段值为
- 非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
相关产品推荐
相关产品推荐

