From 39078225f1104eeaed21b24a024457b892fa7f7a Mon Sep 17 00:00:00 2001
From: panlinlin <648540858@qq.com>
Date: 星期一, 26 四月 2021 18:38:57 +0800
Subject: [PATCH] 优化级联时的异常处理

---
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java                                            |   26 +++--
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java                                                |   10 ++
 src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java                                                   |    8 +
 src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java                                                |    3 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java                            |    2 
 src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java                                          |    2 
 src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java                                      |   14 ++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java                       |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java                   |    2 
 src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java                                              |    3 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java                |    5 
 src/main/resources/application-dev.yml                                                                            |    8 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/RegisterResponseProcessor.java                 |    5 
 src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java                                                     |   33 ++++++
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java                                                      |    4 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEventLister.java |    1 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java                        |    1 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEventLister.java         |   41 +++++++
 src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java                                        |    5 
 src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java                                   |   17 +++
 src/main/java/com/genersoft/iot/vmp/conf/ApplicationCheckRunner.java                                              |    2 
 src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java                                           |   13 ++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java                     |   11 ++
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java                                            |   32 ++++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java                    |    7 +
 25 files changed, 226 insertions(+), 31 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/conf/ApplicationCheckRunner.java b/src/main/java/com/genersoft/iot/vmp/conf/ApplicationCheckRunner.java
index faa9ef1..108b434 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/ApplicationCheckRunner.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/ApplicationCheckRunner.java
@@ -55,7 +55,7 @@
             System.exit(1);
         }
 
-        if (mediaIp.equals("localhost") || mediaIp.equals("127.0.0.1")) {
+        if (mediaIp.equals("localhost") || (mediaIp.equals("127.0.0.1") && mediaWanIp == null)) {
             logger.warn("mediaIp.ip浣跨敤 {} ,灏嗘棤娉曟敹鍒扮綉缁滃唴鍏朵粬璁惧鐨勬帹娴�!!!", mediaIp );
         }
 
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java b/src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java
new file mode 100644
index 0000000..fbe07c7
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java
@@ -0,0 +1,33 @@
+package com.genersoft.iot.vmp.conf;
+
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
+import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 绯荤粺鍚姩鏃舵帶鍒惰澶囩绾�
+ */
+@Component
+@Order(value=4)
+public class SipDeviceRunner implements CommandLineRunner {
+
+    @Autowired
+    private IVideoManagerStorager storager;
+
+    @Autowired
+    private IRedisCatchStorage redisCatchStorage;
+
+    @Override
+    public void run(String... args) throws Exception {
+        // 璁剧疆鎵�鏈夎澶囩绾�
+        storager.outlineForAll();
+    }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java b/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java
index 3586207..41b68cc 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java
@@ -3,6 +3,7 @@
 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
+import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,6 +29,10 @@
     @Autowired
     private EventPublisher publisher;
 
+    @Autowired
+    private ZLMRTPServerFactory zlmrtpServerFactory;
+
+
     @Override
     public void run(String... args) throws Exception {
         // 璁剧疆鎵�鏈夊钩鍙扮绾�
@@ -36,6 +41,9 @@
         // 娓呯悊鎵�鏈夊钩鍙版敞鍐岀紦瀛�
         redisCatchStorage.cleanPlatformRegisterInfos();
 
+        // 鍋滄鎵�鏈夋帹娴�
+//        zlmrtpServerFactory.closeAllSendRtpStream();
+
         List<ParentPlatform> parentPlatforms = storager.queryEnableParentPlatformList(true);
 
         for (ParentPlatform parentPlatform : parentPlatforms) {
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java
index aa642c6..c6e77ca 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java
@@ -111,7 +111,7 @@
         http.headers().contentTypeOptions().disable();
         http.authorizeRequests()
                 // 鏀捐鎺ュ彛
-                .antMatchers("/api/user/login","/index/hook/**").permitAll()
+                .antMatchers("/#/**", "/api/user/login","/index/hook/**").permitAll()
                 // 闄や笂闈㈠鐨勬墍鏈夎姹傚叏閮ㄩ渶瑕侀壌鏉冭璇�
                 .anyRequest().authenticated()
                 // 寮傚父澶勭悊(鏉冮檺鎷掔粷銆佺櫥褰曞け鏁堢瓑)
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 13ed98a..0999736 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
@@ -39,8 +39,8 @@
         //  鑾峰彇澶辨晥鐨刱ey
         String expiredKey = message.toString();
         logger.info(expiredKey);
-        if(!expiredKey.startsWith(VideoManagerConstants.PLATFORM_PREFIX)){
-        	logger.info("鏀跺埌redis杩囨湡鐩戝惉锛屼絾寮�澶翠笉鏄�"+VideoManagerConstants.PLATFORM_PREFIX+"锛屽拷鐣�");
+        if(!expiredKey.startsWith(VideoManagerConstants.PLATFORM_KEEPLIVEKEY_PREFIX)){
+        	logger.debug("鏀跺埌redis杩囨湡鐩戝惉锛屼絾寮�澶翠笉鏄�"+VideoManagerConstants.PLATFORM_KEEPLIVEKEY_PREFIX+"锛屽拷鐣�");
         	return;
         }
         // 骞冲彴蹇冭烦鍒版湡,闇�瑕侀噸鍙�, 鍒ゆ柇鏄惁宸茬粡澶氭鏈敹鍒板績璺冲洖澶�, 澶氭鏈敹鍒�,鍒欓噸鏂板彂璧锋敞鍐�, 娉ㄥ唽灏濊瘯澶氭鏈緱鍒板洖澶�,鍒欒涓哄钩鍙扮绾�
@@ -49,7 +49,6 @@
 
             publisher.platformKeepaliveExpireEventPublish(platformGBId);
         }else if (expiredKey.startsWith(VideoManagerConstants.PLATFORM_REGISTER_PREFIX)) {
-            logger.info("11111111111111");
             String platformGBId = expiredKey.substring(VideoManagerConstants.PLATFORM_REGISTER_PREFIX.length(),expiredKey.length());
 
             publisher.platformNotRegisterEventPublish(platformGBId);
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 27ced6c..cc871ef 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
@@ -38,7 +38,7 @@
         //  鑾峰彇澶辨晥鐨刱ey
         String expiredKey = message.toString();
         if(!expiredKey.startsWith(VideoManagerConstants.KEEPLIVEKEY_PREFIX)){
-        	logger.info("鏀跺埌redis杩囨湡鐩戝惉锛屼絾寮�澶翠笉鏄�"+VideoManagerConstants.KEEPLIVEKEY_PREFIX+"锛屽拷鐣�");
+        	logger.debug("鏀跺埌redis杩囨湡鐩戝惉锛屼絾寮�澶翠笉鏄�"+VideoManagerConstants.KEEPLIVEKEY_PREFIX+"锛屽拷鐣�");
         	return;
         }
         
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 4e2561c..480ed1d 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
@@ -63,6 +63,7 @@
         if (parentPlatformCatch.getKeepAliveReply() >= 3) {
             // 鏈�3娆℃湭鏀跺埌蹇冭烦鍥炲, 璁剧疆骞冲彴鐘舵�佷负绂荤嚎, 寮�濮嬮噸鏂版敞鍐�
             logger.warn("鏈�3娆℃湭鏀跺埌蹇冭烦鍥炲,鏍囪璁剧疆骞冲彴鐘舵�佷负绂荤嚎, 骞堕噸鏂版敞鍐� 骞冲彴鍥芥爣ID锛�" + event.getPlatformGbID());
+            storager.updateParentPlatformStatus(event.getPlatformGbID(), false);
             publisher.platformNotRegisterEventPublish(event.getPlatformGbID());
             parentPlatformCatch.setKeepAliveReply(0);
         }else {
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 b9b0089..a53583b 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
@@ -1,13 +1,20 @@
 package com.genersoft.iot.vmp.gb28181.event.platformNotRegister;
 
 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
+import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
+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.context.ApplicationListener;
 import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @Description: 骞冲彴鏈敞鍐屼簨浠�,鏉ユ簮鏈変簩:
@@ -23,9 +30,14 @@
 
     @Autowired
     private IVideoManagerStorager storager;
+    @Autowired
+    private IRedisCatchStorage redisCatchStorage;
 
     @Autowired
     private SIPCommanderFroPlatform sipCommanderFroPlatform;
+
+    @Autowired
+    private ZLMRTPServerFactory zlmrtpServerFactory;
 
     // @Autowired
     // private RedisUtil redis;
@@ -33,13 +45,38 @@
     @Override
     public void onApplicationEvent(PlatformNotRegisterEvent event) {
 
-        logger.debug("骞冲彴鏈敞鍐屼簨浠惰Е鍙戯紝骞冲彴鍥芥爣ID锛�" + event.getPlatformGbID());
+        logger.info("骞冲彴鏈敞鍐屼簨浠惰Е鍙戯紝骞冲彴鍥芥爣ID锛�" + event.getPlatformGbID());
 
         ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(event.getPlatformGbID());
         if (parentPlatform == null) {
-            logger.debug("骞冲彴鏈敞鍐屼簨浠惰Е鍙戯紝浣嗗钩鍙板凡缁忓垹闄�!!! 骞冲彴鍥芥爣ID锛�" + event.getPlatformGbID());
+            logger.info("骞冲彴鏈敞鍐屼簨浠惰Е鍙戯紝浣嗗钩鍙板凡缁忓垹闄�!!! 骞冲彴鍥芥爣ID锛�" + event.getPlatformGbID());
             return;
         }
+        // 鏌ヨ鏄惁鏈夋帹娴侊紝 濡傛灉鏈夊垯閮藉仠姝�
+        List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServer(event.getPlatformGbID());
+        logger.info("鍋滄[ {} ]鐨勬墍鏈夋帹娴乻ize", sendRtpItems.size());
+        if (sendRtpItems != null && sendRtpItems.size() > 0) {
+            logger.info("鍋滄[ {} ]鐨勬墍鏈夋帹娴�", event.getPlatformGbID());
+            StringBuilder app = new StringBuilder();
+            StringBuilder stream = new StringBuilder();
+            for (int i = 0; i < sendRtpItems.size(); i++) {
+                if (app.length() != 0) {
+                    app.append(",");
+                }
+                app.append(sendRtpItems.get(i).getApp());
+                if (stream.length() != 0) {
+                    stream.append(",");
+                }
+                stream.append(sendRtpItems.get(i).getStreamId());
+                redisCatchStorage.deleteSendRTPServer(event.getPlatformGbID(), sendRtpItems.get(i).getChannelId());
+            }
+            Map<String, Object> param = new HashMap<>();
+            param.put("vhost","__defaultVhost__");
+            param.put("app", app.toString());
+            param.put("stream", stream.toString());
+            zlmrtpServerFactory.stopSendRtpStream(param);
+
+        }
         sipCommanderFroPlatform.register(parentPlatform);
     }
 }
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 770edf0..b9f3f23 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
@@ -43,7 +43,7 @@
             if (totalRecordList.size() < this.recordInfo.getSumNum()) {
                 logger.info("宸茶幏鍙�" + totalRecordList.size() + "椤瑰綍鍍忔暟鎹紝鍏�" + this.recordInfo.getSumNum() + "椤�");
             } else {
-                logger.info("褰曞儚鏁版嵁宸插叏閮ㄨ幏鍙栵紝鍏�" + this.recordInfo.getSumNum() + "椤�");
+                logger.info("褰曞儚鏁版嵁宸插叏閮ㄨ幏鍙栵紝鍏� {} 椤�", this.recordInfo.getSumNum());
                 this.recordInfo.setRecordList(totalRecordList);
                 for (int i = 0; i < cacheKeys.size(); i++) {
                     redis.del(cacheKeys.get(i).toString());
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java
index 17104ba..fdb7c0b 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java
@@ -58,6 +58,7 @@
 				param.put("vhost","__defaultVhost__");
 				param.put("app",sendRtpItem.getApp());
 				param.put("stream",streamId);
+				param.put("ssrc",sendRtpItem.getSsrc());
 				logger.info("鍋滄鍚戜笂绾ф帹娴侊細" + streamId);
 				zlmrtpServerFactory.stopSendRtpStream(param);
 				redisCatchStorage.deleteSendRTPServer(platformGbId, channelId);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
index 91b6ecc..43be89d 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
@@ -93,6 +93,11 @@
 				GbStream gbStream = storager.queryStreamInParentPlatform(requesterId, channelId);
 				// 涓嶆槸閫氶亾鍙兘鏄洿鎾祦
 				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 {
 					logger.info("閫氶亾涓嶅瓨鍦紝杩斿洖404");
@@ -367,6 +372,12 @@
 		getServerTransaction(evt).sendResponse(response);
 	}
 
+	private void responseAck(RequestEvent evt, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException {
+		Response response = getMessageFactory().createResponse(statusCode, evt.getRequest());
+		response.setReasonPhrase(msg);
+		getServerTransaction(evt).sendResponse(response);
+	}
+
 	/**
 	 * 鍥炲甯dp鐨�200
 	 * @param evt
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
index a21ce59..c2f624f 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
@@ -770,14 +770,17 @@
 		try {
 			Element rootElement = getRootElement(evt);
 			String deviceId = XmlUtil.getText(rootElement, "DeviceID");
-			// 妫�鏌ヨ澶囨槸鍚﹀瓨鍦紝 涓嶅瓨鍦ㄥ垯涓嶅洖澶�
-			if (storager.exists(deviceId)) {
+			Device device = storager.queryVideoDevice(deviceId);
+			// 妫�鏌ヨ澶囨槸鍚﹀瓨鍦ㄥ苟鍦ㄧ嚎锛� 涓嶅瓨鍦ㄥ垯涓嶅洖澶�
+			if (device != null && device.getOnline() == 1) {
 				// 鍥炲200 OK
 				responseAck(evt);
 				if (offLineDetector.isOnline(deviceId)) {
 					publisher.onlineEventPublish(deviceId, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE);
 				} else {
 				}
+			}else {
+				logger.warn("鏀跺埌[ "+deviceId+" ]蹇冭烦淇℃伅, 浣嗘槸璁惧" + (device == null? "涓嶅瓨鍦�":"绂荤嚎") + ", 蹇冭烦淇℃伅涓嶄簣浠ュ洖澶�");
 			}
 		} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
 			e.printStackTrace();
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java
index c288470..7ad18c1 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java
@@ -146,7 +146,7 @@
 			// 娉ㄥ唽鎴愬姛
 			// 淇濆瓨鍒皉edis
 			// 涓嬪彂catelog鏌ヨ鐩綍
-			if (registerFlag == 1 && device != null) {
+			if (registerFlag == 1 ) {
 				logger.info("娉ㄥ唽鎴愬姛! deviceId:" + device.getDeviceId());
 				// boolean exists = storager.exists(device.getDeviceId());
 				device.setRegisterTimeMillis(System.currentTimeMillis());
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
index d6df26a..ba3003d 100644
--- 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
@@ -80,12 +80,13 @@
 			// 娉ㄥ唽/娉ㄩ攢鎴愬姛
 			logger.info(String.format("%s %s鎴愬姛", platformGBId, action));
 			redisCatchStorage.delPlatformRegisterInfo(callId);
-			parentPlatform.setStatus(true);
+			parentPlatform.setStatus("娉ㄥ唽".equals(action));
 			// 鍙栧洖Expires璁剧疆锛岄伩鍏嶆敞閿�杩囩▼涓缃负0
 			ParentPlatform parentPlatformTmp = storager.queryParentPlatByServerGBId(platformGBId);
 			String expires = parentPlatformTmp.getExpires();
 			parentPlatform.setExpires(expires);
-			storager.updateParentPlatform(parentPlatform);
+			parentPlatform.setId(parentPlatformTmp.getId());
+			storager.updateParentPlatformStatus(platformGBId, "娉ㄥ唽".equals(action));
 
 			redisCatchStorage.updatePlatformRegister(parentPlatform);
 
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
index 3b7428a..a50b170 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
@@ -1,6 +1,9 @@
 package com.genersoft.iot.vmp.media.zlm;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.genersoft.iot.vmp.conf.MediaServerConfig;
 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
@@ -119,4 +122,33 @@
             storager.mediaOutline(app, streamId);
         }
     }
+
+    public void clearAllSessions() {
+        logger.info("娓呯┖鎵�鏈夊浗鏍囩浉鍏崇殑session");
+        JSONObject allSessionJSON = zlmresTfulUtils.getAllSession();
+        MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
+        HashSet<String> allLocalPorts = new HashSet();
+        if (allSessionJSON.getInteger("code") == 0) {
+            JSONArray data = allSessionJSON.getJSONArray("data");
+            if (data.size() > 0) {
+                for (int i = 0; i < data.size(); i++) {
+                    JSONObject sessionJOSN = data.getJSONObject(i);
+                    Integer local_port = sessionJOSN.getInteger("local_port");
+                    if (!local_port.equals(Integer.valueOf(mediaInfo.getHttpPort())) &&
+                        !local_port.equals(Integer.valueOf(mediaInfo.getHttpSSLport())) &&
+                        !local_port.equals(Integer.valueOf(mediaInfo.getRtmpPort())) &&
+                        !local_port.equals(Integer.valueOf(mediaInfo.getRtspPort())) &&
+                        !local_port.equals(Integer.valueOf(mediaInfo.getRtspSSlport())) &&
+                        !local_port.equals(Integer.valueOf(mediaInfo.getHookOnFlowReport()))){
+                        allLocalPorts.add(sessionJOSN.getInteger("local_port") + "");
+                     }
+                }
+            }
+        }
+        if (allLocalPorts.size() > 0) {
+            List<String> result = new ArrayList<>(allLocalPorts);
+            String localPortSStr = String.join(",", result);
+            zlmresTfulUtils.kickSessions(localPortSStr);
+        }
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
index 8ff9224..a864f3c 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
@@ -194,4 +194,14 @@
         param.put("force", 1);
         return sendPost("close_streams",param, null);
     }
+
+    public JSONObject getAllSession() {
+        return sendPost("getAllSession",null, null);
+    }
+
+    public void kickSessions(String localPortSStr) {
+        Map<String, Object> param = new HashMap<>();
+        param.put("local_port", localPortSStr);
+        sendPost("kick_sessions",param, null);
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
index ffe91d2..430c690 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
@@ -18,13 +18,13 @@
 
     private Logger logger = LoggerFactory.getLogger("ZLMRTPServerFactory");
 
-    @Value("${media.rtp.udpPortRange}")
-    private String udpPortRange;
+    @Value("${media.rtp.portRange}")
+    private String portRange;
 
     @Autowired
     private ZLMRESTfulUtils zlmresTfulUtils;
 
-    private int[] udpPortRangeArray = new int[2];
+    private int[] portRangeArray = new int[2];
 
     private int currentPort = 0;
 
@@ -52,7 +52,7 @@
 
         Map<String, Object> param = new HashMap<>();
         int result = -1;
-        int newPort = getPortFromUdpPortRange();
+        int newPort = getPortFromportRange();
         param.put("port", newPort);
         param.put("enable_tcp", 1);
         param.put("stream_id", streamId);
@@ -101,16 +101,16 @@
         return result;
     }
 
-    private int getPortFromUdpPortRange() {
+    private int getPortFromportRange() {
         if (currentPort == 0) {
-            String[] udpPortRangeStrArray = udpPortRange.split(",");
-            udpPortRangeArray[0] = Integer.parseInt(udpPortRangeStrArray[0]);
-            udpPortRangeArray[1] = Integer.parseInt(udpPortRangeStrArray[1]);
+            String[] portRangeStrArray = portRange.split(",");
+            portRangeArray[0] = Integer.parseInt(portRangeStrArray[0]);
+            portRangeArray[1] = Integer.parseInt(portRangeStrArray[1]);
         }
 
-        if (currentPort == 0 || currentPort++ > udpPortRangeArray[1]) {
-            currentPort = udpPortRangeArray[0];
-            return udpPortRangeArray[0];
+        if (currentPort == 0 || currentPort++ > portRangeArray[1]) {
+            currentPort = portRangeArray[0];
+            return portRangeArray[0];
         } else {
             if (currentPort % 2 == 1) {
                 currentPort++;
@@ -244,4 +244,8 @@
         }
         return result;
     }
+
+    public void closeAllSendRtpStream() {
+
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
index 0e6bfc0..2bbc1be 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
@@ -164,6 +164,10 @@
         mediaServerConfig.setLocalIP(mediaIp);
         mediaServerConfig.setWanIp(StringUtils.isEmpty(mediaWanIp)? mediaIp: mediaWanIp);
         redisCatchStorage.updateMediaInfo(mediaServerConfig);
+
+        // 娓呯┖鎵�鏈塻ession
+//        zlmMediaListManager.clearAllSessions();
+
         // 鏇存柊娴佸垪琛�
         zlmMediaListManager.updateMediaList();
         // 鎭㈠娴佷唬鐞�
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
index 8b2c2bf..978ddc3 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -6,6 +6,7 @@
 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
 
+import java.util.List;
 import java.util.Map;
 
 public interface IRedisCatchStorage {
@@ -91,6 +92,8 @@
      */
     SendRtpItem querySendRTPServer(String platformGbId, String channelId);
 
+    List<SendRtpItem> querySendRTPServer(String platformGbId);
+
     /**
      * 鍒犻櫎RTP鎺ㄩ�佷俊鎭紦瀛�
      * @param platformGbId
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 3e001b0..5d838c5 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
@@ -135,6 +135,13 @@
 	 */
 	public boolean outline(String deviceId);
 
+	/**
+	 * 鏇存柊鎵�鏈夎澶囩绾�
+	 *
+	 * @return true锛氭洿鏂版垚鍔�  false锛氭洿鏂板け璐�
+	 */
+	public boolean outlineForAll();
+
 
 	/**
 	 * 鏌ヨ瀛愯澶�
@@ -352,4 +359,10 @@
 	 * @param streamId
 	 */
 	void mediaOutline(String app, String streamId);
+
+	/**
+	 * 璁剧疆骞冲彴鍦ㄧ嚎/绂荤嚎
+	 * @param online
+	 */
+	void updateParentPlatformStatus(String platformGbID, boolean online);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
index f6e328b..bcc33de 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
@@ -65,4 +65,7 @@
 
     @Delete("DELETE FROM device WHERE deviceId=#{deviceId}")
     int del(String deviceId);
+
+    @Update("UPDATE device SET online=0")
+    int outlineForAll();
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java
index c18c5c3..bb81171 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java
@@ -66,5 +66,8 @@
     ParentPlatform getParentPlatById(int id);
 
     @Update("UPDATE parent_platform SET status=false" )
-    void outlineForAllParentPlatform();
+    int outlineForAllParentPlatform();
+
+    @Update("UPDATE parent_platform SET status=#{online} WHERE serverGBId=#{platformGbID}" )
+    int updateParentPlatformStatus(String platformGbID, boolean online);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
index 98795ef..74d6779 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -233,6 +233,20 @@
         return (SendRtpItem)redis.get(key);
     }
 
+    @Override
+    public List<SendRtpItem> querySendRTPServer(String platformGbId) {
+        String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + platformGbId + "_*";
+        List<Object> queryResult = redis.scan(key);
+        List<SendRtpItem> result= new ArrayList<>();
+
+        for (int i = 0; i < queryResult.size(); i++) {
+            String keyItem = (String) queryResult.get(i);
+            result.add((SendRtpItem)redis.get(keyItem));
+        }
+
+        return result;
+    }
+
     /**
      * 鍒犻櫎RTP鎺ㄩ�佷俊鎭紦瀛�
      * @param platformGbId
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 7e206bf..cbaa404 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
@@ -257,6 +257,18 @@
 	}
 
 	/**
+	 * 鏇存柊鎵�鏈夎澶囩绾�
+	 *
+	 * @return true锛氭洿鏂版垚鍔�  false锛氭洿鏂板け璐�
+	 */
+	@Override
+	public synchronized boolean outlineForAll() {
+		logger.info("鏇存柊鎵�鏈夎澶囩绾�");
+		int result = deviceMapper.outlineForAll();
+		return result > 0;
+	}
+
+	/**
 	 * 娓呯┖閫氶亾
 	 * @param deviceId
 	 */
@@ -575,5 +587,8 @@
 		gbStreamMapper.setStatus(app, streamId, false);
 	}
 
-
+	@Override
+	public void updateParentPlatformStatus(String platformGbID, boolean online) {
+		platformMapper.updateParentPlatformStatus(platformGbID, online);
+	}
 }
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index e28925b..cdab711 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -78,12 +78,12 @@
     autoApplyPlay: false
     # [鍙�塢 閮ㄥ垎璁惧闇�瑕佹墿灞昐DP锛岄渶瑕佹墦寮�姝よ缃�
     seniorSdp: false
-    # 鍚敤udp澶氱鍙fā寮�
+    # 鍚敤澶氱鍙fā寮�, 澶氱鍙fā寮忎娇鐢ㄧ鍙e尯鍒嗘瘡璺祦锛屽吋瀹规�ф洿濂姐�� 鍗曠鍙d娇鐢ㄦ祦鐨剆src鍖哄垎锛� 鐐规挱瓒呮椂寤鸿浣跨敤澶氱鍙f祴璇�
     rtp:
-        # [鍙�塢 鏄惁鍚敤udp澶氱鍙fā寮�, 寮�鍚悗浼氬湪udpPortRange鑼冨洿鍐呴�夋嫨绔彛鐢ㄤ簬濯掍綋娴佷紶杈�
+        # [鍙�塢 鏄惁鍚敤澶氱鍙fā寮�, 寮�鍚悗浼氬湪portRange鑼冨洿鍐呴�夋嫨绔彛鐢ㄤ簬濯掍綋娴佷紶杈�
         enable: true
-        # [鍙�塢 鍦ㄦ鑼冨洿鍐呴�夋嫨绔彛鐢ㄤ簬濯掍綋娴佷紶杈�, 涓嶅彧鏄痷dp, 浣跨敤TCP琚姩浼犺緭妯″紡鏃�,涔熸槸浠庤繖涓寖鍥村唴閫夋嫨绔彛
-        udpPortRange: 30000,30500 # 绔彛鑼冨洿
+        # [鍙�塢 鍦ㄦ鑼冨洿鍐呴�夋嫨绔彛鐢ㄤ簬濯掍綋娴佷紶杈�,
+        portRange: 30000,30500 # 绔彛鑼冨洿
 
 # [鍙�塢 鏃ュ織閰嶇疆, 涓�鑸笉闇�瑕佹敼
 logging:

--
Gitblit v1.8.0