From 54d79531795d43bf45fa8d7cb2ed2d072f7f5ccd Mon Sep 17 00:00:00 2001
From: panlinlin <648540858@qq.com>
Date: 星期四, 07 一月 2021 13:15:39 +0800
Subject: [PATCH] 完成向上级联->删除的时候注销

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java                            |  106 -----------------
 src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEventLister.java |    1 
 src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java                                      |   15 ++
 src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatformCatch.java                                         |   10 +
 src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java                                              |    6 +
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java                        |   52 +++++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java                            |   12 +
 src/main/java/com/genersoft/iot/vmp/vmanager/platform/PlatformController.java                                     |   21 +++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/RegisterResponseProcessor.java                 |   29 ++--
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java                    |   76 ++++++++++--
 src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java                                   |   16 ++
 11 files changed, 204 insertions(+), 140 deletions(-)

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
index 94e8e7f..994039a 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatformCatch.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatformCatch.java
@@ -10,6 +10,8 @@
     // 娉ㄥ唽鏈洖澶嶆鏁�
     private int registerAliveReply;
 
+    private ParentPlatform parentPlatform;
+
     public String getId() {
         return id;
     }
@@ -33,4 +35,12 @@
     public void setRegisterAliveReply(int registerAliveReply) {
         this.registerAliveReply = registerAliveReply;
     }
+
+    public ParentPlatform getParentPlatform() {
+        return parentPlatform;
+    }
+
+    public void setParentPlatform(ParentPlatform parentPlatform) {
+        this.parentPlatform = parentPlatform;
+    }
 }
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 11f248a..a7c786e 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
@@ -52,6 +52,7 @@
         }
         ParentPlatform parentPlatform = storager.queryParentPlatById(event.getPlatformGbID());
         ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(event.getPlatformGbID());
+        parentPlatformCatch.setParentPlatform(parentPlatform);
         if (parentPlatform == null) {
             logger.debug("骞冲彴蹇冭烦鍒版湡浜嬩欢浜嬩欢瑙﹀彂锛屼絾骞冲彴宸茬粡鍒犻櫎!!! 骞冲彴鍥芥爣ID锛�" + event.getPlatformGbID());
             return;
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 f372f00..beeab22 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
@@ -1,6 +1,9 @@
 package com.genersoft.iot.vmp.gb28181.transmit.cmd;
 
 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
+
+import javax.sip.header.WWWAuthenticateHeader;
 
 public interface ISIPCommanderForPlatform {
 
@@ -11,7 +14,14 @@
      */
     boolean register(ParentPlatform parentPlatform);
 
-    boolean register(ParentPlatform parentPlatform, String callId, String realm, String nonce, String scheme);
+    /**
+     * 鍚戜笂绾у钩鍙版敞閿�
+     * @param parentPlatform
+     * @return
+     */
+    boolean unregister(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent);
+
+    boolean register(ParentPlatform parentPlatform, String callId, WWWAuthenticateHeader www, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent);
 
     /**
      * 鍚戜笂绾у钩鍙戦�佸績璺充俊鎭�
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 af7ac2d..befdd95 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
@@ -20,10 +20,11 @@
 import javax.validation.constraints.NotNull;
 import java.text.ParseException;
 import java.util.ArrayList;
+import java.util.UUID;
 
 /**
- * @Description:鎽勫儚澶村懡浠equest鍒涢�犲櫒 TODO 鍐椾綑浠g爜澶寰呬紭鍖�
- * @author: swwheihei
+ * @Description: 骞冲彴鍛戒护request鍒涢�犲櫒 TODO 鍐椾綑浠g爜澶寰呬紭鍖�
+ * @author: panll
  * @date: 2020骞�5鏈�6鏃� 涓婂崍9:29:02
  */
 @Component
@@ -79,7 +80,7 @@
 	}
 
 
-	public Request createRegisterRequest(@NotNull ParentPlatform platform, String fromTag, String viaTag) throws ParseException, InvalidArgumentException, PeerUnavailableException {
+	public Request createRegisterRequest(@NotNull ParentPlatform platform, long CSeq, String fromTag, String viaTag) throws ParseException, InvalidArgumentException, PeerUnavailableException {
 		Request request = null;
 		String sipAddress = sipConfig.getSipIp() + ":" + sipConfig.getSipPort();
 		//璇锋眰琛�
@@ -112,7 +113,7 @@
 		MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
 
 		//ceq
-		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(1L, Request.REGISTER);
+		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(CSeq, Request.REGISTER);
 		request = sipFactory.createMessageFactory().createRequest(requestLine, Request.REGISTER, callIdHeader,
 				cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
 
@@ -120,28 +121,73 @@
 				.createSipURI(platform.getDeviceGBId(), sipAddress));
 		request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress));
 
+		ExpiresHeader expires = sipFactory.createHeaderFactory().createExpiresHeader(Integer.parseInt(platform.getExpires()));
+		request.addHeader(expires);
+
 		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);
+										 String callId, WWWAuthenticateHeader www ) throws ParseException, PeerUnavailableException, InvalidArgumentException {
+		Request registerRequest = createRegisterRequest(parentPlatform, 2L, fromTag, viaTag);
+
+		String realm = www.getRealm();
+		String nonce = www.getNonce();
+		String scheme = www.getScheme();
+
+		// 鍙傝�� https://blog.csdn.net/y673533511/article/details/88388138
+		// qop 淇濇姢璐ㄩ噺 鍖呭惈auth锛堥粯璁ょ殑锛夊拰auth-int锛堝鍔犱簡鎶ユ枃瀹屾暣鎬ф娴嬶級涓ょ绛栫暐
+		String qop = www.getQop();
 
 		CallIdHeader callIdHeader = (CallIdHeader)registerRequest.getHeader(CallIdHeader.NAME);
 		callIdHeader.setCallId(callId);
 
-		String uri = "sip:" + parentPlatform.getServerGBId() +
-				"@" + parentPlatform.getServerIP() +
-				":" + parentPlatform.getServerPort();
 
+		SipURI requestURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIP() + ":" + parentPlatform.getServerPort());
+		String cNonce = null;
+		String nc = "00000001";
+		if (qop != null) {
+			if ("auth".equals(qop)) {
+				// 瀹㈡埛绔殢鏈烘暟锛岃繖鏄竴涓笉閫忔槑鐨勫瓧绗︿覆鍊硷紝鐢卞鎴风鎻愪緵锛屽苟涓斿鎴风鍜屾湇鍔″櫒閮戒細浣跨敤锛屼互閬垮厤鐢ㄦ槑鏂囨枃鏈��
+				// 杩欎娇寰楀弻鏂归兘鍙互鏌ラ獙瀵规柟鐨勮韩浠斤紝骞跺娑堟伅鐨勫畬鏁存�ф彁渚涗竴浜涗繚鎶�
+				cNonce = UUID.randomUUID().toString();
+
+			}else if ("auth-int".equals(qop)){
+				// TODO
+			}
+		}
 		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 HA2=DigestUtils.md5DigestAsHex((Request.REGISTER + ":" + requestURI.toString()).getBytes());
 
-		String authorizationHeaderContent = scheme + " username=\"" + parentPlatform.getDeviceGBId() + "\", " + "realm=\""
-				+ realm + "\", uri=\"" + uri  + "\", response=\"" + RESPONSE + "\", nonce=\""
-				+ nonce + "\"";
-		AuthorizationHeader authorizationHeader = sipFactory.createHeaderFactory().createAuthorizationHeader(authorizationHeaderContent);
+		StringBuffer reStr = new StringBuffer(200);
+		reStr.append(HA1);
+		reStr.append(":");
+		reStr.append(nonce);
+		reStr.append(":");
+		if (qop != null) {
+			reStr.append(nc);
+			reStr.append(":");
+			reStr.append(cNonce);
+			reStr.append(":");
+			reStr.append(qop);
+			reStr.append(":");
+		}
+		reStr.append(HA2);
+
+		String RESPONSE = DigestUtils.md5DigestAsHex(reStr.toString().getBytes());
+
+		AuthorizationHeader authorizationHeader = sipFactory.createHeaderFactory().createAuthorizationHeader(scheme);
+		authorizationHeader.setUsername(parentPlatform.getDeviceGBId());
+		authorizationHeader.setRealm(realm);
+		authorizationHeader.setNonce(nonce);
+		authorizationHeader.setURI(requestURI);
+		authorizationHeader.setResponse(RESPONSE);
+		authorizationHeader.setAlgorithm("MD5");
+		if (qop != null) {
+			authorizationHeader.setQop(qop);
+			authorizationHeader.setCNonce(cNonce);
+			authorizationHeader.setNonceCount(1);
+		}
 		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 dd2f3b7..2829d0e 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
@@ -2,6 +2,7 @@
 
 import java.text.ParseException;
 import java.util.ArrayList;
+import java.util.UUID;
 
 import javax.sip.InvalidArgumentException;
 import javax.sip.PeerUnavailableException;
@@ -167,109 +168,4 @@
 		request.setContent(content, contentTypeHeader);
 		return request;
 	}
-
-
-	public Request createRegisterRequest(@NotNull ParentPlatform platform, long CSeq, 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(CSeq, 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));
-
-		ExpiresHeader expires = sipFactory.createHeaderFactory().createExpiresHeader(Integer.parseInt(platform.getExpires()));
-		request.addHeader(expires);
-
-		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, 2L, 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 + "\", nonce=\"" + nonce + "\", uri=\"" + uri  + "\", response=\"" + RESPONSE + "\"" + ", algorithm=MD5";
-		AuthorizationHeader authorizationHeader = sipFactory.createHeaderFactory().createAuthorizationHeader(authorizationHeaderContent);
-		registerRequest.addHeader(authorizationHeader);
-
-		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 ecc4ed7..19ffd61 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
@@ -3,10 +3,13 @@
 import com.genersoft.iot.vmp.conf.SipConfig;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
+import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
 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.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -16,6 +19,7 @@
 
 import javax.sip.*;
 import javax.sip.header.CallIdHeader;
+import javax.sip.header.WWWAuthenticateHeader;
 import javax.sip.message.Request;
 import java.text.ParseException;
 import java.util.UUID;
@@ -39,6 +43,12 @@
     private IVideoManagerStorager storager;
 
     @Autowired
+    private IRedisCatchStorage redisCatchStorage;
+
+    @Autowired
+    private SipSubscribe sipSubscribe;
+
+    @Autowired
     @Qualifier(value="tcpSipProvider")
     private SipProvider tcpSipProvider;
 
@@ -55,16 +65,29 @@
     }
 
     @Override
-    public boolean register(ParentPlatform parentPlatform, @Nullable String callId, @Nullable String realm, @Nullable String nonce, @Nullable String scheme ) {
+    public boolean unregister(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) {
+        parentPlatform.setExpires("0");
+        ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getDeviceGBId());
+        if (parentPlatformCatch != null) {
+            parentPlatformCatch.setParentPlatform(parentPlatform);
+            redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch);
+        }
+
+        return register(parentPlatform, null, null, errorEvent, okEvent);
+    }
+
+    @Override
+    public boolean register(ParentPlatform parentPlatform, @Nullable String callId, @Nullable WWWAuthenticateHeader www, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) {
         try {
             Request request = null;
-            if (realm == null || nonce == null) {
-                request = headerProvider.createRegisterRequest(parentPlatform, 1L, null, null);
+
+            if (www == null ) {
+                request = headerProviderPlarformProvider.createRegisterRequest(parentPlatform, 1L, null, null);
             }else {
-                request = headerProvider.createRegisterRequest(parentPlatform, null, null, callId, realm, nonce, scheme);
+                request = headerProviderPlarformProvider.createRegisterRequest(parentPlatform, null, null, callId, www);
             }
 
-            transmitRequest(parentPlatform, request);
+            transmitRequest(parentPlatform, request, errorEvent, okEvent);
             return true;
         } catch (ParseException e) {
             e.printStackTrace();
@@ -108,10 +131,29 @@
     }
 
     private void transmitRequest(ParentPlatform parentPlatform, Request request) throws SipException {
+        transmitRequest(parentPlatform, request, null, null);
+    }
+
+    private void transmitRequest(ParentPlatform parentPlatform, Request request, SipSubscribe.Event errorEvent) throws SipException {
+        transmitRequest(parentPlatform, request, errorEvent, null);
+    }
+
+    private void transmitRequest(ParentPlatform parentPlatform, Request request, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws SipException {
         if("TCP".equals(parentPlatform.getTransport())) {
             tcpSipProvider.sendRequest(request);
         } else if("UDP".equals(parentPlatform.getTransport())) {
             udpSipProvider.sendRequest(request);
         }
+
+        CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME);
+        // 娣诲姞閿欒璁㈤槄
+        if (errorEvent != null) {
+            sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), errorEvent);
+        }
+        // 娣诲姞璁㈤槄
+        if (okEvent != null) {
+            sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent);
+        }
+
     }
 }
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 0885712..bfe5e3f 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
@@ -22,9 +22,11 @@
 import javax.sip.address.Address;
 import javax.sip.address.URI;
 import javax.sip.header.CallIdHeader;
+import javax.sip.header.ExpiresHeader;
 import javax.sip.header.ToHeader;
 import javax.sip.header.WWWAuthenticateHeader;
 import javax.sip.message.Response;
+import java.util.UUID;
 
 /**    
  * @Description:Register鍝嶅簲澶勭悊鍣�
@@ -62,24 +64,28 @@
 		ToHeader toHeader = (ToHeader) response.getHeader(ToHeader.NAME);
 		SipUri uri = (SipUri)toHeader.getAddress().getURI();
 		String platformGBId = uri.getAuthority().getUser();
-		logger.info(String.format("鏀跺埌 %s 鐨勬敞鍐�%S璇锋眰", platformGBId, response.getStatusCode() ));
 
-		ParentPlatform parentPlatform = storager.queryParentPlatById(platformGBId);
+		logger.info(String.format("鏀跺埌 %s 鐨勬敞鍐�/娉ㄩ攢%S鍝嶅簲", platformGBId, response.getStatusCode() ));
+
+		ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(platformGBId);
+		if (parentPlatformCatch == null) {
+			logger.warn(String.format("鏀跺埌 %s 鐨勬敞鍐�/娉ㄩ攢%S璇锋眰, 浣嗘槸骞冲彴缂撳瓨淇℃伅鏈煡璇㈠埌!!!", platformGBId, response.getStatusCode()));
+			return;
+		}
+		ParentPlatform parentPlatform = parentPlatformCatch.getParentPlatform();
 		if (parentPlatform == null) {
-			logger.warn(String.format("鏀跺埌 %s 鐨勬敞鍐�%S璇锋眰, 浣嗘槸骞冲彴淇℃伅鏈煡璇㈠埌!!!", platformGBId, response.getStatusCode()));
+			logger.warn(String.format("鏀跺埌 %s 鐨勬敞鍐�/娉ㄩ攢%S璇锋眰, 浣嗘槸骞冲彴淇℃伅鏈煡璇㈠埌!!!", platformGBId, response.getStatusCode()));
 			return;
 		}
 
 		if (response.getStatusCode() == 401) {
-
 			WWWAuthenticateHeader www = (WWWAuthenticateHeader)response.getHeader(WWWAuthenticateHeader.NAME);
-			String realm = www.getRealm();
-			String nonce = www.getNonce();
-			String scheme = www.getScheme();
+
 
 			CallIdHeader callIdHeader = (CallIdHeader)response.getHeader(CallIdHeader.NAME);
 			String callId = callIdHeader.getCallId();
-			sipCommanderForPlatform.register(parentPlatform, callId, realm, nonce, scheme);
+
+			sipCommanderForPlatform.register(parentPlatform, callId, www, null, null);
 		}else if (response.getStatusCode() == 200){
 			// 娉ㄥ唽鎴愬姛
 			logger.info(String.format("%s 娉ㄥ唽鎴愬姛", platformGBId ));
@@ -90,11 +96,8 @@
 
 			redisCatchStorage.updatePlatformKeepalive(parentPlatform);
 
-			ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getDeviceGBId());
-			if (parentPlatformCatch == null) {
-				parentPlatformCatch = new ParentPlatformCatch();
-				parentPlatformCatch.setId(parentPlatform.getDeviceGBId());
-			}
+			parentPlatformCatch.setParentPlatform(parentPlatform);
+
 			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 33ef242..2e55a00 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -63,8 +63,14 @@
 
     ParentPlatformCatch queryPlatformCatchInfo(String platformGbId);
 
+    void delPlatformCatchInfo(String platformGbId);
+
     void updatePlatformKeepalive(ParentPlatform parentPlatform);
 
+    void delPlatformKeepalive(String platformGbId);
+
     void updatePlatformRegister(ParentPlatform parentPlatform);
 
+    void delPlatformRegister(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 53d3480..89eaa13 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
@@ -189,4 +189,19 @@
     public ParentPlatformCatch queryPlatformCatchInfo(String platformGbId) {
         return (ParentPlatformCatch)redis.get(VideoManagerConstants.PLATFORM_CATCH_PREFIX + platformGbId);
     }
+
+    @Override
+    public void delPlatformCatchInfo(String platformGbId) {
+        redis.del(VideoManagerConstants.PLATFORM_CATCH_PREFIX + platformGbId);
+    }
+
+    @Override
+    public void delPlatformKeepalive(String platformGbId) {
+        redis.del(VideoManagerConstants.PLATFORM_KEEPLIVEKEY_PREFIX + platformGbId);
+    }
+
+    @Override
+    public void delPlatformRegister(String platformGbId) {
+        redis.del(VideoManagerConstants.PLATFORM_REGISTER_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 366032c..92de14a 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
@@ -4,6 +4,8 @@
 
 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.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper;
 import com.genersoft.iot.vmp.storager.dao.DeviceMapper;
 import com.genersoft.iot.vmp.storager.dao.ParentPlatformMapper;
@@ -31,6 +33,10 @@
 
 	@Autowired
     private ParentPlatformMapper platformMapper;
+	@Autowired
+    private IRedisCatchStorage redisCatchStorage;
+
+
 
 
 	/**
@@ -210,11 +216,21 @@
 	@Override
 	public boolean updateParentPlatform(ParentPlatform parentPlatform) {
 		int result = 0;
+		ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getDeviceGBId());
 		if ( platformMapper.getParentPlatById(parentPlatform.getDeviceGBId()) == null) {
 			result = platformMapper.addParentPlatform(parentPlatform);
+
+			if (parentPlatformCatch == null) {
+				parentPlatformCatch = new ParentPlatformCatch();
+				parentPlatformCatch.setParentPlatform(parentPlatform);
+				parentPlatformCatch.setId(parentPlatform.getDeviceGBId());
+			}
 		}else {
 			result = platformMapper.updateParentPlatform(parentPlatform);
 		}
+		// 鏇存柊缂撳瓨
+		parentPlatformCatch.setParentPlatform(parentPlatform);
+		redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch);
 		return result > 0;
 	}
 
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 a1d3ba2..152fa5d 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
@@ -3,6 +3,7 @@
 import com.alibaba.fastjson.JSONObject;
 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 import com.github.pagehelper.PageInfo;
 import org.slf4j.Logger;
@@ -24,6 +25,8 @@
 
     @Autowired
     private IVideoManagerStorager storager;
+    @Autowired
+    private IRedisCatchStorage redisCatchStorage;
 
     @Autowired
     private ISIPCommanderForPlatform commanderForPlatform;
@@ -75,7 +78,7 @@
         boolean updateResult = storager.updateParentPlatform(parentPlatform);
 
         if (updateResult) {
-            commanderForPlatform.register(parentPlatform, null, null, null, null);
+            commanderForPlatform.register(parentPlatform);
 
             return new ResponseEntity<>("success", HttpStatus.OK);
         }else {
@@ -94,7 +97,23 @@
         ){
             return new ResponseEntity<>("missing parameters", HttpStatus.BAD_REQUEST);
         }
+
+        // 鍙戦�佺绾挎秷鎭�,
+        commanderForPlatform.unregister(parentPlatform, (event -> {
+            // 娓呯┖redis缂撳瓨
+            redisCatchStorage.delPlatformCatchInfo(parentPlatform.getDeviceGBId());
+            redisCatchStorage.delPlatformKeepalive(parentPlatform.getDeviceGBId());
+            redisCatchStorage.delPlatformRegister(parentPlatform.getDeviceGBId());
+        }), (event -> {
+            // 娓呯┖redis缂撳瓨
+            redisCatchStorage.delPlatformCatchInfo(parentPlatform.getDeviceGBId());
+            redisCatchStorage.delPlatformKeepalive(parentPlatform.getDeviceGBId());
+            redisCatchStorage.delPlatformRegister(parentPlatform.getDeviceGBId());
+        }));
+
         boolean deleteResult = storager.deleteParentPlatform(parentPlatform);
+
+
         if (deleteResult) {
             return new ResponseEntity<>("success", HttpStatus.OK);
         }else {

--
Gitblit v1.8.0