From 985082d33930868c3cc1723f28fd9aaae9013a8f Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期三, 16 八月 2023 09:11:22 +0800 Subject: [PATCH] 添加缺少的内容 --- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java | 191 +++++++++++++++++++++-------------------------- 1 files changed, 85 insertions(+), 106 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java old mode 100644 new mode 100755 index 13335d6..4ff4e98 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java @@ -1,19 +1,18 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; -import com.genersoft.iot.vmp.common.VideoManagerConstants; -import com.genersoft.iot.vmp.conf.DynamicTask; -import com.genersoft.iot.vmp.conf.UserSetup; import com.genersoft.iot.vmp.gb28181.bean.CmdType; +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; +import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder; import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo; -import com.genersoft.iot.vmp.gb28181.task.GPSSubscribeTask; import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; -import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; +import com.genersoft.iot.vmp.gb28181.transmit.SIPSender; import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.utils.SipUtils; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; -import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; +import gov.nist.javax.sip.message.SIPRequest; +import gov.nist.javax.sip.message.SIPResponse; import org.dom4j.DocumentException; import org.dom4j.Element; import org.slf4j.Logger; @@ -24,42 +23,32 @@ import javax.sip.InvalidArgumentException; import javax.sip.RequestEvent; -import javax.sip.ServerTransaction; import javax.sip.SipException; -import javax.sip.header.CallIdHeader; import javax.sip.header.ExpiresHeader; -import javax.sip.header.Header; -import javax.sip.header.ToHeader; -import javax.sip.message.Request; import javax.sip.message.Response; import java.text.ParseException; /** * SIP鍛戒护绫诲瀷锛� SUBSCRIBE璇锋眰 + * @author lin */ @Component public class SubscribeRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { - private Logger logger = LoggerFactory.getLogger(SubscribeRequestProcessor.class); - private String method = "SUBSCRIBE"; + private final Logger logger = LoggerFactory.getLogger(SubscribeRequestProcessor.class); + private final String method = "SUBSCRIBE"; @Autowired private SIPProcessorObserver sipProcessorObserver; @Autowired - private IRedisCatchStorage redisCatchStorage; + private IVideoManagerStorage storager; @Autowired - private ISIPCommanderForPlatform sipCommanderForPlatform; + private SubscribeHolder subscribeHolder; @Autowired - private IVideoManagerStorager storager; - - @Autowired - private DynamicTask dynamicTask; - - @Autowired - private UserSetup userSetup; + private SIPSender sipSender; @Override public void afterPropertiesSet() throws Exception { @@ -70,55 +59,38 @@ /** * 澶勭悊SUBSCRIBE璇锋眰 * - * @param evt + * @param evt 浜嬩欢 */ @Override public void process(RequestEvent evt) { - Request request = evt.getRequest(); - + SIPRequest request = (SIPRequest) evt.getRequest(); try { Element rootElement = getRootElement(evt); + if (rootElement == null) { + logger.error("澶勭悊SUBSCRIBE璇锋眰 鏈幏鍙栧埌娑堟伅浣搟}", evt.getRequest()); + return; + } String cmd = XmlUtil.getText(rootElement, "CmdType"); if (CmdType.MOBILE_POSITION.equals(cmd)) { - logger.info("鎺ユ敹鍒癕obilePosition璁㈤槄"); - processNotifyMobilePosition(evt, rootElement); + processNotifyMobilePosition(request, rootElement); // } else if (CmdType.ALARM.equals(cmd)) { // logger.info("鎺ユ敹鍒癆larm璁㈤槄"); -// processNotifyAlarm(evt, rootElement); +// processNotifyAlarm(serverTransaction, rootElement); } else if (CmdType.CATALOG.equals(cmd)) { - logger.info("鎺ユ敹鍒癈atalog璁㈤槄"); - processNotifyCatalogList(evt, rootElement); + processNotifyCatalogList(request, rootElement); } else { logger.info("鎺ユ敹鍒版秷鎭細" + cmd); -// responseAck(evt, Response.OK); - Response response = null; - response = getMessageFactory().createResponse(200, request); + Response response = getMessageFactory().createResponse(200, request); if (response != null) { ExpiresHeader expireHeader = getHeaderFactory().createExpiresHeader(30); response.setExpires(expireHeader); } - logger.info("response : " + response.toString()); - ServerTransaction transaction = getServerTransaction(evt); - if (transaction != null) { - transaction.sendResponse(response); - transaction.getDialog().delete(); - transaction.terminate(); - } else { - logger.info("processRequest serverTransactionId is null."); - } + logger.info("response : " + response); + sipSender.transmitRequest(request.getLocalAddress().getHostAddress(), response); } - - - - } catch (ParseException e) { - e.printStackTrace(); - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (DocumentException e) { - e.printStackTrace(); + } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) { + logger.error("鏈鐞嗙殑寮傚父 ", e); } } @@ -126,49 +98,52 @@ /** * 澶勭悊绉诲姩浣嶇疆璁㈤槄娑堟伅 */ - private void processNotifyMobilePosition(RequestEvent evt, Element rootElement) { - String platformId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); - String deviceID = XmlUtil.getText(rootElement, "DeviceID"); - SubscribeInfo subscribeInfo = new SubscribeInfo(evt, platformId); - String sn = XmlUtil.getText(rootElement, "SN"); - String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetup.getServerId() + "_MobilePosition_" + platformId; + private void processNotifyMobilePosition(SIPRequest request, Element rootElement) throws SipException { + if (request == null) { + return; + } + String platformId = SipUtils.getUserIdFromFromHeader(request); + String deviceId = XmlUtil.getText(rootElement, "DeviceID"); + ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId); + SubscribeInfo subscribeInfo = new SubscribeInfo(request, platformId); + if (platform == null) { + return; + } + String sn = XmlUtil.getText(rootElement, "SN"); + logger.info("[鍥炲涓婄骇鐨勭Щ鍔ㄤ綅缃闃呰姹俔: {}", platformId); StringBuilder resultXml = new StringBuilder(200); resultXml.append("<?xml version=\"1.0\" ?>\r\n") .append("<Response>\r\n") .append("<CmdType>MobilePosition</CmdType>\r\n") - .append("<SN>" + sn + "</SN>\r\n") - .append("<DeviceID>" + deviceID + "</DeviceID>\r\n") + .append("<SN>").append(sn).append("</SN>\r\n") + .append("<DeviceID>").append(deviceId).append("</DeviceID>\r\n") .append("<Result>OK</Result>\r\n") .append("</Response>\r\n"); if (subscribeInfo.getExpires() > 0) { - if (redisCatchStorage.getSubscribe(key) != null) { - dynamicTask.stopCron(key); + // GPS涓婃姤鏃堕棿闂撮殧 + String interval = XmlUtil.getText(rootElement, "Interval"); + if (interval == null) { + subscribeInfo.setGpsInterval(5); + }else { + subscribeInfo.setGpsInterval(Integer.parseInt(interval)); } - String interval = XmlUtil.getText(rootElement, "Interval"); // GPS涓婃姤鏃堕棿闂撮殧 - dynamicTask.startCron(key, new GPSSubscribeTask(redisCatchStorage, sipCommanderForPlatform, storager, platformId, sn, key), Integer.parseInt(interval)); - - redisCatchStorage.updateSubscribe(key, subscribeInfo); - }else if (subscribeInfo.getExpires() == 0) { - dynamicTask.stopCron(key); - redisCatchStorage.delSubscribe(key); + subscribeInfo.setSn(sn); } - - try { - Response response = responseXmlAck(evt, resultXml.toString()); - ToHeader toHeader = (ToHeader)response.getHeader(ToHeader.NAME); - subscribeInfo.setToTag(toHeader.getTag()); - redisCatchStorage.updateSubscribe(key, subscribeInfo); + ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId); + SIPResponse response = responseXmlAck(request, resultXml.toString(), parentPlatform, subscribeInfo.getExpires()); + if (subscribeInfo.getExpires() == 0) { + subscribeHolder.removeMobilePositionSubscribe(platformId); + }else { + subscribeInfo.setResponse(response); + subscribeHolder.putMobilePositionSubscribe(platformId, subscribeInfo); + } - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("鏈鐞嗙殑寮傚父 ", e); } } @@ -176,41 +151,45 @@ } - private void processNotifyCatalogList(RequestEvent evt, Element rootElement) { - String platformId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); - String deviceID = XmlUtil.getText(rootElement, "DeviceID"); - SubscribeInfo subscribeInfo = new SubscribeInfo(evt, platformId); - String sn = XmlUtil.getText(rootElement, "SN"); - String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetup.getServerId() + "_Catalog_" + platformId; + private void processNotifyCatalogList(SIPRequest request, Element rootElement) throws SipException { + if (request == null) { + return; + } + String platformId = SipUtils.getUserIdFromFromHeader(request); + String deviceId = XmlUtil.getText(rootElement, "DeviceID"); + ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId); + if (platform == null){ + return; + } + SubscribeInfo subscribeInfo = new SubscribeInfo(request, platformId); + String sn = XmlUtil.getText(rootElement, "SN"); + logger.info("[鍥炲涓婄骇鐨勭洰褰曡闃呰姹俔: {}/{}", platformId, deviceId); StringBuilder resultXml = new StringBuilder(200); resultXml.append("<?xml version=\"1.0\" ?>\r\n") .append("<Response>\r\n") .append("<CmdType>Catalog</CmdType>\r\n") - .append("<SN>" + sn + "</SN>\r\n") - .append("<DeviceID>" + deviceID + "</DeviceID>\r\n") + .append("<SN>").append(sn).append("</SN>\r\n") + .append("<DeviceID>").append(deviceId).append("</DeviceID>\r\n") .append("<Result>OK</Result>\r\n") .append("</Response>\r\n"); if (subscribeInfo.getExpires() > 0) { - redisCatchStorage.updateSubscribe(key, subscribeInfo); + subscribeHolder.putCatalogSubscribe(platformId, subscribeInfo); }else if (subscribeInfo.getExpires() == 0) { - redisCatchStorage.delSubscribe(key); + subscribeHolder.removeCatalogSubscribe(platformId); } - try { - Response response = responseXmlAck(evt, resultXml.toString()); - ToHeader toHeader = (ToHeader)response.getHeader(ToHeader.NAME); - subscribeInfo.setToTag(toHeader.getTag()); - redisCatchStorage.updateSubscribe(key, subscribeInfo); - - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); + ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId); + SIPResponse response = responseXmlAck(request, resultXml.toString(), parentPlatform, subscribeInfo.getExpires()); + if (subscribeInfo.getExpires() == 0) { + subscribeHolder.removeCatalogSubscribe(platformId); + }else { + subscribeInfo.setResponse(response); + subscribeHolder.putCatalogSubscribe(platformId, subscribeInfo); + } + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("鏈鐞嗙殑寮傚父 ", e); } } - } -- Gitblit v1.8.0