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