SIP协议之呼叫保持(HOLD)

  呼叫保持(HOLD)是SIP协议应用中的一个重要功能,用于实现不挂断电话而达到暂停媒体(常见于音频,视频很少用)的目的,而解保持操作会恢复通话。

一、保持/解保持实现机制

1.1 保持

  保持发起方(保持方)通过发送INVITE(一般称为re-invite)消息重新协商媒体(SDP)信息, 保持方将SDP媒体属性设置为sendonly, 对方将200应答消息中的SDP媒体属性设置为recvonly,经过上述协商后,保持发起方停止发送接收媒体,被保持方只接收媒体,一般会由服务器向被保持方发送保持提示媒体(音乐)。

1.2 解保持

  保持发起方(保持方)通过发送INVITE(一般称为re-invite)消息重新协商媒体(SDP)信息,保持方将SDP媒体属性设置为sendrecv, 对方将200应答消息中的SDP媒体属性设置为sendrecv,经过上述协商后,保持发起方开始发送和接收媒体,被保持方也开始发送和接收媒体,主被叫恢复正常通话。

注: re-invite是已建立的通话中发送的INVITE消息,属于带内(会话内)消息,wireshark解析报文标识为in-dialog
在这里插入图片描述

二、协议分析

SDP中媒体方向属性有四种取值,如下:

  • sendrecv: 表示该端既发送媒体流,又接收媒体流
  • inactive:表示该端既不发送媒体流,也不接收媒体流。可用于临时禁用媒体流,例如,暂时关闭音频或视频功。
  • sendonly: 表示该端只发送媒体流,不接收任何媒体流
  • recvonly:表示该端只接收媒体流,不发送任何媒体流

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

三、报文实例

3.1 保持流程图

在这里插入图片描述

3.2 解保持流程图

在这里插入图片描述

3.3 信令示例

保持方发起INVITE
INVITE sip:1001@192.168.1.200: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:1000@192.168.1.200;tag=t88GJjOmQ10OnMuh1bAzHNEhjKAfj-9g
To: sip:1001@192.168.1.200;tag=F136cS62FtXNr
Contact: “1000” sip:1000@192.168.1.16: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:1000@192.168.1.200;tag=t88GJjOmQ10OnMuh1bAzHNEhjKAfj-9g
To: sip:1001@192.168.1.200;tag=F136cS62FtXNr
Call-ID: 43cxWXKwy.IabssyG9hdr0SMLgHdcPpy
CSeq: 1084 INVITE
Contact: sip:1001@192.168.1.200: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

四、SIP呼叫保持应用场景

  1. 通话中的一方需要短暂离开通话时,将呼叫切换到保持状态

  2. 当一方需要将通话转接给其它人或部门时,可以先将通话保持,然后与第三方进行咨询转接,将通话转接给第三方

  3. 通话中,有新呼入通话时,用户可以将当前呼叫保持,然后接听新呼叫。新呼叫挂断后,切换回被保持的呼叫,解保持后继续通话

  4. 当销售/客服坐席在与客户通话中,需要查询信息或与其他人沟通时,可以先将呼叫保持,获取到信息或协商完成后,再恢复与客户的通话

五、关键说明

  • SDP中的a=sendrecv属性可以省略,该属性不存在时,默认为sendrecv
  • 保持后,一般由服务器向被保持方播放友好提示音乐(如萨克斯演奏的音乐)
  • 有些终端也会使用a=inactive实现保持功能
STA分析是基于同步电路设计模型的,在数据输入端,假设外部也是同时钟的寄存器的输出并且经过若干组合逻辑进入本级,而输出也被认为是驱动后一级的同时钟的寄存器。在不设置约束的情况下,纯组合逻辑的输入-》输出不得超过一个T,否则也会被认为是TImingviolaTIon.   1.TImingpath TImingpath就是时间线。Timing就是从起始位置的时间点到终点位置的时间点之间的时间长度。Path是指跟位置相关,即时间起始或终点的位置。Timingpath就是某位置的某一时间点到另一位置的某个时间点。对于DFF来说,上升沿类似于一瞬间的脉冲,只有在这短短的一瞬间,数据才允许通过。对于DFF来说,有两个输入点:数据D和时钟CK,有一个输出点:数据Q。由于是时间比较,所以对于D和CK一定要有一个共同的起始时间点,如下图中的A点出现clk上升沿的时刻。如下图,假设我们分析DFF2的数据和时钟到达的时间。二者共同的出发点是A的上升沿,因为A位于时钟通路上,FF1的时钟经过A点到达FF1-C点,在FF1-C上升沿打开FF1,然后数据才能从FF1-Q输出,进而传递到FF2-D。在A点,FF2的时钟沿经过clocktree,达到FF2-C点。所以数据走过的路程是:   Datapath:A-》clk_tree_buf1-》FF1-C-》FF1-Q-》Comb_logic-》B   而对于FF2来说只要满足下个周期的上升沿能够采样即可,所以时钟到达FF2-C的路径是:   Clkpath:A-》clk_tree_buf2-》C.
好的,我可以为您提供一些关于基于SIP协议的电话呼叫系统开发的建议和指导。 首先,SIP(Session Initiation Protocol)是一种基于文本的协议,用于在IP网络上建立、修改和终止多媒体会话,如电话呼叫。因此,我们可以使用SIP协议来实现一个电话呼叫系统。 其次,Java是一种广泛使用的面向对象编程语言,它可以被用来开发各种类型的应用程序,包括电话呼叫系统。而Swing是Java的一个图形用户界面(GUI)工具包,可以帮助我们创建用户友好的界面。 基于上述考虑,以下是我为您提供的一些基本步骤和建议: 1. 确定需求和功能:在开始开发之前,您需要明确电话呼叫系统的需求和功能。例如,系统需要支持多方通话吗?是否需要录音或者呼叫转移等功能? 2. 选择SIP协议栈:为了实现SIP协议,您需要选择一个SIP协议栈。常见的SIP协议栈有JAIN-SIP、MjSIP等。这些协议栈可以帮助您构建SIP协议的请求和响应消息。 3. 编写代码:使用Java编写代码来实现电话呼叫系统。您可以使用Swing等工具来创建GUI界面,并通过SIP协议栈来处理电话呼叫请求和响应。 4. 测试和调试:在开发完成后,您需要进行测试和调试,确保系统能够正常工作并符合需求。 总之,基于SIP协议的电话呼叫系统开发需要涉及多个方面,包括SIP协议的实现、Java编程、GUI设计等。希望这些建议和指导可以帮助您成功开发一个稳定和可靠的电话呼叫系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪游东戴河

你就是这个世界的唯一

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值