gb28181的sip通信

目前gb28181的sip通信基本上都是采用C++,C开发,开源的解决方案有osip,resip等等,高级语言的通信库很少。而且gb28181在sip方面其实应用很少,仅仅用到了点对点通信,并没有用到代理模式,路由模式等等。另外这几个开源的方案,性能上面都有很大不足。尽管我使用这些方案完成了sip的开发,但是我总是不太满意,每次修改一个功能都要看半天代码。

针对上述情况,我决定采用高级语言C# 在netcore2.0下面开发一套符合gb28181要求的sip通信库,并计划开源。由于本人还没有github账号,所以第一步,先申请一个账号,建立了个工程如下:

https://github.com/g0415shenw/gb28181_Sip

接下来,开始梳理gb28181的sip信令组成,这个时候,我们需要做的就是仔细阅读gb28181-2016的书。

我罗列了我需要下载的文档:

命令 参考文档
Register Rfc3261
Invite Rfc3261
Info Rfc2976
Message Rfc3428

大概的结构我梳理了一下,如下:

gb28181的sip通信_第1张图片

 

一口吃不成一个胖子,所以,我们一步一步慢慢解析,我觉得比较幸运,除了有文档以外,我还能抓包研究协议,这样开发的效率大大提高,理论与实践同行。

1、TCP和UDP的网络传输

gb28181的sip通信_第2张图片

gb28181的sip通信_第3张图片

通过对上述UDP协议的观察,我们发现,

第一条:请求的IP地址:192.168.50.90  请求的端口5061  目的地址:192.168.50.64 目的端口5061

第二条:请求的IP地址:192.168.50.64 请求端口5061 目的地址:192.168.50.90 目的端口5061

总结:UDP的sip 通信,需要再本地绑定一个UDP的端口,此端口用来发送信息以及接收信令,接收方同理也是绑定一个本地的UDP端口,即用来接收信令,又用来发送信令。或者这么理解,服务端接收到一个请求后,可以获取到对方的UDP端口与IP地址,应答的消息也需要发送给这个UDP的端口和IP地址。

这个只是猜测,我尝试在rfc3261中找到解释。

下面找到了这么一段话:

gb28181的sip通信_第4张图片

 gb28181的sip通信_第5张图片

 https://www.cnblogs.com/zhangming-blog/articles/5900244.html (参考这篇文章的介绍)

https://blog.csdn.net/dingpeng1978/article/details/2652380

看了好多,我决定先这么设计网络通信:

UDP应答消息根据UDP接收消息的源IP地址与端口

UDP请求消息根据目的IP地址与端口

tcp请求消息根据目的IP地址与端口

tcp应答消息根据接收tcp请求的连接

这里不准备根据via进行应答,也不准备根据contact进行应答,

原因如下:

via在国标的示例里面,好像填写的信息很少,也没有明确如何应答的IP与端口。网络层暂时就这么办。

**********************************sip协议解析与封装***************************

这里的设计思路是,

写一个基类负责解析与封装,这里需要总结出Regiser,message,Invite的统一规律。

封装的话,我计划把类赋值之后,直接序列化成字符串,即可。

**********************************sip事务***************************

sip事务机制,我觉得主要就是处理消息的重发,这里针对的是UDP的消息,Tcp的有协议层实现。还有一个作用

就是接收到重发的消息之后的屏蔽,就是说如果接收到多个同样的消息,我们需要屏蔽消息,然后通知到应用层只能是一条消息。事务机制还有就是各种状态的保存,超时的判断等等。

这里的话,我觉得再好好把RFC文档再读一遍,才开始编码。

*********************************API接口***************************

接收消息我准备以为事件的形式通知出来,然后就是发送消息的API封装。

**********************************大概就这些*****************************************

下面就是通读rfc3261文档,然后开始编码,先读完书再说,另外我计划先安装正常的流程实现功能,后续再补充异常的处理。

你可能感兴趣的:(GB28181)