社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
【GBT28181开发:SIP协议实践】之实况直播 - Go语言中文社区
Toggle navigation
文章
(current)
Go面试题
热
Go导航
Go教程
官方文档
中文文档
标准库文档
Golang入门指南
Go话题
登录
注册
【GBT28181开发:SIP协议实践】之实况直播
实况直播(标准中的叫法是 实时点播,但是以前在HW,SE的设计文档里面是实况,叫习惯了,其实只是个叫法而已 )是整个视频监控系统中比较核心的一个业务,GBT28181标准中对其也做了详细的设计。相对于设备信息、状态查询等业务,其稍微复杂点。
首先消息类型采用的是INVITE,然后消息体的描述采用SDP协议。SDP协议的之前已经学习过了,还算简单:
http://blog.csdn.net/longlong530/article/details/9004707
下面介绍下学习的是实况直播的流程,主要通过模拟SPVMN系统向源设备发送实况直播请求,在GBT28181标准文档中对应的是实况流程中SIP服务器和媒体流发送者交互的子过程。记录下交互的消息,详细研究了下:
转载请注明出处:
http://blog.csdn.net/longlong530
一.环境搭建:
环境准备:
http://blog.csdn.net/longlong530/article/details/9176989
UAC(模拟IPC):
IP:192.168.10.177(同事人不在~,直接用自己的机子模拟了下)
Port:5061
UAS(模拟SIP服务器):
IP:192.168.10.177
Port:5060
SPVMN操作过程:
1.先选择调测设备类型
2.打开UAC.exe完成注册(
http://blog.csdn.net/longlong530/article/details/9179513
)
3.点击实时点播启动,会在左边的文本框中
v=0 //Version 协议版本o=34020000002020000001 0 0 IN IP4 192.168.43.178 //Origin 所有者/创建者和会话标识符s=Play //Subject 会话名称c=IN IP4 192.168.43.178 //Connection Data 连接信息t=0 0 //Time 会话生命周期m=video 6000 RTP/AVP 96 98 97 //Media(Type、Port、RTP/AVP Profile)a=recvonly //扩展属性定义 a=rtpmap:96 PS/90000 //扩展属性定义a=rtpmap:98 H264/90000 //扩展属性定义a=rtpmap:97 MPEG4/90000 //扩展属性定义y=0100000001 //网上木有查到y的意思,最后在28181标准文档中查到:描述SSRC值f= //网上木有查到y的意思,最后在28181标准文档中查到:描述媒体参数
4.点击发送消息,右边对话框即可显示消息交互的过程。(图就不截了~)
二.业务时序图:
三.消息详解:
第一步,UAS-->UAC
SPVMN每次实况前,会发送一个BYE消息,但是该操作在GBT28181标准中并没有规定。
BYE sip:34020000001320000001@192.168.10.177:5061 SIP/2.0CSeq: 2 BYEFrom: <sip:34020000002000000001@3402000000>;tag=67051446_53173353_7e47bbc7-c29c-4299-803b-71f7367975bbTo: <sip:34020000001320000001@3402000000>;tag=946196600Call-ID: 5769dab035fe6ade9dafa5e544c3c6a5@0.0.0.0Max-Forwards: 70Via: SIP/2.0/UDP 192.168.10.177:5060;branch=z9hG4bK7e47bbc7-c29c-4299-803b-71f7367975bb_53173353_20235498592802Content-Length: 0SIP/2.0 200 OKVia: SIP/2.0/UDP 192.168.10.177:5060;branch=z9hG4bK7e47bbc7-c29c-4299-803b-71f7367975bb_53173353_20235498592802From: <sip:34020000002000000001@3402000000>;tag=67051446_53173353_7e47bbc7-c29c-4299-803b-71f7367975bbTo: <sip:34020000001320000001@3402000000>;tag=946196600Call-ID: 5769dab035fe6ade9dafa5e544c3c6a5@0.0.0.0CSeq: 2 BYEUser-Agent: eXosip/3.6.0Content-Length: 0
第二步,UAS-->UAC
发送INVITE消息,请求实况,消息体用SDP协议描述,其中每个字段的意义在上面已经介绍了
INVITE sip:34020000001320000001@3402000000 SIP/2.0Call-ID: 1d7bbec98be4dfc5cf128e40ccde864e@0.0.0.0CSeq: 1 INVITEFrom: <sip:34020000002000000001@3402000000>;tag=97895568_53173353_401bffa2-3ee4-4d32-81b1-3881df7957d3To: <sip:34020000001320000001@3402000000>Max-Forwards: 70Contact: "34020000002000000001" <sip:192.168.10.177:5060>Content-Type: application/sdpRoute: <sip:34020000001320000001@192.168.10.177:5061;line=9a1ca01668b5778;lr>Via: SIP/2.0/UDP 192.168.10.177:5060;branch=z9hG4bK401bffa2-3ee4-4d32-81b1-3881df7957d3_53173353_24913197787603Content-Length: 227v=0o=34020000002020000001 0 0 IN IP4 192.168.43.178s=Playc=IN IP4 192.168.43.178t=0 0m=video 6000 RTP/AVP 96 98 97a=recvonlya=rtpmap:96 PS/90000a=rtpmap:98 H264/90000a=rtpmap:97 MPEG4/90000y=0100000001f= 第三步,UAC-->UAS
服务器响应101消息,表示会话正在正常建立,GBT28181标志没有提及该消息,但是1**的消息都属于Informational级别的通知消息,表示会话正在正常建立。比如网上有的例子还会有180 ring消息响应等。
SIP/2.0 101 Dialog EstablishementVia: SIP/2.0/UDP 192.168.10.177:5060;branch=z9hG4bK4b6c31ac-b631-4c5c-8576-0a82f27a8fbc_53173353_20235503434986From: <sip:34020000002000000001@3402000000>;tag=03164492_53173353_4b6c31ac-b631-4c5c-8576-0a82f27a8fbcTo: <sip:34020000001320000001@3402000000>;tag=3823092636Call-ID: 6fdcb598554bcd699b314c3719c2ba50@0.0.0.0CSeq: 1 INVITEContact: <sip:34020000001320000001@192.168.10.177:5061>User-Agent: eXosip/3.6.0Content-Length: 0
第四步,UAC-->UAS
服务器响应200 ok消息,表示会话建立成功
SIP/2.0 200 OKVia: SIP/2.0/UDP 192.168.10.177:5060;branch=z9hG4bK4b6c31ac-b631-4c5c-8576-0a82f27a8fbc_53173353_20235503434986From: <sip:34020000002000000001@3402000000>;tag=03164492_53173353_4b6c31ac-b631-4c5c-8576-0a82f27a8fbcTo: <sip:34020000001320000001@3402000000>;tag=3823092636Call-ID: 6fdcb598554bcd699b314c3719c2ba50@0.0.0.0CSeq: 1 INVITEContact: <sip:34020000001320000001@192.168.10.177:5061>Content-Type: application/sdpUser-Agent: eXosip/3.6.0Content-Length: 235v=0o=34020000001320000001 0 0 IN IP4 192.168.10.177s=Embedded IPCc=IN IP4 192.168.10.177t=0 0m=video 6000 RTP/AVP 96a=sendonlya=rtpmap:96 H264/90000a=username:34020000001320000001a=password:12345678y=100000001f=
第五步,UAS-->UAC
服务器返回ACK消息,最终确认消息,标志会话正式建立完成
ACK sip:34020000001320000001@192.168.10.177:5061 SIP/2.0Call-ID: 6fdcb598554bcd699b314c3719c2ba50@0.0.0.0CSeq: 1 ACKFrom: <sip:34020000002000000001@3402000000>;tag=03164492_53173353_4b6c31ac-b631-4c5c-8576-0a82f27a8fbcTo: <sip:34020000001320000001@3402000000>;tag=3823092636Max-Forwards: 70Via: SIP/2.0/UDP 192.168.10.177:5060;branch=z9hG4bK4b6c31ac-b631-4c5c-8576-0a82f27a8fbc_53173353_20235513789448Content-Length: 0 然后媒体流发送者(UAC)就开始向服务端指定的目的地( o=34020000002020000001 0 0 IN IP4 192.168.43.178 )发送流媒体,UAC.EXE的截图:
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/fgj111/article/details/54980789
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
发表于 2019-10-26 22:23:40
阅读 ( 3719 )
分类:
0 推荐
收藏
你可能感兴趣的文章
精选的优质文章
也许 Go 开发可以更简单!
10522 浏览
如何使用 Golang 日志监控你的应用程序?
12003 浏览
从Go语言实现模板设计模式浅谈Go的抽象能力
14046 浏览
阿里云基于 Go 的微服务架构分享
23919 浏览
java是否会被取代?Go会否给Java带来冲击?
28446 浏览
千万级规模高性能、高并发的网络架构经验分享
29985 浏览
阿里部分面试题汇总,对想进阿里的同学非常实用
62289 浏览
实用好文:知乎实时数仓架构实践及演进
31314 浏览
支撑马蜂窝「双11」营销大战背后的技术架构
228274 浏览
想进大厂?50个多线程面试题,你会多少?(一)
23046 浏览
0 条评论
请先
登录
后评论
官方社群
关注公众号
—— 加入社区微信群 ——
→
「Go语言教程」
领取
GO教程
1. Go语言简介
1.1 Go语言简介
1.2 Go语言的特性
1.3 Go语言为并发而生
1.4 哪些项目使用Go语言开发?
1.5 哪些大公司正在使用Go语言
1.6 Go语言的性能如何?
1.7 Go语言标准库强大
1.8 Go语言上手简单
1.9 Go语言代码风格清晰、简单
1.10 Go语言工程结构详述
1.11 第一个Go语言程序
1.12 Go语言历史版本
2. Go语言基本语法
2.1 Go语言变量的声明
2.2 Go语言变量的初始化
2.3 Go语言多个变量同时赋值
2.4 Go语言匿名变量
2.5 Go语言变量的作用域
2.6 Go语言整型(整数类型)
2.7 Go语言浮点类型(小数类型)
2.8 Go语言复数
2.9 Go语言bool类型(布尔类型)
2.10 Go语言字符串
2.11 Go语言字符类型(byte和rune)
2.12 Go语言数据类型转换
2.13 Go语言指针
2.14 Go语言变量的生命周期
2.15 Go语言常量
2.16 Go语言类型别名
2.17 Go语言关键字与标识符
2.18 Go语言运算符的优先级
3. Go语言数据结构
3.1 Go语言数组
3.2 Go语言多维数组
3.3 Go语言切片
3.4 使用append()为切片添加元素
3.5 Go语言切片复制
3.6 Go语言从切片中删除元素
3.7 Go语言range关键字
3.8 Go语言多维切片
3.9 Go语言map(映射)
3.10 Go语言遍历map
3.11 map元素的删除和清空
3.12 Go语言sync.Map
3.13 Go语言list(列表)
3.14 Go语言nil:空值/零值
4. Go语言流程控制
4.1 Go语言分支结构
4.2 Go语言循环结构
4.4 Go语言键值循环
4.5 Go语言switch语句
4.6 Go语言goto语句
4.7 Go语言break(跳出循环)
4.8 Go语言continue
5. Go语言函数
5.1 Go语言函数声明
5.2 Go语言函数变量
5.3 Go语言匿名函数
5.4 Go语言函数类型实现接口
5.5 Go语言闭包(Closure)
5.6 Go语言可变参数
5.7 Go语言defer(延迟执行语句)
5.8 Go语言递归函数
5.9 Go语言处理运行时错误
5.10 Go语言宕机(panic)
5.11 Go语言宕机恢复(recover)
5.12 Go语言计算函数执行时间
5.13 Go语言Test功能测试函数
6. Go语言结构体
6.1 Go语言结构体定义
6.2 Go语言实例化结构体
6.3 初始化结构体的成员变量
6.4 Go语言构造函数
6.5 类型内嵌和结构体内嵌
6.6 初始化内嵌结构体
6.7 内嵌结构体成员名字冲突
6.8 Go语言垃圾回收和SetFinalizer
6.9 Go语言链表操作
6.10 Go语言数据I/O对象及操作
7. Go语言接口
7.1 Go语言接口声明(定义)
7.2 Go语言实现接口的条件
7.3 Go语言类型与接口的关系
7.4 Go语言类型断言
7.5 Go语言排序
7.6 Go语言接口的嵌套组合
7.9 Go语言接口和类型之间的转换
7.10 Go语言空接口类型
7.11 Go语言类型分支
7.12 Go语言error接口
8. Go语言包
8.1 包的基本概念
8.2 Go语言封装简介及实现细节
8.3 Go语言GOPATH
8.4 Go语言常用内置包
8.5 Go语言自定义包
8.6 Go语言package
8.7 Go语言导出包中的标识符
8.8 Go语言import导入包
8.9 Go语言sync包与锁
8.10 Go语言big包
8.11 Go语言正则表达式:regexp包
8.12 Go语言time包:时间和日期
8.13 Go语言os包用法简述
8.14 Go语言flag包:命令行参数解析
8.15 Go语言go mod包依赖管理工具
8.16 Go语言runtime包:运行时
9. Go语言并发
9.1 Go语言并发简述
9.2 Go语言轻量级线程
9.3 Go语言并发通信
9.4 Go语言竞争状态
9.5 Go语言调整并发的运行性能
9.6 并发和并行的区别
9.7 goroutine和coroutine的区别
9.8 Go语言通道(chan)
9.9 示例:并发打印
9.10 Go语言单向通道
9.11 Go语言无缓冲的通道
9.12 Go语言带缓冲的通道
9.13 Go语言channel超时机制
9.14 Go语言多核并行化
9.15 互斥锁和读写互斥锁
9.16 Go语言等待组
9.17 死锁、活锁和饥饿概述
9.18 Go语言CSP:通信顺序进程简述
9.19 示例:聊天服务器
10. Go语言反射
10.1 Go语言反射(reflection)
10.2 Go语言反射规则浅析
10.3 通过反射获取类型信息
10.4 通过反射获取指针指向的元素类型
10.5 通过反射获取结构体的成员类型
10.6 Go语言结构体标签
10.7 通过反射获取值信息
10.8 通过反射访问结构体成员的值
10.9 判断反射值的空和有效性
10.10 通过反射修改变量的值
10.11 通过类型信息创建实例
10.12 通过反射调用函数
10.13 Go语言inject库:依赖注入
11. Go语言文件处理
11.1 Go语言自定义数据文件
11.2 Go语言JSON文件的读写操作
11.3 Go语言XML文件的读写操作
11.4 Go语言使用Gob传输数据
11.5 Go语言纯文本文件的读写操作
11.6 Go语言二进制文件的读写操作
11.7 Go语言自定义二进制文件的读写操作
11.8 Go语言zip归档文件的读写操作
11.9 Go语言tar归档文件的读写操作
11.10 Go语言使用buffer读取文件
11.11 Go语言文件的写入、追加、读取、复制操作
11.12 Go语言文件锁操作
12. Go语言编译和工具链
12.1 go build命令
12.2 go clean命令
12.3 go run命令
12.4 go fmt命令
12.5 go install命令
12.6 go get命令
12.7 go generate命令
12.8 go test命令
12.9 go pprof命令
13. Go语言进阶
13.1 Go语言的深拷贝和浅拷贝
13.2 Go语言引用传递和值传递
13.3 Go语言的Socket编程
14. 常见面试题
14.1 Golang Map底层实现
14.2 go语言触发异常的场景有哪些
14.3 Printf()、Sprintf()、Fprintf()函数的区别用法是什么
14.4 详细说说new和make的区别
14.5 详细说说切片和数组的区别
14.6 Golang的内存模型,为什么小对象多了会造成gc压力
14.7 Data Race问题怎么解决?能不能不加锁解决这个问题
14.8 在 range 迭代 slice 时,你怎么修改值的
14.9 select可以用于什么
14.10 go语言编程的好处是什么
14.11 你是否主动关闭过http连接,为啥要这样做
14.12 recover的执行时机
14.13 说出一个避免Goroutine泄露的措施
14.14 如何跳出for select 循环
14.15 如何初始化带嵌套结构的结构体
14.16 Printf()、Sprintf()、Fprintf()函数的区别用法是什么
14.17 go语言中的引用类型包含哪些
14.18 说说go语言的select机制
推荐文章
猜你喜欢
随便看看
设计模式的七大原则(3) --依赖倒置原则
设计模式:观察者模式 ——— 城管来了,摊主快跑
DesignPattern系列__01单一职责原则
DesignPattern系列__02接口隔离原则
面向对象六大设计原则(转载)
DesignPattern系列__03依赖倒置原则
DesignPattern系列__04里氏替换原则
设计模式的七大原则(4) --里氏替换原则
DesignPattern系列__05开闭原则
设计模式之观察者模式
×
发送私信
发给:
内容:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!