文章目录
- 一、SIP通信方法介绍
- 1.1 核心方法(Core Methods)
- 1.2 扩展方法(Extension Methods)
- 二、源码分析
- 2.1 SIP协议处理过程
- 2.2 查询设备信息的sip过程(CmdType=DeviceInfo)
- 2.2.1 摄像机注册成功后,wvp会发命令查询设备信息
- 2.2.2 查询信令发出
- 2.2.3 处理设备查询返回的XML
- 2.3 查询设备通道(目录)的sip过程(CmdType=Catalog)
2024年6月20日下载的wvp-GB28181-pro,版本号为2.7.2,使用ZLMediakit主干版本。
本节阐述sip通信步骤对应到wvp-gb28181-Pro中的代码。
一、SIP通信方法介绍
sip通信主要有6个核心方法和8个扩展方法。
1.1 核心方法(Core Methods)
SIP请求消息(方法Method) | SIP操作 |
---|---|
INVITE | 会话邀请 |
ACK | 确认会话邀请 |
CANCEL | 取消会话邀请 |
BYE | 结束会话 |
REGISTER | 注册 |
OPTIONS | 查询服务器能力 |
1.2 扩展方法(Extension Methods)
SIP请求消息(方法Method) | SIP操作 |
---|---|
Subscribe | 与所使用的用户代理商建立订阅,获取有关特定事件的通知 |
NOTIFY | NOTIFY是用来由用户代理传达特定事件的发生 |
PUBLISH | PUBLISH用于由用户代理发送的事件的状态信息 |
REFER | REFER用于由一个用户代理来指另一个用户代理访问URI的对话框 |
INFO | INFO所使用的用户代理发送呼叫信令信息,与它建立了一个媒体会话其他用户代理 |
UPDATE | UPDATE用于修改会话的状态不改变对话的状态 |
PRACK | PRACK用于确认收到临时响应(1XX)可靠传输 |
MESSAGE | 用来发送即时消息 |
二、源码分析
2.1 SIP协议处理过程
wvp针对这14个方法(注意wvp并没有全部实现14个方法),相应写了处理对象,如下图
将这些处理器RegisterRequestProcessor、MessageRequestProcessor等等Processor加入到SIPProcessorObserver观察者的容器中。
每一个processor中都有这个方法,用来添加消息处理的订阅。processor方法实现了InitializingBean类(不懂的可以去查),通过afterPropertiesSet()方法完成了消息的订阅。
@Override
public void afterPropertiesSet() throws Exception {// 添加消息处理的订阅sipProcessorObserver.addRequestProcessor(method, this);
}
当有相应方法的sip消息到来时,根据是Request还是Response,观察者将调用相应的Processor进行处理。
观察者SIPProcessorObserver类,在如下的包路径下
com.genersoft.iot.vmp.gb28181.transmit
观察者中的处理Request源码如下
public void processRequest(RequestEvent requestEvent) {String method = requestEvent.getRequest().getMethod();ISIPRequestProcessor sipRequestProcessor = requestProcessorMap.get(method);if (sipRequestProcessor == null) {logger.warn("不支持方法{}的request", method);// TODO 回复错误玛return;}requestProcessorMap.get(method).process(requestEvent);}
处理Response的源码如下
@Override@Async("taskExecutor")public void processResponse(ResponseEvent responseEvent) {Response response = responseEvent.getResponse();int status = response.getStatusCode();// Successif (((status >= Response.OK) && (status < Response.MULTIPLE_CHOICES)) || status == Response.UNAUTHORIZED) {CSeqHeader cseqHeader = (CSeqHeader) responseEvent.getResponse().getHeader(CSeqHeader.NAME);String method = cseqHeader.getMethod();ISIPResponseProcessor sipRequestProcessor = responseProcessorMap.get(method);if (sipRequestProcessor != null) {sipRequestProcessor.process(responseEvent);}if (status != Response.UNAUTHORIZED && responseEvent.getResponse() != null && sipSubscribe.getOkSubscribesSize() > 0 ) {CallIdHeader callIdHeader = (CallIdHeader)responseEvent.getResponse().getHeader(CallIdHeader.NAME);if (callIdHeader != null) {SipSubscribe.Event subscribe = sipSubscribe.getOkSubscribe(callIdHeader.getCallId());if (subscribe != null) {SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(responseEvent);sipSubscribe.removeOkSubscribe(callIdHeader.getCallId());subscribe.response(eventResult);}}}} else if ((status >= Response.TRYING) && (status < Response.OK)) {// 增加其它无需回复的响应,如101、180等} else {logger.warn("接收到失败的response响应!status:" + status + ",message:" + response.getReasonPhrase());if (responseEvent.getResponse() != null && sipSubscribe.getErrorSubscribesSize() > 0