国标Gb28181是基于Sip协议的,因此对Contact和Route的使用,也可以说是Sip里Contact和Route的使用。Contact和Route则是sip协议里的头字段。

现在,在使用国标Gb28181来做项目时,经常会遇到这种情况,国标的下级是在内网里,上级在公网上。如果不做处理,下级到上级会经过nat协议的转换从而导致上级向下级发送请求时(比如获取目录请求)不能到达下级的内网里。这里我们就可以使用Contact和Route来处理这个情况。

这里我们还要先来讲讲使用到via里的rport参数,也就是sip的rport机制,它的作用就是用来穿透nat而存在的。

下级从内网里向公网的上级发送请求时,via里带上rport参数。上级接收到后发现带rport参数,就将此via中加入received参数和rport参数,参数带的值分别是服务端看到的消息来源地址和端口(如果有NAT等地址转换设备,则即为转换后的IP和port,也就是下级的外网地址和端口),这样上级在返回信息时就会使用这个地址和端口来穿透到下级的内网里。

REGISTER sip:41020000002000000001@4102000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.206:5060;rport;branch=z9hG4bK144704899
From: <sip:34020000001320000206@4102000000>;tag=825081266
To: <sip:34020000001320000206@4102000000>
Call-ID: 1058865898
CSeq: 1 REGISTER
Contact: <sip:34020000001320000206@192.168.1.206:5060>
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0

比如上面是一个下级的注册请求,via里带了rport参数。而我们收到这个请求时,根据协议会添加上带值得rport和received,更具体来讲,当你自己实现sip协议时需要来完成这个动作。如果使用的是第三方库,则由第三方库来实现这个动作。比如我用的exosip就会完成这个动作。

REGISTER sip:41020000002000000001@4102000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.206:5060;rport=25540;branch=z9hG4bK248624944;received=222.211.183.144
From: <sip:34020000001320000206@4102000000>;tag=825081266
To: <sip:34020000001320000206@4102000000>
Call-ID: 1058865898
CSeq: 5 REGISTER
Contact: <sip:34020000001320000206@222.211.183.144:25540>
Max-forwards: 70
User-agent: IP Camera
Expires: 0
Content-Length: 0

这里我们通过rport=25540; received=222.211.183.144就知道了下级的映射到外网得地址和端口。

我们知道了这个地址和端口有什么用呢?

1、当我们向下级发送信息时,使用rport received来穿透到下级

2、让下级也知道自己的外网地址。

对于第二点就是在返回信息时,via带上的rport=25540; received=222.211.183.144。如下

SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.1.206:5060;rport=25540;branch=z9hG4bK248624944;received=222.211.183.144
From: <sip:34020000001320000206@4102000000>;tag=825081266
To: <sip:34020000001320000206@4102000000>;tag=365387237
Call-ID: 1058865898
CSeq: 5 REGISTER
User-Agent: XINYU SIP UAS/1.0
WWW-Authenticate: Digest realm="xinyu", nonce="{aee9bab8-7517-40fe-96a0-3f3514f5e771}", algorithm=MD5
Content-Length: 0

好了,通过上面的讲述,我们知道了如何获取外网映射的ip和端口,那么该如何使用呢?

对于下级发起的请求,其实我们还不太在意这个数据,因为上级发送响应时,遵照从哪里来的,发回哪里去的原则(考证一下),自动就把信息从就收的ip端口返回了。

最需要这个的就是上级向下级发起的请求了,上级向下级发起请求是,需要在sip协议里说明该发向哪里,发到下级的内网地址?那肯定是不行的。应该是发到下级的外网映射地址上才是。那我们应该在那个字段来说明这个呢?route字段就派上用场了,我们使用route字段来指明下级的外网映射地址,比如Route: <sip:34020000001320000206@222.211.183.144:25540>,这样sip协议就知道了该向222.211.183.144:25540这里发送数据。但是要说明的是下级收到信息时是看不到Route: <sip:34020000001320000206@222.211.183.144:25540>这个字段的,因为根据sip,一条route被使用后会被删除掉。因为这个路由已经过了通过了嘛。比如:

Via: SIP/2.0/UDP 999.999.999.999:99999;rport;branch=z9hG4bK547986598
Route: <sip:34020000001320000206@4102000000>
From: <sip:41020000002000000001@4102000000>;tag=1527192235
To: <sip:34020000001320000206@4102000000>
Call-ID: 937082210
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: XINYU SIP UAS/1.0
Content-Length:   113

实际发送的时候是,可以看到并没有route字段(exosip实现)

MESSAGE sip:34020000001320000206@222.211.183.144:25540 SIP/2.0
Via: SIP/2.0/UDP 172.22.161.79:15060;rport;branch=z9hG4bK547986598
From: <sip:41020000002000000001@4102000000>;tag=1527192235
To: <sip:34020000001320000206@4102000000>
Call-ID: 937082210
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: XINYU SIP UAS/1.0
Content-Length:   113

以上就是route的使用场景。

contact在何时使用呢?一个典型的是下级在呼叫上级时,比如

REGISTER sip:41020000002000000001@4102000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.206:5060;rport;branch=z9hG4bK1758228297
From: <sip:34020000001320000206@4102000000>;tag=825081266
To: <sip:34020000001320000206@4102000000>
Call-ID: 1058865898
CSeq: 4 REGISTER
Contact: <sip:34020000001320000206@222.211.183.144:25540>
Authorization: Digest username="34020000001320000206", realm="xinyu", nonce="{cde06108-5c2d-4961-b3e1-dd7304415820}", uri="sip:41020000002000000001@4102000000", response="d44dde3717e07505b44977f8e6ad40c6", algorithm=MD5
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0

下级请求时,再如

MESSAGE sip:41020000002000000001@123.56.22.90:15060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.222:5070;rport;branch=z9hG4bK206916016
From: <sip:51020000001310000005@4102000000>;tag=444097513
To: <sip:41020000002000000001@4102000000>
Call-ID: 476580169
CSeq: 246 MESSAGE
Contact: <sip:51020000001310000005@222.211.183.144:26244>
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: hahah
Content-Length:   151<?xml version="1.0"?>
<Notify>
<CmdType>Keepalive</CmdType>
<SN>43</SN>
<DeviceID>51020000001310000005</DeviceID>
<Status>OK</Status>
</Notify>

这里加上contact,也是告诉对方,你如果想要向我呼叫或请求,可以向我这里说明的地址和端口发送哈。这样上级在请求或主动呼叫时就可以使用这个地址来进行了。比如invite后,想要结束发送bye方法的时候等等。

另外,还可以参看下面的文章

Contact和Record-Route 解释_wwyyxx26的博客-CSDN博客

国标Gb28181里Contact和Route的使用相关推荐

  1. rtsp 分辨率信息_SDP在RTSP、国标GB28181、WebRTC中的实践

    ​问题背景: 无论你是用微信进行视频电话还是开Zoom视频会议,按照OSI网络七层参考模型,我们进行这些活动之前一般都要先建立一组会话.在建立会话的过程中,我们需要描述下会话的一些信息,描述这种会话能 ...

  2. 使用c# .net core开发国标gb28181 sip +流媒体服务完成视频监控实例教程 亲身完美体验过程...

    目前使用C# .net core 来实现国标gb28181标准的摄像头播放.ptz云台控制.视频回放等视频监控功能,项目可运行于linux/docker/.net core环境,也是当前非常罕有的能做 ...

  3. 取rtsp流数据_SDP在RTSP、国标GB28181、WebRTC中的实践

    问题背景: 无论你是用微信进行视频电话还是开Zoom视频会议,按照OSI网络七层参考模型,我们进行这些活动之前一般都要先建立一组会话.在建立会话的过程中,我们需要描述下会话的一些信息,描述这种会话能力 ...

  4. 国标GB28181协议平台EasyGBS被国外IP攻击后如何快速删除这些垃圾设备?

    随着计算机技术和互联网技术的快速发展,网络安全问题也日益突出和复杂.尤其是进入大数据时代,视频监控的数据资源价值更加显著,因此很容易被不法分子盯上,特别是在视频网络的传输中,大多数的前端接入设备要靠公 ...

  5. 国标GB28181安防视频平台EasyGBS配置完成之后无法播放的问题排查步骤与解决

    EasyGBS是基于国标GB28181协议的视频平台,它的特点是支持设备以GB28181协议接入,可对视频进行解码.处理.分发等服务,兼容全平台.全终端.在视频能力上,EasyGBS可以实现视频监控直 ...

  6. 城市消防项目采用宇视平台接入国标GB28181协议国标视频平台EasyGBS设备过多时应如何解决?

    目前我们TSINGSEE青犀视频团队和很多城市的消防平台都又对接项目,大部分的消防平台都是国标GB28181协议的前端设备,因此很多项目使用的是我们的EasyGBS视频平台. TSINGSEE青犀视频 ...

  7. 服务器支持高频分辨率吗,国标GB28181流媒体服务器分辨率会导致视频无法播放吗?...

    原标题:国标GB28181流媒体服务器分辨率会导致视频无法播放吗? 我的博客里一搜能看到很多关于视频分辨率.码率的相关内容,里面有给大家做介绍的,也有为大家解决问题的,大家都可以自行查找,当然有查找不 ...

  8. ffmpeg编译gb28181_国标GB28181协议视频推流平台EasyGBD在Linux下编译报“UINT64_C在此作用领域中尚未声明”错误...

    上一篇我们讲了国标GB28181协议视频推流平台EasyGBD正在重新编译,在编译中难免遇到不同的报错,比如"UINT64_C在此作用领域中尚未声明"错误就是其中一个. 出现该问题 ...

  9. 【解决方案】国标GB28181视频监控平台国标流媒体服务器EasyGBS如何实现安保行业日常巡查视频监控系统解决方案?

    安保公司的成立主要对所辖区域实行24小时全天候保安巡视服务,为防盗.防火.防灾.交通和维持管理区域的公共秩序,预防和处理各类不安全事件.巡视时要经常定时汇报巡视情况,加强死角地段的治安执勤巡逻,负责上 ...

最新文章

  1. pandas dataframe 过滤——apply最灵活!!!
  2. linux中probe函数传递参数的寻找(下)
  3. (6)段描述符D/B位
  4. linux系统下的mysqlgt;aborted_MySQL令人头疼的Aborted告警案例分析
  5. Mac下修改ZOC中文乱码
  6. JS 异步编程及常考面试题
  7. Hive 之 用户自定义函数 UDF UDAF UDTF
  8. C++基础之返回数组
  9. 如何用代码表白——matlab绘制玫瑰、爱心和I LOVE YOU
  10. android 模拟 ns手柄,Joy-Con Droid可将Android智能机变身为任天堂Switch的手柄
  11. 容齐的身世_浅析容齐
  12. 【Alpha版本】项目测试
  13. 深圳赛意信息 怎么样_深圳鹏程整形医院怎么样_全新整形价目表_资质
  14. ubuntu QT Creator Fatal IO error 2 (没有那个文件或目录) on X server :0
  15. 利用 MATLAB 编程实现乘子法求解约束最优化问题。
  16. 风青杨:马云为何被浙商“炮…
  17. 微信硬件平台蓝牙打印机
  18. 10个顶尖响应式HTML5网页
  19. 五分钟you-get入门
  20. 服务器后还有一系列留后门,服务器留后门的原则是什么

热门文章

  1. Linux常用命令:
  2. 20P70 PR模板-22种视频分屏动画预设 Split Screen Premiere
  3. 【stream】stream流基础知识
  4. 小羊驼和你一起学习cocos2d-x之三(进度条、CCProgressTimer)
  5. NUMECA FINE/Turbo16 安装教程
  6. [附源码]SSM计算机毕业设计志愿者管理系统论文2022JAVA
  7. Docker CE 还是 Docker EE
  8. MyEclipse的项目中把 java EE 5 Libraries 删掉后怎么重新导入
  9. Bandzip右键菜单离奇消失解决办法
  10. 【阿里云】阿里云物联网平台参数设置