From 627a14f37e49d5e33cc5f593277ee24f913875b8 Mon Sep 17 00:00:00 2001
From: panlinlin <648540858@qq.com>
Date: 星期三, 06 一月 2021 18:35:38 +0800
Subject: [PATCH] 完成向上级联->保活

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java                    |  150 ++++++++++
 src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java                                             |   13 
 src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java                                                |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java                            |   34 ++
 src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java                                      |   26 +
 src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java                                              |   12 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java                            |    9 
 src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java                            |   92 +++---
 src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java                |   64 ++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/RegisterResponseProcessor.java                 |   19 +
 src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEventLister.java |   85 ++++++
 src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatformCatch.java                                         |   36 ++
 web_src/src/components/ParentPlatformList.vue                                                                     |    2 
 src/main/resources/wvp.sqlite                                                                                     |    0 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEventLister.java         |    9 
 src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java                                        |   54 +++
 src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java                                   |   42 ++
 README.md                                                                                                         |    2 
 src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java                                             |   10 
 src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java                                           |   38 ++
 src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformRegister.java                                            |   15 +
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java                                     |    8 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java                        |   44 ++
 web_src/src/router/index.js                                                                                       |    2 
 src/main/java/com/genersoft/iot/vmp/vmanager/platform/PlatformController.java                                     |    8 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEvent.java       |   23 +
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java                    |    1 
 src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java                                         |    3 
 28 files changed, 736 insertions(+), 67 deletions(-)

diff --git a/README.md b/README.md
index 2cca7a5..a88ea2d 100644
--- a/README.md
+++ b/README.md
@@ -39,7 +39,7 @@
 - [ ] 鍥芥爣閫氶亾鍚戜笂绾ц仈  
     - [X] WEB娣诲姞涓婄骇骞冲彴
     - [X] 娉ㄥ唽
-    - [ ] 蹇冭烦淇濇椿
+    - [X] 蹇冭烦淇濇椿
     - [ ] 閫氶亾閫夋嫨
     - [ ] 閫氶亾鎺ㄩ��
     - [ ] 鐐规挱
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 32d7d5b..5e796d7 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
@@ -20,7 +20,15 @@
 
 	public static final String PLAY_BLACK_PREFIX = "VMP_playback_";
 
-	public static final String PLATFORM_PREFIX = "VMP_platform_";
+	public static final String PLATFORM_PREFIX = "VMP_platform";
+
+	public static final String PLATFORM_KEEPLIVEKEY_PREFIX = "VMP_platform_keeplive_";
+
+	public static final String PLATFORM_CATCH_PREFIX = "VMP_platform_catch_";
+
+	public static final String PLATFORM_REGISTER_PREFIX = "VMP_platform_register_";
+
+	public static final String Pattern_Topic = "VMP_keeplive_platform_";
 
 	public static final String EVENT_ONLINE_REGISTER = "1";
 	
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java
index 16ed56a..b6ec91f 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java
@@ -1,28 +1,28 @@
 /*
-* Conditions Of Use
-*
-* This software was developed by employees of the National Institute of
-* Standards and Technology (NIST), an agency of the Federal Government.
-* Pursuant to title 15 Untied States Code Section 105, works of NIST
-* employees are not subject to copyright protection in the United States
-* and are considered to be in the public domain.  As a result, a formal
-* license is not needed to use the software.
-*
-* This software is provided by NIST as a service and is expressly
-* provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
-* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
-* AND DATA ACCURACY.  NIST does not warrant or make any representations
-* regarding the use of the software or the results thereof, including but
-* not limited to the correctness, accuracy, reliability or usefulness of
-* the software.
-*
-* Permission to use this software is contingent upon your acceptance
-* of the terms of this agreement
-*
-* .
-*
-*/
+ * Conditions Of Use
+ *
+ * This software was developed by employees of the National Institute of
+ * Standards and Technology (NIST), an agency of the Federal Government.
+ * Pursuant to title 15 Untied States Code Section 105, works of NIST
+ * employees are not subject to copyright protection in the United States
+ * and are considered to be in the public domain.  As a result, a formal
+ * license is not needed to use the software.
+ *
+ * This software is provided by NIST as a service and is expressly
+ * provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
+ * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
+ * AND DATA ACCURACY.  NIST does not warrant or make any representations
+ * regarding the use of the software or the results thereof, including but
+ * not limited to the correctness, accuracy, reliability or usefulness of
+ * the software.
+ *
+ * Permission to use this software is contingent upon your acceptance
+ * of the terms of this agreement
+ *
+ * .
+ *
+ */
 package com.genersoft.iot.vmp.gb28181.auth;
 
 import java.security.MessageDigest;
@@ -42,18 +42,18 @@
 
 /**
  * Implements the HTTP digest authentication method server side functionality.
- * 
+ *
  * @author M. Ranganathan
  * @author Marc Bednarek
  */
 
 public class DigestServerAuthenticationHelper  {
-    
+
     private MessageDigest messageDigest;
-    
+
     public static final String DEFAULT_ALGORITHM = "MD5";
     public static final String DEFAULT_SCHEME = "Digest";
-    
+
 
 
 
@@ -63,11 +63,11 @@
 
     /**
      * Default constructor.
-     * @throws NoSuchAlgorithmException 
+     * @throws NoSuchAlgorithmException
      */
-    public DigestServerAuthenticationHelper() 
-        throws NoSuchAlgorithmException {
-            messageDigest = MessageDigest.getInstance(DEFAULT_ALGORITHM);
+    public DigestServerAuthenticationHelper()
+            throws NoSuchAlgorithmException {
+        messageDigest = MessageDigest.getInstance(DEFAULT_ALGORITHM);
     }
 
     public static String toHexString(byte b[]) {
@@ -79,7 +79,7 @@
         }
         return new String(c);
     }
-    
+
     /**
      * Generate the challenge string.
      *
@@ -121,34 +121,34 @@
      *
      * @param request - the request to authenticate.
      * @param hashedPassword -- the MD5 hashed string of username:realm:plaintext password.
-     * 
+     *
      * @return true if authentication succeded and false otherwise.
      */
     public boolean doAuthenticateHashedPassword(Request request, String hashedPassword) {
-    	AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME);
+        AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME);
         if ( authHeader == null ) return false;
         String realm = authHeader.getRealm();
         String username = authHeader.getUsername();
-      
+
         if ( username == null || realm == null ) {
             return false;
         }
-       
+
         String nonce = authHeader.getNonce();
         URI uri = authHeader.getURI();
         if (uri == null) {
             return false;
         }
-        
 
-      
+
+
         String A2 = request.getMethod().toUpperCase() + ":" + uri.toString();
         String HA1 = hashedPassword;
 
-       
+
         byte[] mdbytes = messageDigest.digest(A2.getBytes());
         String HA2 = toHexString(mdbytes);
-      
+
         String cnonce = authHeader.getCNonce();
         String KD = HA1 + ":" + nonce;
         if (cnonce != null) {
@@ -158,7 +158,7 @@
         mdbytes = messageDigest.digest(KD.getBytes());
         String mdString = toHexString(mdbytes);
         String response = authHeader.getResponse();
-       
+
 
         return mdString.equals(response);
     }
@@ -168,11 +168,11 @@
      *
      * @param request - the request to authenticate.
      * @param pass -- the plain text password.
-     * 
+     *
      * @return true if authentication succeded and false otherwise.
      */
     public boolean doAuthenticatePlainTextPassword(Request request, String pass) {
-    	AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME);
+        AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME);
         if ( authHeader == null ) return false;
         String realm = authHeader.getRealm().trim();
         String username = authHeader.getUsername().trim();
@@ -184,7 +184,7 @@
         String nonce = authHeader.getNonce();
         URI uri = authHeader.getURI();
         if (uri == null) {
-           return false;
+            return false;
         }
         // qop 淇濇姢璐ㄩ噺 鍖呭惈auth锛堥粯璁ょ殑锛夊拰auth-int锛堝鍔犱簡鎶ユ枃瀹屾暣鎬ф娴嬶級涓ょ绛栫暐
         String qop = authHeader.getQop();
@@ -233,7 +233,7 @@
         String response = authHeader.getResponse();
         System.out.println("response: " + response);
         return mdString.equals(response);
-        
+
     }
 
 
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatformCatch.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatformCatch.java
new file mode 100644
index 0000000..94e8e7f
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatformCatch.java
@@ -0,0 +1,36 @@
+package com.genersoft.iot.vmp.gb28181.bean;
+
+public class ParentPlatformCatch {
+
+    private String id;
+
+    // 蹇冭烦鏈洖澶嶆鏁�
+    private int keepAliveReply;
+
+    // 娉ㄥ唽鏈洖澶嶆鏁�
+    private int registerAliveReply;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public int getKeepAliveReply() {
+        return keepAliveReply;
+    }
+
+    public void setKeepAliveReply(int keepAliveReply) {
+        this.keepAliveReply = keepAliveReply;
+    }
+
+    public int getRegisterAliveReply() {
+        return registerAliveReply;
+    }
+
+    public void setRegisterAliveReply(int registerAliveReply) {
+        this.registerAliveReply = registerAliveReply;
+    }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformRegister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformRegister.java
new file mode 100644
index 0000000..4a45862
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformRegister.java
@@ -0,0 +1,15 @@
+package com.genersoft.iot.vmp.gb28181.bean;
+
+public class PlatformRegister {
+
+    // 鏈洖澶嶆鏁�
+    private int reply;
+
+    public int getReply() {
+        return reply;
+    }
+
+    public void setReply(int reply) {
+        this.reply = reply;
+    }
+}
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 3e0a184..29f859d 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
@@ -1,8 +1,7 @@
 package com.genersoft.iot.vmp.gb28181.event;
 
-import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+import com.genersoft.iot.vmp.gb28181.event.platformKeepaliveExpire.PlatformKeepaliveExpireEvent;
 import com.genersoft.iot.vmp.gb28181.event.platformNotRegister.PlatformNotRegisterEvent;
-import com.genersoft.iot.vmp.vmanager.platform.PlatformController;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Component;
@@ -36,6 +35,16 @@
     }
 
 	/**
+	 * 骞冲彴蹇冭烦鍒版湡浜嬩欢
+	 * @param platformGbId
+	 */
+	public void platformKeepaliveExpireEventPublish(String platformGbId){
+		PlatformKeepaliveExpireEvent platformNotRegisterEvent = new PlatformKeepaliveExpireEvent(this);
+		platformNotRegisterEvent.setPlatformGbID(platformGbId);
+        applicationEventPublisher.publishEvent(platformNotRegisterEvent);
+    }
+
+	/**
 	 * 骞冲彴鏈敞鍐屼簨浠�
 	 * @param platformGbId
 	 */
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
new file mode 100644
index 0000000..1420f14
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java
@@ -0,0 +1,64 @@
+package com.genersoft.iot.vmp.gb28181.event.offline;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.connection.Message;
+import org.springframework.data.redis.connection.MessageListener;
+import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
+import org.springframework.data.redis.listener.RedisMessageListenerContainer;
+import org.springframework.stereotype.Component;
+
+import com.genersoft.iot.vmp.common.VideoManagerConstants;
+import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
+
+import java.nio.charset.StandardCharsets;
+
+/**    
+ * @Description:璁惧蹇冭烦瓒呮椂鐩戝惉,鍊熷姪redis杩囨湡鐗规�э紝杩涜鐩戝惉锛岀洃鍚埌璇存槑璁惧蹇冭烦瓒呮椂锛屽彂閫佺绾夸簨浠�
+ * @author: swwheihei
+ * @date:   2020骞�5鏈�6鏃� 涓婂崍11:35:46     
+ */
+@Component
+public class KeepaliveTimeoutListenerForPlatform extends KeyExpirationEventMessageListener {
+
+	@Autowired
+	private EventPublisher publisher;
+
+    public KeepaliveTimeoutListenerForPlatform(RedisMessageListenerContainer listenerContainer) {
+        super(listenerContainer);
+    }
+
+
+    /**
+     * 鐩戝惉澶辨晥鐨刱ey
+     * @param message
+     * @param bytes
+     */
+    @Override
+    public void onMessage(Message message, byte[] pattern) {
+        //  鑾峰彇澶辨晥鐨刱ey
+        String expiredKey = message.toString();
+        System.out.println(expiredKey);
+        if(!expiredKey.startsWith(VideoManagerConstants.PLATFORM_PREFIX)){
+        	System.out.println("鏀跺埌redis杩囨湡鐩戝惉锛屼絾寮�澶翠笉鏄�"+VideoManagerConstants.PLATFORM_PREFIX+"锛屽拷鐣�");
+        	return;
+        }
+        // 骞冲彴蹇冭烦鍒版湡,闇�瑕侀噸鍙�, 鍒ゆ柇鏄惁宸茬粡澶氭鏈敹鍒板績璺冲洖澶�, 澶氭鏈敹鍒�,鍒欓噸鏂板彂璧锋敞鍐�, 娉ㄥ唽灏濊瘯澶氭鏈緱鍒板洖澶�,鍒欒涓哄钩鍙扮绾�
+        if (expiredKey.startsWith(VideoManagerConstants.PLATFORM_KEEPLIVEKEY_PREFIX)) {
+            String platformGBId = expiredKey.substring(VideoManagerConstants.PLATFORM_KEEPLIVEKEY_PREFIX.length(),expiredKey.length());
+
+            publisher.platformKeepaliveExpireEventPublish(platformGBId);
+        }else if (expiredKey.startsWith(VideoManagerConstants.PLATFORM_REGISTER_PREFIX)) {
+            System.out.println("11111111111111");
+            String platformGBId = expiredKey.substring(VideoManagerConstants.PLATFORM_REGISTER_PREFIX.length(),expiredKey.length());
+
+            publisher.platformNotRegisterEventPublish(platformGBId);
+        }else{
+            String deviceId = expiredKey.substring(VideoManagerConstants.KEEPLIVEKEY_PREFIX.length(),expiredKey.length());
+            publisher.outlineEventPublish(deviceId, VideoManagerConstants.EVENT_OUTLINE_TIMEOUT);
+        }
+
+    }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEvent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEvent.java
new file mode 100644
index 0000000..4ea9bc3
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEvent.java
@@ -0,0 +1,23 @@
+package com.genersoft.iot.vmp.gb28181.event.platformKeepaliveExpire;
+
+import org.springframework.context.ApplicationEvent;
+
+/**
+ *  骞冲彴蹇冭烦瓒呮椂浜嬩欢
+ */
+public class PlatformKeepaliveExpireEvent extends ApplicationEvent {
+
+    private String platformGbID;
+
+    public PlatformKeepaliveExpireEvent(Object source) {
+        super(source);
+    }
+
+    public String getPlatformGbID() {
+        return platformGbID;
+    }
+
+    public void setPlatformGbID(String platformGbID) {
+        this.platformGbID = platformGbID;
+    }
+}
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
new file mode 100644
index 0000000..11f248a
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEventLister.java
@@ -0,0 +1,85 @@
+package com.genersoft.iot.vmp.gb28181.event.platformKeepaliveExpire;
+
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
+import com.genersoft.iot.vmp.gb28181.bean.PlatformRegister;
+import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
+import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
+import org.jetbrains.annotations.NotNull;
+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 javax.sip.ResponseEvent;
+import javax.sip.message.Response;
+
+/**
+ * @Description: 骞冲彴蹇冭烦瓒呮椂浜嬩欢
+ * @author: panll
+ * @date: 2020骞�11鏈�5鏃� 10:00
+ */
+@Component
+public class PlatformKeepaliveExpireEventLister implements ApplicationListener<PlatformKeepaliveExpireEvent> {
+
+
+    private final static Logger logger = LoggerFactory.getLogger(PlatformKeepaliveExpireEventLister.class);
+
+    @Autowired
+    private IVideoManagerStorager storager;
+
+    @Autowired
+    private IRedisCatchStorage redisCatchStorage;
+
+    @Autowired
+    private ISIPCommanderForPlatform sipCommanderForPlatform;
+
+    @Autowired
+    private SipSubscribe sipSubscribe;
+
+    @Autowired
+    private EventPublisher publisher;
+
+    @Override
+    public void onApplicationEvent(@NotNull PlatformKeepaliveExpireEvent event) {
+
+        if (logger.isDebugEnabled()) {
+            logger.debug("骞冲彴蹇冭烦鍒版湡浜嬩欢浜嬩欢瑙﹀彂锛屽钩鍙板浗鏍嘔D锛�" + event.getPlatformGbID());
+        }
+        ParentPlatform parentPlatform = storager.queryParentPlatById(event.getPlatformGbID());
+        ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(event.getPlatformGbID());
+        if (parentPlatform == null) {
+            logger.debug("骞冲彴蹇冭烦鍒版湡浜嬩欢浜嬩欢瑙﹀彂锛屼絾骞冲彴宸茬粡鍒犻櫎!!! 骞冲彴鍥芥爣ID锛�" + event.getPlatformGbID());
+            return;
+        }
+        if (parentPlatformCatch == null) {
+            return;
+        }
+        // 鍙戦�佸績璺�
+        if (parentPlatformCatch.getKeepAliveReply() >= 3) {
+            // 鏈�3娆℃湭鏀跺埌蹇冭烦鍥炲, 璁剧疆骞冲彴鐘舵�佷负绂荤嚎, 寮�濮嬮噸鏂版敞鍐�
+            logger.warn("鏈�3娆℃湭鏀跺埌蹇冭烦鍥炲,鏍囪璁剧疆骞冲彴鐘舵�佷负绂荤嚎, 骞堕噸鏂版敞鍐� 骞冲彴鍥芥爣ID锛�" + event.getPlatformGbID());
+            publisher.platformNotRegisterEventPublish(event.getPlatformGbID());
+        }else {
+            // 鍐嶆鍙戦�佸績璺�
+            String callId = sipCommanderForPlatform.keepalive(parentPlatform);
+
+            parentPlatformCatch.setKeepAliveReply( parentPlatformCatch.getKeepAliveReply() + 1);
+            // 瀛樺偍蹇冭烦淇℃伅, 骞惰缃姸鎬佷负鏈洖澶�, 濡傛灉澶氭杩囨湡浠嶆湭鏀跺埌鍥炲,鍒欒涓轰笂绾у钩鍙板凡缁忕绾�
+            redisCatchStorage.updatePlatformKeepalive(parentPlatform);
+            redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch);
+
+            sipSubscribe.addOkSubscribe(callId, (ResponseEvent responseEvent) ->{
+                if (responseEvent.getResponse().getStatusCode() == Response.OK) {
+                    // 鏀跺埌蹇冭烦鍝嶅簲淇℃伅,
+                    parentPlatformCatch.setKeepAliveReply(0);
+                    redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch);
+                }
+            } );
+        }
+    }
+}
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 564d382..9ef66eb 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
@@ -3,6 +3,7 @@
 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
 import com.genersoft.iot.vmp.gb28181.event.online.OnlineEvent;
 import com.genersoft.iot.vmp.gb28181.event.online.OnlineEventListener;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 import com.genersoft.iot.vmp.utils.redis.RedisUtil;
 import org.slf4j.Logger;
@@ -26,6 +27,8 @@
 
     @Autowired
     private IVideoManagerStorager storager;
+    @Autowired
+    private SIPCommanderFroPlatform sipCommanderFroPlatform;
 
     @Autowired
     private RedisUtil redis;
@@ -33,13 +36,13 @@
     @Override
     public void onApplicationEvent(PlatformNotRegisterEvent event) {
 
-        if (logger.isDebugEnabled()) {
-            logger.debug("骞冲彴鏈敞鍐屼簨浠惰Е鍙戯紝骞冲彴鍥芥爣ID锛�" + event.getPlatformGbID());
-        }
+        logger.debug("骞冲彴鏈敞鍐屼簨浠惰Е鍙戯紝骞冲彴鍥芥爣ID锛�" + event.getPlatformGbID());
+
         ParentPlatform parentPlatform = storager.queryParentPlatById(event.getPlatformGbID());
         if (parentPlatform == null) {
             logger.debug("骞冲彴鏈敞鍐屼簨浠惰Е鍙戯紝浣嗗钩鍙板凡缁忓垹闄�!!! 骞冲彴鍥芥爣ID锛�" + event.getPlatformGbID());
             return;
         }
+        sipCommanderFroPlatform.register(parentPlatform);
     }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
index 1e374ad..035c157 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
@@ -4,6 +4,8 @@
 import javax.sip.ResponseEvent;
 import javax.sip.SipProvider;
 import javax.sip.header.CSeqHeader;
+import javax.sip.header.CallIdHeader;
+import javax.sip.header.Header;
 import javax.sip.message.Request;
 import javax.sip.message.Response;
 
@@ -11,6 +13,7 @@
 import com.alibaba.fastjson.JSON;
 import com.genersoft.iot.vmp.gb28181.transmit.response.impl.*;
 import com.genersoft.iot.vmp.gb28181.transmit.response.impl.*;
+import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,6 +37,10 @@
 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;
@@ -88,6 +95,7 @@
 	@Lazy
 	private RegisterResponseProcessor registerResponseProcessor;
 
+
 	@Autowired
 	private OtherResponseProcessor otherResponseProcessor;
 
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java
index 9ec2b49..f372f00 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java
@@ -9,5 +9,14 @@
      * @param parentPlatform
      * @return
      */
+    boolean register(ParentPlatform parentPlatform);
+
     boolean register(ParentPlatform parentPlatform, String callId, String realm, String nonce, String scheme);
+
+    /**
+     * 鍚戜笂绾у钩鍙戦�佸績璺充俊鎭�
+     * @param parentPlatform
+     * @return callId(浣滀负鎺ュ彈鍥炲鐨勫垽瀹�)
+     */
+    String keepalive(ParentPlatform parentPlatform);
 }
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
new file mode 100644
index 0000000..af7ac2d
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java
@@ -0,0 +1,150 @@
+package com.genersoft.iot.vmp.gb28181.transmit.cmd;
+
+import com.genersoft.iot.vmp.conf.SipConfig;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
+import com.genersoft.iot.vmp.gb28181.bean.Host;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+import org.springframework.util.DigestUtils;
+
+import javax.sip.InvalidArgumentException;
+import javax.sip.PeerUnavailableException;
+import javax.sip.SipFactory;
+import javax.sip.SipProvider;
+import javax.sip.address.Address;
+import javax.sip.address.SipURI;
+import javax.sip.header.*;
+import javax.sip.message.Request;
+import javax.validation.constraints.NotNull;
+import java.text.ParseException;
+import java.util.ArrayList;
+
+/**
+ * @Description:鎽勫儚澶村懡浠equest鍒涢�犲櫒 TODO 鍐椾綑浠g爜澶寰呬紭鍖�
+ * @author: swwheihei
+ * @date: 2020骞�5鏈�6鏃� 涓婂崍9:29:02
+ */
+@Component
+public class SIPRequestHeaderPlarformProvider {
+
+	@Autowired
+	private SipConfig sipConfig;
+	
+	@Autowired
+	private SipFactory sipFactory;
+	
+	@Autowired
+	@Qualifier(value="tcpSipProvider")
+	private SipProvider tcpSipProvider;
+	
+	@Autowired
+	@Qualifier(value="udpSipProvider")
+	private SipProvider udpSipProvider;
+
+
+	public Request createKeetpaliveMessageRequest(ParentPlatform parentPlatform, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException, PeerUnavailableException {
+		Request request = null;
+		// sipuri
+		SipURI requestURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIP() + ":" + parentPlatform.getServerPort());
+		// via
+		ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
+		ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(),
+				parentPlatform.getTransport(), viaTag);
+		viaHeader.setRPort();
+		viaHeaders.add(viaHeader);
+		// from
+		SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getDeviceGBId(),
+				sipConfig.getSipIp() + ":" + sipConfig.getSipPort());
+		Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);
+		FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag);
+		// to
+		SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIP() + ":" + parentPlatform.getServerPort() );
+		Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);
+		ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, toTag);
+		// callid
+		CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
+				: udpSipProvider.getNewCallId();
+		// Forwards
+		MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
+		// ceq
+		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(1L, Request.MESSAGE);
+
+		request = sipFactory.createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
+				toHeader, viaHeaders, maxForwards);
+		ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
+		request.setContent(content, contentTypeHeader);
+		return request;
+	}
+
+
+	public Request createRegisterRequest(@NotNull ParentPlatform platform, String fromTag, String viaTag) throws ParseException, InvalidArgumentException, PeerUnavailableException {
+		Request request = null;
+		String sipAddress = sipConfig.getSipIp() + ":" + sipConfig.getSipPort();
+		//璇锋眰琛�
+		SipURI requestLine = sipFactory.createAddressFactory().createSipURI(platform.getDeviceGBId(),
+				platform.getServerIP() + ":" + platform.getServerPort());
+		//via
+		ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
+		ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(platform.getServerIP(), platform.getServerPort(), platform.getTransport(), viaTag);
+		viaHeader.setRPort();
+		viaHeaders.add(viaHeader);
+		//from
+		SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(platform.getDeviceGBId(),sipAddress);
+		Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);
+		FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag);
+		//to
+		SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(platform.getDeviceGBId(),sipAddress);
+		Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);
+		ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress,null);
+
+		//callid
+		CallIdHeader callIdHeader = null;
+		if(platform.getTransport().equals("TCP")) {
+			callIdHeader = tcpSipProvider.getNewCallId();
+		}
+		if(platform.getTransport().equals("UDP")) {
+			callIdHeader = udpSipProvider.getNewCallId();
+		}
+
+		//Forwards
+		MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
+
+		//ceq
+		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(1L, Request.REGISTER);
+		request = sipFactory.createMessageFactory().createRequest(requestLine, Request.REGISTER, callIdHeader,
+				cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
+
+		Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory()
+				.createSipURI(platform.getDeviceGBId(), sipAddress));
+		request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress));
+
+		return request;
+	}
+
+	public Request createRegisterRequest(@NotNull ParentPlatform parentPlatform, String fromTag, String viaTag,
+										 String callId, String realm, String nonce, String scheme) throws ParseException, PeerUnavailableException, InvalidArgumentException {
+		Request registerRequest = createRegisterRequest(parentPlatform, fromTag, viaTag);
+
+		CallIdHeader callIdHeader = (CallIdHeader)registerRequest.getHeader(CallIdHeader.NAME);
+		callIdHeader.setCallId(callId);
+
+		String uri = "sip:" + parentPlatform.getServerGBId() +
+				"@" + parentPlatform.getServerIP() +
+				":" + parentPlatform.getServerPort();
+
+		String HA1 = DigestUtils.md5DigestAsHex((parentPlatform.getDeviceGBId() + ":" + realm + ":" + parentPlatform.getPassword()).getBytes());
+		String HA2=DigestUtils.md5DigestAsHex((Request.REGISTER + ":" + uri).getBytes());
+		String RESPONSE = DigestUtils.md5DigestAsHex((HA1 + ":" + nonce + ":" +  HA2).getBytes());
+
+		String authorizationHeaderContent = scheme + " username=\"" + parentPlatform.getDeviceGBId() + "\", " + "realm=\""
+				+ realm + "\", uri=\"" + uri  + "\", response=\"" + RESPONSE + "\", nonce=\""
+				+ nonce + "\"";
+		AuthorizationHeader authorizationHeader = sipFactory.createHeaderFactory().createAuthorizationHeader(authorizationHeaderContent);
+		registerRequest.addHeader(authorizationHeader);
+
+		return registerRequest;
+	}
+
+}
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 739d5a9..dd2f3b7 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
@@ -238,4 +238,38 @@
 
 		return registerRequest;
 	}
+
+//	public Request createKeetpaliveMessageRequest(ParentPlatform parentPlatform, String content, String fromTag, String toTag, Object o) throws PeerUnavailableException, ParseException, InvalidArgumentException {
+//		Request request = null;
+//		// sipuri
+//		SipURI requestURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIP() + ":" + parentPlatform.getServerPort());
+//		// via
+//		ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
+//		ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(),
+//				parentPlatform.getTransport(), null);
+//		viaHeader.setRPort();
+//		viaHeaders.add(viaHeader);
+//		// from
+//		SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(),
+//				sipConfig.getSipIp() + ":" + sipConfig.getSipPort());
+//		Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);
+//		FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag);
+//		// to
+//		SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerGBDomain());
+//		Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);
+//		ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, toTag);
+//		// callid
+//		CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
+//				: udpSipProvider.getNewCallId();
+//		// Forwards
+//		MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
+//		// ceq
+//		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(1L, Request.MESSAGE);
+//
+//		request = sipFactory.createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
+//				toHeader, viaHeaders, maxForwards);
+//		ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "MANSCDP+xml");
+//		request.setContent(content, contentTypeHeader);
+//		return request;
+//	}
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
index 020b750..ecc4ed7 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
@@ -5,8 +5,8 @@
 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderPlarformProvider;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider;
-import com.genersoft.iot.vmp.media.zlm.ZLMUtils;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -15,8 +15,10 @@
 import org.springframework.stereotype.Component;
 
 import javax.sip.*;
+import javax.sip.header.CallIdHeader;
 import javax.sip.message.Request;
 import java.text.ParseException;
+import java.util.UUID;
 
 @Component
 public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
@@ -26,6 +28,9 @@
 
     @Autowired
     private SIPRequestHeaderProvider headerProvider;
+
+    @Autowired
+    private SIPRequestHeaderPlarformProvider headerProviderPlarformProvider;
 
     @Autowired
     private VideoStreamSessionManager streamSession;
@@ -41,11 +46,13 @@
     @Qualifier(value="udpSipProvider")
     private SipProvider udpSipProvider;
 
-    @Autowired
-    private ZLMUtils zlmUtils;
-
     @Value("${media.rtp.enable}")
     private boolean rtpEnable;
+
+    @Override
+    public boolean register(ParentPlatform parentPlatform) {
+        return register(parentPlatform, null, null, null, null);
+    }
 
     @Override
     public boolean register(ParentPlatform parentPlatform, @Nullable String callId, @Nullable String realm, @Nullable String nonce, @Nullable String scheme ) {
@@ -71,6 +78,35 @@
         return false;
     }
 
+    @Override
+    public String keepalive(ParentPlatform parentPlatform) {
+        String callId = null;
+        try {
+
+            StringBuffer keepaliveXml = new StringBuffer(200);
+            keepaliveXml.append("<?xml version=\"1.0\" encoding=\"GB2312\" ?>\r\n");
+            keepaliveXml.append("<Notify>\r\n");
+            keepaliveXml.append("<CmdType>Keepalive</CmdType>\r\n");
+            keepaliveXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
+            keepaliveXml.append("<DeviceID>" + parentPlatform.getServerGBId() + "</DeviceID>\r\n");
+            keepaliveXml.append("<Status>OK</Status>\r\n");
+            keepaliveXml.append("</Notify>\r\n");
+
+            Request request = headerProviderPlarformProvider.createKeetpaliveMessageRequest(
+                    parentPlatform,
+                    keepaliveXml.toString(),
+                    UUID.randomUUID().toString().replace("-", ""),
+                    UUID.randomUUID().toString().replace("-", ""),
+                    null);
+            transmitRequest(parentPlatform, request);
+            CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME);
+            callId = callIdHeader.getCallId();
+        } catch (ParseException | InvalidArgumentException | SipException e) {
+            e.printStackTrace();
+        }
+        return callId;
+    }
+
     private void transmitRequest(ParentPlatform parentPlatform, Request request) throws SipException {
         if("TCP".equals(parentPlatform.getTransport())) {
             tcpSipProvider.sendRequest(request);
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 cab4a9b..9cb63c5 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
@@ -460,6 +460,7 @@
 					cmder.streamByeCmd(streamInfo.getStreamId());
 				}
 			}
+
 		} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
 			e.printStackTrace();
 		}
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 9fb1312..0885712 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
@@ -3,9 +3,11 @@
 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.request.impl.RegisterRequestProcessor;
 import com.genersoft.iot.vmp.gb28181.transmit.response.ISIPResponseProcessor;
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 import gov.nist.core.Host;
 import gov.nist.javax.sip.address.AddressImpl;
@@ -39,6 +41,12 @@
 
 	@Autowired
 	private IVideoManagerStorager storager;
+
+	@Autowired
+	private IRedisCatchStorage redisCatchStorage;
+
+	public RegisterResponseProcessor() {
+	}
 
 	/**
 	 * 澶勭悊Register鍝嶅簲
@@ -77,6 +85,17 @@
 			logger.info(String.format("%s 娉ㄥ唽鎴愬姛", platformGBId ));
 			parentPlatform.setStatus(true);
 			storager.updateParentPlatform(parentPlatform);
+			//
+			redisCatchStorage.updatePlatformRegister(parentPlatform);
+
+			redisCatchStorage.updatePlatformKeepalive(parentPlatform);
+
+			ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getDeviceGBId());
+			if (parentPlatformCatch == null) {
+				parentPlatformCatch = new ParentPlatformCatch();
+				parentPlatformCatch.setId(parentPlatform.getDeviceGBId());
+			}
+			redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch);
 		}
 	}
 
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 8bc78b9..33ef242 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -2,6 +2,9 @@
 
 import com.genersoft.iot.vmp.common.StreamInfo;
 import com.genersoft.iot.vmp.conf.MediaServerConfig;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
+import com.genersoft.iot.vmp.gb28181.bean.PlatformRegister;
 
 import java.util.Map;
 
@@ -55,4 +58,13 @@
     boolean stopPlayback(StreamInfo streamInfo);
 
     StreamInfo queryPlaybackByDevice(String deviceId, String code);
+
+    void updatePlatformCatchInfo(ParentPlatformCatch parentPlatformCatch);
+
+    ParentPlatformCatch queryPlatformCatchInfo(String platformGbId);
+
+    void updatePlatformKeepalive(ParentPlatform parentPlatform);
+
+    void updatePlatformRegister(ParentPlatform parentPlatform);
+
 }
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 c601f7e..0dad453 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
@@ -1,9 +1,12 @@
 package com.genersoft.iot.vmp.storager;
 
 import java.util.List;
+import java.util.Map;
 
+import com.genersoft.iot.vmp.common.StreamInfo;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
 import com.github.pagehelper.PageInfo;
 
 /**    
@@ -136,4 +139,39 @@
 	 */
 	void cleanChannelsForDevice(String deviceId);
 
+
+	/**
+	 * 鏇存柊涓婄骇骞冲彴
+	 * @param parentPlatform
+	 */
+	boolean updateParentPlatform(ParentPlatform parentPlatform);
+
+
+	/**
+	 * 娣诲姞涓婄骇骞冲彴
+	 * @param parentPlatform
+	 */
+	boolean addParentPlatform(ParentPlatform parentPlatform);
+
+	/**
+	 * 鍒犻櫎涓婄骇骞冲彴
+	 * @param parentPlatform
+	 */
+	boolean deleteParentPlatform(ParentPlatform parentPlatform);
+
+
+	/**
+	 * 鍒嗛〉鑾峰彇涓婄骇骞冲彴
+	 * @param page
+	 * @param count
+	 * @return
+	 */
+	PageInfo<ParentPlatform> queryParentPlatformList(int page, int count);
+
+	/**
+	 * 鑾峰彇涓婄骇骞冲彴
+	 * @param platformGbId
+	 * @return
+	 */
+	ParentPlatform queryParentPlatById(String platformGbId);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
index eecc0bb..fb68768 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
@@ -1,6 +1,7 @@
 package com.genersoft.iot.vmp.storager.dao;
 
 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
 import org.apache.ibatis.annotations.*;
 
 import java.util.List;
@@ -48,4 +49,6 @@
     @Delete("DELETE FROM device_channel WHERE deviceId=#{deviceId}")
     int cleanChannelsByDeviceId(String deviceId);
 
+
+
 }
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 3c10618..9a41522 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
@@ -1,6 +1,7 @@
 package com.genersoft.iot.vmp.storager.dao;
 
 import com.genersoft.iot.vmp.gb28181.bean.Device;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
 import org.apache.ibatis.annotations.*;
 import org.springframework.stereotype.Repository;
 
@@ -63,4 +64,5 @@
 
     @Delete("DELETE FROM device WHERE deviceId=#{deviceId}")
     int del(String deviceId);
+
 }
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
new file mode 100644
index 0000000..4e7cd45
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java
@@ -0,0 +1,54 @@
+package com.genersoft.iot.vmp.storager.dao;
+
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 鐢ㄤ簬瀛樺偍涓婄骇骞冲彴
+ */
+@Mapper
+@Repository
+public interface ParentPlatformMapper {
+
+    @Insert("INSERT INTO parent_platform (enable, name, serverGBId, serverGBDomain, serverIP, serverPort, deviceGBId, deviceIp,  " +
+            "            devicePort, username, password, expires, keepTimeout, transport, characterSet, PTZEnable, rtcp, " +
+            "            status) " +
+            "            VALUES (${enable}, '${name}', '${serverGBId}', '${serverGBDomain}', '${serverIP}', ${serverPort}, '${deviceGBId}', '${deviceIp}', " +
+            "            '${devicePort}', '${username}', '${password}', '${expires}', '${keepTimeout}', '${transport}', '${characterSet}', ${PTZEnable}, ${rtcp}, " +
+            "            ${status})")
+    int addParentPlatform(ParentPlatform parentPlatform);
+
+    @Update("UPDATE parent_platform " +
+            "SET enable=#{enable}, " +
+            "name=#{name}," +
+            "serverGBId=#{serverGBId}," +
+            "serverGBDomain=#{serverGBDomain}, " +
+            "serverIP=#{serverIP}," +
+            "serverPort=#{serverPort}, " +
+            "deviceIp=#{deviceIp}, " +
+            "devicePort=#{devicePort}, " +
+            "username=#{username}, " +
+            "password=#{password}, " +
+            "expires=#{expires}, " +
+            "keepTimeout=#{keepTimeout}, " +
+            "transport=#{transport}, " +
+            "characterSet=#{characterSet}, " +
+            "PTZEnable=#{PTZEnable}, " +
+            "rtcp=#{rtcp}, " +
+            "status=#{status} " +
+            "WHERE deviceGBId=#{deviceGBId}")
+    int updateParentPlatform(ParentPlatform parentPlatform);
+
+    @Delete("DELETE FROM parent_platform WHERE deviceGBId=#{deviceGBId}")
+    int delParentPlatform(ParentPlatform parentPlatform);
+
+
+    @Select("SELECT * FROM parent_platform")
+    List<ParentPlatform> getParentPlatformList();
+
+    @Select("SELECT * FROM parent_platform WHERE deviceGBId=#{platformGbId}")
+    ParentPlatform getParentPlatById(String platformGbId);
+}
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 cebb30b..53d3480 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
@@ -4,6 +4,9 @@
 import com.genersoft.iot.vmp.common.VideoManagerConstants;
 import com.genersoft.iot.vmp.conf.MediaServerConfig;
 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
+import com.genersoft.iot.vmp.gb28181.bean.PlatformRegister;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper;
 import com.genersoft.iot.vmp.utils.redis.RedisUtil;
@@ -163,4 +166,27 @@
         if (playLeys == null || playLeys.size() == 0) return null;
         return (StreamInfo)redis.get(playLeys.get(0).toString());
     }
+
+    @Override
+    public void updatePlatformCatchInfo(ParentPlatformCatch parentPlatformCatch) {
+        String key = VideoManagerConstants.PLATFORM_CATCH_PREFIX + parentPlatformCatch.getId();
+        redis.set(key, parentPlatformCatch);
+    }
+
+    @Override
+    public void updatePlatformKeepalive(ParentPlatform parentPlatform) {
+        String key = VideoManagerConstants.PLATFORM_KEEPLIVEKEY_PREFIX + parentPlatform.getDeviceGBId();
+        redis.set(key, "", Integer.parseInt(parentPlatform.getKeepTimeout()));
+    }
+
+    @Override
+    public void updatePlatformRegister(ParentPlatform parentPlatform) {
+        String key = VideoManagerConstants.PLATFORM_REGISTER_PREFIX + parentPlatform.getDeviceGBId();
+        redis.set(key, "", Integer.parseInt(parentPlatform.getExpires()));
+    }
+
+    @Override
+    public ParentPlatformCatch queryPlatformCatchInfo(String platformGbId) {
+        return (ParentPlatformCatch)redis.get(VideoManagerConstants.PLATFORM_CATCH_PREFIX + 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 01ed247..366032c 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
@@ -3,17 +3,17 @@
 import java.util.*;
 
 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
 import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper;
 import com.genersoft.iot.vmp.storager.dao.DeviceMapper;
+import com.genersoft.iot.vmp.storager.dao.ParentPlatformMapper;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import io.swagger.models.auth.In;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
-import org.springframework.util.StringUtils;
 
 /**    
  * @Description:瑙嗛璁惧鏁版嵁瀛樺偍-jdbc瀹炵幇
@@ -28,6 +28,9 @@
 
 	@Autowired
     private DeviceChannelMapper deviceChannelMapper;
+
+	@Autowired
+    private ParentPlatformMapper platformMapper;
 
 
 	/**
@@ -198,5 +201,40 @@
 		int result = deviceChannelMapper.cleanChannelsByDeviceId(deviceId);
 	}
 
+	@Override
+	public boolean addParentPlatform(ParentPlatform parentPlatform) {
+		int result = platformMapper.addParentPlatform(parentPlatform);
+		return result > 0;
+	}
+
+	@Override
+	public boolean updateParentPlatform(ParentPlatform parentPlatform) {
+		int result = 0;
+		if ( platformMapper.getParentPlatById(parentPlatform.getDeviceGBId()) == null) {
+			result = platformMapper.addParentPlatform(parentPlatform);
+		}else {
+			result = platformMapper.updateParentPlatform(parentPlatform);
+		}
+		return result > 0;
+	}
+
+	@Override
+	public boolean deleteParentPlatform(ParentPlatform parentPlatform) {
+		int result = platformMapper.delParentPlatform(parentPlatform);
+		return result > 0;
+	}
+
+	@Override
+	public PageInfo<ParentPlatform> queryParentPlatformList(int page, int count) {
+		PageHelper.startPage(page, count);
+		List<ParentPlatform> all = platformMapper.getParentPlatformList();
+		return new PageInfo<>(all);
+	}
+
+	@Override
+	public ParentPlatform queryParentPlatById(String platformGbId) {
+		return platformMapper.getParentPlatById(platformGbId);
+	}
+
 
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/platform/PlatformController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/platform/PlatformController.java
index a94685e..a1d3ba2 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/platform/PlatformController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/platform/PlatformController.java
@@ -1,19 +1,15 @@
 package com.genersoft.iot.vmp.vmanager.platform;
 
 import com.alibaba.fastjson.JSONObject;
-import com.genersoft.iot.vmp.common.PageResult;
-import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
-import com.genersoft.iot.vmp.vmanager.device.DeviceController;
+import com.github.pagehelper.PageInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Controller;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import com.genersoft.iot.vmp.conf.SipConfig;
@@ -46,7 +42,7 @@
     }
 
     @GetMapping("/platforms/{count}/{page}")
-    public PageResult<ParentPlatform> platforms(@PathVariable int page, @PathVariable int count){
+    public PageInfo<ParentPlatform> platforms(@PathVariable int page, @PathVariable int count){
 
         if (logger.isDebugEnabled()) {
             logger.debug("鏌ヨ鎵�鏈変笂绾ц澶嘇PI璋冪敤");
diff --git a/src/main/resources/wvp.sqlite b/src/main/resources/wvp.sqlite
index 023ea35..f31609f 100644
--- a/src/main/resources/wvp.sqlite
+++ b/src/main/resources/wvp.sqlite
Binary files differ
diff --git a/web_src/src/components/ParentPlatformList.vue b/web_src/src/components/ParentPlatformList.vue
index 98b0b41..0d3ce69 100644
--- a/web_src/src/components/ParentPlatformList.vue
+++ b/web_src/src/components/ParentPlatformList.vue
@@ -152,7 +152,7 @@
       this.$axios.get(`/api/platforms/${that.count}/${that.currentPage - 1}`)
         .then(function (res) {
           that.total = res.data.total;
-          that.platformList = res.data.data;
+          that.platformList = res.data.list;
         })
         .catch(function (error) {
           console.log(error);
diff --git a/web_src/src/router/index.js b/web_src/src/router/index.js
index 658da4e..73a5781 100644
--- a/web_src/src/router/index.js
+++ b/web_src/src/router/index.js
@@ -35,7 +35,7 @@
       path: '/channelList/:deviceId/:parentChannelId/:count/:page',
       name: 'channelList',
       component: channelList,
-    },
+    },,
     {
       path: '/parentPlatformList/:count/:page',
       name: 'parentPlatformList',

--
Gitblit v1.8.0