SIP协议之呼叫保持(HOLD)

news2024/10/7 4:36:25

  呼叫保持(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实现保持功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/842344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter 自定义view

带进度动画的圆环。没gif,效果大家自行脑补。 继承CustomPainter,paint()方法中拿到canvas,绘制API和android差不多。 import package:flutter/material.dart;class ProgressRingPainter extends CustomPainter {double strokeWidth 20;Col…

2023应急指挥系统总体架构方案 PPT

导读:原文《应急指挥系统总体架构方案PPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式: 如需获取完整的电…

如何找到死锁的线程?_java都学什么

在Java中,死锁是指两个或多个线程被无限地阻塞,等待彼此持有的资源,从而导致程序无法继续执行的情况。死锁通常是由于线程之间循环等待资源而产生的。要找到死锁的线程,可以采用以下方法: 1.线程转储(Thread Dump) 通过…

【Vant Weapp】van-icon 图标

<van-icon name"play-circle" color"rgba(255,255,255,.6)" size"40"/>

关于策略模式的注入问题

上面抄别人的 当在实现策略方法时&#xff0c;报null&#xff0c;排查后发现是接口实现有多个&#xff0c;需要添加别名 注入时添加Qeualifier&#xff0c;指定名称&#xff0c;如下图&#xff1b;如图上修改&#xff0c; 测试类中不用new具体行为策略了&#xff0c;注入别名即…

OpenStreetMap数据转3D场景【Python + PostgreSQL】

很长一段时间以来&#xff0c;我对 GIS 和渲染感兴趣&#xff0c;在分别尝试这两者之后&#xff0c;我决定最终尝试以 3D 方式渲染 OpenStreetMap 中的地理数据&#xff0c;重点关注不超过城市的小规模。 在本文中&#xff0c;我将介绍从建筑形状生成三角形网格、以适合 Blend…

认识Vue;vue使用和安装;声明式和命令式编程;MVVM模型;data属性;methods属性

目录 1_认识Vue2_vue使用和安装3_声明式和命令式编程4_MVVM模型5_data属性6_methods属性 1_认识Vue Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式 JavaScript框架。 全称是Vue.js或者Vuejs&#xff1b; 它基于标准 HTML、CSS 和 JavaScript 构建…

SpringBoot开发环境热部署

目录 开发热部署 添加dev-tools依赖 在application.properties中配置devtools 在IDEA中添加设置 开发热部署 在实际的项目开发调试过程中会频繁地修改后台类文件&#xff0c;导致需要重新编译、 重新启动&#xff0c;整个过程非常麻烦&#xff0c;影响开发…

密码攻击与ADSelfService Plus的保护

密码攻击是当前网络安全面临的严峻挑战之一。黑客通过不断演进的技术手段&#xff0c;试图入侵用户账户&#xff0c;窃取敏感信息&#xff0c;从而对个人和组织造成严重损害。为了应对密码攻击的威胁&#xff0c;ManageEngine推出了ADSelfService Plus&#xff0c;这是一款功能…

【数据结构】链表(一)

链表&#xff08;一&#xff09; 文章目录 链表&#xff08;一&#xff09;01 引入02 概念及结构03 单向不带头不循环链表实现3.1 创建节点类型3.2 简易创建一个链表3.3 遍历链表每个节点3.4 获取链表长度3.5 查找是否包含关键字key是否在单链表当中3.6 头插法3.7 尾插法3.8 任…

无涯教程-Perl - delete函数

描述 此函数从哈希中删除指定的键和关联的值,或从数组中删除指定的元素。该操作适用于单个元素或切片。 语法 以下是此函数的简单语法- delete LIST返回值 如果键不存在,并且与已删除的哈希键或数组索引关联的值,则此函数返回undef。 Perl 中的 delete函数 - 无涯教程网无…

Java spring boot 全解Camunda 7,从 0 到 1 构建工作流平台——第二节:Spring boot 简单集成

目录 1. 成果展示2. 环境准备3. 项目构建3.1 项目结构3.2 引入Camunda 依赖3.3 启动spring boot 程序3.4 启动 web app 程序 引言&#xff1a;当今技术发展迅猛&#xff0c;企业对于业务流程的高效管理和自动化需求也日益增长。在这个背景下&#xff0c;Spring Boot和Camunda7成…

【网络基础实战之路】基于MGRE多点协议的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS&#xff1a;本要求基于…

Jupyter Notebook 未授权访问远程命令执行漏洞

漏洞描述 Jupyter是一个开源的交互式计算环境&#xff0c;它支持多种编程语言&#xff0c;包括Python、R、Julia等。Jupyter的名称来源于三种编程语言的缩写&#xff1a;Ju(lia)、Py(thon)和R。 Jupyter的主要特点是它以笔记本&#xff08;Notebook&#xff09;的形式组织代码…

Python基础教程——贪吃蛇、连连看小游戏(完整版,附源码)

一、贪吃蛇 1. 案例介绍 贪吃蛇是一款经典的益智游戏&#xff0c;简单又耐玩。该游戏通过控制蛇头方向吃蛋&#xff0c;从而使得蛇变得越来越长。 通过上下左右方向键控制蛇的方向&#xff0c;寻找吃的东西&#xff0c;每吃一口就能得到一定的积分&#xff0c;而且蛇的身子会…

pointpillars在Ubuntu2004训练的总结

1、找到pointpcdet-master之后在此打开终端输入code进入VScode界面 code 2、激活pp环境 conda activate pp 3、cd进入tools cd tools 4、将kitti数据集准备好放入data路径下之后开始训练 python train.py --cfg_file cfgs/kitti_models/pointpillar.yaml 5、训练完成之…

AOSP开发——APN配置文件路径

Android1~9&#xff0c;APN配置文件路径&#xff1a; vendor/sprd/telephony-res/apn/apns-conf_8.xml Android10~12&#xff0c;APN配置文件路径&#xff1a; /vendor/sprd/telephony-res/apn/apns-conf_8_v2.xml Android13&#xff0c;APN配置文件路径&#xff1a; /vendor/…

一文读懂快速开发平台

一、开发平台是什么&#xff1f; 开发平台是指以一或多种编程语言为基础而开发的一种软件&#xff0c;通常其不作为最终的软件产品&#xff0c;它是一类可二次开发的软件框架&#xff0c;开发者能利用其高效地开发各类软件产品。 在利用开发平台进行开发工作时&#xff0c;可摒…

基于Home Assistant远程开门

基于Home Assistant远程开门 1.购买云服务器 1.1 阿里云服务器 本人使用的是阿里云服务器&#xff0c;其他的腾讯云&#xff0c;百度云都可以 如果你想要一个建议的话&#xff1a; 推荐在打折优惠的时候买&#xff0c;比如双十一 阿里云最近有一个飞天计划&#xff0c;在校…

关于丢失安卓秘钥的撞sha-1值的办法

实验得知&#xff0c;安卓sha-1和keytool生成秘钥签名文件的时间有关。 前提条件是&#xff0c;开发者必须知道生成秘钥的所有细节参数 以下是撞文件代码&#xff08;重复生成&#xff09; import time import osidx 0while True:cmdkeytool -keyalg RSA -genkeypair -alia…