服务器发布的项目请求摄像头权限,使用 WPF 版简易 SIP 服务器向 GB28181 摄像头发送直播请求...

一、引言

之前写过一篇博客《使用 GB28181.Solution ZLMediaKit  MediaServerUI 进行摄像头推流和播放》,里面是使用了 GB28181.Solution 工程的 GB28181.WinTool 测试程序来作为 SIP 服务器的,该程序界面上体现的功能是比较全的(不过本人只测试了

21421156ebe0fa2af85b72d718e414ed.png

二、项目渊源

GB28181.Solution 里使用了 SIPSorcery 开源项目的代码,本项目 SimpleSIPServer 也是从 SIPSorcery 的一个例子 SIPProxy 起头的,里面还有些其它的例子,有助于学习如何使用 SIPSorcery,大家可以看看:

cf43a078862414f6df6b402d7d33bcac.png

SIPSorcery 的核心功能通过 NuGet 包引入,当前使用的是 v4.0.60-pre 版:

24dc2758cf8a80af63d03910998c86fc.png

本项目还借用了 GB28181.Solution 中针对于 GB28181 进行扩充的实体定义(几个文件夹都拷过来了,以备不时之需),以及几个方法:

d9525fbc3622fbec3774528d4fd767fd.png

三、软件使用及 SIP

(一) 注册和心跳

首先启动程序,在配置区按实际情况进行配置:

44d37c0c0b0af0c47c26bc70e7fdf25a.png

SIP 服务器默认端口为 5060,DeviceId 目前来说不重要,媒体服务器的一些配置可参考引言中提到的文章(本文还是使用 ZLMediaKit 作为流媒体服务器)。

启动服务主要是配置 SIP 通道,然后附加一些事件的处理方法:

2bc80707cb25a7869aeea0574758c8ad.png

摄像头配置好 SIP 服务器后,会周期性地尝试注册和发送心跳到配置的 SIP 服务器 IP:Port。

0f1770193ea11b7e450d05921ada44e2.png

这样我们启动服务器后,就能收到注册请求(REGISTER)了。当然,这次是运气比较好,一下就收到了注册请求,通常还会有先收到一段时间的心跳请求然后才收到注册请求的情况。收到注册请求后,我们先回了个 100 Trying 消息(应该是非必需的),表示正在处理,处理完成后,又回了个 200 OK 消息,如下图:

aff90f0431367ed6aa7e8477a5ca0a42.png

回应心跳请求也是用 200 OK,有说法是不要回应未注册的心跳,我在本程序里也加了这个开关,不过测试中好像和回应的情况没什么区别,大家可以自己试试。

抓包列表如下:

5014d7f7b54778bc6471f3138a4c5112.png

(二) 直播 INVITE

设备(摄像头)注册成功后,展开 “连入的客户端” 区域,并点击选中一项,然后就可以点击 “请求开始直播”:

b0143071026f95c5061f81e14da0e6ed.png

程序发送 INVITE 请求,然后摄像头依次响应 100 Trying、101 Dialog Establishement 中间状态,最后回复 200 OK:

bceb889a44206cf977183a2c19043c1b.png

收到 200 OK 后,程序需要发送 ACK 请求,然后摄像头收到后就可以进行推流(RTP/PS)了:

04b37193dad36efc5079f2d23c7e5bce.png

可以看到 PS 流有个 SSRC (同步源标识),这个是用来区分流的,由本程序在发出 INVITE 时附带,生成和发送的时候是 10 进制,此处显示为 16 进制:

e3851838a655648ca2d39842f7573f57.png

由上图还可看到,本程序依据 ZLMediaKit 的播放地址规则(使用了十六进制形式的 SSRC),直接生成了播放地址,使用 PotPlayer 打开链接即可播放:

6148838aeea193262ad6bdc4f3a1f0bc.png

支持发起多个直播请求(多个设备),使用 MediaServerUI 查看:

aaf4f4264dfdccecddbaaa989fba8c5a.png

停止直播就是发送 BYE 指令:

2ede51443c46624b6404ab15945c9ec3.png

(电脑 C 盘突然空间不足了,抓包失败)

四、注意事项

开发过程中遇到这样一个情况:

IPC(网络摄像头) 回复 200 OK 后,程序发送 ACK 消息过去,但是 IPC 不认,还是继续回复 200 OK,几次之后就 BYE 了。

经过流媒体服务器 Monibuca 的作者指导,得知原因是,CallId 要和 200OK 的 CallId 一致。另外,这个通信过程中直接使用 IPC 的设备编号就行,不一定要使用通道编号(GB28181.WinTool 是使用通道编号)。

实际上,RFC 3261 中说:

The combination of the To tag, From tag, and Call-ID completely defines a peer-to-peer SIP relationship...

也就是 INVITE 整个通信过程中,由 FromTag、ToTag 和 CallId 三者一起唯一确定一个 SIP 的点对点关系,也就是说 ACK 和 BYE 两个请求中,这三者要和 200 OK 发过来时的值一致:

63579a78077a4c752977d5b950ff9d15.png

五、资源

SIP 指令抓包数据:关注微信公众号 "独立观察员博客" 后回复 "SIP" 获取。

d70cd8e86519e97664151ed7b2d6b5c7.png

附-改造方案:

fe9f306ff27edd16ba3c2695606e8ce9.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值