From f1217682a9d1726b5b5673343dfe9b035e1180d4 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期五, 05 十一月 2021 18:27:41 +0800
Subject: [PATCH] 重构28181信令结构,解决循环依赖导致的无法直接注入

---
 src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java                                 |    7 
 src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java                                                      |   13 +
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java                                   |   73 +++--
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java                                      |   36 ++
 src/main/java/com/genersoft/iot/vmp/gb28181/bean/MobilePosition.java                                              |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java                    |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java                                       |    9 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java                                             |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/timeout/ITimeoutProcessor.java                         |    7 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceOffLineDetector.java                                      |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java                            |    2 
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java                                           |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/auth/RegisterLogicHandler.java                                        |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java                            |    2 
 src/main/java/com/genersoft/iot/vmp/utils/redis/FastJsonRedisSerializer.java                                      |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEvent.java                                         |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java                       |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java                               |    7 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/SIPResponseProcessorAbstract.java             |    8 
 src/main/java/com/genersoft/iot/vmp/utils/redis/JedisUtil.java                                                    |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java                |    2 
 src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java                                                     |    2 
 src/main/java/com/genersoft/iot/vmp/conf/VManagerConfig.java                                                      |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordItem.java                                                  |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java                                                    |   33 ++
 src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEventLister.java |    2 
 src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java                                                         |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java                                    |  113 +++++++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/RequestMessage.java                                 |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEventLister.java         |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/timeout/impl/TimeoutProcessorImpl.java                 |   36 +++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java                           |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/utils/DateUtil.java                                                   |    2 
 src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java                                                    |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java                                                  |    2 
 src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java                                   |    2 
 src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java                                             |    2 
 src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java                                           |    2 
 /dev/null                                                                                                         |  100 --------
 src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java                                                         |  182 +-------------
 src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEvent.java                                       |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java                                |    2 
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java                                            |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java                                                   |    9 
 src/main/java/com/genersoft/iot/vmp/utils/SpringBeanFactory.java                                                  |    2 
 45 files changed, 345 insertions(+), 350 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
index cb2b173..5fd9c77 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
@@ -1,7 +1,7 @@
 package com.genersoft.iot.vmp.common;
 
 /**    
- * @Description: 瀹氫箟甯搁噺   
+ * @description: 瀹氫箟甯搁噺   
  * @author: swwheihei
  * @date:   2019骞�5鏈�30鏃� 涓嬪崍3:04:04   
  *   
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java
index ee90788..dcb0e81 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java
@@ -16,7 +16,7 @@
 import redis.clients.jedis.JedisPoolConfig;
 
 /**
- * @Description:Redis涓棿浠堕厤缃被锛屼娇鐢╯pring-data-redis闆嗘垚锛岃嚜鍔ㄤ粠application.yml涓姞杞絩edis閰嶇疆
+ * @description:Redis涓棿浠堕厤缃被锛屼娇鐢╯pring-data-redis闆嗘垚锛岃嚜鍔ㄤ粠application.yml涓姞杞絩edis閰嶇疆
  * @author: swwheihei
  * @date: 2019骞�5鏈�30鏃� 涓婂崍10:58:25
  * 
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java b/src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java
index 68bb1a6..da1664b 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java
@@ -32,5 +32,7 @@
         for (String deviceId : onlineForAll) {
             storager.online(deviceId);
         }
+
+        // TODO 鏌ヨ鍦ㄧ嚎璁惧閭d簺寮�鍚簡璁㈤槄锛屼负璁惧寮�鍚畾鏃剁殑鐩綍璁㈤槄
     }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/VManagerConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/VManagerConfig.java
index ff9d643..85c158c 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/VManagerConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/VManagerConfig.java
@@ -4,7 +4,7 @@
 import org.springframework.context.annotation.Configuration;
 
 /**    
- * @Description: 鑾峰彇鏁版嵁搴撻厤缃�   
+ * @description: 鑾峰彇鏁版嵁搴撻厤缃�   
  * @author: swwheihei
  * @date:   2020骞�5鏈�6鏃� 涓嬪崍2:46:00     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
index 1afabb7..5a573f7 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
@@ -1,19 +1,10 @@
 package com.genersoft.iot.vmp.gb28181;
 
-import java.text.ParseException;
-import java.util.Properties;
-import java.util.TooManyListenersException;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import javax.sip.*;
-import javax.sip.header.CallIdHeader;
-import javax.sip.header.Header;
-import javax.sip.message.Response;
-
+import com.genersoft.iot.vmp.conf.SipConfig;
 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
+import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
 import gov.nist.javax.sip.SipProviderImpl;
+import gov.nist.javax.sip.SipStackImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,14 +12,15 @@
 import org.springframework.context.annotation.DependsOn;
 import org.springframework.stereotype.Component;
 
-import com.genersoft.iot.vmp.conf.SipConfig;
-import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorFactory;
-import com.genersoft.iot.vmp.gb28181.transmit.response.ISIPResponseProcessor;
-
-import gov.nist.javax.sip.SipStackImpl;
+import javax.sip.*;
+import java.util.Properties;
+import java.util.TooManyListenersException;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 
 @Component
-public class SipLayer implements SipListener {
+public class SipLayer{
 
 	private final static Logger logger = LoggerFactory.getLogger(SipLayer.class);
 
@@ -36,7 +28,7 @@
 	private SipConfig sipConfig;
 
 	@Autowired
-	private SIPProcessorFactory processorFactory;
+	private SIPProcessorObserver sipProcessorObserver;
 
 	@Autowired
 	private SipSubscribe sipSubscribe;
@@ -50,19 +42,16 @@
 	 */
 	private ThreadPoolExecutor processThreadPool;
 
-	@Bean("initSipServer")
-	private ThreadPoolExecutor initSipServer() {
-		
+	public SipLayer() {
 		int processThreadNum = Runtime.getRuntime().availableProcessors() * 10;
 		LinkedBlockingQueue<Runnable> processQueue = new LinkedBlockingQueue<>(10000);
 		processThreadPool = new ThreadPoolExecutor(processThreadNum,processThreadNum,
 				0L,TimeUnit.MILLISECONDS,processQueue,
 				new ThreadPoolExecutor.CallerRunsPolicy());
-		return processThreadPool;
 	}
-	
+
+
 	@Bean("sipFactory")
-	@DependsOn("initSipServer")
 	private SipFactory createSipFactory() {
 		sipFactory = SipFactory.getInstance();
 		sipFactory.setPathName("gov.nist");
@@ -70,7 +59,7 @@
 	}
 	
 	@Bean("sipStack")
-	@DependsOn({"initSipServer", "sipFactory"})
+	@DependsOn({"sipFactory"})
 	private SipStack createSipStack() throws PeerUnavailableException {
 		Properties properties = new Properties();
 		properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP");
@@ -96,7 +85,7 @@
 		try {
 			tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getMonitorIp(), sipConfig.getPort(), "TCP");
 			tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint);
-			tcpSipProvider.addSipListener(this);
+			tcpSipProvider.addSipListener(sipProcessorObserver);
 			logger.info("Sip Server TCP 鍚姩鎴愬姛 port {" + sipConfig.getMonitorIp() + ":" + sipConfig.getPort() + "}");
 		} catch (TransportNotSupportedException e) {
 			e.printStackTrace();
@@ -119,8 +108,7 @@
 		try {
 			udpListeningPoint = sipStack.createListeningPoint(sipConfig.getMonitorIp(), sipConfig.getPort(), "UDP");
 			udpSipProvider = (SipProviderImpl)sipStack.createSipProvider(udpListeningPoint);
-			udpSipProvider.addSipListener(this);
-//			udpSipProvider.setAutomaticDialogSupportEnabled(false);
+			udpSipProvider.addSipListener(sipProcessorObserver);
 		} catch (TransportNotSupportedException e) {
 			e.printStackTrace();
 		} catch (InvalidArgumentException e) {
@@ -133,142 +121,6 @@
 		}
 		logger.info("Sip Server UDP 鍚姩鎴愬姛 port [" + sipConfig.getMonitorIp() + ":" + sipConfig.getPort() + "]");
 		return udpSipProvider;
-	}
-
-	/**
-	 * SIP鏈嶅姟绔帴鏀舵秷鎭殑鏂规硶 Content 閲岄潰鏄疓BK缂栫爜 This method is called by the SIP stack when a
-	 * new request arrives.
-	 */
-	@Override
-	public void processRequest(RequestEvent evt) {
-		logger.debug(evt.getRequest().toString());
-		// 鐢变簬jainsip鏄崟绾跨▼绋嬪簭锛屼负鎻愰珮鎬ц兘骞跺彂澶勭悊
-		processThreadPool.execute(() -> {
-			if (processorFactory != null) {
-				processorFactory.createRequestProcessor(evt).process();
-			}
-		});
-	}
-
-	@Override
-	public void processResponse(ResponseEvent evt) {
-		Response response = evt.getResponse();
-		logger.debug(evt.getResponse().toString());
-		int status = response.getStatusCode();
-		if (((status >= 200) && (status < 300)) || status == 401) { // Success!
-			ISIPResponseProcessor processor = processorFactory.createResponseProcessor(evt);
-			try {
-				processor.process(evt, this, sipConfig);
-			} catch (ParseException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-			}
-
-			if (evt.getResponse() != null && sipSubscribe.getOkSubscribesSize() > 0 ) {
-				CallIdHeader callIdHeader = (CallIdHeader)evt.getResponse().getHeader(CallIdHeader.NAME);
-				if (callIdHeader != null) {
-					SipSubscribe.Event subscribe = sipSubscribe.getOkSubscribe(callIdHeader.getCallId());
-					if (subscribe != null) {
-						SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(evt);
-						subscribe.response(eventResult);
-					}
-				}
-			}
-		} else if ((status >= 100) && (status < 200)) {
-			// 澧炲姞鍏跺畠鏃犻渶鍥炲鐨勫搷搴旓紝濡�101銆�180绛�
-		} else {
-			logger.warn("鎺ユ敹鍒板け璐ョ殑response鍝嶅簲锛乻tatus锛�" + status + ",message:" + response.getReasonPhrase()/* .getContent().toString()*/);
-			if (evt.getResponse() != null && sipSubscribe.getErrorSubscribesSize() > 0 ) {
-				CallIdHeader callIdHeader = (CallIdHeader)evt.getResponse().getHeader(CallIdHeader.NAME);
-				if (callIdHeader != null) {
-					SipSubscribe.Event subscribe = sipSubscribe.getErrorSubscribe(callIdHeader.getCallId());
-					if (subscribe != null) {
-						SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(evt);
-						subscribe.response(eventResult);
-					}
-				}
-			}
-		}
-
-
-
-	}
-
-	/**
-	 * <p>
-	 * Title: processTimeout
-	 * </p>
-	 * <p>
-	 * Description:
-	 * </p>
-	 * 
-	 * @param timeoutEvent
-	 */
-	@Override
-	public void processTimeout(TimeoutEvent timeoutEvent) {
-		// TODO Auto-generated method stub
-		CallIdHeader callIdHeader = timeoutEvent.getClientTransaction().getDialog().getCallId();
-		String callId = callIdHeader.getCallId();
-		SipSubscribe.Event errorSubscribe = sipSubscribe.getErrorSubscribe(callId);
-		SipSubscribe.EventResult<TimeoutEvent> timeoutEventEventResult = new SipSubscribe.EventResult<>(timeoutEvent);
-		errorSubscribe.response(timeoutEventEventResult);
-	}
-
-	/**
-	 * <p>
-	 * Title: processIOException
-	 * </p>
-	 * <p>
-	 * Description:
-	 * </p>
-	 * 
-	 * @param exceptionEvent
-	 */
-	@Override
-	public void processIOException(IOExceptionEvent exceptionEvent) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/**
-	 * <p>
-	 * Title: processTransactionTerminated
-	 * </p>
-	 * <p>
-	 * Description:
-	 * </p>
-	 * 
-	 * @param transactionTerminatedEvent
-	 */
-	@Override
-	public void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) {
-		// TODO Auto-generated method stub
-//		CallIdHeader callIdHeader = transactionTerminatedEvent.getClientTransaction().getDialog().getCallId();
-//		String callId = callIdHeader.getCallId();
-//		SipSubscribe.Event errorSubscribe = sipSubscribe.getErrorSubscribe(callId);
-//		SipSubscribe.EventResult<TransactionTerminatedEvent> eventResult = new SipSubscribe.EventResult<>(transactionTerminatedEvent);
-//		errorSubscribe.response(eventResult);
-	}
-
-	/**
-	 * <p>
-	 * Title: processDialogTerminated
-	 * </p>
-	 * <p>
-	 * Description:
-	 * </p>
-	 * 
-	 * @param dialogTerminatedEvent
-	 */
-	@Override
-	public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) {
-		// TODO Auto-generated method stub
-//		CallIdHeader callIdHeader = dialogTerminatedEvent.getDialog().getCallId();
-//		String callId = callIdHeader.getCallId();
-//		SipSubscribe.Event errorSubscribe = sipSubscribe.getErrorSubscribe(callId);
-//		SipSubscribe.EventResult<DialogTerminatedEvent> eventResult = new SipSubscribe.EventResult<>(dialogTerminatedEvent);
-//		errorSubscribe.response(eventResult);
-
 	}
 
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/auth/RegisterLogicHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/auth/RegisterLogicHandler.java
index 01b0a12..62d4bec 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/auth/RegisterLogicHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/auth/RegisterLogicHandler.java
@@ -9,7 +9,7 @@
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
 
 /**    
- * @Description:娉ㄥ唽閫昏緫澶勭悊锛屽綋璁惧娉ㄥ唽鍚庤Е鍙戦�昏緫銆�
+ * @description:娉ㄥ唽閫昏緫澶勭悊锛屽綋璁惧娉ㄥ唽鍚庤Е鍙戦�昏緫銆�
  * @author: swwheihei
  * @date:   2020骞�5鏈�8鏃� 涓嬪崍9:41:46     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
index bfbf547..761437f 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
@@ -109,6 +109,11 @@
 	 */
 	private String charset ;
 
+	/**
+	 * 鐩綍璁㈤槄鍛ㄦ湡锛�0涓轰笉璁㈤槄
+	 */
+	private int subscribeCycleForCatalog ;
+
 
 
 	public String getDeviceId() {
@@ -270,4 +275,12 @@
 	public void setCharset(String charset) {
 		this.charset = charset;
 	}
+
+	public int getSubscribeCycleForCatalog() {
+		return subscribeCycleForCatalog;
+	}
+
+	public void setSubscribeCycleForCatalog(int subscribeCycleForCatalog) {
+		this.subscribeCycleForCatalog = subscribeCycleForCatalog;
+	}
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/MobilePosition.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/MobilePosition.java
index aba3392..c6cf782 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/MobilePosition.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/MobilePosition.java
@@ -1,7 +1,7 @@
 package com.genersoft.iot.vmp.gb28181.bean;
 
 /**
- * @Description: 绉诲姩浣嶇疆bean
+ * @description: 绉诲姩浣嶇疆bean
  * @author: lawrencehj
  * @date: 2021骞�1鏈�23鏃�
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java
index 0aaa687..dcac49d 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java
@@ -6,7 +6,7 @@
 import java.util.List;
 
 /**    
- * @Description:璁惧褰曞儚淇℃伅bean 
+ * @description:璁惧褰曞儚淇℃伅bean 
  * @author: swwheihei
  * @date:   2020骞�5鏈�8鏃� 涓嬪崍2:05:56     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordItem.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordItem.java
index 1533b66..39f894c 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordItem.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordItem.java
@@ -8,7 +8,7 @@
 import java.util.Date;
 
 /**
- * @Description:璁惧褰曞儚bean 
+ * @description:璁惧褰曞儚bean 
  * @author: swwheihei
  * @date:   2020骞�5鏈�8鏃� 涓嬪崍2:06:54     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceOffLineDetector.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceOffLineDetector.java
index 60998ea..e5b57c8 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceOffLineDetector.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceOffLineDetector.java
@@ -7,7 +7,7 @@
 import com.genersoft.iot.vmp.utils.redis.RedisUtil;
 
 /**    
- * @Description:璁惧绂诲湪绾跨姸鎬佹娴嬪櫒锛岀敤浜庢娴嬭澶囩姸鎬�
+ * @description:璁惧绂诲湪绾跨姸鎬佹娴嬪櫒锛岀敤浜庢娴嬭澶囩姸鎬�
  * @author: swwheihei
  * @date:   2020骞�5鏈�13鏃� 涓嬪崍2:40:29     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java
index 0422962..33d6dd4 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java
@@ -13,7 +13,7 @@
 import com.genersoft.iot.vmp.gb28181.event.online.OnlineEvent;
 
 /**    
- * @Description:Event浜嬩欢閫氱煡鎺ㄩ�佸櫒锛屾敮鎸佹帹閫佸湪绾夸簨浠躲�佺绾夸簨浠�
+ * @description:Event浜嬩欢閫氱煡鎺ㄩ�佸櫒锛屾敮鎸佹帹閫佸湪绾夸簨浠躲�佺绾夸簨浠�
  * @author: swwheihei
  * @date:   2020骞�5鏈�6鏃� 涓婂崍11:30:50     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java
index b9ac951..8363e58 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java
@@ -12,7 +12,7 @@
 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
 
 /**    
- * @Description:璁惧蹇冭烦瓒呮椂鐩戝惉,鍊熷姪redis杩囨湡鐗规�э紝杩涜鐩戝惉锛岀洃鍚埌璇存槑璁惧蹇冭烦瓒呮椂锛屽彂閫佺绾夸簨浠�
+ * @description:璁惧蹇冭烦瓒呮椂鐩戝惉,鍊熷姪redis杩囨湡鐗规�э紝杩涜鐩戝惉锛岀洃鍚埌璇存槑璁惧蹇冭烦瓒呮椂锛屽彂閫佺绾夸簨浠�
  * @author: swwheihei
  * @date:   2020骞�5鏈�6鏃� 涓婂崍11:35:46     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java
index cc871ef..db694cc 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java
@@ -12,7 +12,7 @@
 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
 
 /**    
- * @Description:璁惧蹇冭烦瓒呮椂鐩戝惉,鍊熷姪redis杩囨湡鐗规�э紝杩涜鐩戝惉锛岀洃鍚埌璇存槑璁惧蹇冭烦瓒呮椂锛屽彂閫佺绾夸簨浠�
+ * @description:璁惧蹇冭烦瓒呮椂鐩戝惉,鍊熷姪redis杩囨湡鐗规�э紝杩涜鐩戝惉锛岀洃鍚埌璇存槑璁惧蹇冭烦瓒呮椂锛屽彂閫佺绾夸簨浠�
  * @author: swwheihei
  * @date:   2020骞�5鏈�6鏃� 涓婂崍11:35:46     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEvent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEvent.java
index aa45efe..9dfeffc 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEvent.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEvent.java
@@ -3,7 +3,7 @@
 import org.springframework.context.ApplicationEvent;
 
 /**    
- * @Description: 绂荤嚎浜嬩欢绫�   
+ * @description: 绂荤嚎浜嬩欢绫�   
  * @author: swwheihei
  * @date:   2020骞�5鏈�6鏃� 涓婂崍11:33:13     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java
index 4adc8fb..4b401c7 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java
@@ -11,8 +11,8 @@
 import com.genersoft.iot.vmp.utils.redis.RedisUtil;
 
 /**
- * @Description: 绂荤嚎浜嬩欢鐩戝惉鍣紝鐩戝惉鍒扮绾垮悗锛屼慨鏀硅澶囩鍦ㄧ嚎鐘舵�併�� 璁惧绂荤嚎鏈変袱涓潵婧愶細
- *               1銆佽澶囦富鍔ㄦ敞閿�锛屽彂閫佹敞閿�鎸囦护锛寋@link com.genersoft.iot.vmp.gb28181.transmit.request.impl.RegisterRequestProcessor}
+ * @description: 绂荤嚎浜嬩欢鐩戝惉鍣紝鐩戝惉鍒扮绾垮悗锛屼慨鏀硅澶囩鍦ㄧ嚎鐘舵�併�� 璁惧绂荤嚎鏈変袱涓潵婧愶細
+ *               1銆佽澶囦富鍔ㄦ敞閿�锛屽彂閫佹敞閿�鎸囦护锛寋@link com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.RegisterRequestProcessor}
  *               2銆佽澶囨湭鐭ュ師鍥犵绾匡紝蹇冭烦瓒呮椂,{@link com.genersoft.iot.vmp.gb28181.event.offline.OfflineEventListener}
  * @author: swwheihei
  * @date: 2020骞�5鏈�6鏃� 涓嬪崍1:51:23
@@ -54,5 +54,8 @@
 
 		// 澶勭悊绂荤嚎鐩戝惉
 		storager.outline(event.getDeviceId());
+
+		// TODO 绂荤嚎鍙栨秷璁㈤槄
+
 	}
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEvent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEvent.java
index 1e01956..73d7f1f 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEvent.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEvent.java
@@ -4,7 +4,7 @@
 import org.springframework.context.ApplicationEvent;
 
 /**    
- * @Description: 鍦ㄧ嚎浜嬩欢绫�   
+ * @description: 鍦ㄧ嚎浜嬩欢绫�   
  * @author: swwheihei
  * @date:   2020骞�5鏈�6鏃� 涓婂崍11:32:56     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java
index f2150e5..3d59260 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java
@@ -13,12 +13,11 @@
 import com.genersoft.iot.vmp.utils.redis.RedisUtil;
 
 import java.text.SimpleDateFormat;
-import java.util.Date;
 
 /**
- * @Description: 鍦ㄧ嚎浜嬩欢鐩戝惉鍣紝鐩戝惉鍒扮绾垮悗锛屼慨鏀硅澶囩鍦ㄧ嚎鐘舵�併�� 璁惧鍦ㄧ嚎鏈変袱涓潵婧愶細
- *               1銆佽澶囦富鍔ㄦ敞閿�锛屽彂閫佹敞閿�鎸囦护锛寋@link com.genersoft.iot.vmp.gb28181.transmit.request.impl.RegisterRequestProcessor}
- *               2銆佽澶囨湭鐭ュ師鍥犵绾匡紝蹇冭烦瓒呮椂,{@link com.genersoft.iot.vmp.gb28181.transmit.request.impl.MessageRequestProcessor}
+ * @description: 鍦ㄧ嚎浜嬩欢鐩戝惉鍣紝鐩戝惉鍒扮绾垮悗锛屼慨鏀硅澶囩鍦ㄧ嚎鐘舵�併�� 璁惧鍦ㄧ嚎鏈変袱涓潵婧愶細
+ *               1銆佽澶囦富鍔ㄦ敞閿�锛屽彂閫佹敞閿�鎸囦护锛寋@link com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.RegisterRequestProcessor}
+ *               2銆佽澶囨湭鐭ュ師鍥犵绾匡紝蹇冭烦瓒呮椂,{@link com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.MessageRequestProcessor}
  * @author: swwheihei
  * @date: 2020骞�5鏈�6鏃� 涓嬪崍1:51:23
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEventLister.java
index 801e125..6522387 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEventLister.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEventLister.java
@@ -18,7 +18,7 @@
 import javax.sip.message.Response;
 
 /**
- * @Description: 骞冲彴蹇冭烦瓒呮椂浜嬩欢
+ * @description: 骞冲彴蹇冭烦瓒呮椂浜嬩欢
  * @author: panll
  * @date: 2020骞�11鏈�5鏃� 10:00
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEventLister.java
index ea79e34..20950ca 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEventLister.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEventLister.java
@@ -19,7 +19,7 @@
 import java.util.*;
 
 /**
- * @Description: 骞冲彴鏈敞鍐屼簨浠�,鏉ユ簮鏈変簩:
+ * @description: 骞冲彴鏈敞鍐屼簨浠�,鏉ユ簮鏈変簩:
  *               1銆佸钩鍙版柊娣诲姞
  *               2銆佸钩鍙板績璺宠秴鏃�
  * @author: panll
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
index d7cb5d2..ea9aa36 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
@@ -15,7 +15,7 @@
 import org.springframework.stereotype.Component;
 
 /**    
- * @Description:瑙嗛娴乻ession绠$悊鍣紝绠$悊瑙嗛棰勮銆侀瑙堝洖鏀剧殑閫氫俊鍙ユ焺 
+ * @description:瑙嗛娴乻ession绠$悊鍣紝绠$悊瑙嗛棰勮銆侀瑙堝洖鏀剧殑閫氫俊鍙ユ焺 
  * @author: swwheihei
  * @date:   2020骞�5鏈�13鏃� 涓嬪崍4:03:02     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
deleted file mode 100644
index 860f676..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
+++ /dev/null
@@ -1,243 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit;
-
-import javax.sip.RequestEvent;
-import javax.sip.ResponseEvent;
-import javax.sip.SipProvider;
-import javax.sip.header.CSeqHeader;
-import javax.sip.message.Request;
-import javax.sip.message.Response;
-
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
-import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
-import com.genersoft.iot.vmp.service.IDeviceAlarmService;
-import com.genersoft.iot.vmp.service.IMediaServerService;
-import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
-import com.genersoft.iot.vmp.gb28181.transmit.response.impl.*;
-import com.genersoft.iot.vmp.service.IPlayService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Component;
-
-import com.genersoft.iot.vmp.conf.SipConfig;
-import com.genersoft.iot.vmp.gb28181.auth.RegisterLogicHandler;
-import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
-import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
-import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
-import com.genersoft.iot.vmp.gb28181.transmit.request.ISIPRequestProcessor;
-import com.genersoft.iot.vmp.gb28181.transmit.request.impl.AckRequestProcessor;
-import com.genersoft.iot.vmp.gb28181.transmit.request.impl.ByeRequestProcessor;
-import com.genersoft.iot.vmp.gb28181.transmit.request.impl.CancelRequestProcessor;
-import com.genersoft.iot.vmp.gb28181.transmit.request.impl.InviteRequestProcessor;
-import com.genersoft.iot.vmp.gb28181.transmit.request.impl.MessageRequestProcessor;
-import com.genersoft.iot.vmp.gb28181.transmit.request.impl.NotifyRequestProcessor;
-import com.genersoft.iot.vmp.gb28181.transmit.request.impl.OtherRequestProcessor;
-import com.genersoft.iot.vmp.gb28181.transmit.request.impl.RegisterRequestProcessor;
-import com.genersoft.iot.vmp.gb28181.transmit.request.impl.SubscribeRequestProcessor;
-import com.genersoft.iot.vmp.gb28181.transmit.response.ISIPResponseProcessor;
-import com.genersoft.iot.vmp.gb28181.transmit.response.impl.ByeResponseProcessor;
-import com.genersoft.iot.vmp.gb28181.transmit.response.impl.CancelResponseProcessor;
-import com.genersoft.iot.vmp.gb28181.transmit.response.impl.InviteResponseProcessor;
-import com.genersoft.iot.vmp.gb28181.transmit.response.impl.OtherResponseProcessor;
-import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
-import com.genersoft.iot.vmp.utils.SpringBeanFactory;
-import com.genersoft.iot.vmp.utils.redis.RedisUtil;
-
-/**    
- * @Description: SIP淇′护澶勭悊鍒嗛厤
- * @author: swwheihei
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍4:24:37     
- */
-@Component
-public class SIPProcessorFactory {
-	
-	// private final static Logger logger = LoggerFactory.getLogger(SIPProcessorFactory.class);
-	
-	@Autowired
-	private SipConfig sipConfig;
-	
-	@Autowired
-	private RegisterLogicHandler handler;
-	
-	@Autowired
-	private IVideoManagerStorager storager;
-
-	@Autowired
-	private IRedisCatchStorage redisCatchStorage;
-
-	@Autowired
-	private EventPublisher publisher;
-	
-	@Autowired
-	private SIPCommander cmder;
-
-	@Autowired
-	private SIPCommanderFroPlatform cmderFroPlatform;
-
-	@Autowired
-	private IDeviceAlarmService deviceAlarmService;
-
-	@Autowired
-	private RedisUtil redis;
-	
-	@Autowired
-	private DeferredResultHolder deferredResultHolder;
-	
-	@Autowired
-	private DeviceOffLineDetector offLineDetector;
-	
-	@Autowired
-	private InviteResponseProcessor inviteResponseProcessor;
-	
-	@Autowired
-	private ByeResponseProcessor byeResponseProcessor;
-	
-	@Autowired
-	private CancelResponseProcessor cancelResponseProcessor;
-
-	@Autowired
-	@Lazy
-	private RegisterResponseProcessor registerResponseProcessor;
-
-
-	@Autowired
-	private OtherResponseProcessor otherResponseProcessor;
-
-	@Autowired
-	private IPlayService playService;
-
-	@Autowired
-	private ZLMRTPServerFactory zlmrtpServerFactory;
-
-	@Autowired
-	private IMediaServerService mediaServerService;
-
-	// 娉細杩欓噷浣跨敤娉ㄨВ浼氬鑷村惊鐜緷璧栨敞鍏ワ紝鏆傜敤springBean
-	private SipProvider tcpSipProvider;
-		
-	// 娉細杩欓噷浣跨敤娉ㄨВ浼氬鑷村惊鐜緷璧栨敞鍏ワ紝鏆傜敤springBean
-	private SipProvider udpSipProvider;
-	
-	public ISIPRequestProcessor createRequestProcessor(RequestEvent evt) {
-		Request request = evt.getRequest();
-		String method = request.getMethod();
-//		logger.info("鎺ユ敹鍒版秷鎭細"+request.getMethod());
-//		sipSubscribe.getSubscribe(evt.getServerTransaction().getBranchId()).response(evt);
-		if (Request.INVITE.equals(method)) {
-			InviteRequestProcessor processor = new InviteRequestProcessor();
-			processor.setRequestEvent(evt);
-			processor.setTcpSipProvider(getTcpSipProvider());
-			processor.setUdpSipProvider(getUdpSipProvider());
-
-			processor.setCmder(cmder);
-			processor.setCmderFroPlatform(cmderFroPlatform);
-			processor.setPlayService(playService);
-			processor.setStorager(storager);
-			processor.setRedisCatchStorage(redisCatchStorage);
-			processor.setZlmrtpServerFactory(zlmrtpServerFactory);
-			processor.setMediaServerService(mediaServerService);
-			return processor;
-		} else if (Request.REGISTER.equals(method)) {
-			RegisterRequestProcessor processor = new RegisterRequestProcessor();
-			processor.setRequestEvent(evt);
-			processor.setTcpSipProvider(getTcpSipProvider());
-			processor.setUdpSipProvider(getUdpSipProvider());
-			processor.setHandler(handler);
-			processor.setPublisher(publisher);
-			processor.setSipConfig(sipConfig);
-			processor.setVideoManagerStorager(storager);
-			return processor;
-		} else if (Request.SUBSCRIBE.equals(method)) {
-			SubscribeRequestProcessor processor = new SubscribeRequestProcessor();
-			processor.setTcpSipProvider(getTcpSipProvider());
-			processor.setUdpSipProvider(getUdpSipProvider());
-			processor.setRequestEvent(evt);
-			return processor;
-		} else if (Request.ACK.equals(method)) {
-			AckRequestProcessor processor = new AckRequestProcessor();
-			processor.setRequestEvent(evt);
-			processor.setRedisCatchStorage(redisCatchStorage);
-			processor.setZlmrtpServerFactory(zlmrtpServerFactory);
-			processor.setMediaServerService(mediaServerService);
-			return processor;
-		} else if (Request.BYE.equals(method)) {
-			ByeRequestProcessor processor = new ByeRequestProcessor();
-			processor.setRequestEvent(evt);
-			processor.setRedisCatchStorage(redisCatchStorage);
-			processor.setStorager(storager);
-			processor.setZlmrtpServerFactory(zlmrtpServerFactory);
-			processor.setSIPCommander(cmder);
-			processor.setMediaServerService(mediaServerService);
-			return processor;
-		} else if (Request.CANCEL.equals(method)) {
-			CancelRequestProcessor processor = new CancelRequestProcessor();
-			processor.setRequestEvent(evt);
-			return processor;
-		} else if (Request.MESSAGE.equals(method)) {
-			MessageRequestProcessor processor = new MessageRequestProcessor();
-			processor.setRequestEvent(evt);
-			processor.setTcpSipProvider(getTcpSipProvider());
-			processor.setUdpSipProvider(getUdpSipProvider());
-			processor.setPublisher(publisher);
-			processor.setRedis(redis);
-			processor.setDeferredResultHolder(deferredResultHolder);
-			processor.setOffLineDetector(offLineDetector);
-			processor.setCmder(cmder);
-			processor.setCmderFroPlatform(cmderFroPlatform);
-			processor.setDeviceAlarmService(deviceAlarmService);
-			processor.setStorager(storager);
-			processor.setRedisCatchStorage(redisCatchStorage);
-			return processor;
-		} else if (Request.NOTIFY.equalsIgnoreCase(method)) {
-			NotifyRequestProcessor processor = new NotifyRequestProcessor();
-			processor.setRequestEvent(evt);
-			processor.setTcpSipProvider(getTcpSipProvider());
-			processor.setUdpSipProvider(getUdpSipProvider());
-			processor.setPublisher(publisher);
-			processor.setRedis(redis);
-			processor.setDeferredResultHolder(deferredResultHolder);
-			processor.setOffLineDetector(offLineDetector);
-			processor.setCmder(cmder);
-			processor.setStorager(storager);
-			processor.setRedisCatchStorage(redisCatchStorage);
-			return processor;
-		} else {
-			OtherRequestProcessor processor = new OtherRequestProcessor();
-			processor.setRequestEvent(evt);
-			return processor;
-		}
-	}
-	
-	public ISIPResponseProcessor createResponseProcessor(ResponseEvent evt) {
-
-		Response response = evt.getResponse();
-		CSeqHeader cseqHeader = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
-		String method = cseqHeader.getMethod();
-		if(Request.INVITE.equals(method)){
-			return inviteResponseProcessor;
-		} else if (Request.BYE.equals(method)) {
-			return byeResponseProcessor;
-		} else if (Request.CANCEL.equals(method)) {
-			return cancelResponseProcessor;
-		}else if (Request.REGISTER.equals(method)) {
-			return registerResponseProcessor;
-		} else {
-			return otherResponseProcessor;
-		}
-	}
-	
-	private SipProvider getTcpSipProvider() {
-		if (tcpSipProvider == null) {
-			tcpSipProvider = (SipProvider) SpringBeanFactory.getBean("tcpSipProvider");
-		}
-		return tcpSipProvider;
-	}
-	
-	private SipProvider getUdpSipProvider() {
-		if (udpSipProvider == null) {
-			udpSipProvider = (SipProvider) SpringBeanFactory.getBean("udpSipProvider");
-		}
-		return udpSipProvider;
-	}
-	
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java
new file mode 100644
index 0000000..b3175d0
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java
@@ -0,0 +1,113 @@
+package com.genersoft.iot.vmp.gb28181.transmit;
+
+import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
+import com.genersoft.iot.vmp.gb28181.transmit.event.response.ISIPResponseProcessor;
+import com.genersoft.iot.vmp.gb28181.transmit.event.timeout.ITimeoutProcessor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import javax.sip.*;
+import javax.sip.header.CSeqHeader;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @description: SIP淇′护澶勭悊绫昏瀵熻��
+ * @author: panlinlin
+ * @date:   2021骞�11鏈�5鏃� 涓嬪崍15锛�32
+ */
+@Component
+public class SIPProcessorObserver implements SipListener {
+
+    private final static Logger logger = LoggerFactory.getLogger(SIPProcessorObserver.class);
+
+    private static Map<String, ISIPRequestProcessor> requestProcessorMap = new ConcurrentHashMap<>();
+    private static Map<String, ISIPResponseProcessor> responseProcessorMap = new ConcurrentHashMap<>();
+    private static ITimeoutProcessor timeoutProcessor;
+
+    /**
+     * 娣诲姞 request璁㈤槄
+     * @param method 鏂规硶鍚�
+     * @param processor 澶勭悊绋嬪簭
+     */
+    public void addRequestProcessor(String method, ISIPRequestProcessor processor) {
+        requestProcessorMap.put(method, processor);
+    }
+
+    /**
+     * 娣诲姞 response璁㈤槄
+     * @param method 鏂规硶鍚�
+     * @param processor 澶勭悊绋嬪簭
+     */
+    public void addResponseProcessor(String method, ISIPResponseProcessor processor) {
+        responseProcessorMap.put(method, processor);
+    }
+
+    /**
+     * 娣诲姞 瓒呮椂浜嬩欢璁㈤槄
+     * @param processor 澶勭悊绋嬪簭
+     */
+    public void addTimeoutProcessor(ITimeoutProcessor processor) {
+        this.timeoutProcessor = processor;
+    }
+
+    /**
+     * 鍒嗗彂RequestEvent浜嬩欢
+     * @param requestEvent RequestEvent浜嬩欢
+     */
+    @Override
+    public void processRequest(RequestEvent requestEvent) {
+        String method = requestEvent.getRequest().getMethod();
+        ISIPRequestProcessor sipRequestProcessor = requestProcessorMap.get(method);
+        if (sipRequestProcessor == null) {
+            logger.warn("涓嶆敮鎸佹柟娉晎}鐨剅equest", method);
+            return;
+        }
+        requestProcessorMap.get(requestEvent.getRequest().getMethod()).process(requestEvent);
+    }
+
+    /**
+     * 鍒嗗彂ResponseEvent浜嬩欢
+     * @param responseEvent responseEvent浜嬩欢
+     */
+    @Override
+    public void processResponse(ResponseEvent responseEvent) {
+        CSeqHeader cseqHeader = (CSeqHeader) responseEvent.getResponse().getHeader(CSeqHeader.NAME);
+        String method = cseqHeader.getMethod();
+        ISIPResponseProcessor sipRequestProcessor = responseProcessorMap.get(method);
+        if (sipRequestProcessor == null) {
+            logger.warn("涓嶆敮鎸佹柟娉晎}鐨剅esponse", method);
+            return;
+        }
+        sipRequestProcessor.process(responseEvent);
+    }
+
+    /**
+     * 鍚戣秴鏃惰闃呭彂閫佹秷鎭�
+     * @param timeoutEvent timeoutEvent浜嬩欢
+     */
+    @Override
+    public void processTimeout(TimeoutEvent timeoutEvent) {
+        if(timeoutProcessor != null) {
+            timeoutProcessor.process(timeoutEvent);
+        }
+    }
+
+    @Override
+    public void processIOException(IOExceptionEvent exceptionEvent) {
+
+    }
+
+    @Override
+    public void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) {
+
+    }
+
+    @Override
+    public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) {
+
+    }
+
+
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java
index ac949e5..c6f3780 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java
@@ -7,7 +7,7 @@
 
 import com.genersoft.iot.vmp.gb28181.bean.RecordInfo;
 import com.genersoft.iot.vmp.gb28181.bean.RecordItem;
-import com.genersoft.iot.vmp.gb28181.transmit.request.impl.MessageRequestProcessor;
+import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.MessageRequestProcessor;
 import com.genersoft.iot.vmp.utils.redis.RedisUtil;
 
 import org.slf4j.Logger;
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
index ecfa666..51d03b4 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
@@ -11,7 +11,7 @@
 import org.springframework.web.context.request.async.DeferredResult;
 
 /**    
- * @Description: 寮傛璇锋眰澶勭悊
+ * @description: 寮傛璇锋眰澶勭悊
  * @author: swwheihei
  * @date:   2020骞�5鏈�8鏃� 涓嬪崍7:59:05     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/RequestMessage.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/RequestMessage.java
index 5a3ae37..42ae577 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/RequestMessage.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/RequestMessage.java
@@ -1,7 +1,7 @@
 package com.genersoft.iot.vmp.gb28181.transmit.callback;
 
 /**    
- * @Description: 璇锋眰淇℃伅瀹氫箟   
+ * @description: 璇锋眰淇℃伅瀹氫箟   
  * @author: swwheihei
  * @date:   2020骞�5鏈�8鏃� 涓嬪崍1:09:18     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
index 10611dc..9f41377 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
@@ -7,7 +7,7 @@
 import com.genersoft.iot.vmp.service.bean.SSRCInfo;
 
 /**    
- * @Description:璁惧鑳藉姏鎺ュ彛锛岀敤浜庡畾涔夎澶囩殑鎺у埗銆佹煡璇㈣兘鍔�   
+ * @description:璁惧鑳藉姏鎺ュ彛锛岀敤浜庡畾涔夎澶囩殑鎺у埗銆佹煡璇㈣兘鍔�   
  * @author: swwheihei
  * @date:   2020骞�5鏈�3鏃� 涓嬪崍9:16:34     
  */
@@ -299,4 +299,11 @@
 	 * @return				true = 鍛戒护鍙戦�佹垚鍔�
 	 */
 	boolean alarmSubscribe(Device device, int expires, String startPriority, String endPriority, String alarmMethod, String alarmType, String startTime, String endTime);
+
+	/**
+	 * 璁㈤槄銆佸彇娑堣闃呯洰褰曚俊鎭�
+	 * @param device		瑙嗛璁惧
+	 * @return				true = 鍛戒护鍙戦�佹垚鍔�
+	 */
+	boolean catalogSubscribe(Device device, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java
index 4ed942c..cc41af7 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java
@@ -19,7 +19,7 @@
 import java.util.UUID;
 
 /**
- * @Description: 骞冲彴鍛戒护request鍒涢�犲櫒 TODO 鍐椾綑浠g爜澶寰呬紭鍖�
+ * @description: 骞冲彴鍛戒护request鍒涢�犲櫒 TODO 鍐椾綑浠g爜澶寰呬紭鍖�
  * @author: panll
  * @date: 2020骞�5鏈�6鏃� 涓婂崍9:29:02
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
index 48facf6..bb62902 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
@@ -18,7 +18,7 @@
 import com.genersoft.iot.vmp.gb28181.bean.Device;
 
 /**
- * @Description:鎽勫儚澶村懡浠equest鍒涢�犲櫒 TODO 鍐椾綑浠g爜澶寰呬紭鍖�
+ * @description:鎽勫儚澶村懡浠equest鍒涢�犲櫒 TODO 鍐椾綑浠g爜澶寰呬紭鍖�
  * @author: swwheihei
  * @date: 2020骞�5鏈�6鏃� 涓婂崍9:29:02
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
index 0d36d52..7a0e901 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -1,20 +1,17 @@
 package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl;
 
-import java.lang.reflect.Field;
-import java.text.ParseException;
-import java.util.HashSet;
-
-import javax.sip.*;
-import javax.sip.address.SipURI;
-import javax.sip.header.CallIdHeader;
-import javax.sip.header.ViaHeader;
-import javax.sip.message.Request;
-
 import com.alibaba.fastjson.JSONObject;
+import com.genersoft.iot.vmp.conf.SipConfig;
 import com.genersoft.iot.vmp.conf.UserSetup;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
-import com.genersoft.iot.vmp.media.zlm.*;
 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
+import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider;
+import com.genersoft.iot.vmp.gb28181.utils.DateUtil;
+import com.genersoft.iot.vmp.gb28181.utils.NumericUtil;
+import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
 import com.genersoft.iot.vmp.service.IMediaServerService;
 import com.genersoft.iot.vmp.service.bean.SSRCInfo;
@@ -29,20 +26,20 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.DependsOn;
-import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
-
-import com.genersoft.iot.vmp.conf.SipConfig;
-import com.genersoft.iot.vmp.gb28181.bean.Device;
-import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider;
-import com.genersoft.iot.vmp.gb28181.utils.DateUtil;
-import com.genersoft.iot.vmp.gb28181.utils.NumericUtil;
 import org.springframework.util.StringUtils;
 
+import javax.sip.*;
+import javax.sip.address.SipURI;
+import javax.sip.header.CallIdHeader;
+import javax.sip.header.ViaHeader;
+import javax.sip.message.Request;
+import java.lang.reflect.Field;
+import java.text.ParseException;
+import java.util.HashSet;
+
 /**    
- * @Description:璁惧鑳藉姏鎺ュ彛锛岀敤浜庡畾涔夎澶囩殑鎺у埗銆佹煡璇㈣兘鍔�   
+ * @description:璁惧鑳藉姏鎺ュ彛锛岀敤浜庡畾涔夎澶囩殑鎺у埗銆佹煡璇㈣兘鍔�   
  * @author: swwheihei
  * @date:   2020骞�5鏈�3鏃� 涓嬪崍9:22:48     
  */
@@ -55,12 +52,10 @@
 	@Autowired
 	private SipConfig sipConfig;
 
-	@Lazy
 	@Autowired
 	@Qualifier(value="tcpSipProvider")
 	private SipProviderImpl tcpSipProvider;
 
-	@Lazy
 	@Autowired
 	@Qualifier(value="udpSipProvider")
 	private SipProviderImpl udpSipProvider;
@@ -89,11 +84,6 @@
 	@Autowired
 	private IMediaServerService mediaServerService;
 
-	private SIPDialog dialog;
-
-	public SipConfig getSipConfig() {
-		return sipConfig;
-	}
 
 	/**
 	 * 浜戝彴鏂瑰悜鏀炬帶鍒讹紝浣跨敤閰嶇疆鏂囦欢涓殑榛樿闀滃ご绉诲姩閫熷害
@@ -1490,6 +1480,33 @@
 		}
 	}
 
+	@Override
+	public boolean catalogSubscribe(Device device, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) {
+		try {
+			StringBuffer cmdXml = new StringBuffer(200);
+			cmdXml.append("<?xml version=\"1.0\" encoding=\"GB2312\"?>\r\n");
+			cmdXml.append("<Query>\r\n");
+			cmdXml.append("<CmdType>CataLog</CmdType>\r\n");
+			cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
+			cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
+			cmdXml.append("</Query>\r\n");
+
+			String tm = Long.toString(System.currentTimeMillis());
+
+			CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
+					: udpSipProvider.getNewCallId();
+
+			Request request = headerProvider.createSubscribeRequest(device, cmdXml.toString(), "z9hG4bK-viaPos-" + tm, "fromTagPos" + tm, null, device.getSubscribeCycleForCatalog(), "presence" , callIdHeader);
+			transmitRequest(device, request, errorEvent, okEvent);
+
+			return true;
+
+		} catch ( NumberFormatException | ParseException | InvalidArgumentException	| SipException e) {
+			e.printStackTrace();
+			return false;
+		}
+	}
+
 
 	private ClientTransaction transmitRequest(Device device, Request request) throws SipException {
 		return transmitRequest(device, request, null, null);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/SIPResponseProcessorAbstract.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/SIPResponseProcessorAbstract.java
new file mode 100644
index 0000000..9f2a10b
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/SIPResponseProcessorAbstract.java
@@ -0,0 +1,8 @@
+package com.genersoft.iot.vmp.gb28181.transmit.event.response;
+
+import org.springframework.beans.factory.InitializingBean;
+
+public abstract class SIPResponseProcessorAbstract implements InitializingBean, ISIPResponseProcessor {
+
+
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/timeout/ITimeoutProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/timeout/ITimeoutProcessor.java
new file mode 100644
index 0000000..e0bb1f8
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/timeout/ITimeoutProcessor.java
@@ -0,0 +1,7 @@
+package com.genersoft.iot.vmp.gb28181.transmit.event.timeout;
+
+import javax.sip.TimeoutEvent;
+
+public interface ITimeoutProcessor {
+    void process(TimeoutEvent event);
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/timeout/impl/TimeoutProcessorImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/timeout/impl/TimeoutProcessorImpl.java
new file mode 100644
index 0000000..4165004
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/timeout/impl/TimeoutProcessorImpl.java
@@ -0,0 +1,36 @@
+package com.genersoft.iot.vmp.gb28181.transmit.event.timeout.impl;
+
+import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
+import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
+import com.genersoft.iot.vmp.gb28181.transmit.event.timeout.ITimeoutProcessor;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.TimeoutEvent;
+import javax.sip.header.CallIdHeader;
+
+@Component
+public class TimeoutProcessorImpl implements InitializingBean, ITimeoutProcessor {
+
+    @Autowired
+    private SIPProcessorObserver processorObserver;
+
+    @Autowired
+    private SipSubscribe sipSubscribe;
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        processorObserver.addTimeoutProcessor(this);
+    }
+
+    @Override
+    public void process(TimeoutEvent event) {
+        // TODO Auto-generated method stub
+        CallIdHeader callIdHeader = event.getClientTransaction().getDialog().getCallId();
+        String callId = callIdHeader.getCallId();
+        SipSubscribe.Event errorSubscribe = sipSubscribe.getErrorSubscribe(callId);
+        SipSubscribe.EventResult<TimeoutEvent> timeoutEventEventResult = new SipSubscribe.EventResult<>(event);
+        errorSubscribe.response(timeoutEventEventResult);
+    }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/ISIPRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/ISIPRequestProcessor.java
deleted file mode 100644
index 82e2f1d..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/ISIPRequestProcessor.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.request;
-
-/**    
- * @Description:澶勭悊鎺ユ敹IPCamera鍙戞潵鐨凷IP鍗忚璇锋眰娑堟伅
- * @author: swwheihei
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍4:42:22     
- */
-public interface ISIPRequestProcessor {
-
-	public void process();
-
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/SIPRequestAbstractProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/SIPRequestAbstractProcessor.java
deleted file mode 100644
index 12290d2..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/SIPRequestAbstractProcessor.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.request;
-
-import javax.sip.PeerUnavailableException;
-import javax.sip.RequestEvent;
-import javax.sip.ServerTransaction;
-import javax.sip.SipFactory;
-import javax.sip.SipProvider;
-import javax.sip.TransactionAlreadyExistsException;
-import javax.sip.TransactionUnavailableException;
-import javax.sip.address.AddressFactory;
-import javax.sip.header.HeaderFactory;
-import javax.sip.header.ViaHeader;
-import javax.sip.message.MessageFactory;
-import javax.sip.message.Request;
-
-import gov.nist.javax.sip.SipStackImpl;
-import gov.nist.javax.sip.message.SIPRequest;
-import gov.nist.javax.sip.stack.SIPServerTransaction;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**    
- * @Description:澶勭悊鎺ユ敹IPCamera鍙戞潵鐨凷IP鍗忚璇锋眰娑堟伅
- * @author: songww
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍4:42:22     
- */
-public abstract class SIPRequestAbstractProcessor implements ISIPRequestProcessor {
-
-	private final static Logger logger = LoggerFactory.getLogger(SIPRequestAbstractProcessor.class);
-
-	protected RequestEvent evt;
-	
-	private SipProvider tcpSipProvider;
-	
-	private SipProvider udpSipProvider;
-	
-	@Override
-	public void process() {
-		this.process(evt);
-	}
-	
-	public abstract void process(RequestEvent evt);
-	
-	public ServerTransaction getServerTransaction(RequestEvent evt) {
-		Request request = evt.getRequest();
-		ServerTransaction serverTransaction = evt.getServerTransaction();
-		// 鍒ゆ柇TCP杩樻槸UDP
-		boolean isTcp = false;
-		ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME);
-		String transport = reqViaHeader.getTransport();
-		if (transport.equals("TCP")) {
-			isTcp = true;
-		}
-
-		if (serverTransaction == null) {
-			try {
-				if (isTcp) {
-					SipStackImpl stack = (SipStackImpl)tcpSipProvider.getSipStack();
-					serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true);
-					if (serverTransaction == null) {
-						serverTransaction = tcpSipProvider.getNewServerTransaction(request);
-					}
-				} else {
-					SipStackImpl stack = (SipStackImpl)udpSipProvider.getSipStack();
-					serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true);
-					if (serverTransaction == null) {
-						serverTransaction = udpSipProvider.getNewServerTransaction(request);
-					}
-				}
-			} catch (TransactionAlreadyExistsException e) {
-				logger.error(e.getMessage());
-			} catch (TransactionUnavailableException e) {
-				logger.error(e.getMessage());
-			}
-		}
-		return serverTransaction;
-	}
-	
-	public AddressFactory getAddressFactory() {
-		try {
-			return SipFactory.getInstance().createAddressFactory();
-		} catch (PeerUnavailableException e) {
-			e.printStackTrace();
-		}
-		return null;
-	}
-
-	public HeaderFactory getHeaderFactory() {
-		try {
-			return SipFactory.getInstance().createHeaderFactory();
-		} catch (PeerUnavailableException e) {
-			e.printStackTrace();
-		}
-		return null;
-	}
-
-	public MessageFactory getMessageFactory() {
-		try {
-			return SipFactory.getInstance().createMessageFactory();
-		} catch (PeerUnavailableException e) {
-			e.printStackTrace();
-		}
-		return null;
-	}
-
-	public RequestEvent getRequestEvent() {
-		return evt;
-	}
-
-	public void setRequestEvent(RequestEvent evt) {
-		this.evt = evt;
-	}
-
-	public SipProvider getTcpSipProvider() {
-		return tcpSipProvider;
-	}
-
-	public void setTcpSipProvider(SipProvider tcpSipProvider) {
-		this.tcpSipProvider = tcpSipProvider;
-	}
-
-	public SipProvider getUdpSipProvider() {
-		return udpSipProvider;
-	}
-
-	public void setUdpSipProvider(SipProvider udpSipProvider) {
-		this.udpSipProvider = udpSipProvider;
-	}
-	
-	
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/AckRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/AckRequestProcessor.java
deleted file mode 100644
index 7d9e5f7..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/AckRequestProcessor.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.sip.*;
-import javax.sip.address.SipURI;
-import javax.sip.header.FromHeader;
-import javax.sip.header.HeaderAddress;
-import javax.sip.header.ToHeader;
-
-import com.genersoft.iot.vmp.common.StreamInfo;
-import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
-import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
-import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
-import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
-import com.genersoft.iot.vmp.service.IMediaServerService;
-import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**    
- * @Description:ACK璇锋眰澶勭悊鍣�  
- * @author: swwheihei
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:31:45     
- */
-public class AckRequestProcessor extends SIPRequestAbstractProcessor {
-
-	private Logger logger = LoggerFactory.getLogger(AckRequestProcessor.class);
-
-    private IRedisCatchStorage redisCatchStorage;
-
-	private ZLMRTPServerFactory zlmrtpServerFactory;
-
-	private IMediaServerService mediaServerService;
-
-	/**   
-	 * 澶勭悊  ACK璇锋眰
-	 * 
-	 * @param evt
-	 */
-	@Override
-	public void process(RequestEvent evt) {
-		//Request request = evt.getRequest();
-		Dialog dialog = evt.getDialog();
-		if (dialog == null) return;
-		//DialogState state = dialog.getState();
-		if (/*request.getMecodewwthod().equals(Request.INVITE) &&*/ dialog.getState()== DialogState.CONFIRMED) {
-			String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
-			String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();
-			SendRtpItem sendRtpItem =  redisCatchStorage.querySendRTPServer(platformGbId, channelId);
-			String is_Udp = sendRtpItem.isTcp() ? "0" : "1";
-			String deviceId = sendRtpItem.getDeviceId();
-			StreamInfo streamInfo = null;
-			if (deviceId == null) {
-				streamInfo = new StreamInfo();
-				streamInfo.setApp(sendRtpItem.getApp());
-				streamInfo.setStreamId(sendRtpItem.getStreamId());
-			}else {
-				streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
-				sendRtpItem.setStreamId(streamInfo.getStreamId());
-				streamInfo.setApp("rtp");
-			}
-
-			redisCatchStorage.updateSendRTPSever(sendRtpItem);
-			logger.info(platformGbId);
-			logger.info(channelId);
-			Map<String, Object> param = new HashMap<>();
-			param.put("vhost","__defaultVhost__");
-			param.put("app",streamInfo.getApp());
-			param.put("stream",streamInfo.getStreamId());
-			param.put("ssrc", sendRtpItem.getSsrc());
-			param.put("dst_url",sendRtpItem.getIp());
-			param.put("dst_port", sendRtpItem.getPort());
-			param.put("is_udp", is_Udp);
-			//param.put ("src_port", sendRtpItem.getLocalPort());
-			// 璁惧鎺ㄦ祦鏌ヨ锛屾垚鍔熷悗鎵嶈兘杞帹
-			boolean rtpPushed = false;
-			long startTime = System.currentTimeMillis();
-			while (!rtpPushed) {
-				try {
-					if (System.currentTimeMillis() - startTime < 30 * 1000) {
-						MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
-						if (zlmrtpServerFactory.isStreamReady(mediaInfo, streamInfo.getApp(), streamInfo.getStreamId())) {
-							rtpPushed = true;
-							logger.info("宸茶幏鍙栬澶囨帹娴乕{}/{}]锛屽紑濮嬪悜涓婄骇鎺ㄦ祦[{}:{}]",
-									streamInfo.getApp() ,streamInfo.getStreamId(), sendRtpItem.getIp(), sendRtpItem.getPort());
-							zlmrtpServerFactory.startSendRtpStream(mediaInfo, param);
-						} else {
-							logger.info("绛夊緟璁惧鎺ㄦ祦[{}/{}].......",
-									streamInfo.getApp() ,streamInfo.getStreamId());
-							Thread.sleep(1000);
-							continue;
-						}
-					} else {
-						rtpPushed = true;
-						logger.info("璁惧鎺ㄦ祦[{}/{}]瓒呮椂锛岀粓姝㈠悜涓婄骇鎺ㄦ祦",
-								streamInfo.getApp() ,streamInfo.getStreamId());
-					}
-				} catch (InterruptedException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-		// try {
-		// 	Request ackRequest = null;
-		// 	CSeq csReq = (CSeq) request.getHeader(CSeq.NAME);
-		// 	ackRequest = dialog.createAck(csReq.getSeqNumber());
-		// 	dialog.sendAck(ackRequest);
-		// 	logger.info("send ack to callee:" + ackRequest.toString());
-		// } catch (SipException e) {
-		// 	e.printStackTrace();
-		// } catch (InvalidArgumentException e) {
-		// 	e.printStackTrace();
-		// }
-		
-	}
-
-	public IRedisCatchStorage getRedisCatchStorage() {
-		return redisCatchStorage;
-	}
-
-	public void setRedisCatchStorage(IRedisCatchStorage redisCatchStorage) {
-		this.redisCatchStorage = redisCatchStorage;
-	}
-
-	public ZLMRTPServerFactory getZlmrtpServerFactory() {
-		return zlmrtpServerFactory;
-	}
-
-	public void setZlmrtpServerFactory(ZLMRTPServerFactory zlmrtpServerFactory) {
-		this.zlmrtpServerFactory = zlmrtpServerFactory;
-	}
-
-	public IMediaServerService getMediaServerService() {
-		return mediaServerService;
-	}
-
-	public void setMediaServerService(IMediaServerService mediaServerService) {
-		this.mediaServerService = mediaServerService;
-	}
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java
deleted file mode 100644
index a164077..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
-
-import javax.sip.*;
-import javax.sip.address.SipURI;
-import javax.sip.header.FromHeader;
-import javax.sip.header.HeaderAddress;
-import javax.sip.header.ToHeader;
-import javax.sip.message.Response;
-
-import com.genersoft.iot.vmp.common.StreamInfo;
-import com.genersoft.iot.vmp.gb28181.bean.Device;
-import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
-import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
-import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
-import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
-import com.genersoft.iot.vmp.service.IMediaServerService;
-import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
-import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.text.ParseException;
-import java.util.HashMap;
-import java.util.Map;
-
-/**    
- * @Description: BYE璇锋眰澶勭悊鍣�
- * @author: lawrencehj
- * @date:   2021骞�3鏈�9鏃�     
- */
-public class ByeRequestProcessor extends SIPRequestAbstractProcessor {
-
-	private Logger logger = LoggerFactory.getLogger(ByeRequestProcessor.class);
-
-	private ISIPCommander cmder;
-
-	private IRedisCatchStorage redisCatchStorage;
-
-	private IVideoManagerStorager storager;
-
-	private ZLMRTPServerFactory zlmrtpServerFactory;
-
-	private IMediaServerService mediaServerService;
-
-	/**
-	 * 澶勭悊BYE璇锋眰
-	 * @param evt
-	 */
-	@Override
-	public void process(RequestEvent evt) {
-		try {
-			responseAck(evt);
-			Dialog dialog = evt.getDialog();
-			if (dialog == null) return;
-			if (dialog.getState().equals(DialogState.TERMINATED)) {
-				String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
-				String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();
-				SendRtpItem sendRtpItem =  redisCatchStorage.querySendRTPServer(platformGbId, channelId);
-				logger.info("鏀跺埌bye, [{}/{}]", platformGbId, channelId);
-				if (sendRtpItem != null){
-					String streamId = sendRtpItem.getStreamId();
-					Map<String, Object> param = new HashMap<>();
-					param.put("vhost","__defaultVhost__");
-					param.put("app",sendRtpItem.getApp());
-					param.put("stream",streamId);
-					param.put("ssrc",sendRtpItem.getSsrc());
-					logger.info("鍋滄鍚戜笂绾ф帹娴侊細" + streamId);
-					MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
-					zlmrtpServerFactory.stopSendRtpStream(mediaInfo, param);
-					redisCatchStorage.deleteSendRTPServer(platformGbId, channelId);
-					if (zlmrtpServerFactory.totalReaderCount(mediaInfo, sendRtpItem.getApp(), streamId) == 0) {
-						logger.info(streamId + "鏃犲叾瀹冭鐪嬭�咃紝閫氱煡璁惧鍋滄鎺ㄦ祦");
-						cmder.streamByeCmd(sendRtpItem.getDeviceId(), channelId);
-					}
-				}
-				// 鍙兘鏄澶囦富鍔ㄥ仠姝�
-				Device device = storager.queryVideoDeviceByChannelId(platformGbId);
-				if (device != null) {
-					StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(device.getDeviceId(), channelId);
-					if (streamInfo != null) {
-						redisCatchStorage.stopPlay(streamInfo);
-					}
-					storager.stopPlay(device.getDeviceId(), channelId);
-					mediaServerService.closeRTPServer(device, channelId);
-				}
-			}
-		} catch (SipException e) {
-			e.printStackTrace();
-		} catch (InvalidArgumentException e) {
-			e.printStackTrace();
-		} catch (ParseException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/***
-	 * 鍥炲200 OK
-	 * @param evt
-	 * @throws SipException
-	 * @throws InvalidArgumentException
-	 * @throws ParseException
-	 */
-	private void responseAck(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
-		Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest());
-		ServerTransaction serverTransaction = getServerTransaction(evt);
-		serverTransaction.sendResponse(response);
-		if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
-	}
-
-	public IRedisCatchStorage getRedisCatchStorage() {
-		return redisCatchStorage;
-	}
-
-	public void setRedisCatchStorage(IRedisCatchStorage redisCatchStorage) {
-		this.redisCatchStorage = redisCatchStorage;
-	}
-
-	public ZLMRTPServerFactory getZlmrtpServerFactory() {
-		return zlmrtpServerFactory;
-	}
-
-	public void setZlmrtpServerFactory(ZLMRTPServerFactory zlmrtpServerFactory) {
-		this.zlmrtpServerFactory = zlmrtpServerFactory;
-	}
-
-	public ISIPCommander getSIPCommander() {
-		return cmder;
-	}
-
-	public void setSIPCommander(ISIPCommander cmder) {
-		this.cmder = cmder;
-	}
-
-	public IMediaServerService getMediaServerService() {
-		return mediaServerService;
-	}
-
-	public void setMediaServerService(IMediaServerService mediaServerService) {
-		this.mediaServerService = mediaServerService;
-	}
-
-	public IVideoManagerStorager getStorager() {
-		return storager;
-	}
-
-	public void setStorager(IVideoManagerStorager storager) {
-		this.storager = storager;
-	}
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/CancelRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/CancelRequestProcessor.java
deleted file mode 100644
index 1b5b886..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/CancelRequestProcessor.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
-
-import javax.sip.RequestEvent;
-
-import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
-
-/**    
- * @Description:CANCEL璇锋眰澶勭悊鍣�
- * @author: swwheihei
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:32:23     
- */
-public class CancelRequestProcessor extends SIPRequestAbstractProcessor {
-
-	/**   
-	 * 澶勭悊CANCEL璇锋眰
-	 *  
-	 * @param evt
-	 * @param layer
-	 * @param transaction
-	 * @param config    
-	 */  
-	@Override
-	public void process(RequestEvent evt) {
-		// TODO 浼樺厛绾�99 Cancel Request娑堟伅瀹炵幇锛屾娑堟伅涓�鑸负绾ц仈娑堟伅锛屼笂绾х粰涓嬬骇鍙戦�佽姹傚彇娑堟寚浠�
-		
-	}
-
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
deleted file mode 100644
index a2bda77..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
+++ /dev/null
@@ -1,478 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
-
-import javax.sdp.*;
-import javax.sip.*;
-import javax.sip.address.Address;
-import javax.sip.address.SipURI;
-import javax.sip.header.*;
-import javax.sip.message.Request;
-import javax.sip.message.Response;
-
-import com.genersoft.iot.vmp.gb28181.bean.*;
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
-import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
-import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
-import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
-import com.genersoft.iot.vmp.service.IMediaServerService;
-import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
-import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
-import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult;
-import com.genersoft.iot.vmp.service.IPlayService;
-import gov.nist.javax.sip.address.AddressImpl;
-import gov.nist.javax.sip.address.SipUri;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.text.ParseException;
-import java.util.Vector;
-
-/**    
- * @Description:澶勭悊INVITE璇锋眰
- * @author: panll
- * @date:   2021骞�1鏈�14鏃�
- */
-@SuppressWarnings("rawtypes")
-public class InviteRequestProcessor extends SIPRequestAbstractProcessor {
-
-	private final static Logger logger = LoggerFactory.getLogger(InviteRequestProcessor.class);
-
-	private SIPCommanderFroPlatform cmderFroPlatform;
-
-	private IVideoManagerStorager storager;
-
-	private IRedisCatchStorage  redisCatchStorage;
-
-	private SIPCommander cmder;
-
-	private IPlayService playService;
-
-	private ZLMRTPServerFactory zlmrtpServerFactory;
-
-	private IMediaServerService mediaServerService;
-
-	public ZLMRTPServerFactory getZlmrtpServerFactory() {
-		return zlmrtpServerFactory;
-	}
-
-	public void setZlmrtpServerFactory(ZLMRTPServerFactory zlmrtpServerFactory) {
-		this.zlmrtpServerFactory = zlmrtpServerFactory;
-	}
-
-	/**
-	 * 澶勭悊invite璇锋眰
-	 * 
-	 * @param evt
-	 *            璇锋眰娑堟伅
-	 */ 
-	@Override
-	public void process(RequestEvent evt) {
-		//  Invite Request娑堟伅瀹炵幇锛屾娑堟伅涓�鑸负绾ц仈娑堟伅锛屼笂绾х粰涓嬬骇鍙戦�佽姹傝棰戞寚浠�
-		try {
-			Request request = evt.getRequest();
-			SipURI sipURI = (SipURI) request.getRequestURI();
-			String channelId = sipURI.getUser();
-			String requesterId = null;
-
-			FromHeader fromHeader = (FromHeader)request.getHeader(FromHeader.NAME);
-			AddressImpl address = (AddressImpl) fromHeader.getAddress();
-			SipUri uri = (SipUri) address.getURI();
-			requesterId = uri.getUser();
-
-			if (requesterId == null || channelId == null) {
-				logger.info("鏃犳硶浠嶧romHeader鐨凙ddress涓幏鍙栧埌骞冲彴id锛岃繑鍥�400");
-				responseAck(evt, Response.BAD_REQUEST); // 鍙傛暟涓嶅叏锛� 鍙�400锛岃姹傞敊璇�
-				return;
-			}
-
-			// 鏌ヨ璇锋眰鏂规槸鍚︿笂绾у钩鍙�
-			ParentPlatform platform = storager.queryParentPlatByServerGBId(requesterId);
-			if (platform != null) {
-				// 鏌ヨ骞冲彴涓嬫槸鍚︽湁璇ラ�氶亾
-				DeviceChannel channel = storager.queryChannelInParentPlatform(requesterId, channelId);
-				GbStream gbStream = storager.queryStreamInParentPlatform(requesterId, channelId);
-				MediaServerItem mediaServerItem = null;
-				// 涓嶆槸閫氶亾鍙兘鏄洿鎾祦
-				if (channel != null && gbStream == null ) {
-					if (channel.getStatus() == 0) {
-						logger.info("閫氶亾绂荤嚎锛岃繑鍥�400");
-						responseAck(evt, Response.BAD_REQUEST, "channel [" + channel.getChannelId() + "] offline");
-						return;
-					}
-					responseAck(evt, Response.CALL_IS_BEING_FORWARDED); // 閫氶亾瀛樺湪锛屽彂181锛屽懠鍙浆鎺ヤ腑
-				}else if(channel == null && gbStream != null){
-					String mediaServerId = gbStream.getMediaServerId();
-					mediaServerItem = mediaServerService.getOne(mediaServerId);
-					if (mediaServerItem == null) {
-						logger.info("[ app={}, stream={} ]鎵句笉鍒皕lm {}锛岃繑鍥�410",gbStream.getApp(), gbStream.getStream(), mediaServerId);
-						responseAck(evt, Response.GONE, "media server not found");
-						return;
-					}
-					Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, gbStream.getApp(), gbStream.getStream());
-					if (!streamReady ) {
-						logger.info("[ app={}, stream={} ]閫氶亾绂荤嚎锛岃繑鍥�400",gbStream.getApp(), gbStream.getStream());
-						responseAck(evt, Response.BAD_REQUEST, "channel [" + gbStream.getGbId() + "] offline");
-						return;
-					}
-					responseAck(evt, Response.CALL_IS_BEING_FORWARDED); // 閫氶亾瀛樺湪锛屽彂181锛屽懠鍙浆鎺ヤ腑
-				}else {
-					logger.info("閫氶亾涓嶅瓨鍦紝杩斿洖404");
-					responseAck(evt, Response.NOT_FOUND); // 閫氶亾涓嶅瓨鍦紝鍙�404锛岃祫婧愪笉瀛樺湪
-					return;
-				}
-				// 瑙f瀽sdp娑堟伅, 浣跨敤jainsip 鑷甫鐨剆dp瑙f瀽鏂瑰紡
-				String contentString = new String(request.getRawContent());
-
-				// jainSip涓嶆敮鎸亂=瀛楁锛� 绉婚櫎绉婚櫎浠ヨВ鏋愩��
-				int ssrcIndex = contentString.indexOf("y=");
-				//ssrc瑙勫畾闀垮害涓�10瀛楄妭锛屼笉鍙栦綑涓嬮暱搴︿互閬垮厤鍚庣画杩樻湁鈥渇=鈥濆瓧娈�
-				String ssrc = contentString.substring(ssrcIndex + 2, ssrcIndex + 12);
-				String substring = contentString.substring(0, contentString.indexOf("y="));
-				SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(substring);
-
-				//  鑾峰彇鏀寔鐨勬牸寮�
-				Vector mediaDescriptions = sdp.getMediaDescriptions(true);
-				// 鏌ョ湅鏄惁鏀寔PS 璐熻浇96
-				//String ip = null;
-				int port = -1;
-				//boolean recvonly = false;
-				boolean mediaTransmissionTCP = false;
-				Boolean tcpActive = null;
-				for (Object description : mediaDescriptions) {
-					MediaDescription mediaDescription = (MediaDescription) description;
-					Media media = mediaDescription.getMedia();
-
-					Vector mediaFormats = media.getMediaFormats(false);
-					if (mediaFormats.contains("96")) {
-						port = media.getMediaPort();
-						//String mediaType = media.getMediaType();
-						String protocol = media.getProtocol();
-
-						// 鍖哄垎TCP鍙戞祦杩樻槸udp锛� 褰撳墠榛樿udp
-						if ("TCP/RTP/AVP".equals(protocol)) {
-							String setup = mediaDescription.getAttribute("setup");
-							if (setup != null) {
-								mediaTransmissionTCP = true;
-								if ("active".equals(setup)) {
-									tcpActive = true;
-								} else if ("passive".equals(setup)) {
-									tcpActive = false;
-								}
-							}
-						}
-						break;
-					}
-				}
-				if (port == -1) {
-					logger.info("涓嶆敮鎸佺殑濯掍綋鏍煎紡锛岃繑鍥�415");
-					// 鍥炲涓嶆敮鎸佺殑鏍煎紡
-					responseAck(evt, Response.UNSUPPORTED_MEDIA_TYPE); // 涓嶆敮鎸佺殑鏍煎紡锛屽彂415
-					return;
-				}
-				String username = sdp.getOrigin().getUsername();
-				String addressStr = sdp.getOrigin().getAddress();
-				//String sessionName = sdp.getSessionName().getValue();
-				logger.info("[涓婄骇鐐规挱]鐢ㄦ埛锛歿}锛� 鍦板潃锛歿}:{}锛� ssrc锛歿}", username, addressStr, port, ssrc);
-				Device device  = null;
-				// 閫氳繃 channel 鍜� gbStream 鏄惁涓簄ull 鍊煎垽鏂潵婧愭槸鐩存挱娴佸悎閫傚浗鏍�
-				if (channel != null) {
-					device = storager.queryVideoDeviceByPlatformIdAndChannelId(requesterId, channelId);
-					if (device == null) {
-						logger.warn("鐐规挱骞冲彴{}鐨勯�氶亾{}鏃舵湭鎵惧埌璁惧淇℃伅", requesterId, channel);
-						responseAck(evt, Response.SERVER_INTERNAL_ERROR);
-						return;
-					}
-					mediaServerItem = playService.getNewMediaServerItem(device);
-					if (mediaServerItem == null) {
-						logger.warn("鏈壘鍒板彲鐢ㄧ殑zlm");
-						responseAck(evt, Response.BUSY_HERE);
-						return;
-					}
-					SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId,
-							device.getDeviceId(), channelId,
-							mediaTransmissionTCP);
-					if (tcpActive != null) {
-						sendRtpItem.setTcpActive(tcpActive);
-					}
-					if (sendRtpItem == null) {
-						logger.warn("鏈嶅姟鍣ㄧ鍙h祫婧愪笉瓒�");
-						responseAck(evt, Response.BUSY_HERE);
-						return;
-					}
-
-					// 鍐欏叆redis锛� 瓒呮椂鏃跺洖澶�
-					redisCatchStorage.updateSendRTPSever(sendRtpItem);
-					// 閫氱煡涓嬬骇鎺ㄦ祦锛�
-					PlayResult playResult = playService.play(mediaServerItem,device.getDeviceId(), channelId, (mediaServerItemInUSe, responseJSON)->{
-						// 鏀跺埌鎺ㄦ祦锛� 鍥炲200OK, 绛夊緟ack
-						// if (sendRtpItem == null) return;
-						sendRtpItem.setStatus(1);
-						redisCatchStorage.updateSendRTPSever(sendRtpItem);
-						// TODO 娣诲姞瀵箃cp鐨勬敮鎸�
-
-						StringBuffer content = new StringBuffer(200);
-						content.append("v=0\r\n");
-						content.append("o="+ channelId +" 0 0 IN IP4 "+mediaServerItemInUSe.getSdpIp()+"\r\n");
-						content.append("s=Play\r\n");
-						content.append("c=IN IP4 "+mediaServerItemInUSe.getSdpIp()+"\r\n");
-						content.append("t=0 0\r\n");
-						content.append("m=video "+ sendRtpItem.getLocalPort()+" RTP/AVP 96\r\n");
-						content.append("a=sendonly\r\n");
-						content.append("a=rtpmap:96 PS/90000\r\n");
-						content.append("y="+ ssrc + "\r\n");
-						content.append("f=\r\n");
-
-						try {
-							responseAck(evt, content.toString());
-						} catch (SipException e) {
-							e.printStackTrace();
-						} catch (InvalidArgumentException e) {
-							e.printStackTrace();
-						} catch (ParseException e) {
-							e.printStackTrace();
-						}
-					} ,((event) -> {
-						// 鏈煡閿欒銆傜洿鎺ヨ浆鍙戣澶囩偣鎾殑閿欒
-						Response response = null;
-						try {
-							response = getMessageFactory().createResponse(event.statusCode, evt.getRequest());
-							ServerTransaction serverTransaction = getServerTransaction(evt);
-							serverTransaction.sendResponse(response);
-							if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
-						} catch (ParseException | SipException | InvalidArgumentException e) {
-							e.printStackTrace();
-						}
-					}));
-					if (logger.isDebugEnabled()) {
-						logger.debug(playResult.getResult().toString());
-					}
-
-				}else if (gbStream != null) {
-					SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId,
-							gbStream.getApp(), gbStream.getStream(), channelId,
-							mediaTransmissionTCP);
-
-					if (tcpActive != null) {
-						sendRtpItem.setTcpActive(tcpActive);
-					}
-					if (sendRtpItem == null) {
-						logger.warn("鏈嶅姟鍣ㄧ鍙h祫婧愪笉瓒�");
-						responseAck(evt, Response.BUSY_HERE);
-						return;
-					}
-
-					// 鍐欏叆redis锛� 瓒呮椂鏃跺洖澶�
-					redisCatchStorage.updateSendRTPSever(sendRtpItem);
-
-					sendRtpItem.setStatus(1);
-					redisCatchStorage.updateSendRTPSever(sendRtpItem);
-					// TODO 娣诲姞瀵箃cp鐨勬敮鎸�
-					StringBuffer content = new StringBuffer(200);
-					content.append("v=0\r\n");
-					content.append("o="+ channelId +" 0 0 IN IP4 "+mediaServerItem.getSdpIp()+"\r\n");
-					content.append("s=Play\r\n");
-					content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n");
-					content.append("t=0 0\r\n");
-					content.append("m=video "+ sendRtpItem.getLocalPort()+" RTP/AVP 96\r\n");
-					content.append("a=sendonly\r\n");
-					content.append("a=rtpmap:96 PS/90000\r\n");
-					content.append("y="+ ssrc + "\r\n");
-					content.append("f=\r\n");
-
-					try {
-						responseAck(evt, content.toString());
-					} catch (SipException e) {
-						e.printStackTrace();
-					} catch (InvalidArgumentException e) {
-						e.printStackTrace();
-					} catch (ParseException e) {
-						e.printStackTrace();
-					}
-				}
-
-			} else {
-				// 闈炰笂绾у钩鍙拌姹傦紝鏌ヨ鏄惁璁惧璇锋眰锛堥�氬父涓烘帴鏀惰闊冲箍鎾殑璁惧锛�
-				Device device = storager.queryVideoDevice(requesterId);
-				if (device != null) {
-					logger.info("鏀跺埌璁惧" + requesterId + "鐨勮闊冲箍鎾璉nvite璇锋眰");
-					responseAck(evt, Response.TRYING);
-
-					String contentString = new String(request.getRawContent());
-					// jainSip涓嶆敮鎸亂=瀛楁锛� 绉婚櫎绉婚櫎浠ヨВ鏋愩��
-					String substring = contentString;
-					String ssrc = "0000000404";
-					int ssrcIndex = contentString.indexOf("y=");
-					if (ssrcIndex > 0) {
-						substring = contentString.substring(0, ssrcIndex);
-						ssrc = contentString.substring(ssrcIndex + 2, ssrcIndex + 12);
-					}
-					ssrcIndex = substring.indexOf("f=");
-					if (ssrcIndex > 0) {
-						substring = contentString.substring(0, ssrcIndex);
-					}
-					SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(substring);
-
-					//  鑾峰彇鏀寔鐨勬牸寮�
-					Vector mediaDescriptions = sdp.getMediaDescriptions(true);
-					// 鏌ョ湅鏄惁鏀寔PS 璐熻浇96
-					int port = -1;
-					//boolean recvonly = false;
-					boolean mediaTransmissionTCP = false;
-					Boolean tcpActive = null;
-					for (int i = 0; i < mediaDescriptions.size(); i++) {
-						MediaDescription mediaDescription = (MediaDescription)mediaDescriptions.get(i);
-						Media media = mediaDescription.getMedia();
-
-						Vector mediaFormats = media.getMediaFormats(false);
-						if (mediaFormats.contains("8")) {
-							port = media.getMediaPort();
-							String protocol = media.getProtocol();
-							// 鍖哄垎TCP鍙戞祦杩樻槸udp锛� 褰撳墠榛樿udp
-							if ("TCP/RTP/AVP".equals(protocol)) {
-								String setup = mediaDescription.getAttribute("setup");
-								if (setup != null) {
-									mediaTransmissionTCP = true;
-									if ("active".equals(setup)) {
-										tcpActive = true;
-									} else if ("passive".equals(setup)) {
-										tcpActive = false;
-									}
-								}
-							}
-							break;
-						}
-					}
-					if (port == -1) {
-						logger.info("涓嶆敮鎸佺殑濯掍綋鏍煎紡锛岃繑鍥�415");
-						// 鍥炲涓嶆敮鎸佺殑鏍煎紡
-						responseAck(evt, Response.UNSUPPORTED_MEDIA_TYPE); // 涓嶆敮鎸佺殑鏍煎紡锛屽彂415
-						return;
-					}
-					String username = sdp.getOrigin().getUsername();
-					String addressStr = sdp.getOrigin().getAddress();
-					logger.info("璁惧{}璇锋眰璇煶娴侊紝鍦板潃锛歿}:{}锛宻src锛歿}", username, addressStr, port, ssrc);
-
-				} else {
-					logger.warn("鏉ヨ嚜鏃犳晥璁惧/骞冲彴鐨勮姹�");
-					responseAck(evt, Response.BAD_REQUEST);
-				}
-			}
-
-		} catch (SipException | InvalidArgumentException | ParseException e) {
-			e.printStackTrace();
-			logger.warn("sdp瑙f瀽閿欒");
-			e.printStackTrace();
-		} catch (SdpParseException e) {
-			e.printStackTrace();
-		} catch (SdpException e) {
-			e.printStackTrace();
-		}
-	}
-
-
-	/***
-	 * 鍥炲鐘舵�佺爜
-	 * 100 trying
-	 * 200 OK
-	 * 400
-	 * 404
-	 * @param evt
-	 * @throws SipException
-	 * @throws InvalidArgumentException
-	 * @throws ParseException
-	 */
-	private void responseAck(RequestEvent evt, int statusCode) throws SipException, InvalidArgumentException, ParseException {
-		Response response = getMessageFactory().createResponse(statusCode, evt.getRequest());
-		ServerTransaction serverTransaction = getServerTransaction(evt);
-		serverTransaction.sendResponse(response);
-		if (statusCode >= 200) {
-			if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
-		}
-	}
-
-	private void responseAck(RequestEvent evt, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException {
-		Response response = getMessageFactory().createResponse(statusCode, evt.getRequest());
-		response.setReasonPhrase(msg);
-		ServerTransaction serverTransaction = getServerTransaction(evt);
-		serverTransaction.sendResponse(response);
-		if (statusCode >= 200) {
-			if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
-		}
-	}
-
-	/**
-	 * 鍥炲甯dp鐨�200
-	 * @param evt
-	 * @param sdp
-	 * @throws SipException
-	 * @throws InvalidArgumentException
-	 * @throws ParseException
-	 */
-	private void responseAck(RequestEvent evt, String sdp) throws SipException, InvalidArgumentException, ParseException {
-		Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest());
-		SipFactory sipFactory = SipFactory.getInstance();
-		ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
-		response.setContent(sdp, contentTypeHeader);
-
-		SipURI sipURI = (SipURI)evt.getRequest().getRequestURI();
-
-		Address concatAddress = sipFactory.createAddressFactory().createAddress(
-				sipFactory.createAddressFactory().createSipURI(sipURI.getUser(),  sipURI.getHost()+":"+sipURI.getPort()
-				));
-		response.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress));
-		getServerTransaction(evt).sendResponse(response);
-	}
-
-
-
-
-
-
-	public SIPCommanderFroPlatform getCmderFroPlatform() {
-		return cmderFroPlatform;
-	}
-
-	public void setCmderFroPlatform(SIPCommanderFroPlatform cmderFroPlatform) {
-		this.cmderFroPlatform = cmderFroPlatform;
-	}
-
-	public IVideoManagerStorager getStorager() {
-		return storager;
-	}
-
-	public void setStorager(IVideoManagerStorager storager) {
-		this.storager = storager;
-	}
-
-	public SIPCommander getCmder() {
-		return cmder;
-	}
-
-	public void setCmder(SIPCommander cmder) {
-		this.cmder = cmder;
-	}
-
-	public IPlayService getPlayService() {
-		return playService;
-	}
-
-	public void setPlayService(IPlayService playService) {
-		this.playService = playService;
-	}
-
-	public IRedisCatchStorage getRedisCatchStorage() {
-		return redisCatchStorage;
-	}
-
-	public void setRedisCatchStorage(IRedisCatchStorage redisCatchStorage) {
-		this.redisCatchStorage = redisCatchStorage;
-	}
-
-	public IMediaServerService getMediaServerService() {
-		return mediaServerService;
-	}
-
-	public void setMediaServerService(IMediaServerService mediaServerService) {
-		this.mediaServerService = mediaServerService;
-	}
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
deleted file mode 100644
index ae01a70..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
+++ /dev/null
@@ -1,1177 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
-
-import java.io.ByteArrayInputStream;
-import java.text.ParseException;
-import java.util.*;
-
-import javax.sip.*;
-import javax.sip.address.Address;
-import javax.sip.address.SipURI;
-
-import javax.sip.header.FromHeader;
-import javax.sip.header.Header;
-import javax.sip.header.HeaderAddress;
-import javax.sip.header.ToHeader;
-import javax.sip.message.Request;
-import javax.sip.message.Response;
-
-import com.alibaba.fastjson.JSONObject;
-import com.genersoft.iot.vmp.VManageBootstrap;
-import com.genersoft.iot.vmp.common.StreamInfo;
-import com.genersoft.iot.vmp.common.VideoManagerConstants;
-import com.genersoft.iot.vmp.conf.UserSetup;
-import com.genersoft.iot.vmp.gb28181.bean.*;
-import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
-import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
-import com.genersoft.iot.vmp.gb28181.transmit.callback.CheckForAllRecordsThread;
-import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
-import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
-import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
-import com.genersoft.iot.vmp.gb28181.utils.DateUtil;
-import com.genersoft.iot.vmp.gb28181.utils.NumericUtil;
-import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
-import com.genersoft.iot.vmp.service.IDeviceAlarmService;
-import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
-import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
-import com.genersoft.iot.vmp.utils.GpsUtil;
-import com.genersoft.iot.vmp.utils.SipUtils;
-import com.genersoft.iot.vmp.utils.SpringBeanFactory;
-import com.genersoft.iot.vmp.utils.redis.RedisUtil;
-import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce;
-
-import gov.nist.javax.sip.SipStackImpl;
-import gov.nist.javax.sip.address.AddressImpl;
-import gov.nist.javax.sip.address.SipUri;
-
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.util.StringUtils;
-
-/**
- * @Description:MESSAGE璇锋眰澶勭悊鍣�
- * @author: swwheihei
- * @date: 2020骞�5鏈�3鏃� 涓嬪崍5:32:41
- */
-@SuppressWarnings(value={"unchecked", "rawtypes"})
-public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
-
-	public static volatile List<String> threadNameList = new ArrayList();
-
-	private UserSetup userSetup = (UserSetup) SpringBeanFactory.getBean("userSetup");
-
-	private final static Logger logger = LoggerFactory.getLogger(MessageRequestProcessor.class);
-
-	private SIPCommander cmder;
-
-	private SIPCommanderFroPlatform cmderFroPlatform;
-
-	private IVideoManagerStorager storager;
-
-	private IRedisCatchStorage redisCatchStorage;
-
-	private EventPublisher publisher;
-
-	private RedisUtil redis;
-
-	private DeferredResultHolder deferredResultHolder;
-
-	private DeviceOffLineDetector offLineDetector;
-
-	private IDeviceAlarmService deviceAlarmService;
-
-	private final static String CACHE_RECORDINFO_KEY = "CACHE_RECORDINFO_";
-
-	private static final String MESSAGE_KEEP_ALIVE = "Keepalive";
-	private static final String MESSAGE_CONFIG_DOWNLOAD = "ConfigDownload";
-	private static final String MESSAGE_CATALOG = "Catalog";
-	private static final String MESSAGE_DEVICE_INFO = "DeviceInfo";
-	private static final String MESSAGE_ALARM = "Alarm";
-	private static final String MESSAGE_RECORD_INFO = "RecordInfo";
-	private static final String MESSAGE_MEDIA_STATUS = "MediaStatus";
-	private static final String MESSAGE_BROADCAST = "Broadcast";
-	private static final String MESSAGE_DEVICE_STATUS = "DeviceStatus";
-	private static final String MESSAGE_DEVICE_CONTROL = "DeviceControl";
-	private static final String MESSAGE_DEVICE_CONFIG = "DeviceConfig";
-	private static final String MESSAGE_MOBILE_POSITION = "MobilePosition";
-	// private static final String MESSAGE_MOBILE_POSITION_INTERVAL = "Interval";
-	private static final String MESSAGE_PRESET_QUERY = "PresetQuery";
-
-	/**
-	 * 澶勭悊MESSAGE璇锋眰
-	 * 
-	 * @param evt
-	 */
-	@Override
-	public void process(RequestEvent evt) {
-
-		try {
-			Element rootElement = getRootElement(evt);
-			String cmd = XmlUtil.getText(rootElement, "CmdType");
-
-			if (MESSAGE_KEEP_ALIVE.equals(cmd)) {
-				logger.debug("鎺ユ敹鍒癒eepAlive娑堟伅");
-				processMessageKeepAlive(evt);
-			} else if (MESSAGE_CONFIG_DOWNLOAD.equals(cmd)) {
-				logger.debug("鎺ユ敹鍒癈onfigDownload娑堟伅");
-				processMessageConfigDownload(evt);
-			} else if (MESSAGE_CATALOG.equals(cmd)) {
-				logger.debug("鎺ユ敹鍒癈atalog娑堟伅");
-				processMessageCatalogList(evt);
-			} else if (MESSAGE_DEVICE_INFO.equals(cmd)) {
-				// DeviceInfo娑堟伅澶勭悊
-				processMessageDeviceInfo(evt);
-			} else if (MESSAGE_DEVICE_STATUS.equals(cmd)) {
-				// DeviceStatus娑堟伅澶勭悊
-				processMessageDeviceStatus(evt);
-			} else if (MESSAGE_DEVICE_CONTROL.equals(cmd)) {
-				logger.debug("鎺ユ敹鍒癉eviceControl娑堟伅");
-				processMessageDeviceControl(evt);
-			} else if (MESSAGE_DEVICE_CONFIG.equals(cmd)) {
-				logger.info("鎺ユ敹鍒癉eviceConfig娑堟伅");
-				processMessageDeviceConfig(evt);
-			} else if (MESSAGE_ALARM.equals(cmd)) {
-				logger.debug("鎺ユ敹鍒癆larm娑堟伅");
-				processMessageAlarm(evt);
-			} else if (MESSAGE_RECORD_INFO.equals(cmd)) {
-				logger.debug("鎺ユ敹鍒癛ecordInfo娑堟伅");
-				processMessageRecordInfo(evt);
-			}else if (MESSAGE_MEDIA_STATUS.equals(cmd)) {
-				logger.debug("鎺ユ敹鍒癕ediaStatus娑堟伅");
-				processMessageMediaStatus(evt);
-			} else if (MESSAGE_MOBILE_POSITION.equals(cmd)) {
-				logger.debug("鎺ユ敹鍒癕obilePosition娑堟伅");
-				processMessageMobilePosition(evt);
-			} else if (MESSAGE_PRESET_QUERY.equals(cmd)) {
-				logger.debug("鎺ユ敹鍒癙resetQuery娑堟伅");
-				processMessagePresetQuery(evt);
-			} else if (MESSAGE_BROADCAST.equals(cmd)) {
-				// Broadcast娑堟伅澶勭悊
-				processMessageBroadcast(evt);
-			} else {
-				logger.debug("鎺ユ敹鍒版秷鎭細" + cmd);
-				responseAck(evt);
-			}
-		} catch (DocumentException | SipException |InvalidArgumentException | ParseException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * 澶勭悊MobilePosition绉诲姩浣嶇疆娑堟伅
-	 * 
-	 * @param evt
-	 */
-	private void processMessageMobilePosition(RequestEvent evt) {
-		try {
-			String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
-			Device device = storager.queryVideoDevice(deviceId);
-			if (device == null) {
-				logger.warn("澶勭悊MobilePosition绉诲姩浣嶇疆娑堟伅鏃舵湭鎵惧埌璁惧淇℃伅");
-				response404Ack(evt);
-				return;
-			}
-			Element rootElement = getRootElement(evt, device.getCharset());
-
-			MobilePosition mobilePosition = new MobilePosition();
-			if (!StringUtils.isEmpty(device.getName())) {
-				mobilePosition.setDeviceName(device.getName());
-			}
-			mobilePosition.setDeviceId(deviceId);
-			mobilePosition.setChannelId(XmlUtil.getText(rootElement, "DeviceID"));
-			mobilePosition.setTime(XmlUtil.getText(rootElement, "Time"));
-			mobilePosition.setLongitude(Double.parseDouble(XmlUtil.getText(rootElement, "Longitude")));
-			mobilePosition.setLatitude(Double.parseDouble(XmlUtil.getText(rootElement, "Latitude")));
-            if (NumericUtil.isDouble(XmlUtil.getText(rootElement, "Speed"))) {
-				mobilePosition.setSpeed(Double.parseDouble(XmlUtil.getText(rootElement, "Speed")));
-			} else {
-				mobilePosition.setSpeed(0.0);
-			}
-			if (NumericUtil.isDouble(XmlUtil.getText(rootElement, "Direction"))) {
-				mobilePosition.setDirection(Double.parseDouble(XmlUtil.getText(rootElement, "Direction")));
-			} else {
-				mobilePosition.setDirection(0.0);
-			}
-			if (NumericUtil.isDouble(XmlUtil.getText(rootElement, "Altitude"))) {
-				mobilePosition.setAltitude(Double.parseDouble(XmlUtil.getText(rootElement, "Altitude")));
-			} else {
-				mobilePosition.setAltitude(0.0);
-			}
-			mobilePosition.setReportSource("Mobile Position");
-			BaiduPoint bp = new BaiduPoint();
-			bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude()));
-			logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat());
-			mobilePosition.setGeodeticSystem("BD-09");
-			mobilePosition.setCnLng(bp.getBdLng());
-			mobilePosition.setCnLat(bp.getBdLat());
-			if (!userSetup.getSavePositionHistory()) {
-				storager.clearMobilePositionsByDeviceId(deviceId);
-			}
-			storager.insertMobilePosition(mobilePosition);
-			//鍥炲 200 OK
-			responseAck(evt);
-		} catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * 澶勭悊DeviceStatus璁惧鐘舵�丮essage
-	 * 
-	 * @param evt
-	 */
-	private void processMessageDeviceStatus(RequestEvent evt) {
-		try {
-			String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
-			Device device = storager.queryVideoDevice(deviceId);
-			if (device == null) {
-				logger.warn("澶勭悊DeviceStatus璁惧鐘舵�丮essage鏃舵湭鎵惧埌璁惧淇℃伅");
-				response404Ack(evt);
-				return;
-			}
-			Element rootElement = getRootElement(evt);
-			String name = rootElement.getName();
-			Element deviceIdElement = rootElement.element("DeviceID");
-			String channelId = deviceIdElement.getText();
-			if (name.equalsIgnoreCase("Query")) { // 鍖哄垎鏄疪esponse鈥斺�旀煡璇㈠搷搴旓紝杩樻槸Query鈥斺�旀煡璇㈣姹�
-				logger.info("鎺ユ敹鍒癉eviceStatus鏌ヨ娑堟伅");
-				FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
-				String platformId = ((SipUri) fromHeader.getAddress().getURI()).getUser();
-					if (platformId == null) {
-					response404Ack(evt);
-					return;
-				} else {
-					// 鍥炲200 OK
-					responseAck(evt);
-					String sn = rootElement.element("SN").getText();
-					ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId);
-					cmderFroPlatform.deviceStatusResponse(parentPlatform, sn, fromHeader.getTag());
-				}
-			} else {
-				logger.info("鎺ユ敹鍒癉eviceStatus搴旂瓟娑堟伅");
-				// 妫�鏌ヨ澶囨槸鍚﹀瓨鍦紝 涓嶅瓨鍦ㄥ垯涓嶅洖澶�
-				if (storager.exists(deviceId)) {
-					// 鍥炲200 OK
-					responseAck(evt);
-					JSONObject json = new JSONObject();
-					XmlUtil.node2Json(rootElement, json);
-					if (logger.isDebugEnabled()) {
-						logger.debug(json.toJSONString());
-					}
-					RequestMessage msg = new RequestMessage();
-					msg.setKey(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId + channelId);
-					msg.setData(json);
-					deferredResultHolder.invokeAllResult(msg);
-
-					if (offLineDetector.isOnline(deviceId)) {
-						publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE);
-					} else {
-					}
-				}
-			}
-
-		} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * 澶勭悊DeviceControl璁惧鐘舵�丮essage
-	 * 
-	 * @param evt
-	 */
-	private void processMessageDeviceControl(RequestEvent evt) {
-		try {
-			String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
-			Device device = storager.queryVideoDevice(deviceId);
-			if (device == null) {
-				logger.warn("澶勭悊DeviceControl璁惧鐘舵�丮essage鏈壘鍒拌澶囦俊鎭�");
-				response404Ack(evt);
-				return;
-			}
-			Element rootElement = getRootElement(evt);
-			String channelId = XmlUtil.getText(rootElement, "DeviceID");
-			//String result = XmlUtil.getText(rootElement, "Result");
-			// 鍥炲200 OK
-			responseAck(evt);
-			if (rootElement.getName().equals("Response")) {//} !StringUtils.isEmpty(result)) {
-				// 姝ゅ鏄鏈钩鍙板彂鍑篋eviceControl鎸囦护鐨勫簲绛�
-				JSONObject json = new JSONObject();
-				XmlUtil.node2Json(rootElement, json);
-				if (logger.isDebugEnabled()) {
-					logger.debug(json.toJSONString());
-				}
-				RequestMessage msg = new RequestMessage();
-				String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL +  deviceId + channelId;
-				msg.setKey(key);
-				msg.setData(json);
-				deferredResultHolder.invokeAllResult(msg);
-			} else {
-				// 姝ゅ鏄笂绾у彂鍑虹殑DeviceControl鎸囦护
-				String platformId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
-				String targetGBId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();
-				// 杩滅▼鍚姩鍔熻兘
-				if (!StringUtils.isEmpty(XmlUtil.getText(rootElement, "TeleBoot"))) {
-					if (deviceId.equals(targetGBId)) {
-						// 杩滅▼鍚姩鏈钩鍙帮細闇�瑕佸湪閲嶆柊鍚姩绋嬪簭鍚庡厛瀵筍ipStack瑙g粦
-						logger.info("鎵ц杩滅▼鍚姩鏈钩鍙板懡浠�");
-						ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId);
-						cmderFroPlatform.unregister(parentPlatform, null, null);
-	
-						Thread restartThread = new Thread(new Runnable() {
-							@Override
-							public void run() {
-								try {
-									Thread.sleep(3000);
-									SipProvider up = (SipProvider) SpringBeanFactory.getBean("udpSipProvider");
-									SipStackImpl stack = (SipStackImpl)up.getSipStack();
-									stack.stop();
-									Iterator listener = stack.getListeningPoints();
-									while (listener.hasNext()) {
-										stack.deleteListeningPoint((ListeningPoint) listener.next());
-									}
-									Iterator providers = stack.getSipProviders();
-									while (providers.hasNext()) {
-										stack.deleteSipProvider((SipProvider) providers.next());
-									}
-									VManageBootstrap.restart();
-								} catch (InterruptedException ignored) {
-								} catch (ObjectInUseException e) {
-									e.printStackTrace();
-								}
-							}
-						});
-			
-						restartThread.setDaemon(false);
-						restartThread.start();
-					} else {
-						// 杩滅▼鍚姩鎸囧畾璁惧
-					}
-				}
-				// 浜戝彴/鍓嶇鎺у埗鍛戒护
-				if (!StringUtils.isEmpty(XmlUtil.getText(rootElement,"PTZCmd")) && !deviceId.equals(targetGBId)) {
-					String cmdString = XmlUtil.getText(rootElement,"PTZCmd");
-					Device deviceForPlatform = storager.queryVideoDeviceByPlatformIdAndChannelId(platformId, deviceId);
-					cmder.fronEndCmd(deviceForPlatform, deviceId, cmdString);
-				}
-			}
-		} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * 澶勭悊DeviceConfig璁惧鐘舵�丮essage
-	 * 
-	 * @param evt
-	 */
-	private void processMessageDeviceConfig(RequestEvent evt) {
-		try {
-			String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
-			// 鏌ヨ璁惧鏄惁瀛樺湪
-			Device device = storager.queryVideoDevice(deviceId);
-			if (device == null) {
-				logger.warn("澶勭悊DeviceConfig璁惧鐘舵�丮essage娑堟伅鏃舵湭鎵惧埌璁惧淇℃伅");
-				response404Ack(evt);
-				return;
-			}
-			Element rootElement = getRootElement(evt);
-			String channelId = XmlUtil.getText(rootElement, "DeviceID");
-			// 鍥炲200 OK
-			responseAck(evt);
-			if (rootElement.getName().equals("Response")) {
-					// 姝ゅ鏄鏈钩鍙板彂鍑篋eviceControl鎸囦护鐨勫簲绛�
-				JSONObject json = new JSONObject();
-				XmlUtil.node2Json(rootElement, json);
-				if (logger.isDebugEnabled()) {
-					logger.debug(json.toJSONString());
-				}
-				String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG + deviceId + channelId;
-				RequestMessage msg = new RequestMessage();
-				msg.setKey(key);
-				msg.setData(json);
-				deferredResultHolder.invokeAllResult(msg);
-			} else {
-				// 姝ゅ鏄笂绾у彂鍑虹殑DeviceConfig鎸囦护
-			}
-		} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * 澶勭悊ConfigDownload璁惧鐘舵�丮essage
-	 * 
-	 * @param evt
-	 */
-	private void processMessageConfigDownload(RequestEvent evt) {
-		try {
-			String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
-			// 鏌ヨ璁惧鏄惁瀛樺湪
-			Device device = storager.queryVideoDevice(deviceId);
-			if (device == null) {
-				logger.warn("澶勭悊ConfigDownload璁惧鐘舵�丮essage鏃舵湭鎵惧埌璁惧淇℃伅");
-				response404Ack(evt);
-				return;
-			}
-			Element rootElement = getRootElement(evt);
-			String channelId = XmlUtil.getText(rootElement, "DeviceID");
-			String key = DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + deviceId + channelId;
-			// 鍥炲200 OK
-			responseAck(evt);
-			if (rootElement.getName().equals("Response")) {
-					// 姝ゅ鏄鏈钩鍙板彂鍑篋eviceControl鎸囦护鐨勫簲绛�
-				JSONObject json = new JSONObject();
-				XmlUtil.node2Json(rootElement, json);
-				if (logger.isDebugEnabled()) {
-					logger.debug(json.toJSONString());
-				}
-				RequestMessage msg = new RequestMessage();
-				msg.setKey(key);
-				msg.setData(json);
-				deferredResultHolder.invokeAllResult(msg);
-			} else {
-				// 姝ゅ鏄笂绾у彂鍑虹殑DeviceConfig鎸囦护
-			}
-		} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * 澶勭悊PresetQuery棰勭疆浣嶅垪琛∕essage
-	 * 
-	 * @param evt
-	 */
-	private void processMessagePresetQuery(RequestEvent evt) {
-		try {
-			String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
-			// 鏌ヨ璁惧鏄惁瀛樺湪
-			Device device = storager.queryVideoDevice(deviceId);
-			if (device == null) {
-				logger.warn("澶勭悊PresetQuery棰勭疆浣嶅垪琛∕essage鏃舵湭鎵惧埌璁惧淇℃伅");
-				response404Ack(evt);
-				return;
-			}
-			Element rootElement = getRootElement(evt);
-			String channelId = XmlUtil.getText(rootElement, "DeviceID");
-			String key = DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + deviceId + channelId;
-			// 鍥炲200 OK
-			responseAck(evt);
-			if (rootElement.getName().equals("Response")) {//   !StringUtils.isEmpty(result)) {
-				// 姝ゅ鏄鏈钩鍙板彂鍑篋eviceControl鎸囦护鐨勫簲绛�
-				JSONObject json = new JSONObject();
-				XmlUtil.node2Json(rootElement, json);
-				if (logger.isDebugEnabled()) {
-					logger.debug(json.toJSONString());
-				}
-				RequestMessage msg = new RequestMessage();
-				msg.setKey(key);
-				msg.setData(json);
-				deferredResultHolder.invokeAllResult(msg);
-			} else {
-				// 姝ゅ鏄笂绾у彂鍑虹殑DeviceControl鎸囦护
-			}
-		} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * 澶勭悊DeviceInfo璁惧淇℃伅Message
-	 * 
-	 * @param evt
-	 */
-	private void processMessageDeviceInfo(RequestEvent evt) {
-		try {
-			String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
-			// 鏌ヨ璁惧鏄惁瀛樺湪
-			Device device = storager.queryVideoDevice(deviceId);
-			ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(deviceId);
-
-			Element rootElement = getRootElement(evt);
-			String requestName = rootElement.getName();
-			Element deviceIdElement = rootElement.element("DeviceID");
-			String channelId = deviceIdElement.getTextTrim();
-			String key = DeferredResultHolder.CALLBACK_CMD_DEVICEINFO + deviceId + channelId;
-			if (device != null ) {
-				rootElement = getRootElement(evt, device.getCharset());
-			}
-			if (requestName.equals("Query")) {
-				logger.info("鎺ユ敹鍒癉eviceInfo鏌ヨ娑堟伅");
-				FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
-				if (parentPlatform == null) {
-					response404Ack(evt);
-					return;
-				} else {
-					// 鍥炲200 OK
-					responseAck(evt);
-					String sn = rootElement.element("SN").getText();
-					cmderFroPlatform.deviceInfoResponse(parentPlatform, sn, fromHeader.getTag());
-				}
-			} else {
-				logger.debug("鎺ユ敹鍒癉eviceInfo搴旂瓟娑堟伅");
-				if (device == null) {
-					logger.warn("澶勭悊DeviceInfo璁惧淇℃伅Message鏃舵湭鎵惧埌璁惧淇℃伅");
-					response404Ack(evt);
-					return;
-				}
-
-				device.setName(XmlUtil.getText(rootElement, "DeviceName"));
-
-				device.setManufacturer(XmlUtil.getText(rootElement, "Manufacturer"));
-				device.setModel(XmlUtil.getText(rootElement, "Model"));
-				device.setFirmware(XmlUtil.getText(rootElement, "Firmware"));
-				if (StringUtils.isEmpty(device.getStreamMode())) {
-					device.setStreamMode("UDP");
-				}
-				storager.updateDevice(device);
-	
-				RequestMessage msg = new RequestMessage();
-				msg.setKey(key);
-				msg.setData(device);
-				deferredResultHolder.invokeAllResult(msg);
-				// 鍥炲200 OK
-				responseAck(evt);
-				if (offLineDetector.isOnline(deviceId)) {
-					publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE);
-				}
-			}
-		} catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/***
-	 * 鏀跺埌catalog璁惧鐩綍鍒楄〃璇锋眰 澶勭悊
-	 * 
-	 * @param evt
-	 */
-	private void processMessageCatalogList(RequestEvent evt) {
-		try {
-
-			String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
-			// 鏌ヨ璁惧鏄惁瀛樺湪
-			Device device = storager.queryVideoDevice(deviceId);
-			ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(deviceId);
-
-
-			Element rootElement = getRootElement(evt);
-			String name = rootElement.getName();
-			Element deviceIdElement = rootElement.element("DeviceID");
-			String channelId = deviceIdElement.getText();
-			Element deviceListElement = rootElement.element("DeviceList");
-			String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;
-			FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
-			if (name.equalsIgnoreCase("Query")) { // 鍖哄垎鏄疪esponse鈥斺�旀煡璇㈠搷搴旓紝杩樻槸Query鈥斺�旀煡璇㈣姹�
-				// TODO 鍚庣画灏嗕唬鐮佹媶鍒�
-				if (parentPlatform == null) {
-					response404Ack(evt);
-					return;
-				} else {
-					// 鍥炲200 OK
-					responseAck(evt);
-
-					Element snElement = rootElement.element("SN");
-					String sn = snElement.getText();
-					// 鍑嗗鍥炲閫氶亾淇℃伅
-					List<ChannelReduce> channelReduces = storager.queryChannelListInParentPlatform(parentPlatform.getServerGBId());
-					// 鏌ヨ鍏宠仈鐨勭洿鎾�氶亾
-					List<GbStream> gbStreams = storager.queryGbStreamListInPlatform(parentPlatform.getServerGBId());
-					int size = channelReduces.size() + gbStreams.size();
-					// 鍥炲绾ц仈鐨勯�氶亾
-					if (channelReduces.size() > 0) {
-						for (ChannelReduce channelReduce : channelReduces) {
-							DeviceChannel deviceChannel = storager.queryChannel(channelReduce.getDeviceId(), channelReduce.getChannelId());
-							cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size);
-						}
-					}
-					// 鍥炲鐩存挱鐨勯�氶亾
-					if (gbStreams.size() > 0) {
-						for (GbStream gbStream : gbStreams) {
-							DeviceChannel deviceChannel = new DeviceChannel();
-							deviceChannel.setChannelId(gbStream.getGbId());
-							deviceChannel.setName(gbStream.getName());
-							deviceChannel.setLongitude(gbStream.getLongitude());
-							deviceChannel.setLatitude(gbStream.getLatitude());
-							deviceChannel.setDeviceId(parentPlatform.getDeviceGBId());
-							deviceChannel.setManufacture("wvp-pro");
-							deviceChannel.setStatus(gbStream.isStatus()?1:0);
-//							deviceChannel.setParentId(parentPlatform.getDeviceGBId());
-							deviceChannel.setRegisterWay(1);
-							deviceChannel.setCivilCode(cmder.getSipConfig().getDomain());
-							deviceChannel.setModel("live");
-							deviceChannel.setOwner("wvp-pro");
-//							deviceChannel.setAddress("test");
-							deviceChannel.setParental(0);
-							deviceChannel.setSecrecy("0");
-							deviceChannel.setSecrecy("0");
-
-							cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size);
-						}
-					}
-					if (size == 0) {
-						// 鍥炲鏃犻�氶亾
-						cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), size);
-					}
-				}
-
-
-			} else {
-				if (device == null) {
-					logger.warn("鏀跺埌catalog璁惧鐩綍鍒楄〃璇锋眰鏃舵湭鎵惧埌璁惧淇℃伅");
-					response404Ack(evt);
-					return;
-				}
-				deviceListElement = getRootElement(evt, device.getCharset()).element("DeviceList");
-				Iterator<Element> deviceListIterator = deviceListElement.elementIterator();
-				if (deviceListIterator != null) {
-
-					// 閬嶅巻DeviceList
-					while (deviceListIterator.hasNext()) {
-						Element itemDevice = deviceListIterator.next();
-						Element channelDeviceElement = itemDevice.element("DeviceID");
-						if (channelDeviceElement == null) {
-							continue;
-						}
-						String channelDeviceId = channelDeviceElement.getText();
-						Element channdelNameElement = itemDevice.element("Name");
-						String channelName = channdelNameElement != null ? channdelNameElement.getTextTrim().toString() : "";
-						Element statusElement = itemDevice.element("Status");
-						String status = statusElement != null ? statusElement.getText().toString() : "ON";
-						DeviceChannel deviceChannel = new DeviceChannel();
-						deviceChannel.setName(channelName);
-						deviceChannel.setChannelId(channelDeviceId);
-						// ONLINE OFFLINE  HIKVISION DS-7716N-E4 NVR鐨勫吋瀹规�у鐞�
-						if (status.equals("ON") || status.equals("On") || status.equals("ONLINE")) {
-							deviceChannel.setStatus(1);
-						}
-						if (status.equals("OFF") || status.equals("Off") || status.equals("OFFLINE")) {
-							deviceChannel.setStatus(0);
-						}
-
-						deviceChannel.setManufacture(XmlUtil.getText(itemDevice, "Manufacturer"));
-						deviceChannel.setModel(XmlUtil.getText(itemDevice, "Model"));
-						deviceChannel.setOwner(XmlUtil.getText(itemDevice, "Owner"));
-						deviceChannel.setCivilCode(XmlUtil.getText(itemDevice, "CivilCode"));
-						deviceChannel.setBlock(XmlUtil.getText(itemDevice, "Block"));
-						deviceChannel.setAddress(XmlUtil.getText(itemDevice, "Address"));
-						if (XmlUtil.getText(itemDevice, "Parental") == null || XmlUtil.getText(itemDevice, "Parental") == "") {
-							deviceChannel.setParental(0);
-						} else {
-							deviceChannel.setParental(Integer.parseInt(XmlUtil.getText(itemDevice, "Parental")));
-						}
-						deviceChannel.setParentId(XmlUtil.getText(itemDevice, "ParentID"));
-						if (XmlUtil.getText(itemDevice, "SafetyWay") == null || XmlUtil.getText(itemDevice, "SafetyWay") == "") {
-							deviceChannel.setSafetyWay(0);
-						} else {
-							deviceChannel.setSafetyWay(Integer.parseInt(XmlUtil.getText(itemDevice, "SafetyWay")));
-						}
-						if (XmlUtil.getText(itemDevice, "RegisterWay") == null || XmlUtil.getText(itemDevice, "RegisterWay") == "") {
-							deviceChannel.setRegisterWay(1);
-						} else {
-							deviceChannel.setRegisterWay(Integer.parseInt(XmlUtil.getText(itemDevice, "RegisterWay")));
-						}
-						deviceChannel.setCertNum(XmlUtil.getText(itemDevice, "CertNum"));
-						if (XmlUtil.getText(itemDevice, "Certifiable") == null || XmlUtil.getText(itemDevice, "Certifiable") == "") {
-							deviceChannel.setCertifiable(0);
-						} else {
-							deviceChannel.setCertifiable(Integer.parseInt(XmlUtil.getText(itemDevice, "Certifiable")));
-						}
-						if (XmlUtil.getText(itemDevice, "ErrCode") == null || XmlUtil.getText(itemDevice, "ErrCode") == "") {
-							deviceChannel.setErrCode(0);
-						} else {
-							deviceChannel.setErrCode(Integer.parseInt(XmlUtil.getText(itemDevice, "ErrCode")));
-						}
-						deviceChannel.setEndTime(XmlUtil.getText(itemDevice, "EndTime"));
-						deviceChannel.setSecrecy(XmlUtil.getText(itemDevice, "Secrecy"));
-						deviceChannel.setIpAddress(XmlUtil.getText(itemDevice, "IPAddress"));
-						if (XmlUtil.getText(itemDevice, "Port") == null || XmlUtil.getText(itemDevice, "Port") == "") {
-							deviceChannel.setPort(0);
-						} else {
-							deviceChannel.setPort(Integer.parseInt(XmlUtil.getText(itemDevice, "Port")));
-						}
-						deviceChannel.setPassword(XmlUtil.getText(itemDevice, "Password"));
-						if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Longitude"))) {
-							deviceChannel.setLongitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Longitude")));
-						} else {
-							deviceChannel.setLongitude(0.00);
-						}
-						if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Latitude"))) {
-							deviceChannel.setLatitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Latitude")));
-						} else {
-							deviceChannel.setLatitude(0.00);
-						}
-						if (XmlUtil.getText(itemDevice, "PTZType") == null || XmlUtil.getText(itemDevice, "PTZType") == "") {
-							deviceChannel.setPTZType(0);
-						} else {
-							deviceChannel.setPTZType(Integer.parseInt(XmlUtil.getText(itemDevice, "PTZType")));
-						}
-						deviceChannel.setHasAudio(true); // 榛樿鍚湁闊抽锛屾挱鏀炬椂鍐嶆鏌ユ槸鍚︽湁闊抽鍙婃槸鍚AC
-						storager.updateChannel(device.getDeviceId(), deviceChannel);
-					}
-
-					RequestMessage msg = new RequestMessage();
-					msg.setKey(key);
-					msg.setData(device);
-					deferredResultHolder.invokeAllResult(msg);
-					// 鍥炲200 OK
-					responseAck(evt);
-					if (offLineDetector.isOnline(deviceId)) {
-						publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE);
-					}
-				}
-			}
-		} catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/***
-	 * 鏀跺埌alarm璁惧鎶ヨ淇℃伅 澶勭悊
-	 * 
-	 * @param evt
-	 */
-	private void processMessageAlarm(RequestEvent evt) {
-		try {
-			String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
-			Device device = storager.queryVideoDevice(deviceId);
-			if (device == null) {
-				logger.warn("澶勭悊alarm璁惧鎶ヨ淇℃伅鏈壘鍒拌澶囦俊鎭�");
-				response404Ack(evt);
-				return;
-			}
-			Element rootElement = getRootElement(evt, device.getCharset());
-			Element deviceIdElement = rootElement.element("DeviceID");
-			String channelId = deviceIdElement.getText().toString();
-			String key = DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId + channelId;
-			// 鍥炲200 OK
-			responseAck(evt);
-
-			if (device.getCharset() != null) {
-				rootElement = getRootElement(evt, device.getCharset());
-			}
-
-			if (rootElement.getName().equals("Notify")) {	// 澶勭悊鎶ヨ閫氱煡
-				DeviceAlarm deviceAlarm = new DeviceAlarm();
-				deviceAlarm.setDeviceId(deviceId);
-				deviceAlarm.setChannelId(channelId);
-				deviceAlarm.setAlarmPriority(XmlUtil.getText(rootElement, "AlarmPriority"));
-				deviceAlarm.setAlarmMethod(XmlUtil.getText(rootElement, "AlarmMethod"));
-				deviceAlarm.setAlarmTime(XmlUtil.getText(rootElement, "AlarmTime"));
-				if (XmlUtil.getText(rootElement, "AlarmDescription") == null) {
-					deviceAlarm.setAlarmDescription("");
-				} else {
-					deviceAlarm.setAlarmDescription(XmlUtil.getText(rootElement, "AlarmDescription"));
-				}
-				if (NumericUtil.isDouble(XmlUtil.getText(rootElement, "Longitude"))) {
-					deviceAlarm.setLongitude(Double.parseDouble(XmlUtil.getText(rootElement, "Longitude")));
-				} else {
-					deviceAlarm.setLongitude(0.00);
-				}
-				if (NumericUtil.isDouble(XmlUtil.getText(rootElement, "Latitude"))) {
-					deviceAlarm.setLatitude(Double.parseDouble(XmlUtil.getText(rootElement, "Latitude")));
-				} else {
-					deviceAlarm.setLatitude(0.00);
-				}
-	
-				if (!StringUtils.isEmpty(deviceAlarm.getAlarmMethod())) {
-					if ( deviceAlarm.getAlarmMethod().equals("4")) {
-						MobilePosition mobilePosition = new MobilePosition();
-						mobilePosition.setDeviceId(deviceAlarm.getDeviceId());
-						mobilePosition.setTime(deviceAlarm.getAlarmTime());
-						mobilePosition.setLongitude(deviceAlarm.getLongitude());
-						mobilePosition.setLatitude(deviceAlarm.getLatitude());
-						mobilePosition.setReportSource("GPS Alarm");
-						BaiduPoint bp = new BaiduPoint();
-						bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude()));
-						logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat());
-						mobilePosition.setGeodeticSystem("BD-09");
-						mobilePosition.setCnLng(bp.getBdLng());
-						mobilePosition.setCnLat(bp.getBdLat());
-						if (!userSetup.getSavePositionHistory()) {
-							storager.clearMobilePositionsByDeviceId(deviceId);
-						}
-						storager.insertMobilePosition(mobilePosition);
-					}
-				}
-				logger.debug("瀛樺偍鎶ヨ淇℃伅銆佹姤璀﹀垎绫�");
-				// 瀛樺偍鎶ヨ淇℃伅銆佹姤璀﹀垎绫�
-				deviceAlarmService.add(deviceAlarm);
-	
-				if (offLineDetector.isOnline(deviceId)) {
-					publisher.deviceAlarmEventPublish(deviceAlarm);
-				}
-			} else if (rootElement.getName().equals("Response")) {	// 澶勭悊鎶ヨ鏌ヨ鍝嶅簲
-				JSONObject json = new JSONObject();
-				XmlUtil.node2Json(rootElement, json);
-				if (logger.isDebugEnabled()) {
-					logger.debug(json.toJSONString());
-				}
-				RequestMessage msg = new RequestMessage();
-				msg.setKey(key);
-				msg.setData(json);
-				deferredResultHolder.invokeAllResult(msg);
-			}
-		} catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/***
-	 * 鏀跺埌keepalive璇锋眰 澶勭悊
-	 * 
-	 * @param evt
-	 */
-	private void processMessageKeepAlive(RequestEvent evt) {
-		try {
-
-			String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
-			// 鏌ヨ璁惧鏄惁瀛樺湪
-			Device device = storager.queryVideoDevice(deviceId);
-
-			Element rootElement = getRootElement(evt);
-			String channelId = XmlUtil.getText(rootElement, "DeviceID");
-
-			// 妫�鏌ヨ澶囨槸鍚﹀瓨鍦ㄥ苟鍦ㄧ嚎锛� 涓嶅湪绾垮垯璁剧疆涓哄湪绾�
-			if (device != null ) {
-				// 鍥炲200 OK
-				responseAck(evt);
-				publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE);
-			}else{
-				logger.warn("鏀跺埌[ "+deviceId+" ]蹇冭烦淇℃伅, 浣嗘槸璁惧涓嶅瓨鍦�, 鍥炲404");
-				Response response = getMessageFactory().createResponse(Response.NOT_FOUND, evt.getRequest());
-				ServerTransaction serverTransaction = getServerTransaction(evt);
-				serverTransaction.sendResponse(response);
-				if (serverTransaction.getDialog() != null) {
-					serverTransaction.getDialog().delete();
-				}
-			}
-
-//			if (device != null && device.getOnline() == 1) {
-//
-//				if (offLineDetector.isOnline(deviceId)) {
-//					publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE);
-//				} else {
-//				}
-//			}else {
-////				logger.warn("鏀跺埌[ "+deviceId+" ]蹇冭烦淇℃伅, 浣嗘槸璁惧" + (device == null? "涓嶅瓨鍦�":"绂荤嚎") + ", 鍥炲401");
-////				Response response = getMessageFactory().createResponse(Response.UNAUTHORIZED, evt.getRequest());
-////				getServerTransaction(evt).sendResponse(response);
-//				publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE);
-//
-//			}
-		} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/***
-	 * 澶勭悊RecordInfo璁惧褰曞儚鍒楄〃Message璇锋眰 TODO 杩囨湡鏃堕棿鏆傛椂鍐欐180绉掞紝鍚庣画涓嶥eferredResult瓒呮椂鏃堕棿淇濇寔涓�鑷�
-	 * 
-	 * @param evt
-	 */
-	private void processMessageRecordInfo(RequestEvent evt) {
-		try {
-
-			String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
-			// 鏌ヨ璁惧鏄惁瀛樺湪
-			Device device = storager.queryVideoDevice(deviceId);
-			if (device == null) {
-				logger.warn("澶勭悊DeviceInfo璁惧淇℃伅Message鏃舵湭鎵惧埌璁惧淇℃伅");
-				response404Ack(evt);
-				return;
-			}
-
-			// 鍥炲200 OK
-			responseAck(evt);
-			String uuid = UUID.randomUUID().toString().replace("-", "");
-			RecordInfo recordInfo = new RecordInfo();
-			Element rootElement = getRootElement(evt);
-			Element deviceIdElement = rootElement.element("DeviceID");
-			String channelId = deviceIdElement.getText().toString();
-			String key = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + deviceId + channelId;
-			if (device != null ) {
-				rootElement = getRootElement(evt, device.getCharset());
-			}
-			recordInfo.setDeviceId(deviceId);
-			recordInfo.setChannelId(channelId);
-			recordInfo.setName(XmlUtil.getText(rootElement, "Name"));
-			if (XmlUtil.getText(rootElement, "SumNum")== null || XmlUtil.getText(rootElement, "SumNum") =="") {
-				recordInfo.setSumNum(0);
-			} else {
-				recordInfo.setSumNum(Integer.parseInt(XmlUtil.getText(rootElement, "SumNum")));
-			}
-			String sn = XmlUtil.getText(rootElement, "SN");
-			Element recordListElement = rootElement.element("RecordList");
-			if (recordListElement == null || recordInfo.getSumNum() == 0) {
-				logger.info("鏃犲綍鍍忔暟鎹�");
-				RequestMessage msg = new RequestMessage();
-				msg.setKey(key);
-				msg.setData(recordInfo);
-				deferredResultHolder.invokeAllResult(msg);
-			} else {
-				Iterator<Element> recordListIterator = recordListElement.elementIterator();
-				List<RecordItem> recordList = new ArrayList<RecordItem>();
-				if (recordListIterator != null) {
-					RecordItem record = new RecordItem();
-					logger.info("澶勭悊褰曞儚鍒楄〃鏁版嵁...");
-					// 閬嶅巻DeviceList
-					while (recordListIterator.hasNext()) {
-						Element itemRecord = recordListIterator.next();
-						Element recordElement = itemRecord.element("DeviceID");
-						if (recordElement == null) {
-							logger.info("璁板綍涓虹┖锛屼笅涓�涓�...");
-							continue;
-						}
-						record = new RecordItem();
-						record.setDeviceId(XmlUtil.getText(itemRecord, "DeviceID"));
-						record.setName(XmlUtil.getText(itemRecord, "Name"));
-						record.setFilePath(XmlUtil.getText(itemRecord, "FilePath"));
-						record.setAddress(XmlUtil.getText(itemRecord, "Address"));
-						record.setStartTime(
-								DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(XmlUtil.getText(itemRecord, "StartTime")));
-						record.setEndTime(
-								DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(XmlUtil.getText(itemRecord, "EndTime")));
-						record.setSecrecy(itemRecord.element("Secrecy") == null ? 0
-								: Integer.parseInt(XmlUtil.getText(itemRecord, "Secrecy")));
-						record.setType(XmlUtil.getText(itemRecord, "Type"));
-						record.setRecorderId(XmlUtil.getText(itemRecord, "RecorderID"));
-						recordList.add(record);
-					}
-					recordInfo.setRecordList(recordList);
-				}
-
-				// 鏀圭敤鍗曠嫭绾跨▼缁熻宸茶幏鍙栧綍鍍忔枃浠舵暟閲忥紝閬垮厤澶氬寘骞惰鍒嗗埆缁熻涓嶅畬鏁寸殑闂
-				String cacheKey = CACHE_RECORDINFO_KEY + deviceId + sn;
-				redis.set(cacheKey + "_" + uuid, recordList, 90);
-				if (!threadNameList.contains(cacheKey)) {
-					threadNameList.add(cacheKey);
-					CheckForAllRecordsThread chk = new CheckForAllRecordsThread(cacheKey, recordInfo);
-					chk.setName(cacheKey);
-					chk.setDeferredResultHolder(deferredResultHolder);
-					chk.setRedis(redis);
-					chk.setLogger(logger);
-					chk.start();
-					if (logger.isDebugEnabled()) {
-						logger.debug("Start Thread " + cacheKey + ".");
-					}
-				} else {
-					if (logger.isDebugEnabled()) {
-						logger.debug("Thread " + cacheKey + " already started.");
-					}
-				}
-
-				// 瀛樺湪褰曞儚涓斿鏋滃綋鍓嶅綍鍍忔槑缁嗕釜鏁板皬浜庢�绘潯鏁帮紝璇存槑鎷嗗寘杩斿洖锛岄渶瑕佺粍瑁咃紝鏆備笉杩斿洖
-				// if (recordInfo.getSumNum() > 0 && recordList.size() > 0 && recordList.size() < recordInfo.getSumNum()) {
-				// 	// 涓洪槻姝㈣繛缁姹傝璁惧鐨勫綍鍍忔暟鎹紝杩斿洖鏁版嵁閿欎贡锛岀壒澧炲姞sn杩涜鍖哄垎
-				// 	String cacheKey = CACHE_RECORDINFO_KEY + deviceId + sn;
-
-				// 	redis.set(cacheKey + "_" + uuid, recordList, 90);
-				// 	List<Object> cacheKeys = redis.scan(cacheKey + "_*");
-				// 	List<RecordItem> totalRecordList = new ArrayList<RecordItem>();
-				// 	for (int i = 0; i < cacheKeys.size(); i++) {
-				// 		totalRecordList.addAll((List<RecordItem>) redis.get(cacheKeys.get(i).toString()));
-				// 	}
-				// 	if (totalRecordList.size() < recordInfo.getSumNum()) {
-				// 		logger.info("宸茶幏鍙�" + totalRecordList.size() + "椤瑰綍鍍忔暟鎹紝鍏�" + recordInfo.getSumNum() + "椤�");
-				// 		return;
-				// 	}
-				// 	logger.info("褰曞儚鏁版嵁宸插叏閮ㄨ幏鍙栵紝鍏�" + recordInfo.getSumNum() + "椤�");
-				// 	recordInfo.setRecordList(totalRecordList);
-				// 	for (int i = 0; i < cacheKeys.size(); i++) {
-				// 		redis.del(cacheKeys.get(i).toString());
-				// 	}
-				// }
-				// // 鑷劧椤哄簭鎺掑簭, 鍏冪礌杩涜鍗囧簭鎺掑垪
-				// recordInfo.getRecordList().sort(Comparator.naturalOrder());
-			}
-			// 璧板埌杩欓噷锛屾湁浠ヤ笅鍙兘锛�1銆佹病鏈夊綍鍍忎俊鎭�,绗竴娆℃敹鍒皉ecordinfo鐨勬秷鎭嵆杩斿洖鍝嶅簲鏁版嵁锛屾棤redis鎿嶄綔
-			// 2銆佹湁褰曞儚鏁版嵁锛屼笖绗竴娆″嵆鏀跺埌瀹屾暣鏁版嵁锛岃繑鍥炲搷搴旀暟鎹紝鏃爎edis鎿嶄綔
-			// 3銆佹湁褰曞儚鏁版嵁锛屽湪瓒呮椂鏃堕棿鍐呮敹鍒板娆″寘缁勮鍚庢暟閲忚冻澶燂紝杩斿洖鏁版嵁
-
-			// RequestMessage msg = new RequestMessage();
-			// msg.setDeviceId(deviceId);
-			// msg.setType(DeferredResultHolder.CALLBACK_CMD_RECORDINFO);
-			// msg.setData(recordInfo);
-			// deferredResultHolder.invokeResult(msg);
-			// logger.info("澶勭悊瀹屾垚锛岃繑鍥炵粨鏋�");
-		} catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * 鏀跺埌MediaStatus娑堟伅澶勭悊
- 	 *  
- 	 * @param evt
- 	 */
-	private void processMessageMediaStatus(RequestEvent evt){
-		try {
-
-			String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
-			// 鏌ヨ璁惧鏄惁瀛樺湪
-			Device device = storager.queryVideoDevice(deviceId);
-			if (device == null) {
-				logger.warn("澶勭悊DeviceInfo璁惧淇℃伅Message鏃舵湭鎵惧埌璁惧淇℃伅");
-				response404Ack(evt);
-				return;
-			}
-
-			// 鍥炲200 OK
-			responseAck(evt);
-			Element rootElement = getRootElement(evt);
-			String channelId = XmlUtil.getText(rootElement, "DeviceID");
-			String NotifyType =XmlUtil.getText(rootElement, "NotifyType");
-			if (NotifyType.equals("121")){
-				logger.info("濯掍綋鎾斁瀹屾瘯锛岄�氱煡鍏虫祦");
-				StreamInfo streamInfo = redisCatchStorage.queryPlaybackByDevice(deviceId, "*");
-				if (streamInfo != null) {
-					redisCatchStorage.stopPlayback(streamInfo);
-					cmder.streamByeCmd(streamInfo.getDeviceID(), streamInfo.getChannelId());
-				}
-			}
-		} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * 澶勭悊AudioBroadcast璇煶骞挎挱Message
-	 * 
-	 * @param evt
-	 */
-	private void processMessageBroadcast(RequestEvent evt) {
-		try {
-
-			String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
-			// 鏌ヨ璁惧鏄惁瀛樺湪
-			Device device = storager.queryVideoDevice(deviceId);
-			if (device == null) {
-				logger.warn("澶勭悊DeviceInfo璁惧淇℃伅Message鏃舵湭鎵惧埌璁惧淇℃伅");
-				response404Ack(evt);
-				return;
-			}
-
-			Element rootElement = getRootElement(evt);
-			String channelId = XmlUtil.getText(rootElement, "DeviceID");
-			String key = DeferredResultHolder.CALLBACK_CMD_BROADCAST + deviceId + channelId;
-			// 鍥炲200 OK
-			responseAck(evt);
-			if (rootElement.getName().equals("Response")) {
-					// 姝ゅ鏄鏈钩鍙板彂鍑築roadcast鎸囦护鐨勫簲绛�
-				JSONObject json = new JSONObject();
-				XmlUtil.node2Json(rootElement, json);
-				if (logger.isDebugEnabled()) {
-					logger.debug(json.toJSONString());
-				}
-				RequestMessage msg = new RequestMessage();
-				msg.setKey(key);
-				msg.setData(json);
-				deferredResultHolder.invokeAllResult(msg);
-			} else {
-				// 姝ゅ鏄笂绾у彂鍑虹殑Broadcast鎸囦护
-			}
-		} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
-			e.printStackTrace();
-		}
-	}
-
-
-	/***
-	 * 鍥炲200 OK
-	 * @param evt
-	 * @throws SipException
-	 * @throws InvalidArgumentException
-	 * @throws ParseException
-	 */
-	private void responseAck(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
-		Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest());
-		ServerTransaction serverTransaction = getServerTransaction(evt);
-		serverTransaction.sendResponse(response);
-		if (serverTransaction.getDialog() != null) {
-			serverTransaction.getDialog().delete();
-		}
-	}
-
-	/***
-	 * 鍥炲404
-	 * @param evt
-	 * @throws SipException
-	 * @throws InvalidArgumentException
-	 * @throws ParseException
-	 */
-	private void response404Ack(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
-		Response response = getMessageFactory().createResponse(Response.NOT_FOUND, evt.getRequest());
-		ServerTransaction serverTransaction = getServerTransaction(evt);
-		serverTransaction.sendResponse(response);
-		if (serverTransaction.getDialog() != null) {
-			serverTransaction.getDialog().delete();
-		}
-	}
-
-	private Element getRootElement(RequestEvent evt) throws DocumentException {
-
-		return getRootElement(evt, "gb2312");
-	}
-
-	private Element getRootElement(RequestEvent evt, String charset) throws DocumentException {
-		if (charset == null) {
-			charset = "gb2312";
-		}
-		Request request = evt.getRequest();
-		SAXReader reader = new SAXReader();
-		reader.setEncoding(charset);
-		Document xml = reader.read(new ByteArrayInputStream(request.getRawContent()));
-		return xml.getRootElement();
-	}
-
-	public void setCmder(SIPCommander cmder) {
-		this.cmder = cmder;
-	}
-
-	public void setStorager(IVideoManagerStorager storager) {
-		this.storager = storager;
-	}
-
-	public void setPublisher(EventPublisher publisher) {
-		this.publisher = publisher;
-	}
-
-	public void setRedis(RedisUtil redis) {
-		this.redis = redis;
-	}
-
-	public void setDeferredResultHolder(DeferredResultHolder deferredResultHolder) {
-		this.deferredResultHolder = deferredResultHolder;
-	}
-
-	public void setOffLineDetector(DeviceOffLineDetector offLineDetector) {
-		this.offLineDetector = offLineDetector;
-	}
-
-	public IRedisCatchStorage getRedisCatchStorage() {
-		return redisCatchStorage;
-	}
-
-	public void setRedisCatchStorage(IRedisCatchStorage redisCatchStorage) {
-		this.redisCatchStorage = redisCatchStorage;
-	}
-
-	public SIPCommanderFroPlatform getCmderFroPlatform() {
-		return cmderFroPlatform;
-	}
-
-	public void setCmderFroPlatform(SIPCommanderFroPlatform cmderFroPlatform) {
-		this.cmderFroPlatform = cmderFroPlatform;
-	}
-
-	public void setDeviceAlarmService(IDeviceAlarmService deviceAlarmService) {
-		this.deviceAlarmService = deviceAlarmService;
-	}
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/NotifyRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/NotifyRequestProcessor.java
deleted file mode 100644
index 4c17769..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/NotifyRequestProcessor.java
+++ /dev/null
@@ -1,394 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
-
-import java.io.ByteArrayInputStream;
-import java.text.ParseException;
-import java.util.Iterator;
-
-import javax.sip.InvalidArgumentException;
-import javax.sip.RequestEvent;
-import javax.sip.ServerTransaction;
-import javax.sip.SipException;
-import javax.sip.message.Request;
-import javax.sip.message.Response;
-
-import com.genersoft.iot.vmp.common.VideoManagerConstants;
-import com.genersoft.iot.vmp.conf.UserSetup;
-import com.genersoft.iot.vmp.gb28181.bean.BaiduPoint;
-import com.genersoft.iot.vmp.gb28181.bean.Device;
-import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
-import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
-import com.genersoft.iot.vmp.gb28181.bean.MobilePosition;
-import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
-import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
-import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
-import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
-import com.genersoft.iot.vmp.gb28181.utils.NumericUtil;
-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.utils.GpsUtil;
-import com.genersoft.iot.vmp.utils.SpringBeanFactory;
-import com.genersoft.iot.vmp.utils.redis.RedisUtil;
-
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.util.StringUtils;
-
-/**
- * @Description: Notify璇锋眰澶勭悊鍣�
- * @author: lawrencehj
- * @date: 2021骞�1鏈�27鏃�
- */
-
-public class NotifyRequestProcessor extends SIPRequestAbstractProcessor {
-    
-	private UserSetup userSetup = (UserSetup) SpringBeanFactory.getBean("userSetup");
-
-    private final static Logger logger = LoggerFactory.getLogger(MessageRequestProcessor.class);
-
-	private IVideoManagerStorager storager;
-
-	private IRedisCatchStorage redisCatchStorage;
-
-	private EventPublisher publisher;
-
-	private DeviceOffLineDetector offLineDetector;
-
-	private static final String NOTIFY_CATALOG = "Catalog";
-	private static final String NOTIFY_ALARM = "Alarm";
-	private static final String NOTIFY_MOBILE_POSITION = "MobilePosition";
-
-	@Override
-	public void process(RequestEvent evt) {
-		try {
-			Element rootElement = getRootElement(evt);
-			String cmd = XmlUtil.getText(rootElement, "CmdType");
-
-			if (NOTIFY_CATALOG.equals(cmd)) {
-				logger.info("鎺ユ敹鍒癈atalog閫氱煡");
-				processNotifyCatalogList(evt);
-			} else if (NOTIFY_ALARM.equals(cmd)) {
-				logger.info("鎺ユ敹鍒癆larm閫氱煡");
-				processNotifyAlarm(evt);
-			} else if (NOTIFY_MOBILE_POSITION.equals(cmd)) {
-				logger.info("鎺ユ敹鍒癕obilePosition閫氱煡");
-				processNotifyMobilePosition(evt);
-			} else {
-				logger.info("鎺ユ敹鍒版秷鎭細" + cmd);
-				response200Ok(evt);
-			}
-		} catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * 澶勭悊MobilePosition绉诲姩浣嶇疆Notify
-	 * 
-	 * @param evt
-	 */
-	private void processNotifyMobilePosition(RequestEvent evt) {
-		try {
-			// 鍥炲 200 OK
-			Element rootElement = getRootElement(evt);
-			MobilePosition mobilePosition = new MobilePosition();
-			Element deviceIdElement = rootElement.element("DeviceID");
-			String deviceId = deviceIdElement.getTextTrim().toString();
-			Device device = storager.queryVideoDevice(deviceId);
-			if (device != null) {
-				if (!StringUtils.isEmpty(device.getName())) {
-					mobilePosition.setDeviceName(device.getName());
-				}
-			}
-			mobilePosition.setDeviceId(XmlUtil.getText(rootElement, "DeviceID"));
-			mobilePosition.setTime(XmlUtil.getText(rootElement, "Time"));
-			mobilePosition.setLongitude(Double.parseDouble(XmlUtil.getText(rootElement, "Longitude")));
-			mobilePosition.setLatitude(Double.parseDouble(XmlUtil.getText(rootElement, "Latitude")));
-			if (NumericUtil.isDouble(XmlUtil.getText(rootElement, "Speed"))) {
-				mobilePosition.setSpeed(Double.parseDouble(XmlUtil.getText(rootElement, "Speed")));
-			} else {
-				mobilePosition.setSpeed(0.0);
-			}
-			if (NumericUtil.isDouble(XmlUtil.getText(rootElement, "Direction"))) {
-				mobilePosition.setDirection(Double.parseDouble(XmlUtil.getText(rootElement, "Direction")));
-			} else {
-				mobilePosition.setDirection(0.0);
-			}
-			if (NumericUtil.isDouble(XmlUtil.getText(rootElement, "Altitude"))) {
-				mobilePosition.setAltitude(Double.parseDouble(XmlUtil.getText(rootElement, "Altitude")));
-			} else {
-				mobilePosition.setAltitude(0.0);
-			}
-			mobilePosition.setReportSource("Mobile Position");
-			BaiduPoint bp = new BaiduPoint();
-			bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude()));
-			logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat());
-			mobilePosition.setGeodeticSystem("BD-09");
-			mobilePosition.setCnLng(bp.getBdLng());
-			mobilePosition.setCnLat(bp.getBdLat());
-			if (!userSetup.getSavePositionHistory()) {
-				storager.clearMobilePositionsByDeviceId(deviceId);
-			}
-			storager.insertMobilePosition(mobilePosition);
-			response200Ok(evt);
-		} catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/***
-	 * 澶勭悊alarm璁惧鎶ヨNotify
-	 * 
-	 * @param evt
-	 */
-	private void processNotifyAlarm(RequestEvent evt) {
-		try {
-			Element rootElement = getRootElement(evt);
-			Element deviceIdElement = rootElement.element("DeviceID");
-			String deviceId = deviceIdElement.getText().toString();
-
-			Device device = storager.queryVideoDevice(deviceId);
-			if (device == null) {
-				return;
-			}
-			rootElement = getRootElement(evt, device.getCharset());
-			DeviceAlarm deviceAlarm = new DeviceAlarm();
-			deviceAlarm.setDeviceId(deviceId);
-			deviceAlarm.setAlarmPriority(XmlUtil.getText(rootElement, "AlarmPriority"));
-			deviceAlarm.setAlarmMethod(XmlUtil.getText(rootElement, "AlarmMethod"));
-			deviceAlarm.setAlarmTime(XmlUtil.getText(rootElement, "AlarmTime"));
-			if (XmlUtil.getText(rootElement, "AlarmDescription") == null) {
-				deviceAlarm.setAlarmDescription("");
-			} else {
-				deviceAlarm.setAlarmDescription(XmlUtil.getText(rootElement, "AlarmDescription"));
-			}
-			if (NumericUtil.isDouble(XmlUtil.getText(rootElement, "Longitude"))) {
-				deviceAlarm.setLongitude(Double.parseDouble(XmlUtil.getText(rootElement, "Longitude")));
-			} else {
-				deviceAlarm.setLongitude(0.00);
-			}
-			if (NumericUtil.isDouble(XmlUtil.getText(rootElement, "Latitude"))) {
-				deviceAlarm.setLatitude(Double.parseDouble(XmlUtil.getText(rootElement, "Latitude")));
-			} else {
-				deviceAlarm.setLatitude(0.00);
-			}
-
-			if (deviceAlarm.getAlarmMethod().equals("4")) {
-				MobilePosition mobilePosition = new MobilePosition();
-				mobilePosition.setDeviceId(deviceAlarm.getDeviceId());
-				mobilePosition.setTime(deviceAlarm.getAlarmTime());
-				mobilePosition.setLongitude(deviceAlarm.getLongitude());
-				mobilePosition.setLatitude(deviceAlarm.getLatitude());
-				mobilePosition.setReportSource("GPS Alarm");
-				BaiduPoint bp = new BaiduPoint();
-				bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude()));
-				logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat());
-				mobilePosition.setGeodeticSystem("BD-09");
-				mobilePosition.setCnLng(bp.getBdLng());
-				mobilePosition.setCnLat(bp.getBdLat());
-				if (!userSetup.getSavePositionHistory()) {
-					storager.clearMobilePositionsByDeviceId(deviceId);
-				}
-				storager.insertMobilePosition(mobilePosition);
-			}
-			// TODO: 闇�瑕佸疄鐜板瓨鍌ㄦ姤璀︿俊鎭�佹姤璀﹀垎绫�
-
-			// 鍥炲200 OK
-			response200Ok(evt);
-			if (offLineDetector.isOnline(deviceId)) {
-				publisher.deviceAlarmEventPublish(deviceAlarm);
-			}
-		} catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/***
-	 * 澶勭悊catalog璁惧鐩綍鍒楄〃Notify
-	 * 
-	 * @param evt
-	 */
-	private void processNotifyCatalogList(RequestEvent evt) {
-		try {
-			Element rootElement = getRootElement(evt);
-			Element deviceIdElement = rootElement.element("DeviceID");
-			String deviceId = deviceIdElement.getText();
-			Device device = storager.queryVideoDevice(deviceId);
-			if (device != null ) {
-				rootElement = getRootElement(evt, device.getCharset());
-			}
-			Element deviceListElement = rootElement.element("DeviceList");
-			if (deviceListElement == null) {
-				return;
-			}
-			Iterator<Element> deviceListIterator = deviceListElement.elementIterator();
-			if (deviceListIterator != null) {
-				if (device == null) {
-					return;
-				}
-				// 閬嶅巻DeviceList
-				while (deviceListIterator.hasNext()) {
-					Element itemDevice = deviceListIterator.next();
-					Element channelDeviceElement = itemDevice.element("DeviceID");
-					if (channelDeviceElement == null) {
-						continue;
-					}
-					String channelDeviceId = channelDeviceElement.getTextTrim();
-					Element channdelNameElement = itemDevice.element("Name");
-					String channelName = channdelNameElement != null ? channdelNameElement.getTextTrim().toString() : "";
-					Element statusElement = itemDevice.element("Status");
-					String status = statusElement != null ? statusElement.getTextTrim().toString() : "ON";
-					DeviceChannel deviceChannel = new DeviceChannel();
-					deviceChannel.setName(channelName);
-					deviceChannel.setChannelId(channelDeviceId);
-					// ONLINE OFFLINE HIKVISION DS-7716N-E4 NVR鐨勫吋瀹规�у鐞�
-					if (status.equals("ON") || status.equals("On") || status.equals("ONLINE")) {
-						deviceChannel.setStatus(1);
-					}
-					if (status.equals("OFF") || status.equals("Off") || status.equals("OFFLINE")) {
-						deviceChannel.setStatus(0);
-					}
-
-					deviceChannel.setManufacture(XmlUtil.getText(itemDevice, "Manufacturer"));
-					deviceChannel.setModel(XmlUtil.getText(itemDevice, "Model"));
-					deviceChannel.setOwner(XmlUtil.getText(itemDevice, "Owner"));
-					deviceChannel.setCivilCode(XmlUtil.getText(itemDevice, "CivilCode"));
-					deviceChannel.setBlock(XmlUtil.getText(itemDevice, "Block"));
-					deviceChannel.setAddress(XmlUtil.getText(itemDevice, "Address"));
-					if (XmlUtil.getText(itemDevice, "Parental") == null
-							|| XmlUtil.getText(itemDevice, "Parental") == "") {
-						deviceChannel.setParental(0);
-					} else {
-						deviceChannel.setParental(Integer.parseInt(XmlUtil.getText(itemDevice, "Parental")));
-					}
-					deviceChannel.setParentId(XmlUtil.getText(itemDevice, "ParentID"));
-					if (XmlUtil.getText(itemDevice, "SafetyWay") == null
-							|| XmlUtil.getText(itemDevice, "SafetyWay") == "") {
-						deviceChannel.setSafetyWay(0);
-					} else {
-						deviceChannel.setSafetyWay(Integer.parseInt(XmlUtil.getText(itemDevice, "SafetyWay")));
-					}
-					if (XmlUtil.getText(itemDevice, "RegisterWay") == null
-							|| XmlUtil.getText(itemDevice, "RegisterWay") == "") {
-						deviceChannel.setRegisterWay(1);
-					} else {
-						deviceChannel.setRegisterWay(Integer.parseInt(XmlUtil.getText(itemDevice, "RegisterWay")));
-					}
-					deviceChannel.setCertNum(XmlUtil.getText(itemDevice, "CertNum"));
-					if (XmlUtil.getText(itemDevice, "Certifiable") == null
-							|| XmlUtil.getText(itemDevice, "Certifiable") == "") {
-						deviceChannel.setCertifiable(0);
-					} else {
-						deviceChannel.setCertifiable(Integer.parseInt(XmlUtil.getText(itemDevice, "Certifiable")));
-					}
-					if (XmlUtil.getText(itemDevice, "ErrCode") == null
-							|| XmlUtil.getText(itemDevice, "ErrCode") == "") {
-						deviceChannel.setErrCode(0);
-					} else {
-						deviceChannel.setErrCode(Integer.parseInt(XmlUtil.getText(itemDevice, "ErrCode")));
-					}
-					deviceChannel.setEndTime(XmlUtil.getText(itemDevice, "EndTime"));
-					deviceChannel.setSecrecy(XmlUtil.getText(itemDevice, "Secrecy"));
-					deviceChannel.setIpAddress(XmlUtil.getText(itemDevice, "IPAddress"));
-					if (XmlUtil.getText(itemDevice, "Port") == null || XmlUtil.getText(itemDevice, "Port") == "") {
-						deviceChannel.setPort(0);
-					} else {
-						deviceChannel.setPort(Integer.parseInt(XmlUtil.getText(itemDevice, "Port")));
-					}
-					deviceChannel.setPassword(XmlUtil.getText(itemDevice, "Password"));
-					if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Longitude"))) {
-						deviceChannel.setLongitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Longitude")));
-					} else {
-						deviceChannel.setLongitude(0.00);
-					}
-					if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Latitude"))) {
-						deviceChannel.setLatitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Latitude")));
-					} else {
-						deviceChannel.setLatitude(0.00);
-					}
-					if (XmlUtil.getText(itemDevice, "PTZType") == null
-							|| XmlUtil.getText(itemDevice, "PTZType") == "") {
-						deviceChannel.setPTZType(0);
-					} else {
-						deviceChannel.setPTZType(Integer.parseInt(XmlUtil.getText(itemDevice, "PTZType")));
-					}
-					deviceChannel.setHasAudio(true); // 榛樿鍚湁闊抽锛屾挱鏀炬椂鍐嶆鏌ユ槸鍚︽湁闊抽鍙婃槸鍚AC
-					storager.updateChannel(device.getDeviceId(), deviceChannel);
-				}
-
-				// RequestMessage msg = new RequestMessage();
-				// msg.setDeviceId(deviceId);
-				// msg.setType(DeferredResultHolder.CALLBACK_CMD_CATALOG);
-				// msg.setData(device);
-				// deferredResultHolder.invokeResult(msg);
-				// 鍥炲200 OK
-				response200Ok(evt);
-				if (offLineDetector.isOnline(deviceId)) {
-					publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE);
-				}
-			}
-		} catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/***
-	 * 鍥炲200 OK
-	 * 
-	 * @param evt
-	 * @throws SipException
-	 * @throws InvalidArgumentException
-	 * @throws ParseException
-	 */
-	private void response200Ok(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
-		Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest());
-		ServerTransaction serverTransaction = getServerTransaction(evt);
-		serverTransaction.sendResponse(response);
-		if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
-	}
-	private Element getRootElement(RequestEvent evt) throws DocumentException {
-		return getRootElement(evt, "gb2312");
-	}
-	private Element getRootElement(RequestEvent evt, String charset) throws DocumentException {
-		if (charset == null) charset = "gb2312";
-		Request request = evt.getRequest();
-		SAXReader reader = new SAXReader();
-		reader.setEncoding(charset);
-		Document xml = reader.read(new ByteArrayInputStream(request.getRawContent()));
-		return xml.getRootElement();
-	}
-
-	public void setCmder(SIPCommander cmder) {
-	}
-
-	public void setStorager(IVideoManagerStorager storager) {
-		this.storager = storager;
-	}
-
-	public void setPublisher(EventPublisher publisher) {
-		this.publisher = publisher;
-	}
-
-	public void setRedis(RedisUtil redis) {
-	}
-
-	public void setDeferredResultHolder(DeferredResultHolder deferredResultHolder) {
-	}
-
-	public void setOffLineDetector(DeviceOffLineDetector offLineDetector) {
-		this.offLineDetector = offLineDetector;
-	}
-
-	public IRedisCatchStorage getRedisCatchStorage() {
-		return redisCatchStorage;
-	}
-
-	public void setRedisCatchStorage(IRedisCatchStorage redisCatchStorage) {
-		this.redisCatchStorage = redisCatchStorage;
-	}
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/OtherRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/OtherRequestProcessor.java
deleted file mode 100644
index 65ed0c4..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/OtherRequestProcessor.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
-
-import javax.sip.RequestEvent;
-
-import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**    
- * @Description:鏆備笉鏀寔鐨勬秷鎭姹傚鐞嗗櫒
- * @author: swwheihei
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:32:59     
- */
-public class OtherRequestProcessor extends SIPRequestAbstractProcessor {
-
-	private Logger logger = LoggerFactory.getLogger(OtherRequestProcessor.class);
-
-	/**   
-	 * <p>Title: process</p>   
-	 * <p>Description: </p>   
-	 * @param evt
-	 * @param layer
-	 * @param transaction
-	 * @param config    
-	 */  
-	@Override
-	public void process(RequestEvent evt) {
-		logger.info("Unsupported the method: " + evt.getRequest().getMethod());
-	}
-
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java
deleted file mode 100644
index c70988a..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java
+++ /dev/null
@@ -1,201 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
-
-import java.security.NoSuchAlgorithmException;
-import java.text.ParseException;
-import java.util.Calendar;
-import java.util.Locale;
-
-import javax.sip.InvalidArgumentException;
-import javax.sip.RequestEvent;
-import javax.sip.ServerTransaction;
-import javax.sip.SipException;
-import javax.sip.header.AuthorizationHeader;
-import javax.sip.header.ContactHeader;
-import javax.sip.header.ExpiresHeader;
-import javax.sip.header.FromHeader;
-import javax.sip.header.ViaHeader;
-import javax.sip.message.Request;
-import javax.sip.message.Response;
-
-import com.genersoft.iot.vmp.gb28181.bean.WvpSipDate;
-import gov.nist.javax.sip.RequestEventExt;
-import gov.nist.javax.sip.header.SIPDateHeader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.util.StringUtils;
-
-import com.genersoft.iot.vmp.common.VideoManagerConstants;
-import com.genersoft.iot.vmp.conf.SipConfig;
-import com.genersoft.iot.vmp.gb28181.auth.DigestServerAuthenticationHelper;
-import com.genersoft.iot.vmp.gb28181.auth.RegisterLogicHandler;
-import com.genersoft.iot.vmp.gb28181.bean.Device;
-import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
-import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
-import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
-
-import gov.nist.javax.sip.address.AddressImpl;
-import gov.nist.javax.sip.address.SipUri;
-import gov.nist.javax.sip.header.Expires;
-
-/**    
- * @Description:鏀跺埌娉ㄥ唽璇锋眰 澶勭悊 
- * @author: swwheihei
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍4:47:25     
- */
-public class RegisterRequestProcessor extends SIPRequestAbstractProcessor {
-
-	private Logger logger = LoggerFactory.getLogger(RegisterRequestProcessor.class);
-
-	private SipConfig sipConfig;
-	
-	private RegisterLogicHandler handler;
-	
-	private IVideoManagerStorager storager;
-	
-	private EventPublisher publisher;
-
-	/**
-	 * 鏀跺埌娉ㄥ唽璇锋眰 澶勭悊
- 	 * @param evt
-	 */
-	@Override
-	public void process(RequestEvent evt) {
-		try {
-			RequestEventExt evtExt = (RequestEventExt)evt;
-			String requestAddress = evtExt.getRemoteIpAddress() + ":" + evtExt.getRemotePort();
-			logger.info("[{}] 鏀跺埌娉ㄥ唽璇锋眰锛屽紑濮嬪鐞�", requestAddress);
-			Request request = evt.getRequest();
-
-			Response response = null; 
-			boolean passwordCorrect = false;
-			// 娉ㄥ唽鏍囧織  0锛氭湭鎼哄甫鎺堟潈澶存垨鑰呭瘑鐮侀敊璇�  1锛氭敞鍐屾垚鍔�   2锛氭敞閿�鎴愬姛
-			int registerFlag = 0;
-			FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME);
-			AddressImpl address = (AddressImpl) fromHeader.getAddress();
-			SipUri uri = (SipUri) address.getURI();
-			String deviceId = uri.getUser();
-			Device device = storager.queryVideoDevice(deviceId);
-			AuthorizationHeader authorhead = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); 
-			// 鏍¢獙瀵嗙爜鏄惁姝g‘
-			if (authorhead != null) {
-				passwordCorrect = new DigestServerAuthenticationHelper().doAuthenticatePlainTextPassword(request,
-						sipConfig.getPassword());
-			}
-			if (StringUtils.isEmpty(sipConfig.getPassword())){
-				passwordCorrect = true;
-			}
-
-			// 鏈惡甯︽巿鏉冨ご鎴栬�呭瘑鐮侀敊璇� 鍥炲401
-			if (authorhead == null ) {
-
-				logger.info("[{}] 鏈惡甯︽巿鏉冨ご 鍥炲401", requestAddress);
-				response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request);
-				new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain());
-			}else {
-				if (!passwordCorrect){
-					// 娉ㄥ唽澶辫触
-					response = getMessageFactory().createResponse(Response.FORBIDDEN, request);
-					response.setReasonPhrase("wrong password");
-					logger.info("[{}] 瀵嗙爜/SIP鏈嶅姟鍣↖D閿欒, 鍥炲403", requestAddress);
-				}else {
-					// 鎼哄甫鎺堟潈澶村苟涓斿瘑鐮佹纭�
-					response = getMessageFactory().createResponse(Response.OK, request);
-					// 娣诲姞date澶�
-					SIPDateHeader dateHeader = new SIPDateHeader();
-					// 浣跨敤鑷繁淇敼鐨�
-					WvpSipDate wvpSipDate = new WvpSipDate(Calendar.getInstance(Locale.ENGLISH).getTimeInMillis());
-					dateHeader.setDate(wvpSipDate);
-					response.addHeader(dateHeader);
-
-					ExpiresHeader expiresHeader = (ExpiresHeader) request.getHeader(Expires.NAME);
-					if (expiresHeader == null) {
-						response = getMessageFactory().createResponse(Response.BAD_REQUEST, request);
-						ServerTransaction serverTransaction = getServerTransaction(evt);
-						serverTransaction.sendResponse(response);
-						if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
-						return;
-					}
-					// 娣诲姞Contact澶�
-					response.addHeader(request.getHeader(ContactHeader.NAME));
-					// 娣诲姞Expires澶�
-					response.addHeader(request.getExpires());
-
-					// 鑾峰彇鍒伴�氫俊鍦板潃绛変俊鎭�
-					ViaHeader viaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME);
-					String received = viaHeader.getReceived();
-					int rPort = viaHeader.getRPort();
-					// 瑙f瀽鏈湴鍦板潃鏇夸唬
-					if (StringUtils.isEmpty(received) || rPort == -1) {
-						received = viaHeader.getHost();
-						rPort = viaHeader.getPort();
-					}
-					//
-
-					if (device == null) {
-						device = new Device();
-						device.setStreamMode("UDP");
-						device.setCharset("gb2312");
-						device.setDeviceId(deviceId);
-						device.setFirsRegister(true);
-					}
-					device.setIp(received);
-					device.setPort(rPort);
-					device.setHostAddress(received.concat(":").concat(String.valueOf(rPort)));
-					// 娉ㄩ攢鎴愬姛
-					if (expiresHeader.getExpires() == 0) {
-						registerFlag = 2;
-					}
-					// 娉ㄥ唽鎴愬姛
-					else {
-						device.setExpires(expiresHeader.getExpires());
-						registerFlag = 1;
-						// 鍒ゆ柇TCP杩樻槸UDP
-						boolean isTcp = false;
-						ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME);
-						String transport = reqViaHeader.getTransport();
-						if (transport.equals("TCP")) {
-							isTcp = true;
-						}
-						device.setTransport(isTcp ? "TCP" : "UDP");
-					}
-				}
-			}
-
-			ServerTransaction serverTransaction = getServerTransaction(evt);
-			serverTransaction.sendResponse(response);
-			if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
-			// 娉ㄥ唽鎴愬姛
-			// 淇濆瓨鍒皉edis
-			// 涓嬪彂catelog鏌ヨ鐩綍
-			if (registerFlag == 1 ) {
-				logger.info("[{}] 娉ㄥ唽鎴愬姛! deviceId:" + device.getDeviceId(), requestAddress);
-				publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_REGISTER);
-				// 閲嶆柊娉ㄥ唽鏇存柊璁惧鍜岄�氶亾锛屼互鍏嶈澶囨浛鎹㈡垨鏇存柊鍚庝俊鎭棤娉曟洿鏂�
-				handler.onRegister(device);
-			} else if (registerFlag == 2) {
-				logger.info("[{}] 娉ㄩ攢鎴愬姛! deviceId:" + device.getDeviceId(), requestAddress);
-				publisher.outlineEventPublish(device.getDeviceId(), VideoManagerConstants.EVENT_OUTLINE_UNREGISTER);
-			}
-		} catch (SipException | InvalidArgumentException | NoSuchAlgorithmException | ParseException e) {
-			e.printStackTrace();
-		}
-		
-	}
-	
-	public void setSipConfig(SipConfig sipConfig) {
-		this.sipConfig = sipConfig;
-	}
-
-	public void setHandler(RegisterLogicHandler handler) {
-		this.handler = handler;
-	}
-
-	public void setVideoManagerStorager(IVideoManagerStorager storager) {
-		this.storager = storager;
-	}
-
-	public void setPublisher(EventPublisher publisher) {
-		this.publisher = publisher;
-	}
-
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/SubscribeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/SubscribeRequestProcessor.java
deleted file mode 100644
index 6d61763..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/SubscribeRequestProcessor.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
-
-import java.text.ParseException;
-
-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 com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**    
- * @Description:SUBSCRIBE璇锋眰澶勭悊鍣�
- * @author: swwheihei
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:31:20     
- */
-public class SubscribeRequestProcessor extends SIPRequestAbstractProcessor {
-
-	private Logger logger = LoggerFactory.getLogger(SubscribeRequestProcessor.class);
-
-	/**   
-	 * 澶勭悊SUBSCRIBE璇锋眰  
-	 * 
-	 * @param evt
-	 */
-	@Override
-	public void process(RequestEvent evt) {
-		Request request = evt.getRequest();
-
-		try {
-			Response response = null;
-			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.");
-			}
-
-		} catch (ParseException e) {
-			e.printStackTrace();
-		} catch (SipException e) {
-			e.printStackTrace();
-		} catch (InvalidArgumentException e) {
-			e.printStackTrace();
-		}
-		
-	}
-
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/ISIPResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/ISIPResponseProcessor.java
deleted file mode 100644
index fee80eb..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/ISIPResponseProcessor.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.response;
-
-import java.text.ParseException;
-
-import javax.sip.ResponseEvent;
-
-import com.genersoft.iot.vmp.conf.SipConfig;
-import com.genersoft.iot.vmp.gb28181.SipLayer;
-
-/**    
- * @Description:澶勭悊鎺ユ敹IPCamera鍙戞潵鐨凷IP鍗忚鍝嶅簲娑堟伅
- * @author: swwheihei
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍4:42:22     
- */
-public interface ISIPResponseProcessor {
-
-	public void process(ResponseEvent evt, SipLayer layer, SipConfig config) throws ParseException;
-
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/ByeResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/ByeResponseProcessor.java
deleted file mode 100644
index c35431c..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/ByeResponseProcessor.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.response.impl;
-
-import javax.sip.ResponseEvent;
-
-import org.springframework.stereotype.Component;
-
-import com.genersoft.iot.vmp.conf.SipConfig;
-import com.genersoft.iot.vmp.gb28181.SipLayer;
-import com.genersoft.iot.vmp.gb28181.transmit.response.ISIPResponseProcessor;
-
-/**    
- * @Description: BYE璇锋眰鍝嶅簲鍣�
- * @author: swwheihei
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:32:05     
- */
-@Component
-public class ByeResponseProcessor implements ISIPResponseProcessor {
-
-	/**   
-	 * 澶勭悊BYE鍝嶅簲
-	 * 
-	 * @param evt
-	 * @param layer
-	 * @param config    
-	 */  
-	@Override
-	public void process(ResponseEvent evt, SipLayer layer, SipConfig config) {
-		// TODO Auto-generated method stub
-	}
-
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/CancelResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/CancelResponseProcessor.java
deleted file mode 100644
index c6fd9b3..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/CancelResponseProcessor.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.response.impl;
-
-import javax.sip.ResponseEvent;
-
-import org.springframework.stereotype.Component;
-
-import com.genersoft.iot.vmp.conf.SipConfig;
-import com.genersoft.iot.vmp.gb28181.SipLayer;
-import com.genersoft.iot.vmp.gb28181.transmit.response.ISIPResponseProcessor;
-
-/**    
- * @Description:CANCEL鍝嶅簲澶勭悊鍣�
- * @author: swwheihei
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:32:23     
- */
-@Component
-public class CancelResponseProcessor implements ISIPResponseProcessor {
-
-	/**   
-	 * 澶勭悊CANCEL鍝嶅簲
-	 *  
-	 * @param evt
-	 * @param layer
-	 * @param transaction
-	 * @param config    
-	 */  
-	@Override
-	public void process(ResponseEvent evt, SipLayer layer, SipConfig config) {
-		// TODO Auto-generated method stub
-		
-	}
-
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/InviteResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/InviteResponseProcessor.java
deleted file mode 100644
index c807c04..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/InviteResponseProcessor.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.response.impl;
-
-import java.text.ParseException;
-
-import javax.sip.*;
-import javax.sip.address.SipURI;
-import javax.sip.header.CSeqHeader;
-import javax.sip.message.Request;
-import javax.sip.message.Response;
-
-import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
-import gov.nist.javax.sip.ResponseEventExt;
-import gov.nist.javax.sip.stack.SIPDialog;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import com.genersoft.iot.vmp.conf.SipConfig;
-import com.genersoft.iot.vmp.gb28181.SipLayer;
-import com.genersoft.iot.vmp.gb28181.transmit.response.ISIPResponseProcessor;
-
-
-/**
- * @Description:澶勭悊INVITE鍝嶅簲
- * @author: swwheihei
- * @date: 2020骞�5鏈�3鏃� 涓嬪崍4:43:52
- */
-@Component
-public class InviteResponseProcessor implements ISIPResponseProcessor {
-
-	 private final static Logger logger = LoggerFactory.getLogger(InviteResponseProcessor.class);
-
-	@Autowired
-	private VideoStreamSessionManager streamSession;
-
-	/**
-	 * 澶勭悊invite鍝嶅簲
-	 * 
-	 * @param evt 鍝嶅簲娑堟伅
-	 * @throws ParseException
-	 */
-	@Override
-	public void process(ResponseEvent evt, SipLayer layer, SipConfig config) throws ParseException {
-		try {
-			Response response = evt.getResponse();
-			int statusCode = response.getStatusCode();
-			// trying涓嶄細鍥炲
-			if (statusCode == Response.TRYING) {
-			}
-			// 鎴愬姛鍝嶅簲
-			// 涓嬪彂ack
-			if (statusCode == Response.OK) {
-				ResponseEventExt event = (ResponseEventExt)evt;
-				SIPDialog dialog = (SIPDialog)evt.getDialog();
-				CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
-				Request reqAck = dialog.createAck(cseq.getSeqNumber());
-				SipURI requestURI = (SipURI) reqAck.getRequestURI();
-				requestURI.setHost(event.getRemoteIpAddress());
-				requestURI.setPort(event.getRemotePort());
-				reqAck.setRequestURI(requestURI);
-				logger.info("鍚� " + event.getRemoteIpAddress() + ":" + event.getRemotePort() + "鍥炲ack");
-				SipURI sipURI = (SipURI)dialog.getRemoteParty().getURI();
-				String deviceId = requestURI.getUser();
-				String channelId = sipURI.getUser();
-
-				dialog.sendAck(reqAck);
-
-			}
-		} catch (InvalidArgumentException | SipException e) {
-			e.printStackTrace();
-		}
-	}
-
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/OtherResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/OtherResponseProcessor.java
deleted file mode 100644
index 1631440..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/OtherResponseProcessor.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.response.impl;
-
-import javax.sip.ResponseEvent;
-
-import org.springframework.stereotype.Component;
-
-import com.genersoft.iot.vmp.conf.SipConfig;
-import com.genersoft.iot.vmp.gb28181.SipLayer;
-import com.genersoft.iot.vmp.gb28181.transmit.response.ISIPResponseProcessor;
-
-/**    
- * @Description:鏆備笉鏀寔鐨勬秷鎭搷搴斿鐞嗗櫒
- * @author: swwheihei
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:32:59     
- */
-@Component
-public class OtherResponseProcessor implements ISIPResponseProcessor {
-
-	/**   
-	 * <p>Title: process</p>   
-	 * <p>Description: </p>   
-	 * @param evt
-	 * @param layer
-	 * @param config    
-	 */  
-	@Override
-	public void process(ResponseEvent evt, SipLayer layer, SipConfig config) {
-		// TODO Auto-generated method stub
-		
-	}
-
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/RegisterResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/RegisterResponseProcessor.java
deleted file mode 100644
index f8a59bb..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/RegisterResponseProcessor.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.transmit.response.impl;
-
-import com.genersoft.iot.vmp.conf.SipConfig;
-import com.genersoft.iot.vmp.gb28181.SipLayer;
-import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
-import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
-import com.genersoft.iot.vmp.gb28181.transmit.response.ISIPResponseProcessor;
-import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
-import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import javax.sip.ResponseEvent;
-import javax.sip.header.CallIdHeader;
-import javax.sip.header.WWWAuthenticateHeader;
-import javax.sip.message.Response;
-
-/**    
- * @Description:Register鍝嶅簲澶勭悊鍣�
- * @author: swwheihei
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:32:23     
- */
-@Component
-public class RegisterResponseProcessor implements ISIPResponseProcessor {
-
-	private Logger logger = LoggerFactory.getLogger(RegisterResponseProcessor.class);
-
-	@Autowired
-	private ISIPCommanderForPlatform sipCommanderForPlatform;
-
-	@Autowired
-	private IVideoManagerStorager storager;
-
-	@Autowired
-	private IRedisCatchStorage redisCatchStorage;
-
-	public RegisterResponseProcessor() {
-	}
-
-	/**
-	 * 澶勭悊Register鍝嶅簲
-	 *
- 	 * @param evt
-	 * @param layer
-	 * @param config
-	 */
-	@Override
-	public void process(ResponseEvent evt, SipLayer layer, SipConfig config) {
-		Response response = evt.getResponse();
-		CallIdHeader callIdHeader = (CallIdHeader) response.getHeader(CallIdHeader.NAME);
-		String callId = callIdHeader.getCallId();
-
-		String platformGBId = redisCatchStorage.queryPlatformRegisterInfo(callId);
-		if (platformGBId == null) {
-			logger.info(String.format("鏈壘鍒癱allId锛� %s 鐨勬敞鍐�/娉ㄩ攢骞冲彴id", callId ));
-			return;
-		}
-
-		ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(platformGBId);
-		if (parentPlatformCatch == null) {
-			logger.warn(String.format("鏀跺埌 %s 鐨勬敞鍐�/娉ㄩ攢%S璇锋眰, 浣嗘槸骞冲彴缂撳瓨淇℃伅鏈煡璇㈠埌!!!", platformGBId, response.getStatusCode()));
-			return;
-		}
-		String action = parentPlatformCatch.getParentPlatform().getExpires().equals("0") ? "娉ㄩ攢" : "娉ㄥ唽";
-		logger.info(String.format("鏀跺埌 %s %s鐨�%S鍝嶅簲", platformGBId, action, response.getStatusCode() ));
-		ParentPlatform parentPlatform = parentPlatformCatch.getParentPlatform();
-		if (parentPlatform == null) {
-			logger.warn(String.format("鏀跺埌 %s %s鐨�%S璇锋眰, 浣嗘槸骞冲彴淇℃伅鏈煡璇㈠埌!!!", platformGBId, action, response.getStatusCode()));
-			return;
-		}
-
-		if (response.getStatusCode() == 401) {
-			WWWAuthenticateHeader www = (WWWAuthenticateHeader)response.getHeader(WWWAuthenticateHeader.NAME);
-			sipCommanderForPlatform.register(parentPlatform, callId, www, null, null);
-		}else if (response.getStatusCode() == 200){
-			// 娉ㄥ唽/娉ㄩ攢鎴愬姛
-			logger.info(String.format("%s %s鎴愬姛", platformGBId, action));
-			redisCatchStorage.delPlatformRegisterInfo(callId);
-			parentPlatform.setStatus("娉ㄥ唽".equals(action));
-			// 鍙栧洖Expires璁剧疆锛岄伩鍏嶆敞閿�杩囩▼涓缃负0
-			ParentPlatform parentPlatformTmp = storager.queryParentPlatByServerGBId(platformGBId);
-			String expires = parentPlatformTmp.getExpires();
-			parentPlatform.setExpires(expires);
-			parentPlatform.setId(parentPlatformTmp.getId());
-			storager.updateParentPlatformStatus(platformGBId, "娉ㄥ唽".equals(action));
-
-			redisCatchStorage.updatePlatformRegister(parentPlatform);
-
-			redisCatchStorage.updatePlatformKeepalive(parentPlatform);
-
-			parentPlatformCatch.setParentPlatform(parentPlatform);
-
-			redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch);
-		}
-	}
-
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/DateUtil.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/DateUtil.java
index 195b7e3..604c083 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/DateUtil.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/DateUtil.java
@@ -6,7 +6,7 @@
 import java.util.Locale;
 
 /**    
- * @Description:鏃堕棿宸ュ叿绫伙紝涓昏澶勭悊ISO 8601鏍煎紡杞崲
+ * @description:鏃堕棿宸ュ叿绫伙紝涓昏澶勭悊ISO 8601鏍煎紡杞崲
  * @author: swwheihei
  * @date:   2020骞�5鏈�8鏃� 涓嬪崍3:24:42     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/utils/SipUtils.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java
similarity index 72%
rename from src/main/java/com/genersoft/iot/vmp/utils/SipUtils.java
rename to src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java
index b889be2..9dd0271 100644
--- a/src/main/java/com/genersoft/iot/vmp/utils/SipUtils.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java
@@ -1,4 +1,4 @@
-package com.genersoft.iot.vmp.utils;
+package com.genersoft.iot.vmp.gb28181.utils;
 
 import gov.nist.javax.sip.address.AddressImpl;
 import gov.nist.javax.sip.address.SipUri;
@@ -9,15 +9,20 @@
 /**
  * @author panlinlin
  * @version 1.0.0
- * @Description JAIN SIP鐨勫伐鍏风被
+ * @description JAIN SIP鐨勫伐鍏风被
  * @createTime 2021骞�09鏈�27鏃� 15:12:00
  */
 public class SipUtils {
 
     public static String getUserIdFromFromHeader(Request request) {
         FromHeader fromHeader = (FromHeader)request.getHeader(FromHeader.NAME);
+        return getUserIdFromFromHeader(fromHeader);
+    }
+
+    public static String getUserIdFromFromHeader(FromHeader fromHeader) {
         AddressImpl address = (AddressImpl)fromHeader.getAddress();
         SipUri uri = (SipUri) address.getURI();
         return uri.getUser();
     }
+
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
index 4220d81..079a78b 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
@@ -1,15 +1,7 @@
 package com.genersoft.iot.vmp.gb28181.utils;
 
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-
 import org.dom4j.Attribute;
 import org.dom4j.Document;
 import org.dom4j.DocumentException;
@@ -18,6 +10,12 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.util.StringUtils;
+
+import javax.sip.RequestEvent;
+import javax.sip.message.Request;
+import java.io.ByteArrayInputStream;
+import java.io.StringReader;
+import java.util.*;
 
 /**
  * 鍩轰簬dom4j鐨勫伐鍏峰寘
@@ -161,4 +159,23 @@
             }
         }
     }
+    public static  Element getRootElement(RequestEvent evt) throws DocumentException {
+
+        return getRootElement(evt, "gb2312");
+    }
+
+    public static Element getRootElement(RequestEvent evt, String charset) throws DocumentException {
+        Request request = evt.getRequest();
+        return getRootElement(request.getRawContent(), charset);
+    }
+
+    public static Element getRootElement(byte[] content, String charset) throws DocumentException {
+        if (charset == null) {
+            charset = "gb2312";
+        }
+        SAXReader reader = new SAXReader();
+        reader.setEncoding(charset);
+        Document xml = reader.read(new ByteArrayInputStream(content));
+        return xml.getRootElement();
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
index 0de3cb8..f74dcfa 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -31,7 +31,7 @@
 import javax.servlet.http.HttpServletRequest;
 
 /**    
- * @Description:閽堝 ZLMediaServer鐨刪ook浜嬩欢鐩戝惉
+ * @description:閽堝 ZLMediaServer鐨刪ook浜嬩欢鐩戝惉
  * @author: swwheihei
  * @date:   2020骞�5鏈�8鏃� 涓婂崍10:46:48     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java
index be69df1..c47c394 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java
@@ -8,7 +8,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * @Description:閽堝 ZLMediaServer鐨刪ook浜嬩欢璁㈤槄
+ * @description:閽堝 ZLMediaServer鐨刪ook浜嬩欢璁㈤槄
  * @author: pan
  * @date:   2020骞�12鏈�2鏃� 21:17:32
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
index 266c945..28a52a3 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
@@ -10,7 +10,7 @@
 import com.github.pagehelper.PageInfo;
 
 /**    
- * @Description:瑙嗛璁惧鏁版嵁瀛樺偍鎺ュ彛
+ * @description:瑙嗛璁惧鏁版嵁瀛樺偍鎺ュ彛
  * @author: swwheihei
  * @date:   2020骞�5鏈�6鏃� 涓嬪崍2:14:31     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
index 89c1d6c..990f4e5 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
@@ -25,7 +25,7 @@
 import org.springframework.transaction.annotation.Transactional;
 
 /**    
- * @Description:瑙嗛璁惧鏁版嵁瀛樺偍-jdbc瀹炵幇
+ * @description:瑙嗛璁惧鏁版嵁瀛樺偍-jdbc瀹炵幇
  * @author: swwheihei
  * @date:   2020骞�5鏈�6鏃� 涓嬪崍2:31:42
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/utils/SpringBeanFactory.java b/src/main/java/com/genersoft/iot/vmp/utils/SpringBeanFactory.java
index ccbe94d..3d2b2ba 100644
--- a/src/main/java/com/genersoft/iot/vmp/utils/SpringBeanFactory.java
+++ b/src/main/java/com/genersoft/iot/vmp/utils/SpringBeanFactory.java
@@ -6,7 +6,7 @@
 import org.springframework.stereotype.Component;
 
 /**    
- * @Description:spring bean鑾峰彇宸ュ巶锛岃幏鍙杝pring涓殑宸插垵濮嬪寲鐨刡ean
+ * @description:spring bean鑾峰彇宸ュ巶锛岃幏鍙杝pring涓殑宸插垵濮嬪寲鐨刡ean
  * @author: swwheihei
  * @date:   2019骞�6鏈�25鏃� 涓嬪崍4:51:52   
  * 
diff --git a/src/main/java/com/genersoft/iot/vmp/utils/redis/FastJsonRedisSerializer.java b/src/main/java/com/genersoft/iot/vmp/utils/redis/FastJsonRedisSerializer.java
index 411f962..05d7f81 100644
--- a/src/main/java/com/genersoft/iot/vmp/utils/redis/FastJsonRedisSerializer.java
+++ b/src/main/java/com/genersoft/iot/vmp/utils/redis/FastJsonRedisSerializer.java
@@ -9,7 +9,7 @@
 import com.alibaba.fastjson.serializer.SerializerFeature;
 
 /**    
- * @Description:浣跨敤fastjson瀹炵幇redis鐨勫簭鍒楀寲   
+ * @description:浣跨敤fastjson瀹炵幇redis鐨勫簭鍒楀寲   
  * @author: swwheihei
  * @date:   2020骞�5鏈�6鏃� 涓嬪崍8:40:11     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/utils/redis/JedisUtil.java b/src/main/java/com/genersoft/iot/vmp/utils/redis/JedisUtil.java
index 54e5422..1fb1d17 100644
--- a/src/main/java/com/genersoft/iot/vmp/utils/redis/JedisUtil.java
+++ b/src/main/java/com/genersoft/iot/vmp/utils/redis/JedisUtil.java
@@ -8,7 +8,7 @@
 import java.util.Set;
 
 /**
- * @Description:Jedis宸ュ叿绫�
+ * @description:Jedis宸ュ叿绫�
  * @author: wangshaopeng@sunnybs.com
  * @date: 2021骞�03鏈�22鏃� 涓嬪崍8:27:29
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java b/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java
index dd5614f..35da678 100644
--- a/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java
+++ b/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java
@@ -9,7 +9,7 @@
 import org.springframework.util.CollectionUtils;
 
 /**    
- * @Description:Redis宸ュ叿绫�
+ * @description:Redis宸ュ叿绫�
  * @author: swwheihei
  * @date:   2020骞�5鏈�6鏃� 涓嬪崍8:27:29     
  */
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
index c750821..729eca2 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
@@ -1,11 +1,21 @@
 package com.genersoft.iot.vmp.vmanager.gb28181.device;
 
+import com.alibaba.fastjson.JSONObject;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
+import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
+import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
+import com.genersoft.iot.vmp.service.IDeviceService;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
 import com.github.pagehelper.PageInfo;
-import io.swagger.annotations.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -15,15 +25,6 @@
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.context.request.async.DeferredResult;
 
-import com.alibaba.fastjson.JSONObject;
-import com.genersoft.iot.vmp.gb28181.bean.Device;
-import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
-import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
-import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
-
-import javax.sip.message.Response;
-import java.io.UnsupportedEncodingException;
 import java.util.UUID;
 
 @Api(tags = "鍥芥爣璁惧鏌ヨ", value = "鍥芥爣璁惧鏌ヨ")
@@ -49,6 +50,9 @@
 	
 	@Autowired
 	private DeviceOffLineDetector offLineDetector;
+
+	@Autowired
+	private IDeviceService deviceService;
 
 	/**
 	 * 浣跨敤ID鏌ヨ鍥芥爣璁惧
@@ -301,6 +305,18 @@
 			if (!StringUtils.isEmpty(device.getName())) deviceInStore.setName(device.getName());
 			if (!StringUtils.isEmpty(device.getCharset())) deviceInStore.setCharset(device.getCharset());
 			if (!StringUtils.isEmpty(device.getMediaServerId())) deviceInStore.setMediaServerId(device.getMediaServerId());
+
+			if (deviceInStore.getSubscribeCycleForCatalog() <=0 && device.getSubscribeCycleForCatalog() > 0) {
+				deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog());
+				// 寮�鍚闃�
+				deviceService.addCatalogSubscribe(deviceInStore);
+			}
+			if (deviceInStore.getSubscribeCycleForCatalog() > 0 && device.getSubscribeCycleForCatalog() <= 0) {
+				deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog());
+				// 鍙栨秷璁㈤槄
+				deviceService.removeCatalogSubscribe(deviceInStore);
+			}
+
 			storager.updateDevice(deviceInStore);
 			cmder.deviceInfoQuery(deviceInStore);
 		}

--
Gitblit v1.8.0