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