From 0c10e8d9d3ca01fb31f632560f6089f5d2b1d585 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期二, 14 十二月 2021 18:41:50 +0800 Subject: [PATCH] 优化info消息的cseq计数 --- src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java | 13 ---- /dev/null | 14 ---- src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java | 2 src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java | 2 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java | 14 +++- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 22 ++++--- src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java | 22 +++++++ src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java | 10 +++ src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java | 8 ++ src/main/java/com/genersoft/iot/vmp/service/bean/CatalogSubscribeTask.java | 32 ++++++---- src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java | 2 src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java | 2 12 files changed, 85 insertions(+), 58 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java index 97cb3d9..3502525 100644 --- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java +++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java @@ -56,6 +56,8 @@ public static final String MEDIA_TRANSACTION_USED_PREFIX = "VMP_MEDIA_TRANSACTION_"; + public static final String SIP_CSEQ_PREFIX = "VMP_SIP_CSEQ_"; + //************************** redis 娑堟伅********************************* public static final String WVP_MSG_STREAM_CHANGE_PREFIX = "WVP_MSG_STREAM_CHANGE_"; diff --git a/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java b/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java index f944b11..26b0a5c 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java @@ -1,5 +1,7 @@ package com.genersoft.iot.vmp.conf.runner; +import com.genersoft.iot.vmp.common.VideoManagerConstants; +import com.genersoft.iot.vmp.conf.UserSetup; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; import org.springframework.beans.factory.annotation.Autowired; @@ -23,6 +25,9 @@ @Autowired private IRedisCatchStorage redisCatchStorage; + @Autowired + private UserSetup userSetup; + @Override public void run(String... args) throws Exception { // 璇诲彇redis娌℃湁蹇冭烦淇℃伅鐨勫垯璁剧疆涓虹绾匡紝绛夋敹鍒颁笅娆″績璺宠缃负鍦ㄧ嚎 @@ -32,7 +37,8 @@ for (String deviceId : onlineForAll) { storager.online(deviceId); } - + // 閲嶇疆cseq璁℃暟 + redisCatchStorage.resetAllCSEQ(); // TODO 鏌ヨ鍦ㄧ嚎璁惧閭d簺寮�鍚簡璁㈤槄锛屼负璁惧寮�鍚畾鏃剁殑鐩綍璁㈤槄 } } 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 98ea7c9..6306ab6 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 @@ -14,7 +14,7 @@ import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; -import com.genersoft.iot.vmp.vmanager.gb28181.session.InfoCseqCache; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -34,6 +34,9 @@ @Autowired private SipFactory sipFactory; + + @Autowired + private IRedisCatchStorage redisCatchStorage; @Autowired private VideoStreamSessionManager streamSession; @@ -195,6 +198,7 @@ // Forwards MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); + // ceq CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(1L, Request.SUBSCRIBE); @@ -218,7 +222,7 @@ return request; } - public Request createInfoRequest(Device device, StreamInfo streamInfo, String content) + public Request createInfoRequest(Device device, StreamInfo streamInfo, String content, Long cseq) throws PeerUnavailableException, ParseException, InvalidArgumentException { Request request = null; Dialog dialog = streamSession.getDialog(streamInfo.getDeviceID(), streamInfo.getChannelId()); @@ -247,10 +251,12 @@ // Forwards MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); - + if (cseq == null) { + cseq = redisCatchStorage.getCSEQ(Request.INFO); + } // ceq CSeqHeader cSeqHeader = sipFactory.createHeaderFactory() - .createCSeqHeader(InfoCseqCache.CSEQCACHE.get(streamInfo.getStreamId()), Request.INFO); + .createCSeqHeader(cseq, Request.INFO); request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INFO, callIdHeader, cSeqHeader, fromHeader, toHeader, viaHeaders, maxForwards); 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 138ccaf..dc0996a 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 @@ -18,7 +18,6 @@ import com.genersoft.iot.vmp.service.bean.SSRCInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.vmanager.gb28181.session.InfoCseqCache; import gov.nist.javax.sip.SipProviderImpl; import gov.nist.javax.sip.SipStackImpl; import gov.nist.javax.sip.message.SIPRequest; @@ -1553,12 +1552,12 @@ @Override public void playPauseCmd(Device device, StreamInfo streamInfo) { try { - + Long cseq = redisCatchStorage.getCSEQ(Request.INFO); StringBuffer content = new StringBuffer(200); content.append("PAUSE RTSP/1.0\r\n"); - content.append("CSeq: " + InfoCseqCache.CSEQCACHE.get(streamInfo.getStreamId()) + "\r\n"); + content.append("CSeq: " + cseq + "\r\n"); content.append("PauseTime: now\r\n"); - Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); + Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq); logger.info(request.toString()); ClientTransaction clientTransaction = null; if ("TCP".equals(device.getTransport())) { @@ -1581,11 +1580,12 @@ @Override public void playResumeCmd(Device device, StreamInfo streamInfo) { try { + Long cseq = redisCatchStorage.getCSEQ(Request.INFO); StringBuffer content = new StringBuffer(200); content.append("PLAY RTSP/1.0\r\n"); - content.append("CSeq: " + InfoCseqCache.CSEQCACHE.get(streamInfo.getStreamId()) + "\r\n"); + content.append("CSeq: " + cseq + "\r\n"); content.append("Range: npt=now-\r\n"); - Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); + Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq); logger.info(request.toString()); ClientTransaction clientTransaction = null; if ("TCP".equals(device.getTransport())) { @@ -1607,12 +1607,13 @@ @Override public void playSeekCmd(Device device, StreamInfo streamInfo, long seekTime) { try { + Long cseq = redisCatchStorage.getCSEQ(Request.INFO); StringBuffer content = new StringBuffer(200); content.append("PLAY RTSP/1.0\r\n"); - content.append("CSeq: " + InfoCseqCache.CSEQCACHE.get(streamInfo.getStreamId()) + "\r\n"); + content.append("CSeq: " + cseq + "\r\n"); content.append("Range: npt=" + Math.abs(seekTime) + "-\r\n"); - Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); + Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq); logger.info(request.toString()); ClientTransaction clientTransaction = null; if ("TCP".equals(device.getTransport())) { @@ -1634,11 +1635,12 @@ @Override public void playSpeedCmd(Device device, StreamInfo streamInfo, Double speed) { try { + Long cseq = redisCatchStorage.getCSEQ(Request.INFO); StringBuffer content = new StringBuffer(200); content.append("PLAY RTSP/1.0\r\n"); - content.append("CSeq: " + InfoCseqCache.CSEQCACHE.get(streamInfo.getStreamId()) + "\r\n"); + content.append("CSeq: " + cseq + "\r\n"); content.append("Scale: " + String.format("%.1f",speed) + "\r\n"); - Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); + Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq); logger.info(request.toString()); ClientTransaction clientTransaction = null; if ("TCP".equals(device.getTransport())) { 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 79cb5cc..b56287b 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 @@ -89,7 +89,7 @@ }); // 鑾峰彇zlm淇℃伅 - logger.info("绛夊緟榛樿zlm鎺ュ叆..."); + logger.info("[zlm鎺ュ叆]绛夊緟榛樿zlm涓�..."); // 鑾峰彇鎵�鏈夌殑zlm锛� 骞跺紑鍚富鍔ㄨ繛鎺� List<MediaServerItem> all = mediaServerService.getAllFromDatabase(); diff --git a/src/main/java/com/genersoft/iot/vmp/service/bean/CatalogSubscribeTask.java b/src/main/java/com/genersoft/iot/vmp/service/bean/CatalogSubscribeTask.java index eb179d7..cfaef71 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/bean/CatalogSubscribeTask.java +++ b/src/main/java/com/genersoft/iot/vmp/service/bean/CatalogSubscribeTask.java @@ -25,24 +25,28 @@ sipCommander.catalogSubscribe(device, eventResult -> { ResponseEvent event = (ResponseEvent) eventResult.event; Element rootElement = null; - try { - rootElement = XmlUtil.getRootElement(event.getResponse().getRawContent(), "gb2312"); - } catch (DocumentException e) { - e.printStackTrace(); - } - Element resultElement = rootElement.element("Result"); - String result = resultElement.getText(); - if (result.toUpperCase().equals("OK")){ - // 鎴愬姛 - logger.info("鐩綍璁㈤槄鎴愬姛锛� {}", device.getDeviceId()); + if (event.getResponse().getRawContent() != null) { + try { + rootElement = XmlUtil.getRootElement(event.getResponse().getRawContent(), "gb2312"); + } catch (DocumentException e) { + e.printStackTrace(); + } + Element resultElement = rootElement.element("Result"); + String result = resultElement.getText(); + if (result.toUpperCase().equals("OK")){ + // 鎴愬姛 + logger.info("[鐩綍璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); + }else { + // 澶辫触 + logger.info("[鐩綍璁㈤槄]澶辫触锛� {}-{}", device.getDeviceId(), result); + } }else { - // 澶辫触 - logger.info("鐩綍璁㈤槄澶辫触锛� {}-{}", device.getDeviceId(), result); + // 鎴愬姛 + logger.info("[鐩綍璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); } - },eventResult -> { // 澶辫触 - logger.warn("鐩綍璁㈤槄澶辫触锛� {}-淇′护鍙戦�佸け璐�", device.getDeviceId()); + logger.warn("[鐩綍璁㈤槄]澶辫触锛屼俊浠ゅ彂閫佸け璐ワ細 {}-{} ", device.getDeviceId(), eventResult.msg); }); } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java index f914313..1159484 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java @@ -51,6 +51,8 @@ dynamicTask.stopCron(device.getDeviceId()); device.setSubscribeCycleForCatalog(0); sipCommander.catalogSubscribe(device, null, null); + // 娓呯┖cseq璁℃暟 + return true; } } 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 0efb20a..5b17068 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 @@ -83,7 +83,7 @@ */ @Override public void run(String... args) throws Exception { - logger.info("Media Server 缂撳瓨鍒濆鍖�"); + logger.info("[缂撳瓨鍒濆鍖朷 Media Server "); List<MediaServerItem> mediaServerItemList = mediaServerMapper.queryAll(); for (MediaServerItem mediaServerItem : mediaServerItemList) { if (StringUtils.isEmpty(mediaServerItem.getId())) { 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 c9ffb35..68a772e 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java @@ -15,6 +15,14 @@ public interface IRedisCatchStorage { /** + * 璁℃暟鍣ㄣ�備负cseq杩涜璁℃暟 + * + * @param method sip 鏂规硶 + * @return + */ + Long getCSEQ(String method); + + /** * 寮�濮嬫挱鏀炬椂灏嗘祦瀛樺叆 * * @param stream 娴佷俊鎭� @@ -181,4 +189,6 @@ * 鑾峰彇Device */ Device getDevice(String deviceId); + + void resetAllCSEQ(); } 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 bad2aae..3ded416 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 @@ -36,6 +36,28 @@ private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + @Override + public Long getCSEQ(String method) { + String key = VideoManagerConstants.SIP_CSEQ_PREFIX + userSetup.getServerId() + "_" + method; + + long result = redis.incr(key, 1L); + if (result > Integer.MAX_VALUE) { + redis.set(key, 1); + result = 1; + } + return result; + } + + @Override + public void resetAllCSEQ() { + String scanKey = VideoManagerConstants.SIP_CSEQ_PREFIX + userSetup.getServerId() + "_*"; + List<Object> keys = redis.scan(scanKey); + for (int i = 0; i < keys.size(); i++) { + String key = (String) keys.get(i); + redis.set(key, 1); + } + } + /** * 寮�濮嬫挱鏀炬椂灏嗘祦瀛樺叆redis * diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java index fd1f2ab..8f83e7c 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java @@ -9,7 +9,6 @@ import com.genersoft.iot.vmp.service.bean.SSRCInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.service.IPlayService; -import com.genersoft.iot.vmp.vmanager.gb28181.session.InfoCseqCache; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -31,7 +30,6 @@ import com.genersoft.iot.vmp.storager.IVideoManagerStorager; import org.springframework.web.context.request.async.DeferredResult; -import javax.sip.message.Response; import java.util.UUID; @Api(tags = "瑙嗛鍥炴斁") @@ -168,7 +166,6 @@ logger.warn("streamId涓嶅瓨鍦�!"); return new ResponseEntity<String>(json.toString(), HttpStatus.BAD_REQUEST); } - setCseq(streamId); Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); cmder.playPauseCmd(device, streamInfo); json.put("msg", "ok"); @@ -189,7 +186,6 @@ logger.warn("streamId涓嶅瓨鍦�!"); return new ResponseEntity<String>(json.toString(), HttpStatus.BAD_REQUEST); } - setCseq(streamId); Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); cmder.playResumeCmd(device, streamInfo); json.put("msg", "ok"); @@ -211,7 +207,6 @@ logger.warn("streamId涓嶅瓨鍦�!"); return new ResponseEntity<String>(json.toString(), HttpStatus.BAD_REQUEST); } - setCseq(streamId); Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); cmder.playSeekCmd(device, streamInfo, seekTime); json.put("msg", "ok"); @@ -238,18 +233,10 @@ logger.warn("涓嶆敮鎸佺殑speed锛� " + speed); return new ResponseEntity<String>(json.toString(), HttpStatus.BAD_REQUEST); } - setCseq(streamId); Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); cmder.playSpeedCmd(device, streamInfo, speed); json.put("msg", "ok"); return new ResponseEntity<String>(json.toString(), HttpStatus.OK); } - public void setCseq(String streamId) { - if (InfoCseqCache.CSEQCACHE.containsKey(streamId)) { - InfoCseqCache.CSEQCACHE.put(streamId, InfoCseqCache.CSEQCACHE.get(streamId) + 1); - } else { - InfoCseqCache.CSEQCACHE.put(streamId, 2L); - } - } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/session/InfoCseqCache.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/session/InfoCseqCache.java deleted file mode 100644 index 051f981..0000000 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/session/InfoCseqCache.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.genersoft.iot.vmp.vmanager.gb28181.session; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @ClassName: InfoCseqCache - * @Description: INFO绫诲瀷鐨凷ip涓璫seq鐨勭紦瀛� - */ -public class InfoCseqCache { - - public static Map<String, Long> CSEQCACHE = new ConcurrentHashMap<>(); - -} \ No newline at end of file -- Gitblit v1.8.0