本节阐述sip通信步骤对应到wvp-gb28181-Pro中的代码。
sip通信流程
sip通信主要有6个核心方法和8个扩展方法。
wvp针对这14个方法(注意wvp并没有全部实现14个方法),相应写了处理对象,如下图
将这些处理器RegisterRequestProcessor、MessageRequestProcessor等等Processor加入到SIPProcessorObserver观察者的容器中。当有相应方法的sip消息到来时,根据是Request还是Response,观察者将调用相应的Processor进行处理。观察者中的处理Request源码如下(处理response的没有贴出来):
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);
}
由于MessageRequestProcessor类型的消息较多,wvp将Message再分为多个handler,根据cmdType调用对应的handler。如cmdType = “Catalog”、cmdType = “DeviceInfo”。
查询设备信息的sip过程
gb28181文档上的消息规范,从J.10.1到J.10.8:
摄像机注册成功后,wvp会发命令查询设备信息。过程如下:
1、RegisterRequestProcessor.java 第195行deviceService.online(device, sipTransactionInfo);
2、DeviceServiceImpl.java 第127行commander.deviceInfoQuery(device);
3、SIPCommander.java 第45行发出一个message请求,代码如下
public void deviceInfoQuery(Device device) throws InvalidArgumentException, SipException, ParseException {
StringBuffer catalogXml = new StringBuffer(200);
String charset = device.getCharset();
catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
catalogXml.append("<Query>\r\n");
catalogXml.append("<CmdType>DeviceInfo</CmdType>\r\n");
catalogXml.append("<SN>" + (