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