From c96ab05d7d0fb9ede820d89ea5e5b55820554e29 Mon Sep 17 00:00:00 2001
From: swwheihei <swwheihei@163.com>
Date: 星期四, 16 七月 2020 17:31:41 +0800
Subject: [PATCH] 尝试解决内存溢出,并使用多线程提高性能

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java       |   13 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/AckRequestProcessor.java       |   11 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/OtherRequestProcessor.java     |   11 
 src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java                                        |  177 ++----
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/ISIPRequestProcessor.java           |    6 
 src/main/java/com/genersoft/iot/vmp/vmanager/device/entity/DeviceChannel.java                    |  385 ++++++++++++++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java    |   14 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java  |   41 +
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/SubscribeRequestProcessor.java |   16 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java                    |   87 +++
 src/main/java/com/genersoft/iot/vmp/vmanager/device/entity/Device.java                           |  401 +++++++++++++++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/SIPRequestAbstractProcessor.java    |  127 +++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java   |   77 +-
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/CancelRequestProcessor.java    |   13 
 14 files changed, 1,137 insertions(+), 242 deletions(-)

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 0f6a092..9cc9c25 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
@@ -2,115 +2,113 @@
 
 import java.text.ParseException;
 import java.util.Properties;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 
-import javax.annotation.PostConstruct;
 import javax.sip.DialogTerminatedEvent;
 import javax.sip.IOExceptionEvent;
 import javax.sip.ListeningPoint;
+import javax.sip.PeerUnavailableException;
 import javax.sip.RequestEvent;
 import javax.sip.ResponseEvent;
-import javax.sip.ServerTransaction;
 import javax.sip.SipFactory;
 import javax.sip.SipListener;
 import javax.sip.SipProvider;
 import javax.sip.SipStack;
 import javax.sip.TimeoutEvent;
-import javax.sip.TransactionAlreadyExistsException;
 import javax.sip.TransactionTerminatedEvent;
-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 javax.sip.message.Response;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+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.request.ISIPRequestProcessor;
 import com.genersoft.iot.vmp.gb28181.transmit.response.ISIPResponseProcessor;
 
 import gov.nist.javax.sip.SipStackImpl;
 
 @Component
-public class SipLayer implements SipListener, Runnable {
+public class SipLayer implements SipListener {
 
 	private final static Logger logger = LoggerFactory.getLogger(SipLayer.class);
 
 	@Autowired
 	private SipConfig sipConfig;
 
-	private SipProvider tcpSipProvider;
-
-	private SipProvider udpSipProvider;
-
 	@Autowired
 	private SIPProcessorFactory processorFactory;
 
 	private SipStack sipStack;
 
-	private AddressFactory addressFactory;
-	private HeaderFactory headerFactory;
-	private MessageFactory messageFactory;
+	private SipFactory sipFactory;
 
-	@PostConstruct
+	/**   
+	 * 娑堟伅澶勭悊鍣ㄧ嚎绋嬫睜
+	 */
+	private ThreadPoolExecutor processThreadPool;
+
+	@Bean("initSipServer")
+	@DependsOn("allOffline")
 	private void initSipServer() {
-		Thread thread = new Thread(this);
-		thread.setDaemon(true);
-		thread.setName("sip server thread start");
-		thread.start();
+		
+		int processThreadNum = Runtime.getRuntime().availableProcessors() * 10;
+		LinkedBlockingQueue<Runnable> processQueue = new LinkedBlockingQueue<Runnable>(10000);
+		processThreadPool = new ThreadPoolExecutor(processThreadNum,processThreadNum,
+				0L,TimeUnit.MILLISECONDS,processQueue,
+				new ThreadPoolExecutor.CallerRunsPolicy());
 	}
-
-	@Override
-	public void run() {
-		SipFactory sipFactory = SipFactory.getInstance();
+	
+	@Bean("sipFactory")
+	@DependsOn("initSipServer")
+	private SipFactory createSipFactory() {
+		sipFactory = SipFactory.getInstance();
 		sipFactory.setPathName("gov.nist");
-		try {
-			headerFactory = sipFactory.createHeaderFactory();
-
-			addressFactory = sipFactory.createAddressFactory();
-			messageFactory = sipFactory.createMessageFactory();
-
-			Properties properties = new Properties();
-			properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP");
-			properties.setProperty("javax.sip.IP_ADDRESS", sipConfig.getSipIp());
-			properties.setProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT", "false");
-			/**
-			 * sip_server_log.log 鍜� sip_debug_log.log public static final int TRACE_NONE =
-			 * 0; public static final int TRACE_MESSAGES = 16; public static final int
-			 * TRACE_EXCEPTION = 17; public static final int TRACE_DEBUG = 32;
-			 */
-			properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "32");
-			properties.setProperty("gov.nist.javax.sip.SERVER_LOG", "sip_server_log");
-			properties.setProperty("gov.nist.javax.sip.DEBUG_LOG", "sip_debug_log");
-			sipStack = (SipStackImpl) sipFactory.createSipStack(properties);
-
-			startTcpListener();
-			startUdpListener();
-		} catch (Exception e) {
-			logger.error("Sip Server 鍚姩澶辫触锛� port {" + sipConfig.getSipPort() + "}");
-			e.printStackTrace();
-		}
-		logger.info("Sip Server 鍚姩鎴愬姛 port {" + sipConfig.getSipPort() + "}");
+		return sipFactory;
+	}
+	
+	@Bean("sipStack")
+	@DependsOn({"initSipServer", "sipFactory"})
+	private SipStack createSipStack() throws PeerUnavailableException {
+		Properties properties = new Properties();
+		properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP");
+		properties.setProperty("javax.sip.IP_ADDRESS", sipConfig.getSipIp());
+		properties.setProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT", "false");
+		/**
+		 * sip_server_log.log 鍜� sip_debug_log.log public static final int TRACE_NONE =
+		 * 0; public static final int TRACE_MESSAGES = 16; public static final int
+		 * TRACE_EXCEPTION = 17; public static final int TRACE_DEBUG = 32;
+		 */
+		properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "0");
+		properties.setProperty("gov.nist.javax.sip.SERVER_LOG", "sip_server_log");
+		properties.setProperty("gov.nist.javax.sip.DEBUG_LOG", "sip_debug_log");
+		sipStack = (SipStackImpl) sipFactory.createSipStack(properties);
+		return sipStack;
 	}
 
-	private void startTcpListener() throws Exception {
-		ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(),
-				"TCP");
-		tcpSipProvider = sipStack.createSipProvider(tcpListeningPoint);
+	@Bean("tcpSipProvider")
+	@DependsOn("sipStack")
+	private SipProvider startTcpListener() throws Exception {
+		ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(), "TCP");
+		SipProvider tcpSipProvider = sipStack.createSipProvider(tcpListeningPoint);
 		tcpSipProvider.addSipListener(this);
+		logger.info("Sip Server TCP 鍚姩鎴愬姛 port {" + sipConfig.getSipPort() + "}");
+		return tcpSipProvider;
 	}
-
-	private void startUdpListener() throws Exception {
-		ListeningPoint udpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(),
-				"UDP");
-		udpSipProvider = sipStack.createSipProvider(udpListeningPoint);
+	
+	@Bean("udpSipProvider")
+	@DependsOn("sipStack")
+	private SipProvider startUdpListener() throws Exception {
+		ListeningPoint udpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(), "UDP");
+		SipProvider udpSipProvider = sipStack.createSipProvider(udpListeningPoint);
 		udpSipProvider.addSipListener(this);
+		logger.info("Sip Server TCP 鍚姩鎴愬姛 port {" + sipConfig.getSipPort() + "}");
+		return udpSipProvider;
 	}
 
 	/**
@@ -119,8 +117,10 @@
 	 */
 	@Override
 	public void processRequest(RequestEvent evt) {
-		ISIPRequestProcessor processor = processorFactory.createRequestProcessor(evt);
-		processor.process(evt, this);
+		// 鐢变簬jainsip鏄崟绾跨▼绋嬪簭锛屼负鎻愰珮鎬ц兘骞跺彂澶勭悊
+		processThreadPool.execute(() -> {
+			processorFactory.createRequestProcessor(evt).process();
+		});
 	}
 
 	@Override
@@ -210,53 +210,6 @@
 	public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) {
 		// TODO Auto-generated method stub
 
-	}
-
-	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) {
-					serverTransaction = tcpSipProvider.getNewServerTransaction(request);
-				} else {
-					serverTransaction = udpSipProvider.getNewServerTransaction(request);
-				}
-			} catch (TransactionAlreadyExistsException e) {
-				e.printStackTrace();
-			} catch (TransactionUnavailableException e) {
-				e.printStackTrace();
-			}
-		}
-		return serverTransaction;
-	}
-
-	public AddressFactory getAddressFactory() {
-		return addressFactory;
-	}
-
-	public HeaderFactory getHeaderFactory() {
-		return headerFactory;
-	}
-
-	public MessageFactory getMessageFactory() {
-		return messageFactory;
-	}
-
-	public SipProvider getTcpSipProvider() {
-		return tcpSipProvider;
-	}
-
-	public SipProvider getUdpSipProvider() {
-		return udpSipProvider;
 	}
 
 }
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
index a211b6e..88e7ccf 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
@@ -2,13 +2,23 @@
 
 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 org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 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;
@@ -23,6 +33,8 @@
 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.redis.RedisUtil;
 
 /**    
  * @Description:TODO(杩欓噷鐢ㄤ竴鍙ヨ瘽鎻忚堪杩欎釜绫荤殑浣滅敤)   
@@ -32,29 +44,31 @@
 @Component
 public class SIPProcessorFactory {
 	
-	@Autowired
-	private InviteRequestProcessor inviteRequestProcessor;
+	private final static Logger logger = LoggerFactory.getLogger(SIPProcessorFactory.class);
 	
 	@Autowired
-	private RegisterRequestProcessor registerRequestProcessor;
+	private SipConfig sipConfig;
 	
 	@Autowired
-	private SubscribeRequestProcessor subscribeRequestProcessor;
+	private RegisterLogicHandler handler;
 	
 	@Autowired
-	private AckRequestProcessor ackRequestProcessor;
+	private IVideoManagerStorager storager;
 	
 	@Autowired
-	private ByeRequestProcessor byeRequestProcessor;
+	private EventPublisher publisher;
 	
 	@Autowired
-	private CancelRequestProcessor cancelRequestProcessor;
+	private SIPCommander cmder;
 	
 	@Autowired
-	private MessageRequestProcessor messageRequestProcessor;
+	private RedisUtil redis;
 	
 	@Autowired
-	private OtherRequestProcessor otherRequestProcessor;
+	private DeferredResultHolder deferredResultHolder;
+	
+	@Autowired
+	private DeviceOffLineDetector offLineDetector;
 	
 	@Autowired
 	private InviteResponseProcessor inviteResponseProcessor;
@@ -68,27 +82,64 @@
 	@Autowired
 	private OtherResponseProcessor otherResponseProcessor;
 	
+	@Autowired
+	@Qualifier(value="tcpSipProvider")
+	private SipProvider tcpSipProvider;
+	
+	@Autowired
+	@Qualifier(value="udpSipProvider")
+	private SipProvider udpSipProvider;
 	
 	public ISIPRequestProcessor createRequestProcessor(RequestEvent evt) {
 		Request request = evt.getRequest();
 		String method = request.getMethod();
-		
+		logger.info("鎺ユ敹鍒版秷鎭細"+request.getMethod());
 		if (Request.INVITE.equals(method)) {
-			return inviteRequestProcessor;
+			InviteRequestProcessor processor = new InviteRequestProcessor();
+			processor.setRequestEvent(evt);
+			processor.setTcpSipProvider(tcpSipProvider);
+			processor.setUdpSipProvider(udpSipProvider);
+			return processor;
 		} else if (Request.REGISTER.equals(method)) {
-			return registerRequestProcessor;
+			RegisterRequestProcessor processor = new RegisterRequestProcessor();
+			processor.setRequestEvent(evt);
+			processor.setTcpSipProvider(tcpSipProvider);
+			processor.setUdpSipProvider(udpSipProvider);
+			processor.setHandler(handler);
+			processor.setPublisher(publisher);
+			processor.setSipConfig(sipConfig);
+			processor.setVideoManagerStorager(storager);
+			return processor;
 		} else if (Request.SUBSCRIBE.equals(method)) {
-			return subscribeRequestProcessor;
+			SubscribeRequestProcessor processor = new SubscribeRequestProcessor();
+			processor.setRequestEvent(evt);
+			return processor;
 		} else if (Request.ACK.equals(method)) {
-			return ackRequestProcessor;
+			AckRequestProcessor processor = new AckRequestProcessor();
+			processor.setRequestEvent(evt);
+			return processor;
 		} else if (Request.BYE.equals(method)) {
-			return byeRequestProcessor;
+			ByeRequestProcessor processor = new ByeRequestProcessor();
+			processor.setRequestEvent(evt);
+			return processor;
 		} else if (Request.CANCEL.equals(method)) {
-			return cancelRequestProcessor;
+			CancelRequestProcessor processor = new CancelRequestProcessor();
+			processor.setRequestEvent(evt);
+			return processor;
 		} else if (Request.MESSAGE.equals(method)) {
-			return messageRequestProcessor;
+			MessageRequestProcessor processor = new MessageRequestProcessor();
+			processor.setRequestEvent(evt);
+			processor.setTcpSipProvider(tcpSipProvider);
+			processor.setUdpSipProvider(udpSipProvider);
+			processor.setPublisher(publisher);
+			processor.setRedis(redis);
+			processor.setDeferredResultHolder(deferredResultHolder);
+			processor.setOffLineDetector(offLineDetector);
+			processor.setCmder(cmder);
+			processor.setStorager(storager);
+			return processor;
 		} else {
-			return otherRequestProcessor;
+			return new OtherRequestProcessor();
 		}
 	}
 	
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
index 8b8475c..82e2f1d 100644
--- 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
@@ -1,9 +1,5 @@
 package com.genersoft.iot.vmp.gb28181.transmit.request;
 
-import javax.sip.RequestEvent;
-
-import com.genersoft.iot.vmp.gb28181.SipLayer;
-
 /**    
  * @Description:澶勭悊鎺ユ敹IPCamera鍙戞潵鐨凷IP鍗忚璇锋眰娑堟伅
  * @author: swwheihei
@@ -11,6 +7,6 @@
  */
 public interface ISIPRequestProcessor {
 
-	public void process(RequestEvent evt, SipLayer layer);
+	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
new file mode 100644
index 0000000..5410820
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/SIPRequestAbstractProcessor.java
@@ -0,0 +1,127 @@
+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;
+
+/**    
+ * @Description:澶勭悊鎺ユ敹IPCamera鍙戞潵鐨凷IP鍗忚璇锋眰娑堟伅
+ * @author: songww
+ * @date:   2020骞�5鏈�3鏃� 涓嬪崍4:42:22     
+ */
+public abstract class SIPRequestAbstractProcessor implements ISIPRequestProcessor {
+
+	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) {
+				e.printStackTrace();
+			} catch (TransactionUnavailableException e) {
+				e.printStackTrace();
+			}
+		}
+		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
index 44457e8..aebc601 100644
--- 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
@@ -3,14 +3,10 @@
 import javax.sip.Dialog;
 import javax.sip.InvalidArgumentException;
 import javax.sip.RequestEvent;
-import javax.sip.ServerTransaction;
 import javax.sip.SipException;
 import javax.sip.message.Request;
 
-import org.springframework.stereotype.Component;
-
-import com.genersoft.iot.vmp.gb28181.SipLayer;
-import com.genersoft.iot.vmp.gb28181.transmit.request.ISIPRequestProcessor;
+import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
 
 import gov.nist.javax.sip.header.CSeq;
 
@@ -19,8 +15,7 @@
  * @author: swwheihei
  * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:31:45     
  */
-@Component
-public class AckRequestProcessor implements ISIPRequestProcessor {
+public class AckRequestProcessor extends SIPRequestAbstractProcessor {
 	
 	/**   
 	 * 澶勭悊  ACK璇锋眰
@@ -31,7 +26,7 @@
 	 * @param config    
 	 */  
 	@Override
-	public void process(RequestEvent evt, SipLayer layer) {
+	public void process(RequestEvent evt) {
 		Request request = evt.getRequest();
 		Dialog dialog = evt.getDialog();
 		try {
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
index 0c17364..0730731 100644
--- 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
@@ -1,20 +1,15 @@
 package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
 
 import javax.sip.RequestEvent;
-import javax.sip.ServerTransaction;
 
-import org.springframework.stereotype.Component;
-
-import com.genersoft.iot.vmp.gb28181.SipLayer;
-import com.genersoft.iot.vmp.gb28181.transmit.request.ISIPRequestProcessor;
+import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
 
 /**    
  * @Description: BYE璇锋眰澶勭悊鍣�
  * @author: swwheihei
  * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:32:05     
  */
-@Component
-public class ByeRequestProcessor implements ISIPRequestProcessor {
+public class ByeRequestProcessor extends SIPRequestAbstractProcessor {
 
 	/**   
 	 * 澶勭悊BYE璇锋眰
@@ -25,8 +20,8 @@
 	 * @param config    
 	 */  
 	@Override
-	public void process(RequestEvent evt, SipLayer layer) {
-		// TODO Auto-generated method stub
+	public void process(RequestEvent evt) {
+		// TODO 浼樺厛绾�99 Bye Request娑堟伅瀹炵幇锛屾娑堟伅涓�鑸负绾ц仈娑堟伅锛屼笂绾х粰涓嬬骇鍙戦�佽棰戝仠姝㈡寚浠�
 		
 	}
 
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
index 7b6cc31..1b5b886 100644
--- 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
@@ -1,20 +1,15 @@
 package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
 
 import javax.sip.RequestEvent;
-import javax.sip.ServerTransaction;
 
-import org.springframework.stereotype.Component;
-
-import com.genersoft.iot.vmp.gb28181.SipLayer;
-import com.genersoft.iot.vmp.gb28181.transmit.request.ISIPRequestProcessor;
+import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
 
 /**    
  * @Description:CANCEL璇锋眰澶勭悊鍣�
  * @author: swwheihei
  * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:32:23     
  */
-@Component
-public class CancelRequestProcessor implements ISIPRequestProcessor {
+public class CancelRequestProcessor extends SIPRequestAbstractProcessor {
 
 	/**   
 	 * 澶勭悊CANCEL璇锋眰
@@ -25,8 +20,8 @@
 	 * @param config    
 	 */  
 	@Override
-	public void process(RequestEvent evt, SipLayer layer) {
-		// TODO Auto-generated method stub
+	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
index d3d94ee..ab70a5e 100644
--- 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
@@ -1,20 +1,15 @@
 package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
 
 import javax.sip.RequestEvent;
-import javax.sip.ServerTransaction;
 
-import org.springframework.stereotype.Component;
-
-import com.genersoft.iot.vmp.gb28181.SipLayer;
-import com.genersoft.iot.vmp.gb28181.transmit.request.ISIPRequestProcessor;
+import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
 
 /**    
  * @Description:澶勭悊INVITE璇锋眰
  * @author: swwheihei
  * @date:   2020骞�5鏈�3鏃� 涓嬪崍4:43:52     
  */
-@Component
-public class InviteRequestProcessor implements ISIPRequestProcessor {
+public class InviteRequestProcessor extends SIPRequestAbstractProcessor {
 
 	/**
 	 * 澶勭悊invite璇锋眰
@@ -23,8 +18,8 @@
 	 *            璇锋眰娑堟伅
 	 */ 
 	@Override
-	public void process(RequestEvent evt, SipLayer layer) {
-		// TODO Auto-generated method stub
+	public void process(RequestEvent evt) {
+		// TODO 浼樺厛绾�99 Invite Request娑堟伅瀹炵幇锛屾娑堟伅涓�鑸负绾ц仈娑堟伅锛屼笂绾х粰涓嬬骇鍙戦�佽姹傝棰戞寚浠�
 //		Request request = requestEvent.getRequest();
 //
 //		try {
@@ -45,7 +40,6 @@
 //			Via via = (Via) headerFactory.createViaHeader(SIPMain.ip, SIPMain.port, "UDP",
 //					callerVia.getBranch() + "sipphone");
 //
-//			// FIXME 闇�瑕佹祴璇曟槸鍚﹁兘澶熼�氳繃璁剧疆VIA澶村煙鏉ヤ慨鏀筕IA澶村煙鍊�
 //			cliReq.removeHeader(Via.NAME);
 //			cliReq.addHeader(via);
 //
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
index 70ed863..7038590 100644
--- 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
@@ -10,7 +10,6 @@
 
 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;
@@ -22,10 +21,8 @@
 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.common.VideoManagerConstants;
-import com.genersoft.iot.vmp.gb28181.SipLayer;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
 import com.genersoft.iot.vmp.gb28181.bean.RecordInfo;
@@ -35,7 +32,7 @@
 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.request.ISIPRequestProcessor;
+import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
 import com.genersoft.iot.vmp.gb28181.utils.DateUtil;
 import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
@@ -46,38 +43,28 @@
  * @author: swwheihei
  * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:32:41     
  */
-@Component
-public class MessageRequestProcessor implements ISIPRequestProcessor {
+public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
 	
 	private final static Logger logger = LoggerFactory.getLogger(MessageRequestProcessor.class);
 	
-	private ServerTransaction transaction;
-	
-	private SipLayer layer;
-	
-	@Autowired
 	private SIPCommander cmder;
 	
-	@Autowired
 	private IVideoManagerStorager storager;
 	
-	@Autowired
 	private EventPublisher publisher;
 	
-	@Autowired
 	private RedisUtil redis;
 	
-	@Autowired
 	private DeferredResultHolder deferredResultHolder;
 	
-	@Autowired
 	private DeviceOffLineDetector offLineDetector;
 	
 	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_KEEP_ALIVE = "Keepalive";
 	private static final String MESSAGE_ALARM = "Alarm";
 	private static final String MESSAGE_RECORD_INFO = "RecordInfo";
 //	private static final String MESSAGE_BROADCAST = "Broadcast";
@@ -93,23 +80,17 @@
 	 * @param transaction  
 	 */  
 	@Override
-	public void process(RequestEvent evt, SipLayer layer) {
-		
-		this.layer = layer;
-		this.transaction = layer.getServerTransaction(evt);
-		
-		Request request = evt.getRequest();
-		SAXReader reader = new SAXReader();
-		reader.setEncoding("gbk");
-		Document xml;
+	public void process(RequestEvent evt) {
+
 		try {
-			xml = reader.read(new ByteArrayInputStream(request.getRawContent()));
-			Element rootElement = xml.getRootElement();
-			String cmd = rootElement.element("CmdType").getStringValue();
-			
+			Element rootElement = getRootElement(evt);
+			String cmd = XmlUtil.getText(rootElement,"CmdType");
+
 			if (MESSAGE_KEEP_ALIVE.equals(cmd)) {
 				logger.info("鎺ユ敹鍒癒eepAlive娑堟伅");
 				processMessageKeepAlive(evt);
+			} else if (MESSAGE_CONFIG_DOWNLOAD.equals(cmd)) {
+				logger.info("鎺ユ敹鍒癈onfigDownload娑堟伅");
 			} else if (MESSAGE_CATALOG.equals(cmd)) {
 				logger.info("鎺ユ敹鍒癈atalog娑堟伅");
 				processMessageCatalogList(evt);
@@ -126,7 +107,6 @@
 		} catch (DocumentException e) {
 			e.printStackTrace();
 		}
-		
 	}
 	
 	/**
@@ -273,15 +253,11 @@
 		try {
 			Element rootElement = getRootElement(evt);
 			String deviceId = XmlUtil.getText(rootElement,"DeviceID");
-			Request request = evt.getRequest();
-			Response response = null;
 			if (offLineDetector.isOnline(deviceId)) {
-				response = layer.getMessageFactory().createResponse(Response.OK,request);
+				responseAck(evt);
 				publisher.onlineEventPublish(deviceId, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE);
 			} else {
-				response = layer.getMessageFactory().createResponse(Response.BAD_REQUEST,request);
 			}
-			transaction.sendResponse(response);
 		} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
 			e.printStackTrace();
 		}
@@ -373,6 +349,11 @@
 		}
 	}
 	
+	private void responseAck(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
+		Response response = getMessageFactory().createResponse(Response.OK,evt.getRequest());
+		getServerTransaction(evt).sendResponse(response);
+	}
+	
 	private Element getRootElement(RequestEvent evt) throws DocumentException {
 		Request request = evt.getRequest();
 		SAXReader reader = new SAXReader();
@@ -381,4 +362,28 @@
 		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;
+	}
+
 }
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
index b27c032..63da991 100644
--- 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
@@ -1,20 +1,15 @@
 package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
 
 import javax.sip.RequestEvent;
-import javax.sip.ServerTransaction;
 
-import org.springframework.stereotype.Component;
-
-import com.genersoft.iot.vmp.gb28181.SipLayer;
-import com.genersoft.iot.vmp.gb28181.transmit.request.ISIPRequestProcessor;
+import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
 
 /**    
  * @Description:鏆備笉鏀寔鐨勬秷鎭姹傚鐞嗗櫒
  * @author: swwheihei
  * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:32:59     
  */
-@Component
-public class OtherRequestProcessor implements ISIPRequestProcessor {
+public class OtherRequestProcessor extends SIPRequestAbstractProcessor {
 
 	/**   
 	 * <p>Title: process</p>   
@@ -25,7 +20,7 @@
 	 * @param config    
 	 */  
 	@Override
-	public void process(RequestEvent evt, SipLayer layer) {
+	public void process(RequestEvent evt) {
 		System.out.println("no support the method! 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
index 7f07406..a90429a 100644
--- 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
@@ -7,7 +7,6 @@
 
 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;
@@ -17,19 +16,16 @@
 import javax.sip.message.Request;
 import javax.sip.message.Response;
 
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 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.SipLayer;
 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.bean.Host;
 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
-import com.genersoft.iot.vmp.gb28181.transmit.request.ISIPRequestProcessor;
+import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 
 import gov.nist.javax.sip.address.AddressImpl;
@@ -41,19 +37,14 @@
  * @author: swwheihei
  * @date:   2020骞�5鏈�3鏃� 涓嬪崍4:47:25     
  */
-@Component
-public class RegisterRequestProcessor implements ISIPRequestProcessor {
+public class RegisterRequestProcessor extends SIPRequestAbstractProcessor {
 
-	@Autowired
 	private SipConfig sipConfig;
 	
-	@Autowired
 	private RegisterLogicHandler handler;
 	
-	@Autowired
 	private IVideoManagerStorager storager;
 	
-	@Autowired
 	private EventPublisher publisher;
 	
 	/***
@@ -63,7 +54,7 @@
 	 *            璇锋眰娑堟伅
 	 */ 
 	@Override
-	public void process(RequestEvent evt, SipLayer layer) {
+	public void process(RequestEvent evt) {
 		try {
 			System.out.println("鏀跺埌娉ㄥ唽璇锋眰锛屽紑濮嬪鐞�");
 			Request request = evt.getRequest();
@@ -88,14 +79,14 @@
 				} else if (!passwordCorrect) {
 					System.out.println("瀵嗙爜閿欒 鍥炲401");
 				}
-				response = layer.getMessageFactory().createResponse(Response.UNAUTHORIZED, request);
-				new DigestServerAuthenticationHelper().generateChallenge(layer.getHeaderFactory(), response, sipConfig.getSipDomain());
+				response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request);
+				new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getSipDomain());
 			}
 			// 鎼哄甫鎺堟潈澶村苟涓斿瘑鐮佹纭�
 			else if (passwordCorrect) {
-				response = layer.getMessageFactory().createResponse(Response.OK, request);
+				response = getMessageFactory().createResponse(Response.OK, request);
 				// 娣诲姞date澶�
-				response.addHeader(layer.getHeaderFactory().createDateHeader(Calendar.getInstance(Locale.ENGLISH)));
+				response.addHeader(getHeaderFactory().createDateHeader(Calendar.getInstance(Locale.ENGLISH)));
 				ExpiresHeader expiresHeader = (ExpiresHeader) request.getHeader(Expires.NAME);
 				// 娣诲姞Contact澶�
 				response.addHeader(request.getHeader(ContactHeader.NAME));
@@ -141,7 +132,7 @@
 					device.setTransport(isTcp ? "TCP" : "UDP");
 				}
 			}
-			layer.getServerTransaction(evt).sendResponse(response);
+			getServerTransaction(evt).sendResponse(response);
 			// 娉ㄥ唽鎴愬姛
 			// 淇濆瓨鍒皉edis
 			// 涓嬪彂catelog鏌ヨ鐩綍
@@ -159,5 +150,21 @@
 		}
 		
 	}
+	
+	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
index b2f1008..010659e 100644
--- 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
@@ -10,18 +10,14 @@
 import javax.sip.message.Request;
 import javax.sip.message.Response;
 
-import org.springframework.stereotype.Component;
-
-import com.genersoft.iot.vmp.gb28181.SipLayer;
-import com.genersoft.iot.vmp.gb28181.transmit.request.ISIPRequestProcessor;
+import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
 
 /**    
  * @Description:SUBSCRIBE璇锋眰澶勭悊鍣�
  * @author: swwheihei
  * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:31:20     
  */
-@Component
-public class SubscribeRequestProcessor implements ISIPRequestProcessor {
+public class SubscribeRequestProcessor extends SIPRequestAbstractProcessor {
 
 	/**   
 	 * 澶勭悊SUBSCRIBE璇锋眰  
@@ -32,18 +28,18 @@
 	 * @param config    
 	 */
 	@Override
-	public void process(RequestEvent evt, SipLayer layer) {
+	public void process(RequestEvent evt) {
 		Request request = evt.getRequest();
 
 		try {
 			Response response = null;
-			response = layer.getMessageFactory().createResponse(200, request);
+			response = getMessageFactory().createResponse(200, request);
 			if (response != null) {
-				ExpiresHeader expireHeader = layer.getHeaderFactory().createExpiresHeader(30);
+				ExpiresHeader expireHeader = getHeaderFactory().createExpiresHeader(30);
 				response.setExpires(expireHeader);
 			}
 			System.out.println("response : " + response.toString());
-			ServerTransaction transaction = layer.getServerTransaction(evt);
+			ServerTransaction transaction = getServerTransaction(evt);
 			if (transaction != null) {
 				transaction.sendResponse(response);
 				transaction.terminate();
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/device/entity/Device.java b/src/main/java/com/genersoft/iot/vmp/vmanager/device/entity/Device.java
new file mode 100644
index 0000000..50682f9
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/device/entity/Device.java
@@ -0,0 +1,401 @@
+package com.genersoft.iot.vmp.vmanager.device.entity;
+
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description:瑙嗛璁惧淇℃伅
+ * @author: songww
+ * @date:   2020骞�5鏈�8鏃� 涓嬪崍2:05:56
+ */
+@ApiModel(value = "瑙嗛璁惧淇℃伅", description = "瑙嗛璁惧淇℃伅")
+@Table(name="VMP_VIDEODEVICES")
+public class Device {
+
+	/**
+	 * 璁惧Id
+	 */
+	@ApiModelProperty("璁惧缂栧彿")
+	@Id
+	@Column(name="DEVICE_ID")
+	@NotNull(message = "deviceId 涓嶈兘涓� null")
+	@Size(min = 4, max = 32, message = "deviceId 蹇呴』澶т簬 4 浣嶅苟涓斿皬浜� 32 浣�")
+	private String deviceId;
+
+	/**
+	 * 璁惧鍚嶇О
+	 */
+	@ApiModelProperty("璁惧鍚嶇О")
+	@Column(name="DEVICE_NAME")
+	@Size(max = 32, message = "deviceName 蹇呴』灏忎簬 32 浣�")
+	private String deviceName;
+
+	/**
+	 * 鐢熶骇鍘傚晢
+	 */
+	@ApiModelProperty("鐢熶骇鍘傚晢")
+	@Column(name="MANUFACTURER")
+	@Size(max = 64, message = "manufacturer 蹇呴』灏忎簬 64 浣�")
+	private String manufacturer;
+
+	/**
+	 * 鍨嬪彿
+	 */
+	@ApiModelProperty("鍨嬪彿")
+	@Column(name="MODEL")
+	@Size(max = 64, message = "manufacturer 蹇呴』灏忎簬 64 浣�")
+	private String model;
+
+	/**
+	 * 鍥轰欢鐗堟湰
+	 */
+	@ApiModelProperty("鍥轰欢鐗堟湰")
+	@Column(name="FIRMWARE")
+	@Size(max = 64, message = "firmware 蹇呴』灏忎簬 64 浣�")
+	private String firmware;
+
+	/**
+	 * 閫氫俊鍗忚
+	 * GB28181 ONVIF
+	 */
+	@ApiModelProperty("閫氫俊鍗忚")
+	@Column(name="PROTOCOL")
+	@NotNull(message = "protocol 涓嶈兘涓� null")
+	@Size(max = 16, message = "protocol 蹇呴』灏忎簬 16 浣�")
+	private String protocol;
+
+	/**
+	 * SIP 浼犺緭鍗忚
+	 * UDP/TCP
+	 */
+	@ApiModelProperty("SIP 浼犺緭鍗忚")
+	@Column(name="TRANSPORT")
+	@Size(min = 3,max = 3 ,message = "transport 蹇呴』涓� 3 浣�")
+	private String transport;
+
+	/**
+	 * 鏁版嵁娴佷紶杈撴ā寮�
+	 * UDP:udp浼犺緭
+	 * TCP-ACTIVE锛歵cp涓诲姩妯″紡
+	 * TCP-PASSIVE锛歵cp琚姩妯″紡
+	 */
+	@ApiModelProperty("鏁版嵁娴佷紶杈撴ā寮�")
+	@Column(name="STREAM_MODE")
+	@Size(max = 64, message = "streamMode 蹇呴』灏忎簬 16 浣�")
+	private String streamMode;
+
+	/**
+	 * IP鍦板潃
+	 */
+	@ApiModelProperty("IP鍦板潃")
+	@Column(name="IP")
+	@Size(max = 15, message = "streamMode 蹇呴』灏忎簬 15 浣�")
+	private String ip;
+
+	/**
+	 * 绔彛鍙�
+	 */
+	@ApiModelProperty("绔彛鍙�")
+	@Column(name="PORT")
+	@Max(value = 65535,message = "port 鏈�澶у�间负 65535")
+	private Integer port;
+
+	/**
+	 * 鍦ㄧ嚎鐘舵�� 1鍦ㄧ嚎, 0绂荤嚎
+	 */
+	@ApiModelProperty("鍦ㄧ嚎鐘舵��")
+	@Size(min = 1,max = 1 ,message = "online 蹇呴』涓� 1 浣�")
+	@Column(name="ONLINE")
+	private String online;
+
+	/**
+	 * 閫氶亾鏁伴噺
+	 */
+	@ApiModelProperty("閫氶亾鏁伴噺")
+	@Column(name="CHANNEL_SUM")
+	@Max(value = 1000000000,message = "channelSum 鏈�澶у�间负 1000000000")
+	private Integer channelSum;
+
+	@Override
+	public String toString() {
+		return "Device{" +
+				"deviceId='" + deviceId + '\'' +
+				", deviceName='" + deviceName + '\'' +
+				", manufacturer='" + manufacturer + '\'' +
+				", model='" + model + '\'' +
+				", firmware='" + firmware + '\'' +
+				", protocol='" + protocol + '\'' +
+				", transport='" + transport + '\'' +
+				", streamMode='" + streamMode + '\'' +
+				", ip='" + ip + '\'' +
+				", port=" + port +
+				", online='" + online + '\'' +
+				", channelSum=" + channelSum +
+				", createTime='" + createTime + '\'' +
+				", registerTime='" + registerTime + '\'' +
+				", heartbeatTime='" + heartbeatTime + '\'' +
+				", updateTime='" + updateTime + '\'' +
+				", updatePerson='" + updatePerson + '\'' +
+				", syncTime='" + syncTime + '\'' +
+				", syncPerson='" + syncPerson + '\'' +
+				", username='" + username + '\'' +
+				", password='" + password + '\'' +
+				", channelList=" + channelList +
+				'}';
+	}
+
+	/**
+	 * 鍒涘缓鏃堕棿
+	 */
+	@ApiModelProperty("鍒涘缓鏃堕棿")
+	@Column(name="CREATE_TIME")
+	private String createTime;
+
+	/**
+	 * 娉ㄥ唽鏃堕棿
+	 */
+	@ApiModelProperty("娉ㄥ唽鏃堕棿")
+	@Column(name="REGISTER_TIME")
+	private String registerTime;
+
+	/**
+	 * 蹇冭烦鏃堕棿
+	 */
+	@ApiModelProperty("蹇冭烦鏃堕棿")
+	@Column(name="HEARTBEAT_TIME")
+	private String heartbeatTime;
+
+	/**
+	 * 淇敼鏃堕棿
+	 */
+	@ApiModelProperty("鏇存柊鏃堕棿")
+	@Column(name="UPDATE_TIME")
+	private String updateTime;
+
+	/**
+	 * 淇敼浜�
+	 */
+	@ApiModelProperty("淇敼浜�")
+	@Column(name="UPDATE_PERSON")
+	private String updatePerson;
+
+	/**
+	 * 鍚屾鏃堕棿
+	 */
+	@ApiModelProperty("鍚屾鏃堕棿")
+	@Column(name="SYNC_TIME")
+	private String syncTime;
+
+	/**
+	 * 鍚屾浜�
+	 */
+	@ApiModelProperty("鍚屾浜�")
+	@Column(name="SYNC_PERSON")
+	private String syncPerson;
+
+	/**
+	 * ONVIF鍗忚-鐢ㄦ埛鍚�
+	 */
+	@ApiModelProperty("鐢ㄦ埛鍚�")
+	@Column(name="USERNAME")
+	@Size(max = 32, message = "username 蹇呴』灏忎簬 32 浣�")
+	private String username;
+
+	/**
+	 * ONVIF鍗忚-瀵嗙爜
+	 */
+	@ApiModelProperty("瀵嗙爜")
+	@Size(max = 32, message = "password 蹇呴』灏忎簬 32 浣�")
+	@Column(name="PASSWORD")
+	private String password;
+
+	@Transient
+	private List<DeviceChannel> channelList;
+
+	public String getDeviceId() {
+		return deviceId;
+	}
+
+	public void setDeviceId(String deviceId) {
+		this.deviceId = deviceId;
+	}
+
+	public String getDeviceName() {
+		return deviceName;
+	}
+
+	public void setDeviceName(String deviceName) {
+		this.deviceName = deviceName;
+	}
+
+	public String getTransport() {
+		return transport;
+	}
+
+	public void setTransport(String transport) {
+		this.transport = transport;
+	}
+
+	public String getIp() {
+		return ip;
+	}
+
+	public void setIp(String ip) {
+		this.ip = ip;
+	}
+
+	public Integer getPort() {
+		return port;
+	}
+
+	public void setPort(Integer port) {
+		this.port = port;
+	}
+
+	public String getManufacturer() {
+		return manufacturer;
+	}
+
+	public void setManufacturer(String manufacturer) {
+		this.manufacturer = manufacturer;
+	}
+
+	public String getModel() {
+		return model;
+	}
+
+	public void setModel(String model) {
+		this.model = model;
+	}
+
+	public String getFirmware() {
+		return firmware;
+	}
+
+	public void setFirmware(String firmware) {
+		this.firmware = firmware;
+	}
+
+	public String getOnline() {
+		return online;
+	}
+
+	public void setOnline(String online) {
+		this.online = online;
+	}
+
+	public String getStreamMode() {
+		return streamMode;
+	}
+
+	public void setStreamMode(String streamMode) {
+		this.streamMode = streamMode;
+	}
+
+	public List<DeviceChannel> getChannelList() {
+		return channelList;
+	}
+
+	public void setChannelList(List<DeviceChannel> channelList) {
+		this.channelList = channelList;
+	}
+
+	public Integer getChannelSum() {
+		return channelSum;
+	}
+
+	public void setChannelSum(Integer channelSum) {
+		this.channelSum = channelSum;
+	}
+
+	public String getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(String createTime) {
+		this.createTime = createTime;
+	}
+
+	public String getRegisterTime() {
+		return registerTime;
+	}
+
+	public void setRegisterTime(String registerTime) {
+		this.registerTime = registerTime;
+	}
+
+	public String getHeartbeatTime() {
+		return heartbeatTime;
+	}
+
+	public void setHeartbeatTime(String heartbeatTime) {
+		this.heartbeatTime = heartbeatTime;
+	}
+
+	public String getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(String updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public String getUpdatePerson() {
+		return updatePerson;
+	}
+
+	public void setUpdatePerson(String updatePerson) {
+		this.updatePerson = updatePerson;
+	}
+
+	public String getSyncTime() {
+		return syncTime;
+	}
+
+	public void setSyncTime(String syncTime) {
+		this.syncTime = syncTime;
+	}
+
+	public String getSyncPerson() {
+		return syncPerson;
+	}
+
+	public void setSyncPerson(String syncPerson) {
+		this.syncPerson = syncPerson;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getProtocol() {
+		return protocol;
+	}
+
+	public void setProtocol(String protocol) {
+		this.protocol = protocol;
+	}
+
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/device/entity/DeviceChannel.java b/src/main/java/com/genersoft/iot/vmp/vmanager/device/entity/DeviceChannel.java
new file mode 100644
index 0000000..35d6293
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/device/entity/DeviceChannel.java
@@ -0,0 +1,385 @@
+package com.genersoft.iot.vmp.vmanager.device.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description:璁惧閫氶亾淇℃伅
+ * @author: songww
+ * @date:   2020骞�5鏈�20鏃� 涓嬪崍9:00:46     
+ */
+@ApiModel(value = "璁惧閫氶亾淇℃伅", description = "璁惧閫氶亾淇℃伅")
+@Table(name="VMP_VIDEOCHANNELS")
+public class DeviceChannel {
+
+	/**
+	 * 閫氶亾缂栧彿
+	 */
+	@ApiModelProperty("閫氶亾缂栧彿")
+	@Id
+	@Column(name="CHANNEL_ID")
+	private String channelId;
+	
+	/**
+	 * 璁惧缂栧彿
+	 */
+	@ApiModelProperty("璁惧缂栧彿")
+	@Column(name="DEVICE_ID")
+	private String deviceId;
+	
+	/**
+	 * 閫氶亾鍚�
+	 */
+	@ApiModelProperty("閫氶亾鍚�")
+	@Column(name="CHANNEL_NAME")
+	private String channelName;
+	
+	/**
+	 * 鐢熶骇鍘傚晢
+	 */
+	@ApiModelProperty("鐢熶骇鍘傚晢")
+	@Column(name="MANUFACTURER")
+	private String manufacture;
+	
+	/**
+	 * 鍨嬪彿
+	 */
+	@ApiModelProperty("鍨嬪彿")
+	@Column(name="MODEL")
+	private String model;
+	
+	/**
+	 * 璁惧褰掑睘
+	 */
+	@ApiModelProperty("璁惧褰掑睘")
+	@Column(name="OWNER")
+	private String owner;
+	
+	/**
+	 * 琛屾斂鍖哄煙
+	 */
+	@ApiModelProperty("琛屾斂鍖哄煙")
+	@Column(name="CIVIL_CODE")
+	private String civilCode;
+	
+	/**
+	 * 璀﹀尯
+	 */
+	@ApiModelProperty("璀﹀尯")
+	@Column(name="BLOCK")
+	private String block;
+
+	/**
+	 * 瀹夎鍦板潃
+	 */
+	@ApiModelProperty("瀹夎鍦板潃")
+	@Column(name="ADDRESS")
+	private String address;
+	
+	/**
+	 * 鏄惁鏈夊瓙璁惧 1鏈�, 0娌℃湁
+	 */
+	@ApiModelProperty("鏄惁鏈夊瓙璁惧")
+	@Column(name="PARENTAL")
+	private String parental;
+	
+	/**
+	 * 鐖剁骇id
+	 */
+	@ApiModelProperty("鐖剁骇缂栫爜")
+	@Column(name="PARENT_ID")
+	private String parentId;
+	
+	/**
+	 * 淇′护瀹夊叏妯″紡  缂虹渷涓�0; 0:涓嶉噰鐢�; 2: S/MIME绛惧悕鏂瑰紡; 3: S/ MIME鍔犲瘑绛惧悕鍚屾椂閲囩敤鏂瑰紡; 4:鏁板瓧鎽樿鏂瑰紡
+	 */
+	@ApiModelProperty("淇′护瀹夊叏妯″紡")
+	@Column(name="SAFETY_WAY")
+	private String safetyWay;
+	
+	/**
+	 * 娉ㄥ唽鏂瑰紡 缂虹渷涓�1;1:绗﹀悎IETFRFC3261鏍囧噯鐨勮璇佹敞鍐屾ā 寮�; 2:鍩轰簬鍙d护鐨勫弻鍚戣璇佹敞鍐屾ā寮�; 3:鍩轰簬鏁板瓧璇佷功鐨勫弻鍚戣璇佹敞鍐屾ā寮�
+	 */
+	@ApiModelProperty("娉ㄥ唽鏂瑰紡")
+	@Column(name="REGISTER_WAY")
+	private String registerWay;
+	
+	/**
+	 * 璇佷功搴忓垪鍙�
+	 */
+	@ApiModelProperty("璇佷功搴忓垪鍙�")
+	@Column(name="CERT_NUM")
+	private String certNum;
+	
+	/**
+	 * 璇佷功鏈夋晥鏍囪瘑 缂虹渷涓�0;璇佷功鏈夋晥鏍囪瘑:0:鏃犳晥1: 鏈夋晥
+	 */
+	@ApiModelProperty("璇佷功鏈夋晥鏍囪瘑")
+	@Column(name="CERT_VALID")
+	private String certValid;
+	
+	/**
+	 * 璇佷功鏃犳晥鍘熷洜鐮�
+	 */
+	@ApiModelProperty("璇佷功鏃犳晥鍘熷洜鐮�")
+	@Column(name="CERT_ERRCODE")
+	private String certErrCode;
+	
+	/**
+	 * 璇佷功缁堟鏈夋晥鏈�
+	 */
+	@ApiModelProperty("璇佷功缁堟鏈夋晥鏈�")
+	@Column(name="CERT_ENDTIME")
+	private String certEndTime;
+	
+	/**
+	 * 淇濆瘑灞炴�� 缂虹渷涓�0; 0:涓嶆秹瀵�, 1:娑夊瘑
+	 */
+	@ApiModelProperty("淇濆瘑灞炴��")
+	@Column(name="SECRECY")
+	private String secrecy;
+	
+	/**
+	 * IP鍦板潃
+	 */
+	@ApiModelProperty("IP鍦板潃")
+	@Column(name="IP")
+	private String ip;
+	
+	/**
+	 * 绔彛鍙�
+	 */
+	@ApiModelProperty("绔彛鍙�")
+	@Column(name="PORT")
+	private Integer port;
+	
+	/**
+	 * 瀵嗙爜
+	 */
+	@ApiModelProperty("瀵嗙爜")
+	@Column(name="PASSWORD")
+	private String password;	 
+	
+	/**
+	 * 鍦ㄧ嚎/绂荤嚎
+	 * 1鍦ㄧ嚎,0绂荤嚎
+	 * 榛樿鍦ㄧ嚎
+	 * 淇′护:
+	 * <Status>ON</Status>
+	 * <Status>OFF</Status>
+	 * 閬囧埌杩嘚VR涓嬬殑IPC涓嬪彂淇′护鍙互鎺ㄦ祦锛� 浣嗘槸 Status 鍝嶅簲 OFF
+	 */
+	@ApiModelProperty("鐘舵��")
+	@Column(name="ONLINE")
+	private String online;
+
+	/**
+	 * 缁忓害
+	 */
+	@ApiModelProperty("缁忓害")
+	@Column(name="LONGITUDE")
+	private double longitude;
+	
+	/**
+	 * 绾害
+	 */
+	@ApiModelProperty("绾害")
+	@Column(name="LATITUDE")
+	private double latitude;
+
+	public String getChannelId() {
+		return channelId;
+	}
+
+	public void setChannelId(String channelId) {
+		this.channelId = channelId;
+	}
+
+	public String getDeviceId() {
+		return deviceId;
+	}
+
+	public void setDeviceId(String deviceId) {
+		this.deviceId = deviceId;
+	}
+
+	public String getChannelName() {
+		return channelName;
+	}
+
+	public void setChannelName(String channelName) {
+		this.channelName = channelName;
+	}
+
+	public String getOnline() {
+		return online;
+	}
+
+	public void setOnline(String online) {
+		this.online = online;
+	}
+
+	public String getManufacture() {
+		return manufacture;
+	}
+
+	public void setManufacture(String manufacture) {
+		this.manufacture = manufacture;
+	}
+
+	public String getModel() {
+		return model;
+	}
+
+	public void setModel(String model) {
+		this.model = model;
+	}
+
+	public String getOwner() {
+		return owner;
+	}
+
+	public void setOwner(String owner) {
+		this.owner = owner;
+	}
+
+	public String getCivilCode() {
+		return civilCode;
+	}
+
+	public void setCivilCode(String civilCode) {
+		this.civilCode = civilCode;
+	}
+
+	public String getBlock() {
+		return block;
+	}
+
+	public void setBlock(String block) {
+		this.block = block;
+	}
+
+	public String getAddress() {
+		return address;
+	}
+
+	public void setAddress(String address) {
+		this.address = address;
+	}
+
+	public String getParental() {
+		return parental;
+	}
+
+	public void setParental(String parental) {
+		this.parental = parental;
+	}
+
+	public String getParentId() {
+		return parentId;
+	}
+
+	public void setParentId(String parentId) {
+		this.parentId = parentId;
+	}
+
+	public String getSafetyWay() {
+		return safetyWay;
+	}
+
+	public void setSafetyWay(String safetyWay) {
+		this.safetyWay = safetyWay;
+	}
+
+	public String getRegisterWay() {
+		return registerWay;
+	}
+
+	public void setRegisterWay(String registerWay) {
+		this.registerWay = registerWay;
+	}
+
+	public String getCertNum() {
+		return certNum;
+	}
+
+	public void setCertNum(String certNum) {
+		this.certNum = certNum;
+	}
+
+	public String getCertValid() {
+		return certValid;
+	}
+
+	public void setCertValid(String certValid) {
+		this.certValid = certValid;
+	}
+
+	public String getCertErrCode() {
+		return certErrCode;
+	}
+
+	public void setCertErrCode(String certErrCode) {
+		this.certErrCode = certErrCode;
+	}
+
+	public String getCertEndTime() {
+		return certEndTime;
+	}
+
+	public void setCertEndTime(String certEndTime) {
+		this.certEndTime = certEndTime;
+	}
+
+	public String getSecrecy() {
+		return secrecy;
+	}
+
+	public void setSecrecy(String secrecy) {
+		this.secrecy = secrecy;
+	}
+
+	public String getIp() {
+		return ip;
+	}
+
+	public void setIp(String ip) {
+		this.ip = ip;
+	}
+
+	public Integer getPort() {
+		return port;
+	}
+
+	public void setPort(Integer port) {
+		this.port = port;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public double getLongitude() {
+		return longitude;
+	}
+
+	public void setLongitude(double longitude) {
+		this.longitude = longitude;
+	}
+
+	public double getLatitude() {
+		return latitude;
+	}
+
+	public void setLatitude(double latitude) {
+		this.latitude = latitude;
+	}
+}

--
Gitblit v1.8.0