From 221f99c764b51c3cd284c6e5a41492c26c5c7ffc Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期五, 09 九月 2022 17:06:19 +0800 Subject: [PATCH] 优化sip消息 --- src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java | 250 +++++++++++++++++--------------------------------- 1 files changed, 85 insertions(+), 165 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 54c0711..9b57097 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java @@ -1,30 +1,22 @@ 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.message.Response; - +import com.genersoft.iot.vmp.conf.SipConfig; +import com.genersoft.iot.vmp.gb28181.transmit.ISIPProcessorObserver; +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; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; 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 javax.sip.*; +import java.util.Properties; +import java.util.TooManyListenersException; -import gov.nist.javax.sip.SipStackImpl; - -@Component -public class SipLayer implements SipListener { +@Configuration +public class SipLayer{ private final static Logger logger = LoggerFactory.getLogger(SipLayer.class); @@ -32,182 +24,110 @@ private SipConfig sipConfig; @Autowired - private SIPProcessorFactory processorFactory; + private ISIPProcessorObserver sipProcessorObserver; - private SipStack sipStack; + private SipStackImpl 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 createSipFactory() { sipFactory = SipFactory.getInstance(); sipFactory.setPathName("gov.nist"); return sipFactory; } @Bean("sipStack") - @DependsOn({"initSipServer", "sipFactory"}) - private SipStack createSipStack() throws PeerUnavailableException { + @DependsOn({"sipFactory"}) + 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"); + properties.setProperty("javax.sip.IP_ADDRESS", sipConfig.getMonitorIp()); /** - * 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; + * 瀹屾暣閰嶇疆鍙傝�� gov.nist.javax.sip.SipStackImpl锛岄渶瑕佷笅杞芥簮鐮� + * gov/nist/javax/sip/SipStackImpl.class + * sip娑堟伅鐨勮В鏋愬湪 gov.nist.javax.sip.stack.UDPMessageChannel鐨刾rocessIncomingDataPacket鏂规硶 */ - 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"); + +// * gov/nist/javax/sip/SipStackImpl.class + if (logger.isDebugEnabled()) { + properties.setProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT", "false"); + } + // 鎺ユ敹鎵�鏈塶otify璇锋眰锛屽嵆浣挎病鏈夎闃� + properties.setProperty("gov.nist.javax.sip.DELIVER_UNSOLICITED_NOTIFY", "true"); + properties.setProperty("gov.nist.javax.sip.AUTOMATIC_DIALOG_ERROR_HANDLING", "false"); + properties.setProperty("gov.nist.javax.sip.CANCEL_CLIENT_TRANSACTION_CHECKED", "false"); + // 涓篲NULL _瀵硅瘽妗嗕紶閫抇缁堟鐨刜浜嬩欢 + properties.setProperty("gov.nist.javax.sip.DELIVER_TERMINATED_EVENT_FOR_NULL_DIALOG", "true"); + // 浼氳瘽娓呯悊绛栫暐 + properties.setProperty("gov.nist.javax.sip.RELEASE_REFERENCES_STRATEGY", "Normal"); + // 澶勭悊鐢辫鏈嶅姟鍣ㄥ鐞嗙殑鍩轰簬搴曞眰TCP鐨勪繚鎸佺敓瀛樿秴鏃� + properties.setProperty("gov.nist.javax.sip.RELIABLE_CONNECTION_KEEP_ALIVE_TIMEOUT", "60"); + // 鑾峰彇瀹為檯鍐呭闀垮害锛屼笉浣跨敤header涓殑闀垮害淇℃伅 + properties.setProperty("gov.nist.javax.sip.COMPUTE_CONTENT_LENGTH_FROM_MESSAGE_BODY", "true"); + + /** + * sip_server_log.log 鍜� sip_debug_log.log ERROR, INFO, WARNING, OFF, DEBUG, TRACE + */ + properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "ERROR"); +// properties.setProperty("gov.nist.javax.sip.SIP_MESSAGE_VALVE", "com.genersoft.iot.vmp.gb28181.session.SipMessagePreprocessing"); +// if (logger.isDebugEnabled()) { +// properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "DEBUG"); +// } + sipStack = (SipStackImpl) sipFactory.createSipStack(properties); + return sipStack; } - @Bean("tcpSipProvider") + @Bean(name = "tcpSipProvider") @DependsOn("sipStack") - private SipProvider startTcpListener() { + SipProviderImpl startTcpListener() { ListeningPoint tcpListeningPoint = null; - SipProvider tcpSipProvider = null; + SipProviderImpl 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())); + tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getMonitorIp(), sipConfig.getPort(), "TCP"); + tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint); + tcpSipProvider.setDialogErrorsAutomaticallyHandled(); + tcpSipProvider.addSipListener(sipProcessorObserver); +// tcpSipProvider.setAutomaticDialogSupportEnabled(false); + logger.info("[Sip Server] TCP 鍚姩鎴愬姛 {}:{}", sipConfig.getMonitorIp(), sipConfig.getPort()); + } catch (TransportNotSupportedException e) { + e.printStackTrace(); + } catch (InvalidArgumentException e) { + logger.error("[Sip Server] 鏃犳硶浣跨敤 [ {}:{} ]浣滀负SIP[ TCP ]鏈嶅姟锛屽彲鎺掓煡: 1. sip.monitor-ip 鏄惁涓烘湰鏈虹綉鍗P; 2. sip.port 鏄惁宸茶鍗犵敤" + , sipConfig.getMonitorIp(), sipConfig.getPort()); + } catch (TooManyListenersException e) { + e.printStackTrace(); + } catch (ObjectInUseException e) { + e.printStackTrace(); } return tcpSipProvider; } - @Bean("udpSipProvider") + @Bean(name = "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(() -> { - 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(); - } - // } 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()*/); + SipProviderImpl startUdpListener() { + ListeningPoint udpListeningPoint = null; + SipProviderImpl udpSipProvider = null; + try { + udpListeningPoint = sipStack.createListeningPoint(sipConfig.getMonitorIp(), sipConfig.getPort(), "UDP"); + udpSipProvider = (SipProviderImpl)sipStack.createSipProvider(udpListeningPoint); + udpSipProvider.addSipListener(sipProcessorObserver); +// udpSipProvider.setAutomaticDialogSupportEnabled(false); + } catch (TransportNotSupportedException e) { + e.printStackTrace(); + } catch (InvalidArgumentException e) { + logger.error("[Sip Server] 鏃犳硶浣跨敤 [ {}:{} ]浣滀负SIP[ UDP ]鏈嶅姟锛屽彲鎺掓煡: 1. sip.monitor-ip 鏄惁涓烘湰鏈虹綉鍗P; 2. sip.port 鏄惁宸茶鍗犵敤" + , sipConfig.getMonitorIp(), sipConfig.getPort()); + } catch (TooManyListenersException e) { + e.printStackTrace(); + } catch (ObjectInUseException e) { + e.printStackTrace(); } - // 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 - + logger.info("[Sip Server] UDP 鍚姩鎴愬姛 {}:{}", sipConfig.getMonitorIp(), sipConfig.getPort()); + return udpSipProvider; } } -- Gitblit v1.8.0