监控网关的设计思路
监控网关
在voip系统中,信令都是基于sip协议的,在接入摄像头时一般就需要一个网关,用于sip协议到rtsp协议的转换及媒体流的转发。监控网关将摄像头虚拟成sip终端,注册到sip服务器上,可供voip系统内部的sip终端直接点播视频。
点播时序图
以下是核心流程点播的简单时序图,主要用于说明监控网关所扮演的一个角色。
监控网关的几点需求
- 通过配置将摄像头rtsp url与一个sip账号进行映射
- 将一个摄像头虚拟成一个sip终端,向sip server注册并维持在线状态
- 支持点播(拉流模式),支持媒体协商
- 支持媒体流心跳消息,对sip端来说是update消息,对rtsp端来说是SET_PARAMETER消息
- 支持媒体流复用,即对同一个摄像头有多次点播时,几次点播间的媒体流是复用的,不再另行拉流
实现的几个要点
- 性能关键点
监控网关的主要业务是sip,rtsp消息的收发解析及rtp流的转发,所以其为一个IO密集型(socket的读写也属于IO)服务器,IO模块的设计正是网关性能的关键。网关涉及到的sip协议,rtsp协议,rtp协议其实只是信令解析和状态管理的不同,其IO模块共用一套,IO模块同时支持udp和tcp。 - 信令实现
网关需要实现的sip协议只是一个子集。需实现register,option,invite,update,bye,info。其中register,option消息是用于维护与sip server的在线状态。invite用于实现点播,update用于支持媒体流心跳,info用于支持关键帧的请求,message用于支持业务扩展。 - 媒体协商
对网关而言,其只是去拉流,媒体协商是以摄像头支持的能力为准,如果sip终端的invite消息中带的媒体能力不包括摄像头的媒体能力则为协商失败。
综上所述,网关分为网络层(IO层),sip协议模块,rtsp协议模块,媒体转发模块。网络层根据IP和Port将收到的消息分发至对应的协议解析模块,媒体专访直接在网络层做,收到的媒体流直接转发至对应的目的端口。
我见过的一种网关的实现,其只是简单的将开源的sip协议栈及rtsp协议栈进行集成,将网关上的一个虚拟的sip终端抽象为包含这两种协议栈的一个对象,再为每个协议栈去开一个线程,发别处理对应的消息。这种实现实现起来很简单,但是问题也很大,首先每个协议栈间IO模块自成体系,各玩各的一套,这样在IO性能上很难将效率发挥到最大,再者由于其是集成的整个协议栈,庞大而复杂难以维护。
以上。