From ecaf8750dd9c537e581ae05c65be9a26db5e67a7 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期二, 24 十一月 2020 16:41:00 +0800
Subject: [PATCH] 完成向上级联->注册

---
 src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEvent.java       |   21 ++
 src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEventLister.java |   45 +++++
 src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java                     |    6 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java                               |    3 
 README.md                                                                                                 |    3 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java                                     |   13 +
 src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java                                   |    7 
 web_src/src/components/platformEdit.vue                                                                   |   42 ++++
 src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java                                                 |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java                    |   72 +++++++++
 src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java                       |    5 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java                             |   10 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java                |   81 ++++++++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java                    |   13 +
 src/main/java/com/genersoft/iot/vmp/vmanager/platform/PlatformController.java                             |   23 ++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/RegisterResponseProcessor.java         |   83 ++++++++++
 16 files changed, 416 insertions(+), 13 deletions(-)

diff --git a/README.md b/README.md
index 583d34e..2cca7a5 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,8 @@
 # 2.0 鏀寔鐗规�� 
 - [ ] 鍥芥爣閫氶亾鍚戜笂绾ц仈  
     - [X] WEB娣诲姞涓婄骇骞冲彴
-    - [ ] 娉ㄥ唽
+    - [X] 娉ㄥ唽
+    - [ ] 蹇冭烦淇濇椿
     - [ ] 閫氶亾閫夋嫨
     - [ ] 閫氶亾鎺ㄩ��
     - [ ] 鐐规挱
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
index bfdc8f6..9b091e6 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
@@ -123,7 +123,7 @@
 	public void processResponse(ResponseEvent evt) {
 		Response response = evt.getResponse();
 		int status = response.getStatusCode();
-		if ((status >= 200) && (status < 300)) { // Success!
+		if (((status >= 200) && (status < 300)) || status == 401) { // Success!
 			ISIPResponseProcessor processor = processorFactory.createResponseProcessor(evt);
 			try {
 				processor.process(evt, this, sipConfig);
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 ebf0430..3e0a184 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,5 +1,8 @@
 package com.genersoft.iot.vmp.gb28181.event;
 
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+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;
@@ -31,4 +34,14 @@
 		outEvent.setFrom(from);
         applicationEventPublisher.publishEvent(outEvent);
     }
+
+	/**
+	 * 骞冲彴鏈敞鍐屼簨浠�
+	 * @param platformGbId
+	 */
+	public void platformNotRegisterEventPublish(String platformGbId){
+		PlatformNotRegisterEvent platformNotRegisterEvent = new PlatformNotRegisterEvent(this);
+		platformNotRegisterEvent.setPlatformGbID(platformGbId);
+        applicationEventPublisher.publishEvent(platformNotRegisterEvent);
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEvent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEvent.java
new file mode 100644
index 0000000..9c238d7
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEvent.java
@@ -0,0 +1,21 @@
+package com.genersoft.iot.vmp.gb28181.event.platformNotRegister;
+
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+import org.springframework.context.ApplicationEvent;
+
+public class PlatformNotRegisterEvent extends ApplicationEvent {
+
+    private String platformGbID;
+
+    public PlatformNotRegisterEvent(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/platformNotRegister/PlatformNotRegisterEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEventLister.java
new file mode 100644
index 0000000..564d382
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEventLister.java
@@ -0,0 +1,45 @@
+package com.genersoft.iot.vmp.gb28181.event.platformNotRegister;
+
+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.storager.IVideoManagerStorager;
+import com.genersoft.iot.vmp.utils.redis.RedisUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 骞冲彴鏈敞鍐屼簨浠�,鏉ユ簮鏈変簩:
+ *               1銆佸钩鍙版柊娣诲姞
+ *               2銆佸钩鍙板績璺宠秴鏃�
+ * @author: panll
+ * @date: 2020骞�11鏈�24鏃� 10:00
+ */
+@Component
+public class PlatformNotRegisterEventLister implements ApplicationListener<PlatformNotRegisterEvent> {
+
+    private final static Logger logger = LoggerFactory.getLogger(PlatformNotRegisterEventLister.class);
+
+    @Autowired
+    private IVideoManagerStorager storager;
+
+    @Autowired
+    private RedisUtil redis;
+
+    @Override
+    public void onApplicationEvent(PlatformNotRegisterEvent event) {
+
+        if (logger.isDebugEnabled()) {
+            logger.debug("骞冲彴鏈敞鍐屼簨浠惰Е鍙戯紝骞冲彴鍥芥爣ID锛�" + event.getPlatformGbID());
+        }
+        ParentPlatform parentPlatform = storager.queryParentPlatById(event.getPlatformGbID());
+        if (parentPlatform == null) {
+            logger.debug("骞冲彴鏈敞鍐屼簨浠惰Е鍙戯紝浣嗗钩鍙板凡缁忓垹闄�!!! 骞冲彴鍥芥爣ID锛�" + event.getPlatformGbID());
+            return;
+        }
+    }
+}
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 73fb474..3ee95f9 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
@@ -8,6 +8,7 @@
 import javax.sip.message.Response;
 
 import com.alibaba.fastjson.JSON;
+import com.genersoft.iot.vmp.gb28181.transmit.response.impl.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -30,10 +31,6 @@
 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;
@@ -80,6 +77,9 @@
 	
 	@Autowired
 	private CancelResponseProcessor cancelResponseProcessor;
+
+	@Autowired
+	private RegisterResponseProcessor registerResponseProcessor;
 	
 	@Autowired
 	private OtherResponseProcessor otherResponseProcessor;
@@ -154,6 +154,8 @@
 			return byeResponseProcessor;
 		} else if (Request.CANCEL.equals(method)) {
 			return cancelResponseProcessor;
+		}else if (Request.REGISTER.equals(method)) {
+			return registerResponseProcessor;
 		} else {
 			return otherResponseProcessor;
 		}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
index 923f211..32cc06e 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
@@ -2,6 +2,7 @@
 
 import com.genersoft.iot.vmp.common.StreamInfo;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
 
 /**    
  * @Description:璁惧鑳藉姏鎺ュ彛锛岀敤浜庡畾涔夎澶囩殑鎺у埗銆佹煡璇㈣兘鍔�   
@@ -212,4 +213,6 @@
 	 * @param device 瑙嗛璁惧
 	 */
 	public boolean mobilePostitionQuery(Device device);
+
+
 }
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
new file mode 100644
index 0000000..9ec2b49
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java
@@ -0,0 +1,13 @@
+package com.genersoft.iot.vmp.gb28181.transmit.cmd;
+
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+
+public interface ISIPCommanderForPlatform {
+
+    /**
+     * 鍚戜笂绾у钩鍙版敞鍐�
+     * @param parentPlatform
+     * @return
+     */
+    boolean register(ParentPlatform parentPlatform, String callId, String realm, String nonce, String scheme);
+}
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 2233ee0..fa3465d 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
@@ -11,7 +11,9 @@
 import javax.sip.address.SipURI;
 import javax.sip.header.*;
 import javax.sip.message.Request;
+import javax.validation.constraints.NotNull;
 
+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;
@@ -19,6 +21,7 @@
 import com.genersoft.iot.vmp.conf.SipConfig;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.Host;
+import org.springframework.util.DigestUtils;
 
 /**
  * @Description:鎽勫儚澶村懡浠equest鍒涢�犲櫒 TODO 鍐椾綑浠g爜澶寰呬紭鍖�
@@ -168,4 +171,73 @@
 		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/impl/SIPCommanderFroPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
new file mode 100644
index 0000000..baf6e5a
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
@@ -0,0 +1,81 @@
+package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl;
+
+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.session.VideoStreamSessionManager;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
+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;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.lang.Nullable;
+import org.springframework.stereotype.Component;
+
+import javax.sip.*;
+import javax.sip.message.Request;
+import java.text.ParseException;
+
+@Component
+public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
+
+    @Autowired
+    private SipConfig sipConfig;
+
+    @Autowired
+    private SIPRequestHeaderProvider headerProvider;
+
+    @Autowired
+    private VideoStreamSessionManager streamSession;
+
+    @Autowired
+    private IVideoManagerStorager storager;
+
+    @Autowired
+    @Qualifier(value="tcpSipProvider")
+    private SipProvider tcpSipProvider;
+
+    @Autowired
+    @Qualifier(value="udpSipProvider")
+    private SipProvider udpSipProvider;
+
+    @Autowired
+    private ZLMUtils zlmUtils;
+
+    @Value("${media.rtp.enable}")
+    private boolean rtpEnable;
+
+    @Override
+    public boolean register(ParentPlatform parentPlatform, @Nullable String callId, @Nullable String realm, @Nullable String nonce, @Nullable String scheme ) {
+        try {
+            Request request = null;
+            if (realm == null || nonce == null) {
+                request = headerProvider.createRegisterRequest(parentPlatform, null, null);
+            }else {
+                request = headerProvider.createRegisterRequest(parentPlatform, null, null, callId, realm, nonce, scheme);
+            }
+
+            transmitRequest(parentPlatform, request);
+            return true;
+        } catch (ParseException e) {
+            e.printStackTrace();
+        } catch (InvalidArgumentException e) {
+            e.printStackTrace();
+        } catch (PeerUnavailableException e) {
+            e.printStackTrace();
+        } catch (SipException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    private void transmitRequest(ParentPlatform parentPlatform, Request request) throws SipException {
+        if("TCP".equals(parentPlatform.getTransport())) {
+            tcpSipProvider.sendRequest(request);
+        } else if("UDP".equals(parentPlatform.getTransport())) {
+            udpSipProvider.sendRequest(request);
+        }
+    }
+}
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
new file mode 100644
index 0000000..9fb1312
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/RegisterResponseProcessor.java
@@ -0,0 +1,83 @@
+package com.genersoft.iot.vmp.gb28181.transmit.response.impl;
+
+import com.genersoft.iot.vmp.conf.SipConfig;
+import com.genersoft.iot.vmp.gb28181.SipLayer;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+import com.genersoft.iot.vmp.gb28181.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.IVideoManagerStorager;
+import gov.nist.core.Host;
+import gov.nist.javax.sip.address.AddressImpl;
+import gov.nist.javax.sip.address.SipUri;
+import gov.nist.javax.sip.header.To;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.ResponseEvent;
+import javax.sip.address.Address;
+import javax.sip.address.URI;
+import javax.sip.header.CallIdHeader;
+import javax.sip.header.ToHeader;
+import javax.sip.header.WWWAuthenticateHeader;
+import javax.sip.message.Response;
+
+/**    
+ * @Description:Register鍝嶅簲澶勭悊鍣�
+ * @author: swwheihei
+ * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:32:23     
+ */
+@Component
+public class RegisterResponseProcessor implements ISIPResponseProcessor {
+
+	private Logger logger = LoggerFactory.getLogger(RegisterRequestProcessor.class);
+
+	@Autowired
+	private ISIPCommanderForPlatform sipCommanderForPlatform;
+
+	@Autowired
+	private IVideoManagerStorager storager;
+
+	/**
+	 * 澶勭悊Register鍝嶅簲
+	 *
+ 	 * @param evt
+	 * @param layer
+	 * @param config
+	 */
+	@Override
+	public void process(ResponseEvent evt, SipLayer layer, SipConfig config) {
+		// TODO Auto-generated method stub
+		Response response = evt.getResponse();
+		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);
+		if (parentPlatform == null) {
+			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);
+		}else if (response.getStatusCode() == 200){
+			// 娉ㄥ唽鎴愬姛
+			logger.info(String.format("%s 娉ㄥ唽鎴愬姛", platformGBId ));
+			parentPlatform.setStatus(true);
+			storager.updateParentPlatform(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 8842230..b58caae 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
@@ -213,4 +213,11 @@
 	 * @return
 	 */
 	public PageResult<ParentPlatform> queryParentPlatformList(int page, int count);
+
+	/**
+	 * 鑾峰彇涓婄骇骞冲彴
+	 * @param platformGbId
+	 * @return
+	 */
+	public ParentPlatform queryParentPlatById(String platformGbId);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java
index 645c803..5e8ba1a 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java
@@ -229,4 +229,9 @@
 	public PageResult<ParentPlatform> queryParentPlatformList(int page, int count) {
 		return null;
 	}
+
+	@Override
+	public ParentPlatform queryParentPlatById(String platformGbId) {
+		return null;
+	}
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java
index 0e21167..ad77995 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java
@@ -561,6 +561,7 @@
 
 	@Override
 	public boolean updateParentPlatform(ParentPlatform parentPlatform) {
+
 		// 瀛樺偍device
 		return redis.set(VideoManagerConstants.PLATFORM_PREFIX + parentPlatform.getDeviceGBId(), parentPlatform);
 	}
@@ -587,4 +588,9 @@
 		pageResult.setData(resultData);
 		return pageResult;
 	}
+
+	@Override
+	public ParentPlatform queryParentPlatById(String platformGbId) {
+		return (ParentPlatform)redis.get(VideoManagerConstants.PLATFORM_PREFIX + 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 27dbdd4..8af7cbf 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,8 @@
 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 org.slf4j.Logger;
@@ -23,6 +25,9 @@
 
     @Autowired
     private IVideoManagerStorager storager;
+
+    @Autowired
+    private ISIPCommanderForPlatform commanderForPlatform;
 
     @GetMapping("/platforms/{count}/{page}")
     public PageResult<ParentPlatform> platforms(@PathVariable int page, @PathVariable int count){
@@ -53,8 +58,13 @@
         ){
             return new ResponseEntity<>("missing parameters", HttpStatus.BAD_REQUEST);
         }
+        // TODO 妫�鏌ユ槸鍚﹀凡缁忓瓨鍦�,涓旀敞鍐屾垚鍔�, 濡傛灉娉ㄥ唽鎴愬姛,闇�瑕佸厛娉ㄩ攢涔嬪墠鍐�,淇敼骞舵敞鍐�
+
         boolean updateResult = storager.updateParentPlatform(parentPlatform);
+
         if (updateResult) {
+            commanderForPlatform.register(parentPlatform, null, null, null, null);
+
             return new ResponseEntity<>("success", HttpStatus.OK);
         }else {
             return new ResponseEntity<>("fail", HttpStatus.OK);
@@ -79,4 +89,17 @@
             return new ResponseEntity<>("fail", HttpStatus.OK);
         }
     }
+
+    @RequestMapping("/platforms/exit/{deviceGbId}")
+    @ResponseBody
+    public ResponseEntity<String> exitPlatform(@PathVariable String deviceGbId){
+
+        if (logger.isDebugEnabled()) {
+            logger.debug("鏌ヨ鎵�鏈変笂绾ц澶嘇PI璋冪敤");
+        }
+        ParentPlatform parentPlatform = storager.queryParentPlatById(deviceGbId);
+        return new ResponseEntity<>(String.valueOf(parentPlatform != null), HttpStatus.OK);
+    }
+
+
 }
diff --git a/web_src/src/components/platformEdit.vue b/web_src/src/components/platformEdit.vue
index faacdde..7dee4ca 100644
--- a/web_src/src/components/platformEdit.vue
+++ b/web_src/src/components/platformEdit.vue
@@ -30,7 +30,7 @@
                         <el-form-item label="鏈湴绔彛" prop="devicePort">
                             <el-input v-model="platform.devicePort" :disabled="true"></el-input>
                         </el-form-item>
-                        
+
                     </el-form>
                 </el-col>
                 <el-col :span="12">
@@ -61,8 +61,8 @@
                         </el-form-item>
                         <el-form-item label="鍏朵粬閫夐」" >
                             <el-checkbox label="鍚敤" v-model="platform.enable" ></el-checkbox>
-                            <el-checkbox label="鍏佽浜戝彴鎺у埗" v-model="platform.PTZEnable"></el-checkbox>
-                            <el-checkbox label="鍚敤RTCP淇濇椿" v-model="platform.rtcp"></el-checkbox>
+                            <el-checkbox label="浜戝彴鎺у埗" v-model="platform.PTZEnable"></el-checkbox>
+                            <el-checkbox label="RTCP淇濇椿" v-model="platform.rtcp"></el-checkbox>
                         </el-form-item>
                         <el-form-item>
                             <el-button type="primary" @click="onSubmit">{{onSubmit_text}}</el-button>
@@ -81,10 +81,26 @@
     name: 'platformEdit',
     props: {},
     computed: {
-        
+
     },
     created() {},
     data() {
+        var deviceGBIdRules = async (rule, value, callback) => {
+          console.log(value)
+          if (value === '') {
+            callback(new Error('璇疯緭鍏ヨ澶囧浗鏍囩紪鍙�'));
+          } else {
+            var exit = await this.deviceGBIdExit(value);
+            console.log(exit)
+            console.log(exit == "true")
+            console.log(exit === "true")
+            if (exit) {
+              callback(new Error('璁惧鍥芥爣缂栧彿宸插瓨鍦�'));
+            }else {
+              callback();
+            }
+          }
+        };
         return {
             listChangeCallback: null,
             showDialog: false,
@@ -145,7 +161,7 @@
                     { required: true, message:"璇疯緭鍏IP鏈嶅姟绔彛",   trigger: 'blur' }
                 ],
                 deviceGBId: [
-                    { required: true, message:"璇疯緭鍏ヨ澶囧浗鏍囩紪鍙�",   trigger: 'blur' }
+                    {validator: deviceGBIdRules,  trigger: 'blur' }
                 ],
                 username: [
                     { required: false, message:"璇疯緭鍏IP璁よ瘉鐢ㄦ埛鍚�",   trigger: 'blur' }
@@ -176,7 +192,7 @@
                 this.platform = platform;
                 this.onSubmit_text = "淇濆瓨"
             }
-            
+
         },
         onSubmit: function () {
             console.log('onSubmit');
@@ -206,7 +222,19 @@
             this.showDialog = false;
             this.$refs.platform1.resetFields();
             this.$refs.platform2.resetFields();
-            
+        },
+        deviceGBIdExit: async function (deviceGbId) {
+          var result = false;
+          var that = this
+          await that.$axios.post(`/api/platforms/exit/${deviceGbId}`)
+            .then(function (res) {
+              result = res.data;
+            })
+            .catch(function (error) {
+              console.log(error);
+            });
+            return result;
+
         }
 
     }

--
Gitblit v1.8.0