目前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 |
大概的结构我梳理了一下,如下:
一口吃不成一个胖子,所以,我们一步一步慢慢解析,我觉得比较幸运,除了有文档以外,我还能抓包研究协议,这样开发的效率大大提高,理论与实践同行。
1、TCP和UDP的网络传输
通过对上述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中找到解释。
下面找到了这么一段话:
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文档,然后开始编码,先读完书再说,另外我计划先安装正常的流程实现功能,后续再补充异常的处理。