From 9f680a2e9e8560cf5f38acdc30335e51d88b2001 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期五, 26 八月 2022 18:03:09 +0800 Subject: [PATCH] 修复bug以及日志按照,错误/sip/数据库 分割 --- src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java | 6 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 2 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java | 7 src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java | 10 ++ src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java | 2 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java | 1 src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java | 3 src/main/resources/logback-spring-local.xml | 30 ++++-- src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java | 18 +++ web_src/src/components/dialog/devicePlayer.vue | 2 src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java | 2 src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java | 2 web_src/src/components/dialog/platformEdit.vue | 19 +-- src/main/java/com/genersoft/iot/vmp/service/impl/RedisGbPlayMsgListener.java | 2 src/main/java/com/genersoft/iot/vmp/conf/security/UrlTokenHandler.java | 24 ++++ src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java | 3 src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java | 5 + src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java | 2 src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java | 74 +++++--------- src/main/java/com/genersoft/iot/vmp/service/impl/RedisAlarmMsgListener.java | 32 ++++- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java | 1 src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java | 14 ++ src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java | 3 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 33 +++-- src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java | 3 25 files changed, 187 insertions(+), 113 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java index 4f717f0..41a56cd 100644 --- a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java +++ b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java @@ -31,6 +31,8 @@ private String rtsp; private String rtsps; private String rtc; + + private String rtcs; private String mediaServerId; private Object tracks; private String startTime; @@ -302,4 +304,12 @@ public void setIp(String ip) { this.ip = ip; } + + public String getRtcs() { + return rtcs; + } + + public void setRtcs(String rtcs) { + this.rtcs = rtcs; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java b/src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java index 95b2262..9cdd2a4 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java @@ -1,6 +1,8 @@ package com.genersoft.iot.vmp.conf.security; import com.alibaba.fastjson.JSONObject; +import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; +import org.apache.poi.hssf.eventmodel.ERFListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.AuthenticationException; @@ -28,8 +30,8 @@ response.setHeader("Access-Control-Allow-Headers", "token, Accept, Origin, X-Requested-With, Content-Type, Last-Modified"); response.setHeader("Content-type", "application/json;charset=UTF-8"); JSONObject jsonObject = new JSONObject(); - jsonObject.put("code", "-1"); - jsonObject.put("msg", "璇风櫥褰曞悗閲嶆柊璇锋眰"); + jsonObject.put("code", ErrorCode.ERROR401.getCode()); + jsonObject.put("msg", ErrorCode.ERROR401.getMsg()); String logUri = "api/user/login"; if (request.getRequestURI().contains(logUri)){ jsonObject.put("msg", e.getMessage()); diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/UrlTokenHandler.java b/src/main/java/com/genersoft/iot/vmp/conf/security/UrlTokenHandler.java new file mode 100644 index 0000000..e63aca4 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/conf/security/UrlTokenHandler.java @@ -0,0 +1,24 @@ +package com.genersoft.iot.vmp.conf.security; + +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.SessionCookieConfig; +import javax.servlet.SessionTrackingMode; +import java.util.Collections; + +public class UrlTokenHandler extends SpringBootServletInitializer { + + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + super.onStartup(servletContext); + + servletContext.setSessionTrackingModes( + Collections.singleton(SessionTrackingMode.COOKIE) + ); + SessionCookieConfig sessionCookieConfig = servletContext.getSessionCookieConfig(); + sessionCookieConfig.setHttpOnly(true); + + } +} 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 c1811bf..29253e7 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java @@ -2,8 +2,10 @@ import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.gb28181.transmit.ISIPProcessorObserver; +import com.genersoft.iot.vmp.utils.DateUtil; import gov.nist.javax.sip.SipProviderImpl; import gov.nist.javax.sip.SipStackImpl; +import org.apache.commons.lang3.time.DateFormatUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -13,6 +15,7 @@ import org.springframework.stereotype.Component; import javax.sip.*; +import java.text.DateFormat; import java.util.Properties; import java.util.TooManyListenersException; import java.util.concurrent.LinkedBlockingQueue; @@ -52,7 +55,9 @@ * 瀹屾暣閰嶇疆鍙傝�� gov.nist.javax.sip.SipStackImpl锛岄渶瑕佷笅杞芥簮鐮� * gov/nist/javax/sip/SipStackImpl.class */ - properties.setProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT", "true"); + if (logger.isDebugEnabled()) { + properties.setProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT", "true"); + } // 鎺ユ敹鎵�鏈塶otify璇锋眰锛屽嵆浣挎病鏈夎闃� properties.setProperty("gov.nist.javax.sip.DELIVER_UNSOLICITED_NOTIFY", "true"); // 涓篲NULL _瀵硅瘽妗嗕紶閫抇缁堟鐨刜浜嬩欢 @@ -67,9 +72,10 @@ * 0; public static final int TRACE_MESSAGES = 16; public static final int * TRACE_EXCEPTION = 17; public static final int TRACE_DEBUG = 32; */ - properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "0"); - properties.setProperty("gov.nist.javax.sip.SERVER_LOG", "sip_server_log"); - properties.setProperty("gov.nist.javax.sip.DEBUG_LOG", "sip_debug_log"); + if (logger.isDebugEnabled()) { + properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "DEBUG"); + } + properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "INFO"); sipStack = (SipStackImpl) sipFactory.createSipStack(properties); return sipStack; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java index 319016c..d20dc74 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java @@ -71,7 +71,6 @@ @Override @Async public void processRequest(RequestEvent requestEvent) { - logger.debug("\n鏀跺埌璇锋眰锛歕n{}", requestEvent.getRequest()); String method = requestEvent.getRequest().getMethod(); ISIPRequestProcessor sipRequestProcessor = requestProcessorMap.get(method); if (sipRequestProcessor == null) { @@ -90,7 +89,6 @@ @Async public void processResponse(ResponseEvent responseEvent) { Response response = responseEvent.getResponse(); - logger.debug("\n鏀跺埌鍝嶅簲锛歕n{}", responseEvent.getResponse()); int status = response.getStatusCode(); if (((status >= 200) && (status < 300)) || status == Response.UNAUTHORIZED) { // Success! diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java index b9a5011..3f6fa0c 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java @@ -640,7 +640,7 @@ hookEvent.call(new InviteStreamInfo(mediaServerItem, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); subscribe.removeSubscribe(hookSubscribe); hookSubscribe.getContent().put("regist", false); - hookSubscribe.getContent().put("schema", "rtmp"); + hookSubscribe.getContent().put("schema", "rtsp"); // 娣诲姞娴佹敞閿�鐨勮闃咃紝娉ㄩ攢浜嗗悗鍚戣澶囧彂閫乥ye subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd)->{ diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java index 34cb753..7e28457 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java @@ -410,6 +410,7 @@ streamId = String.format("%s_%s", device.getDeviceId(), channelId); } SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, null, device.isSsrcCheck(), false); + logger.info(JSONObject.toJSONString(ssrcInfo)); sendRtpItem.setStreamId(ssrcInfo.getStream()); // 鍐欏叆redis锛� 瓒呮椂鏃跺洖澶� redisCatchStorage.updateSendRTPSever(sendRtpItem); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java index 13cc1b6..6ce2ce0 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java @@ -180,7 +180,6 @@ private void processNotifyCatalogList(RequestEvent evt, Element rootElement) throws SipException { - System.out.println(evt.getRequest().toString()); String platformId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); String deviceId = XmlUtil.getText(rootElement, "DeviceID"); ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java index 4ea5d92..98fd7a7 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java @@ -164,7 +164,7 @@ } } - if (channelId.equals(sipConfig.getId())) { + if ("7".equals(deviceAlarm.getAlarmMethod()) ) { // 鍙戦�佺粰骞冲彴鐨勬姤璀︿俊鎭�� 鍙戦�乺edis閫氱煡 AlarmChannelMessage alarmChannelMessage = new AlarmChannelMessage(); alarmChannelMessage.setAlarmSn(Integer.parseInt(deviceAlarm.getAlarmMethod())); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java index 21879ab..e7c32ef 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java @@ -7,12 +7,10 @@ import com.alibaba.fastjson.JSON; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.UserSetting; -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.gb28181.bean.GbStream; -import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; +import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; import com.genersoft.iot.vmp.media.zlm.dto.*; import com.genersoft.iot.vmp.service.*; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; @@ -48,6 +46,9 @@ @Autowired private SIPCommander cmder; + + @Autowired + private SIPCommanderFroPlatform commanderFroPlatform; @Autowired private IPlayService playService; @@ -237,7 +238,7 @@ // 閴存潈閫氳繃 redisCatchStorage.updateStreamAuthorityInfo(param.getApp(), param.getStream(), streamAuthorityInfo); // 閫氱煡assist鏂扮殑callId - if (mediaInfo != null) { + if (mediaInfo != null && mediaInfo.getRecordAssistPort() > 0) { assistRESTfulUtils.addStreamCallInfo(mediaInfo, param.getApp(), param.getStream(), callId, null); } }else { @@ -427,7 +428,7 @@ }else { redisCatchStorage.removeStreamAuthorityInfo(app, stream); } - if ("rtmp".equals(schema)){ + if ("rtsp".equals(schema)){ logger.info("on_stream_changed锛氭敞鍐�->{}, app->{}, stream->{}", regist, app, stream); if (regist) { mediaServerService.addCount(mediaServerId); @@ -523,17 +524,21 @@ if ("rtp".equals(app)){ ret.put("close", true); StreamInfo streamInfoForPlayCatch = redisCatchStorage.queryPlayByStreamId(streamId); - SsrcTransaction ssrcTransaction = sessionManager.getSsrcTransaction(null, null, null, streamId); if (streamInfoForPlayCatch != null) { - // 濡傛灉鍦ㄧ粰涓婄骇鎺ㄦ祦锛屼篃涓嶅仠姝€�� + // 鏀跺埌鏃犱汉瑙傜湅璇存槑娴佷篃娌℃湁鍦ㄥ線涓婄骇鎺ㄩ�� if (redisCatchStorage.isChannelSendingRTP(streamInfoForPlayCatch.getChannelId())) { - ret.put("close", false); - } else { - cmder.streamByeCmd(streamInfoForPlayCatch.getDeviceID(), streamInfoForPlayCatch.getChannelId(), - streamInfoForPlayCatch.getStream(), null); - redisCatchStorage.stopPlay(streamInfoForPlayCatch); - storager.stopPlay(streamInfoForPlayCatch.getDeviceID(), streamInfoForPlayCatch.getChannelId()); + List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServerByChnnelId(streamInfoForPlayCatch.getChannelId()); + if (sendRtpItems.size() > 0) { + for (SendRtpItem sendRtpItem : sendRtpItems) { + ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(sendRtpItem.getPlatformId()); + commanderFroPlatform.streamByeCmd(parentPlatform, sendRtpItem.getCallId()); + } + } } + cmder.streamByeCmd(streamInfoForPlayCatch.getDeviceID(), streamInfoForPlayCatch.getChannelId(), + streamInfoForPlayCatch.getStream(), null); + redisCatchStorage.stopPlay(streamInfoForPlayCatch); + storager.stopPlay(streamInfoForPlayCatch.getDeviceID(), streamInfoForPlayCatch.getChannelId()); }else{ StreamInfo streamInfoForPlayBackCatch = redisCatchStorage.queryPlayback(null, null, streamId, null); if (streamInfoForPlayBackCatch != 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 413a3f8..6c70096 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 @@ -92,6 +92,7 @@ int result = -1; // 鏌ヨ姝tp server 鏄惁宸茬粡瀛樺湪 JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaServerItem, streamId); + logger.info(JSONObject.toJSONString(rtpInfo)); if(rtpInfo.getInteger("code") == 0){ if (rtpInfo.getBoolean("exist")) { result = rtpInfo.getInteger("local_port"); @@ -113,7 +114,7 @@ } param.put("ssrc", ssrc); JSONObject openRtpServerResultJson = zlmresTfulUtils.openRtpServer(mediaServerItem, param); - + logger.info(JSONObject.toJSONString(openRtpServerResultJson)); if (openRtpServerResultJson != null) { if (openRtpServerResultJson.getInteger("code") == 0) { result= openRtpServerResultJson.getInteger("port"); @@ -270,7 +271,7 @@ * 鏌ヨ寰呰浆鎺ㄧ殑娴佹槸鍚﹀氨缁� */ public Boolean isRtpReady(MediaServerItem mediaServerItem, String streamId) { - JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServerItem,"rtp", "rtmp", streamId); + JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServerItem,"rtp", "rtsp", streamId); return (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")); } @@ -290,7 +291,7 @@ * @return */ public int totalReaderCount(MediaServerItem mediaServerItem, String app, String streamId) { - JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServerItem, app, "rtmp", streamId); + JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServerItem, app, "rtsp", streamId); if (mediaInfo == null) { return 0; } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java index f6d3eef..55b32d9 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java @@ -417,7 +417,7 @@ if (RedisUtil.zScore(key, serverItem.getId()) == null) { // 涓嶅瓨鍦ㄥ垯璁剧疆榛樿鍊� 宸插瓨鍦ㄥ垯閲嶇疆 RedisUtil.zAdd(key, serverItem.getId(), 0L); // 鏌ヨ鏈嶅姟娴佹暟閲� - zlmresTfulUtils.getMediaList(serverItem, null, null, "rtmp",(mediaList ->{ + zlmresTfulUtils.getMediaList(serverItem, null, null, "rtsp",(mediaList ->{ Integer code = mediaList.getInteger("code"); if (code == 0) { JSONArray data = mediaList.getJSONArray("data"); diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java index 876dc9c..ab1fd55 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java @@ -112,6 +112,7 @@ streamInfoResult.setWs_fmp4(String.format("ws://%s:%s/%s/%s.live.mp4%s", addr, mediaInfo.getHttpPort(), app, stream, callIdParam)); streamInfoResult.setTs(String.format("http://%s:%s/%s/%s.live.ts%s", addr, mediaInfo.getHttpPort(), app, stream, callIdParam)); streamInfoResult.setWs_ts(String.format("ws://%s:%s/%s/%s.live.ts%s", addr, mediaInfo.getHttpPort(), app, stream, callIdParam)); + streamInfoResult.setRtc(String.format("http://%s:%s/index/api/webrtc?app=%s&stream=%s&type=play%s", mediaInfo.getStreamIp(), mediaInfo.getHttpPort(), app, stream, ObjectUtils.isEmpty(callId)?"":"&callId=" + callId)); if (mediaInfo.getHttpSSlPort() != 0) { streamInfoResult.setHttps_flv(String.format("https://%s:%s/%s/%s.live.flv%s", addr, mediaInfo.getHttpSSlPort(), app, stream, callIdParam)); streamInfoResult.setWss_flv(String.format("wss://%s:%s/%s/%s.live.flv%s", addr, mediaInfo.getHttpSSlPort(), app, stream, callIdParam)); @@ -122,7 +123,7 @@ streamInfoResult.setHttps_ts(String.format("https://%s:%s/%s/%s.live.ts%s", addr, mediaInfo.getHttpSSlPort(), app, stream, callIdParam)); streamInfoResult.setWss_ts(String.format("wss://%s:%s/%s/%s.live.ts%s", addr, mediaInfo.getHttpSSlPort(), app, stream, callIdParam)); streamInfoResult.setWss_ts(String.format("wss://%s:%s/%s/%s.live.ts%s", addr, mediaInfo.getHttpSSlPort(), app, stream, callIdParam)); - streamInfoResult.setRtc(String.format("https://%s:%s/index/api/webrtc?app=%s&stream=%s&type=play%s", mediaInfo.getStreamIp(), mediaInfo.getHttpSSlPort(), app, stream, ObjectUtils.isEmpty(callId)?"":"&callId=" + callId)); + streamInfoResult.setRtcs(String.format("https://%s:%s/index/api/webrtc?app=%s&stream=%s&type=play%s", mediaInfo.getStreamIp(), mediaInfo.getHttpSSlPort(), app, stream, ObjectUtils.isEmpty(callId)?"":"&callId=" + callId)); } streamInfoResult.setTracks(tracks); diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java index 56fd65b..e00eb55 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java @@ -195,6 +195,7 @@ streamId = String.format("%s_%s", device.getDeviceId(), channelId); } SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, device.isSsrcCheck(), false); + logger.info(JSONObject.toJSONString(ssrcInfo)); play(mediaServerItem, ssrcInfo, device, channelId, (mediaServerItemInUse, response)->{ if (hookEvent != null) { hookEvent.response(mediaServerItem, response); @@ -306,7 +307,7 @@ // 鍗曠鍙fā寮弒treamId涔熸湁鍙樺寲锛岄渶瑕侀噸鏂拌缃洃鍚� if (!mediaServerItem.isRtpEnable()) { // 娣诲姞璁㈤槄 - HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtmp", mediaServerItem.getId()); + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtsp", mediaServerItem.getId()); subscribe.removeSubscribe(hookSubscribe); hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase()); subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response)->{ diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/RedisAlarmMsgListener.java b/src/main/java/com/genersoft/iot/vmp/service/impl/RedisAlarmMsgListener.java index 4d1948a..1634234 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/RedisAlarmMsgListener.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/RedisAlarmMsgListener.java @@ -4,6 +4,8 @@ import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; +import com.genersoft.iot.vmp.service.IPlatformChannelService; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.DateUtil; import org.slf4j.Logger; @@ -12,6 +14,9 @@ import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.util.List; @Component @@ -37,8 +42,6 @@ return; } String gbId = alarmChannelMessage.getGbId(); - Device device = storage.queryVideoDevice(gbId); - ParentPlatform platform = storage.queryParentPlatByServerGBId(gbId); DeviceAlarm deviceAlarm = new DeviceAlarm(); deviceAlarm.setCreateTime(DateUtil.getNow()); @@ -46,18 +49,29 @@ deviceAlarm.setAlarmDescription(alarmChannelMessage.getAlarmDescription()); deviceAlarm.setAlarmMethod("" + alarmChannelMessage.getAlarmSn()); deviceAlarm.setAlarmPriority("1"); - deviceAlarm.setAlarmTime(DateUtil.getNow()); + deviceAlarm.setAlarmTime(DateUtil.getNowForISO8601()); deviceAlarm.setAlarmType("1"); deviceAlarm.setLongitude(0); deviceAlarm.setLatitude(0); - - if (device != null && platform == null) { - commander.sendAlarmMessage(device, deviceAlarm); - }else if (device == null && platform != null){ - commanderForPlatform.sendAlarmMessage(platform, deviceAlarm); + if (ObjectUtils.isEmpty(gbId)) { + // 鍙戦�佺粰鎵�鏈夌殑涓婄骇 + List<ParentPlatform> parentPlatforms = storage.queryEnableParentPlatformList(true); + if (parentPlatforms.size() > 0) { + for (ParentPlatform parentPlatform : parentPlatforms) { + commanderForPlatform.sendAlarmMessage(parentPlatform, deviceAlarm); + } + } }else { - logger.warn("鏃犳硶纭畾" + gbId + "鏄钩鍙拌繕鏄澶�"); + Device device = storage.queryVideoDevice(gbId); + ParentPlatform platform = storage.queryParentPlatByServerGBId(gbId); + if (device != null && platform == null) { + commander.sendAlarmMessage(device, deviceAlarm); + }else if (device == null && platform != null){ + commanderForPlatform.sendAlarmMessage(platform, deviceAlarm); + }else { + logger.warn("鏃犳硶纭畾" + gbId + "鏄钩鍙拌繕鏄澶�"); + } } } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/RedisGbPlayMsgListener.java b/src/main/java/com/genersoft/iot/vmp/service/impl/RedisGbPlayMsgListener.java index 0f5f57c..4ef1d01 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/RedisGbPlayMsgListener.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/RedisGbPlayMsgListener.java @@ -271,7 +271,7 @@ }, userSetting.getPlatformPlayTimeout()); // 娣诲姞璁㈤槄 - HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed(content.getApp(), content.getStream(), true, "rtmp", mediaServerItem.getId()); + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed(content.getApp(), content.getStream(), true, "rtsp", mediaServerItem.getId()); subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{ dynamicTask.stop(taskKey); diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java index 8fabbda..e217ca9 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java @@ -301,7 +301,6 @@ if (jsonObject == null) { return false; } - System.out.println(jsonObject); if (jsonObject.getInteger("code") == 0) { result = true; streamProxy.setEnable(true); @@ -427,7 +426,7 @@ if(data != null && data.size() > 0) { for (int i = 0; i < data.size(); i++) { JSONObject streamJSONObj = data.getJSONObject(i); - if ("rtmp".equals(streamJSONObj.getString("schema"))) { + if ("rtsp".equals(streamJSONObj.getString("schema"))) { StreamInfo streamInfo = new StreamInfo(); String app = streamJSONObj.getString("app"); String stream = streamJSONObj.getString("stream"); 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 d10de48..b3bb89c 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java @@ -237,4 +237,6 @@ * 鍙戦�乺edis娑堟伅 鏌ヨ鎵�鏈夋帹娴佽澶囩殑鐘舵�� */ void sendStreamPushRequestedMsgForStatus(); + + List<SendRtpItem> querySendRTPServerByChnnelId(String channelId); } 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 ff31c11..a401ee2 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 @@ -380,6 +380,24 @@ } @Override + public List<SendRtpItem> querySendRTPServerByChnnelId(String channelId) { + if (channelId == null) { + return null; + } + String platformGbId = "*"; + String callId = "*"; + String streamId = "*"; + String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetting.getServerId() + "_" + platformGbId + + "_" + channelId + "_" + streamId + "_" + callId; + List<Object> scan = RedisUtil.scan(key); + List<SendRtpItem> result = new ArrayList<>(); + for (Object o : scan) { + result.add((SendRtpItem) RedisUtil.get((String) o)); + } + return result; + } + + @Override public List<SendRtpItem> querySendRTPServer(String platformGbId) { if (platformGbId == null) { platformGbId = "*"; diff --git a/src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java b/src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java index 494bcbb..f7e0729 100644 --- a/src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java +++ b/src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java @@ -82,4 +82,9 @@ return false; } } + + public static String getNowForISO8601() { + LocalDateTime nowDateTime = LocalDateTime.now(); + return formatterISO8601.format(nowDateTime); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java index 14b7a37..0e003e5 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java @@ -197,7 +197,7 @@ @Operation(summary = "淇濆瓨涓婄骇骞冲彴淇℃伅") @PostMapping("/save") @ResponseBody - public String savePlatform(@RequestBody ParentPlatform parentPlatform) { + public void savePlatform(@RequestBody ParentPlatform parentPlatform) { if (logger.isDebugEnabled()) { logger.debug("淇濆瓨涓婄骇骞冲彴淇℃伅API璋冪敤"); @@ -247,7 +247,6 @@ // 鍋滄璁㈤槄鐩稿叧鐨勫畾鏃朵换鍔� subscribeHolder.removeAllSubscribe(parentPlatform.getServerGBId()); } - return null; } else { throw new ControllerException(ErrorCode.ERROR100.getCode(),"鍐欏叆鏁版嵁搴撳け璐�"); } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java index d8a87d7..d0aff58 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java @@ -5,6 +5,7 @@ import com.alibaba.excel.read.metadata.ReadSheet; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.UserSetting; +import com.genersoft.iot.vmp.conf.exception.ControllerException; import com.genersoft.iot.vmp.conf.security.SecurityUtils; import com.genersoft.iot.vmp.conf.security.dto.LoginUser; import com.genersoft.iot.vmp.gb28181.bean.GbStream; @@ -17,6 +18,7 @@ import com.genersoft.iot.vmp.service.IStreamPushService; import com.genersoft.iot.vmp.service.impl.StreamPushUploadFileHandler; import com.genersoft.iot.vmp.vmanager.bean.BatchGBStreamParam; +import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.PageInfo; @@ -95,11 +97,9 @@ @PostMapping(value = "/save_to_gb") @ResponseBody @Operation(summary = "灏嗘帹娴佹坊鍔犲埌鍥芥爣") - public Object saveToGB(@RequestBody GbStream stream){ - if (streamPushService.saveToGB(stream)){ - return "success"; - }else { - return "fail"; + public void saveToGB(@RequestBody GbStream stream){ + if (!streamPushService.saveToGB(stream)){ + throw new ControllerException(ErrorCode.ERROR100); } } @@ -107,11 +107,9 @@ @DeleteMapping(value = "/remove_form_gb") @ResponseBody @Operation(summary = "灏嗘帹娴佺Щ鍑哄埌鍥芥爣") - public Object removeFormGB(@RequestBody GbStream stream){ - if (streamPushService.removeFromGB(stream)){ - return "success"; - }else { - return "fail"; + public void removeFormGB(@RequestBody GbStream stream){ + if (!streamPushService.removeFromGB(stream)){ + throw new ControllerException(ErrorCode.ERROR100); } } @@ -121,25 +119,21 @@ @Operation(summary = "涓涓�涓帹娴�") @Parameter(name = "app", description = "搴旂敤鍚�", required = true) @Parameter(name = "stream", description = "娴乮d", required = true) - public Object stop(String app, String streamId){ - if (streamPushService.stop(app, streamId)){ - return "success"; - }else { - return "fail"; + public void stop(String app, String streamId){ + if (!streamPushService.stop(app, streamId)){ + throw new ControllerException(ErrorCode.ERROR100); } } @DeleteMapping(value = "/batchStop") @ResponseBody @Operation(summary = "涓澶氫釜鎺ㄦ祦") - public Object batchStop(@RequestBody BatchGBStreamParam batchGBStreamParam){ + public void batchStop(@RequestBody BatchGBStreamParam batchGBStreamParam){ if (batchGBStreamParam.getGbStreams().size() == 0) { - return "fail"; + throw new ControllerException(ErrorCode.ERROR100); } - if (streamPushService.batchStop(batchGBStreamParam.getGbStreams())){ - return "success"; - }else { - return "fail"; + if (!streamPushService.batchStop(batchGBStreamParam.getGbStreams())){ + throw new ControllerException(ErrorCode.ERROR100); } } @@ -249,7 +243,7 @@ @Parameter(name = "app", description = "搴旂敤鍚�", required = true) @Parameter(name = "stream", description = "娴乮d", required = true) @Parameter(name = "mediaServerId", description = "濯掍綋鏈嶅姟鍣╥d") - public WVPResult<StreamInfo> getPlayUrl(@RequestParam String app,@RequestParam String stream, + public StreamInfo getPlayUrl(@RequestParam String app,@RequestParam String stream, @RequestParam(required = false) String mediaServerId){ boolean authority = false; // 鏄惁鐧婚檰鐢ㄦ埛, 鐧婚檰鐢ㄦ埛杩斿洖瀹屾暣淇℃伅 @@ -257,52 +251,38 @@ if (userInfo!= null) { authority = true; } - WVPResult<StreamInfo> result = new WVPResult<>(); StreamPushItem push = streamPushService.getPush(app, stream); if (push != null && !push.isSelf()) { - result.setCode(-1); - result.setMsg("鏉ヨ嚜鍏朵粬骞冲彴鐨勬帹娴佷俊鎭�"); - return result; + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鏉ヨ嚜鍏朵粬骞冲彴鐨勬帹娴佷俊鎭�"); } StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, authority); - if (streamInfo != null){ - result.setCode(0); - result.setMsg("success"); - result.setData(streamInfo); - }else { - result.setCode(-1); - result.setMsg("鑾峰彇鎾斁鍦板潃澶辫触"); + if (streamInfo == null){ + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鑾峰彇鎾斁鍦板潃澶辫触"); } - - return result; + return streamInfo; } /** - * 鑾峰彇鎺ㄦ祦鎾斁鍦板潃 + * 娣诲姞鎺ㄦ祦淇℃伅 * @param stream 鎺ㄦ祦淇℃伅 * @return */ @PostMapping(value = "/add") @ResponseBody - @Operation(summary = "鍋滄瑙嗛鍥炴斁") - public WVPResult<StreamInfo> add(@RequestBody StreamPushItem stream){ + @Operation(summary = "娣诲姞鎺ㄦ祦淇℃伅") + public void add(@RequestBody StreamPushItem stream){ if (ObjectUtils.isEmpty(stream.getGbId())) { - - return new WVPResult<>(400, "鍥芥爣ID涓嶅彲涓虹┖", null); + throw new ControllerException(ErrorCode.ERROR400.getCode(), "鍥芥爣ID涓嶅彲涓虹┖"); } if (ObjectUtils.isEmpty(stream.getApp()) && ObjectUtils.isEmpty(stream.getStream())) { - return new WVPResult<>(400, "app鎴杝tream涓嶅彲涓虹┖", null); + throw new ControllerException(ErrorCode.ERROR400.getCode(), "app鎴杝tream涓嶅彲涓虹┖"); } stream.setStatus(false); stream.setPushIng(false); stream.setAliveSecond(0L); stream.setTotalReaderCount("0"); - boolean result = streamPushService.add(stream); - - if (result) { - return new WVPResult<>(0, "success", null); - }else { - return new WVPResult<>(-1, "fail", null); + if (!streamPushService.add(stream)) { + throw new ControllerException(ErrorCode.ERROR100); } } } diff --git a/src/main/resources/logback-spring-local.xml b/src/main/resources/logback-spring-local.xml index 9e58355..b9d3b39 100644 --- a/src/main/resources/logback-spring-local.xml +++ b/src/main/resources/logback-spring-local.xml @@ -77,25 +77,35 @@ </encoder> </appender> + <!-- 鐢熸垚 SIP鏃ュ織杩藉姞 --> + <appender name="sipRollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> + <!--鍘嗗彶鏃ュ織鏂囦欢杈撳嚭鐨勬枃浠跺悕 --> + <FileNamePattern>${LOG_HOME}/sip-%d{yyyy-MM-dd}.%i.log</FileNamePattern> + <!--鏃ュ織鏂囦欢淇濈暀澶╂暟 --> + <MaxHistory>30</MaxHistory> + <maxFileSize>50MB</maxFileSize> + </rollingPolicy> + <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> + <!--鏍煎紡鍖栬緭鍑猴細%d琛ㄧず鏃ユ湡锛�%thread琛ㄧず绾跨▼鍚嶏紝%-5level锛氱骇鍒粠宸︽樉绀�5涓瓧绗﹀搴�%msg锛氭棩蹇楁秷鎭紝%n鏄崲琛岀 --> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern> + </encoder> + </appender> + <!-- 鏃ュ織杈撳嚭绾у埆 --> <root level="INFO"> <appender-ref ref="STDOUT" /> - <appender-ref ref="RollingFile" /> - <appender-ref ref="RollingFileError" /> </root> -<!-- <logger name="com.genersoft.iot.vmp.storager.dao" level="INFO">--> -<!-- <appender-ref ref="STDOUT"/>--> -<!-- </logger>--> -<!-- <logger name="com.genersoft.iot.vmp.gb28181" level="INFO">--> -<!-- <appender-ref ref="STDOUT"/>--> -<!-- </logger>--> + <logger name="GB28181_SIP" level="debug" additivity="true"> + <appender-ref ref="RollingFileError"/> + <appender-ref ref="sipRollingFile"/> + </logger> <!--璁板綍druid-sql鐨勮褰�--> - <logger name="druid.sql.Statement" level="debug" additivity="true"> + <logger name="com.genersoft.iot.vmp.storager.dao" level="info" additivity="true"> <!--AppenderRef ref="Console"/--> - <!-- <appender-ref ref="RollingFile"/>--> <appender-ref ref="RollingFileError"/> <appender-ref ref="druidSqlRollingFile"/> </logger> diff --git a/web_src/src/components/dialog/devicePlayer.vue b/web_src/src/components/dialog/devicePlayer.vue index 336a27f..71530ce 100644 --- a/web_src/src/components/dialog/devicePlayer.vue +++ b/web_src/src/components/dialog/devicePlayer.vue @@ -371,7 +371,7 @@ if (tab.name === "codec") { this.$axios({ method: 'get', - url: '/zlm/' +this.mediaServerId+ '/index/api/getMediaInfo?vhost=__defaultVhost__&schema=rtmp&app='+ this.app +'&stream='+ this.streamId + url: '/zlm/' +this.mediaServerId+ '/index/api/getMediaInfo?vhost=__defaultVhost__&schema=rtsp&app='+ this.app +'&stream='+ this.streamId }).then(function (res) { that.tracksLoading = false; if (res.data.code == 0 && res.data.tracks) { diff --git a/web_src/src/components/dialog/platformEdit.vue b/web_src/src/components/dialog/platformEdit.vue index d2ebb84..633160b 100644 --- a/web_src/src/components/dialog/platformEdit.vue +++ b/web_src/src/components/dialog/platformEdit.vue @@ -268,30 +268,29 @@ } }, saveForm: function (){ - var that = this; - that.$axios({ + this.$axios({ method: 'post', url: this.saveUrl, - data: that.platform - }).then(function (res) { + data: this.platform + }).then((res) =>{ if (res.data.code === 0) { - that.$message({ + this.$message({ showClose: true, message: "淇濆瓨鎴愬姛", type: "success", }); - that.showDialog = false; - if (that.listChangeCallback != null) { - that.listChangeCallback(); + this.showDialog = false; + if (this.listChangeCallback != null) { + this.listChangeCallback(); } }else { - that.$message({ + this.$message({ showClose: true, message: res.data.msg, type: "error", }); } - }).catch(function (error) { + }).catch((error)=> { console.log(error); }); }, -- Gitblit v1.8.0