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