From 269ad8cedbb07ca207a6f33af23085894dab4aa6 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期日, 23 四月 2023 14:36:13 +0800 Subject: [PATCH] 修身目录刷新,优化公网下远程IP端口的获取 --- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java | 180 +++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 149 insertions(+), 31 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 index ba835db..4ff4e98 100644 --- 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,8 +1,20 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; +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.transmit.SIPProcessorObserver; +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.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; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; @@ -11,26 +23,32 @@ import javax.sip.InvalidArgumentException; import javax.sip.RequestEvent; -import javax.sip.ServerTransaction; import javax.sip.SipException; import javax.sip.header.ExpiresHeader; -import javax.sip.message.Request; import javax.sip.message.Response; import java.text.ParseException; -/** - * @description:SUBSCRIBE璇锋眰澶勭悊鍣� - * @author: swwheihei - * @date: 2020骞�5鏈�3鏃� 涓嬪崍5:31:20 +/** + * 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 IVideoManagerStorage storager; + + @Autowired + private SubscribeHolder subscribeHolder; + + @Autowired + private SIPSender sipSender; @Override public void afterPropertiesSet() throws Exception { @@ -41,37 +59,137 @@ /** * 澶勭悊SUBSCRIBE璇锋眰 * - * @param evt + * @param evt 浜嬩欢 */ @Override public void process(RequestEvent evt) { - Request request = evt.getRequest(); - + SIPRequest request = (SIPRequest) evt.getRequest(); try { - Response response = null; - response = getMessageFactory().createResponse(200, request); - if (response != null) { - ExpiresHeader expireHeader = getHeaderFactory().createExpiresHeader(30); - response.setExpires(expireHeader); + Element rootElement = getRootElement(evt); + if (rootElement == null) { + logger.error("澶勭悊SUBSCRIBE璇锋眰 鏈幏鍙栧埌娑堟伅浣搟}", evt.getRequest()); + return; } - logger.info("response : " + response.toString()); - ServerTransaction transaction = getServerTransaction(evt); - if (transaction != null) { - transaction.sendResponse(response); - transaction.getDialog().delete(); - transaction.terminate(); + String cmd = XmlUtil.getText(rootElement, "CmdType"); + if (CmdType.MOBILE_POSITION.equals(cmd)) { + processNotifyMobilePosition(request, rootElement); +// } else if (CmdType.ALARM.equals(cmd)) { +// logger.info("鎺ユ敹鍒癆larm璁㈤槄"); +// processNotifyAlarm(serverTransaction, rootElement); + } else if (CmdType.CATALOG.equals(cmd)) { + processNotifyCatalogList(request, rootElement); } else { - logger.info("processRequest serverTransactionId is null."); - } + logger.info("鎺ユ敹鍒版秷鎭細" + cmd); - } catch (ParseException e) { - e.printStackTrace(); - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); + Response response = getMessageFactory().createResponse(200, request); + if (response != null) { + ExpiresHeader expireHeader = getHeaderFactory().createExpiresHeader(30); + response.setExpires(expireHeader); + } + logger.info("response : " + response); + sipSender.transmitRequest(request.getLocalAddress().getHostAddress(), response); + } + } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) { + logger.error("鏈鐞嗙殑寮傚父 ", e); } - + } + /** + * 澶勭悊绉诲姩浣嶇疆璁㈤槄娑堟伅 + */ + 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>").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) { + // GPS涓婃姤鏃堕棿闂撮殧 + String interval = XmlUtil.getText(rootElement, "Interval"); + if (interval == null) { + subscribeInfo.setGpsInterval(5); + }else { + subscribeInfo.setGpsInterval(Integer.parseInt(interval)); + } + subscribeInfo.setSn(sn); + } + + try { + 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 | InvalidArgumentException | ParseException e) { + logger.error("鏈鐞嗙殑寮傚父 ", e); + } + } + + private void processNotifyAlarm(RequestEvent evt, Element rootElement) { + + } + + 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>").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) { + subscribeHolder.putCatalogSubscribe(platformId, subscribeInfo); + }else if (subscribeInfo.getExpires() == 0) { + subscribeHolder.removeCatalogSubscribe(platformId); + } + try { + 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