呼叫保持(HOLD)是SIP协议应用中的一个重要功能,用于实现不挂断电话而达到暂停媒体(常见于音频,视频很少用)的目的,而解保持操作会恢复通话。
保持发起方(保持方)通过发送INVITE(一般称为re-invite)消息重新协商媒体(SDP)信息, 保持方将SDP媒体属性设置为sendonly, 对方将200应答消息中的SDP媒体属性设置为recvonly,经过上述协商后,保持发起方停止发送接收媒体,被保持方只接收媒体,一般会由服务器向被保持方发送保持提示媒体(音乐)。
保持发起方(保持方)通过发送INVITE(一般称为re-invite)消息重新协商媒体(SDP)信息,保持方将SDP媒体属性设置为sendrecv, 对方将200应答消息中的SDP媒体属性设置为sendrecv,经过上述协商后,保持发起方开始发送和接收媒体,被保持方也开始发送和接收媒体,主被叫恢复正常通话。
注: re-invite是已建立的通话中发送的INVITE消息,属于带内(会话内)消息,wireshark解析报文标识为in-dialog
SDP中媒体方向属性有四种取值,如下:
SDP示例:
v=0
o=- 3899965522 3899965526 IN IP4 192.168.1.16
s=SDP
c=IN IP4 192.168.1.16
t=0 0
m=audio 10008 RTP/AVP 9 0 8 18 102 97 101
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=rtpmap:102 opus/48000
a=fmtp:102 maxplaybackrate=16000;sprop-maxcapturerate=16000;maxcodedaudiobandwidth=16000
a=rtpmap:97 iLBC/8000
a=fmtp:97 mode=20
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendonly
保持方发起INVITE
INVITE sip:[email protected]:5060;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.1.16:5060;rport;branch=z9hG4bKPjpHJsJomm.pSb43QJmGQ1nq3IwtDqoUvv
Max-Forwards: 70
From: “1000” sip:[email protected];tag=t88GJjOmQ10OnMuh1bAzHNEhjKAfj-9g
To: sip:[email protected];tag=F136cS62FtXNr
Contact: “1000” sip:[email protected]:5060
Call-ID: 43cxWXKwy.IabssyG9hdr0SMLgHdcPpy
CSeq: 1084 INVITE
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Supported: replaces, 100rel
User-Agent: VoIP
Content-Type: application/sdp
Content-Length: 463
v=0
o=- 3899965522 3899965526 IN IP4 192.168.1.16
s=SDP
c=IN IP4 192.168.1.16
t=0 0
m=audio 10008 RTP/AVP 9 0 8 18 102 97 101
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=rtpmap:102 opus/48000
a=fmtp:102 maxplaybackrate=16000;sprop-maxcapturerate=16000;maxcodedaudiobandwidth=16000
a=rtpmap:97 iLBC/8000
a=fmtp:97 mode=20
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendonly
被保持方响应200-OK:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.16:5060;rport=5060;branch=z9hG4bKPjpHJsJomm.pSb43QJmGQ1nq3IwtDqoUvv
From: “1000” sip:[email protected];tag=t88GJjOmQ10OnMuh1bAzHNEhjKAfj-9g
To: sip:[email protected];tag=F136cS62FtXNr
Call-ID: 43cxWXKwy.IabssyG9hdr0SMLgHdcPpy
CSeq: 1084 INVITE
Contact: sip:[email protected]:5060;transport=udp
User-Agent: FreeSWITCH-mod_sofia/1.10.9-release~64bit
Accept: application/sdp
Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE
Supported: timer, path, replaces
Content-Type: application/sdp
Content-Disposition: session
Content-Length: 234
v=0
o=FreeSWITCH 1690944859 1690944861 IN IP4 192.168.1.200
s=FreeSWITCH
c=IN IP4 192.168.1.200
t=0 0
m=audio 31858 RTP/AVP 9 101
a=rtpmap:9 G722/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=recvonly
a=ptime:20
通话中的一方需要短暂离开通话时,将呼叫切换到保持状态
当一方需要将通话转接给其它人或部门时,可以先将通话保持,然后与第三方进行咨询转接,将通话转接给第三方
通话中,有新呼入通话时,用户可以将当前呼叫保持,然后接听新呼叫。新呼叫挂断后,切换回被保持的呼叫,解保持后继续通话
当销售/客服坐席在与客户通话中,需要查询信息或与其他人沟通时,可以先将呼叫保持,获取到信息或协商完成后,再恢复与客户的通话