文章目录
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();
// Success
if (((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