From c223d4e4ec4e908d12776f22f48b99ff4525aed1 Mon Sep 17 00:00:00 2001
From: Lawrence <1934378145@qq.com>
Date: 星期三, 27 一月 2021 15:31:31 +0800
Subject: [PATCH] 增加数据格式检验,避免设备返回错误格式造成抛错误

---
 src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java |  460 +++++++++++++++++++++++++++++---------------------------
 1 files changed, 237 insertions(+), 223 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 4d08fcc..25a35a4 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
@@ -1,223 +1,237 @@
-package com.genersoft.iot.vmp.gb28181;
-
-import java.util.Properties;
-
-import javax.sip.DialogTerminatedEvent;
-import javax.sip.IOExceptionEvent;
-import javax.sip.ListeningPoint;
-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.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{
-	
-	private final static Logger logger = LoggerFactory.getLogger(SipLayer.class);
-	
-	@Autowired
-	private SipConfig config;
-	
-	private SipProvider tcpSipProvider;
-	
-	private SipProvider udpSipProvider;
-	
-	@Autowired
-	private SIPProcessorFactory processorFactory;
-	
-	private SipStack sipStack;
-	
-	private AddressFactory addressFactory;
-	private HeaderFactory headerFactory;
-	private MessageFactory messageFactory;
-
-	@Bean
-	private boolean initSipServer() throws Exception {
-		SipFactory sipFactory = SipFactory.getInstance();
-		sipFactory.setPathName("gov.nist");
-		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", config.getSipIp());
-		/**
-		 * 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", "16");
-		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);
-		
-		try {
-			startTcpListener();
-			startUdpListener();
-		} catch (Exception e) {
-			logger.error("Sip Server 鍚姩澶辫触锛� port {"+config.getSipPort()+"}");
-			e.printStackTrace();
-			throw e;
-		}
-		logger.info("Sip Server 鍚姩鎴愬姛 port {"+config.getSipPort()+"}");
-		return true;
-	}
-	
-	private void startTcpListener() throws Exception {
-		ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(config.getSipIp(), config.getSipPort(), "TCP");
-		tcpSipProvider = sipStack.createSipProvider(tcpListeningPoint);
-		tcpSipProvider.addSipListener(this);
-    }
-	
-    private void startUdpListener() throws Exception {
-		ListeningPoint udpListeningPoint = sipStack.createListeningPoint(config.getSipIp(), config.getSipPort(), "UDP");
-		udpSipProvider = sipStack.createSipProvider(udpListeningPoint);
-		udpSipProvider.addSipListener(this);
-    }
-
-	/**
-	 * SIP鏈嶅姟绔帴鏀舵秷鎭殑鏂规硶 Content 閲岄潰鏄疓BK缂栫爜 This method is called by the SIP stack when a
-	 * new request arrives.
-	 */
-	@Override
-	public void processRequest(RequestEvent evt) {
-		ISIPRequestProcessor processor = processorFactory.createRequestProcessor(evt);
-		processor.process(evt, this, getServerTransaction(evt));
-	}
-
-	@Override
-	public void processResponse(ResponseEvent evt) {
-		Response response = evt.getResponse();
-		int status = response.getStatusCode();
-		if ((status >= 200) && (status < 300)) { // Success!
-			ISIPResponseProcessor processor = processorFactory.createResponseProcessor(evt);
-			processor.process(evt,this,config);
-		} else {
-			logger.warn("鎺ユ敹鍒板け璐ョ殑response鍝嶅簲锛乻tatus锛�"+status+",message:"+response.getContent().toString());
-		}
-		//trying涓嶄細鍥炲
-		if(status == Response.TRYING){
-
-		}
-	}
-
-	/**   
-	 * <p>Title: processTimeout</p>   
-	 * <p>Description: </p>   
-	 * @param timeoutEvent    
-	 */  
-	@Override
-	public void processTimeout(TimeoutEvent timeoutEvent) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	/**   
-	 * <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
-		
-	}
-
-	/**   
-	 * <p>Title: processDialogTerminated</p>   
-	 * <p>Description: </p>   
-	 * @param dialogTerminatedEvent    
-	 */  
-	@Override
-	public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) {
-		// TODO Auto-generated method stub
-		
-	}
-	
-	private 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;
-	}
-	
-}
+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.message.Response;
+
+import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
+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.response.ISIPResponseProcessor;
+
+import gov.nist.javax.sip.SipStackImpl;
+
+@Component
+public class SipLayer implements SipListener {
+
+	private final static Logger logger = LoggerFactory.getLogger(SipLayer.class);
+
+	@Autowired
+	private SipConfig sipConfig;
+
+	@Autowired
+	private SIPProcessorFactory processorFactory;
+
+	@Autowired
+	private SipSubscribe sipSubscribe;
+
+	private SipStack sipStack;
+
+	private SipFactory sipFactory;
+
+	/**   
+	 * 娑堟伅澶勭悊鍣ㄧ嚎绋嬫睜
+	 */
+	private ThreadPoolExecutor processThreadPool;
+
+	@Bean("initSipServer")
+	private ThreadPoolExecutor initSipServer() {
+		
+		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());
+		return processThreadPool;
+	}
+	
+	@Bean("sipFactory")
+	@DependsOn("initSipServer")
+	private SipFactory createSipFactory() {
+		sipFactory = SipFactory.getInstance();
+		sipFactory.setPathName("gov.nist");
+		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;
+	}
+
+	@Bean("tcpSipProvider")
+	@DependsOn("sipStack")
+	private SipProvider startTcpListener() {
+		ListeningPoint tcpListeningPoint = null;
+		SipProvider tcpSipProvider  = null;
+		try {
+			tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(), "TCP");
+			tcpSipProvider = sipStack.createSipProvider(tcpListeningPoint);
+			tcpSipProvider.addSipListener(this);
+			logger.info("Sip Server TCP 鍚姩鎴愬姛 port {" + sipConfig.getSipPort() + "}");
+		} catch (TransportNotSupportedException | InvalidArgumentException | TooManyListenersException | ObjectInUseException e) {
+			logger.error(String.format("鍒涘缓SIP鏈嶅姟澶辫触: %s", e.getMessage()));
+		}
+		return tcpSipProvider;
+	}
+	
+	@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 UDP 鍚姩鎴愬姛 port {" + sipConfig.getSipPort() + "}");
+		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)) { // 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) {
+						subscribe.response(evt);
+					}
+				}
+			}
+		// } else if (status == Response.TRYING) {
+			// trying涓嶄細鍥炲
+		} 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) {
+						subscribe.response(evt);
+					}
+				}
+			}
+		}
+
+
+
+	}
+
+	/**
+	 * <p>
+	 * Title: processTimeout
+	 * </p>
+	 * <p>
+	 * Description:
+	 * </p>
+	 * 
+	 * @param timeoutEvent
+	 */
+	@Override
+	public void processTimeout(TimeoutEvent timeoutEvent) {
+		// TODO Auto-generated method stub
+
+	}
+
+	/**
+	 * <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
+
+	}
+
+	/**
+	 * <p>
+	 * Title: processDialogTerminated
+	 * </p>
+	 * <p>
+	 * Description:
+	 * </p>
+	 * 
+	 * @param dialogTerminatedEvent
+	 */
+	@Override
+	public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) {
+		// TODO Auto-generated method stub
+
+	}
+
+}

--
Gitblit v1.8.0