From cb16cabb64e99d7f505822a49665725ff5b61ff6 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期一, 15 八月 2022 15:37:13 +0800
Subject: [PATCH] Merge branch 'wvp-28181-2.0'
---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 88 ++++---
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java | 89 ++++++-
src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java | 67 +----
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java | 6
pom.xml | 12 -
src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java | 40 ++-
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java | 58 ++++
/dev/null | 97 --------
src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java | 13
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java | 98 ++++----
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 7
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java | 4
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java | 3
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java | 2
src/main/java/com/genersoft/iot/vmp/conf/RedisKeyExpirationEventMessageListener.java | 2
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java | 2
doc/_content/introduction/deployment.md | 2
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java | 25 -
18 files changed, 305 insertions(+), 310 deletions(-)
diff --git a/doc/_content/introduction/deployment.md b/doc/_content/introduction/deployment.md
index cdc1568..388fd35 100644
--- a/doc/_content/introduction/deployment.md
+++ b/doc/_content/introduction/deployment.md
@@ -24,7 +24,7 @@
7. 鍚姩鏈嶅姟锛屼互linux涓轰緥
**鍚姩WVP-PRO**
```shell
-nohup java -jar java -jar wvp-pro-*.jar &
+nohup java -jar wvp-pro-*.jar &
```
**鍚姩ZLM**
diff --git a/pom.xml b/pom.xml
index 41be567..2abd9d8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -61,13 +61,6 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
- <exclusions>
- <!-- 鍘绘帀 Lettuce 鐨勪緷璧栵紝 Spring Boot 浼樺厛浣跨敤 Lettuce 浣滀负 Redis 瀹㈡埛绔� -->
- <exclusion>
- <groupId>io.lettuce</groupId>
- <artifactId>lettuce-core</artifactId>
- </exclusion>
- </exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
@@ -92,11 +85,6 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
- </dependency>
-
- <dependency>
- <groupId>redis.clients</groupId>
- <artifactId>jedis</artifactId>
</dependency>
<!-- druid鏁版嵁搴撹繛鎺ユ睜 -->
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 40a7352..510b5b2 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
@@ -77,38 +77,54 @@
//************************** redis 娑堟伅*********************************
- // 娴佸彉鍖栫殑閫氱煡
+ /**
+ * 娴佸彉鍖栫殑閫氱煡
+ */
public static final String WVP_MSG_STREAM_CHANGE_PREFIX = "WVP_MSG_STREAM_CHANGE_";
- // 鎺ユ敹鎺ㄦ祦璁惧鐨凣PS鍙樺寲閫氱煡
+ /**
+ * 鎺ユ敹鎺ㄦ祦璁惧鐨凣PS鍙樺寲閫氱煡
+ */
public static final String VM_MSG_GPS = "VM_MSG_GPS";
- // 鎺ユ敹鎺ㄦ祦璁惧鐨凣PS鍙樺寲閫氱煡
+ /**
+ * 鎺ユ敹鎺ㄦ祦璁惧鐨凣PS鍙樺寲閫氱煡
+ */
public static final String VM_MSG_PUSH_STREAM_STATUS_CHANGE = "VM_MSG_PUSH_STREAM_STATUS_CHANGE";
- // redis 娑堟伅閫氱煡璁惧鎺ㄦ祦鍒板钩鍙�
+ /**
+ * redis 娑堟伅閫氱煡璁惧鎺ㄦ祦鍒板钩鍙�
+ */
public static final String VM_MSG_STREAM_PUSH_REQUESTED = "VM_MSG_STREAM_PUSH_REQUESTED";
- // redis 娑堟伅璇锋眰鎵�鏈夌殑鍦ㄧ嚎閫氶亾
+ /**
+ * redis 娑堟伅璇锋眰鎵�鏈夌殑鍦ㄧ嚎閫氶亾
+ */
public static final String VM_MSG_GET_ALL_ONLINE_REQUESTED = "VM_MSG_GET_ALL_ONLINE_REQUESTED";
- // 绉诲姩浣嶇疆璁㈤槄閫氱煡
+ /**
+ * 绉诲姩浣嶇疆璁㈤槄閫氱煡
+ */
public static final String VM_MSG_SUBSCRIBE_MOBILE_POSITION = "mobileposition";
- // 鎶ヨ璁㈤槄鐨勯�氱煡锛堟敹鍒版姤璀﹀悜redis鍙戝嚭閫氱煡锛�
+ /**
+ * 鎶ヨ璁㈤槄鐨勯�氱煡锛堟敹鍒版姤璀﹀悜redis鍙戝嚭閫氱煡锛�
+ */
public static final String VM_MSG_SUBSCRIBE_ALARM = "alarm";
- // 鎶ヨ閫氱煡鐨勫彂閫� 锛堟敹鍒皉edis鍙戝嚭鐨勯�氱煡锛岃浆鍙戠粰鍏朵粬骞冲彴锛�
+ /**
+ * 鎶ヨ閫氱煡鐨勫彂閫� 锛堟敹鍒皉edis鍙戝嚭鐨勯�氱煡锛岃浆鍙戠粰鍏朵粬骞冲彴锛�
+ */
public static final String VM_MSG_SUBSCRIBE_ALARM_RECEIVE= "alarm_receive";
- // 璁惧鐘舵�佽闃呯殑閫氱煡
+ /**
+ * 璁惧鐘舵�佽闃呯殑閫氱煡
+ */
public static final String VM_MSG_SUBSCRIBE_DEVICE_STATUS = "device";
-
-
-
//************************** 绗笁鏂� ****************************************
+
public static final String WVP_STREAM_GB_ID_PREFIX = "memberNo_";
public static final String WVP_STREAM_GPS_MSG_PREFIX = "WVP_STREAM_GPS_MSG_";
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java
index 6a862ae..d2e1347 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java
@@ -1,5 +1,6 @@
package com.genersoft.iot.vmp.conf;
+import com.alibaba.fastjson.parser.ParserConfig;
import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.service.impl.*;
import org.apache.commons.lang3.StringUtils;
@@ -9,15 +10,14 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
-import com.alibaba.fastjson.parser.ParserConfig;
import com.genersoft.iot.vmp.utils.redis.FastJsonRedisSerializer;
-import redis.clients.jedis.JedisPool;
-import redis.clients.jedis.JedisPoolConfig;
+
/**
* @description:Redis涓棿浠堕厤缃被锛屼娇鐢╯pring-data-redis闆嗘垚锛岃嚜鍔ㄤ粠application.yml涓姞杞絩edis閰嶇疆
@@ -27,23 +27,6 @@
*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
-
- @Value("${spring.redis.host}")
- private String host;
- @Value("${spring.redis.port}")
- private int port;
- @Value("${spring.redis.database}")
- private int database;
- @Value("${spring.redis.password}")
- private String password;
- @Value("${spring.redis.timeout}")
- private int timeout;
- @Value("${spring.redis.poolMaxTotal:1000}")
- private int poolMaxTotal;
- @Value("${spring.redis.poolMaxIdle:500}")
- private int poolMaxIdle;
- @Value("${spring.redis.poolMaxWait:5}")
- private int poolMaxWait;
@Autowired
private RedisGpsMsgListener redisGPSMsgListener;
@@ -61,36 +44,24 @@
private RedisPushStreamStatusMsgListener redisPushStreamStatusMsgListener;
@Bean
- public JedisPool jedisPool() {
- if (StringUtils.isBlank(password)) {
- password = null;
- }
- JedisPoolConfig poolConfig = new JedisPoolConfig();
- poolConfig.setMaxIdle(poolMaxIdle);
- poolConfig.setMaxTotal(poolMaxTotal);
- // 绉掕浆姣
- poolConfig.setMaxWaitMillis(poolMaxWait * 1000L);
- JedisPool jp = new JedisPool(poolConfig, host, port, timeout * 1000, password, database);
- return jp;
+ public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
+ RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
+ // 浣跨敤fastJson搴忓垪鍖�
+ FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
+ // value鍊肩殑搴忓垪鍖栭噰鐢╢astJsonRedisSerializer
+ redisTemplate.setValueSerializer(fastJsonRedisSerializer);
+ redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
+ // 鍏ㄥ眬寮�鍚疉utoType锛屼笉寤鸿浣跨敤
+ ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
+ // 寤鸿浣跨敤杩欑鏂瑰紡锛屽皬鑼冨洿鎸囧畾鐧藉悕鍗曪紝闇�瑕佸簭鍒楀寲鐨勭被
+// ParserConfig.getGlobalInstance().addAccept("com.avatar");
+ // key鐨勫簭鍒楀寲閲囩敤StringRedisSerializer
+ redisTemplate.setKeySerializer(new StringRedisSerializer());
+ redisTemplate.setHashKeySerializer(new StringRedisSerializer());
+ redisTemplate.setConnectionFactory(redisConnectionFactory);
+ return redisTemplate;
}
- @Bean("redisTemplate")
- public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
- RedisTemplate<Object, Object> template = new RedisTemplate<>();
- template.setConnectionFactory(redisConnectionFactory);
- // 浣跨敤fastjson杩涜搴忓垪鍖栧鐞嗭紝鎻愰珮瑙f瀽鏁堢巼
- FastJsonRedisSerializer<Object> serializer = new FastJsonRedisSerializer<Object>(Object.class);
- // value鍊肩殑搴忓垪鍖栭噰鐢╢astJsonRedisSerializer
- template.setValueSerializer(serializer);
- template.setHashValueSerializer(serializer);
- // key鐨勫簭鍒楀寲閲囩敤StringRedisSerializer
- template.setKeySerializer(new StringRedisSerializer());
- template.setHashKeySerializer(new StringRedisSerializer());
- template.setConnectionFactory(redisConnectionFactory);
- // 浣跨敤fastjson鏃堕渶璁剧疆姝ら」锛屽惁鍒欎細鎶ュ紓甯竛ot support type
- ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
- return template;
- }
/**
* redis娑堟伅鐩戝惉鍣ㄥ鍣� 鍙互娣诲姞澶氫釜鐩戝惉涓嶅悓璇濋鐨剅edis鐩戝惉鍣紝鍙渶瑕佹妸娑堟伅鐩戝惉鍣ㄥ拰鐩稿簲鐨勬秷鎭闃呭鐞嗗櫒缁戝畾锛岃娑堟伅鐩戝惉鍣�
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/RedisKeyExpirationEventMessageListener.java b/src/main/java/com/genersoft/iot/vmp/conf/RedisKeyExpirationEventMessageListener.java
index 1848380..ef4a617 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/RedisKeyExpirationEventMessageListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/RedisKeyExpirationEventMessageListener.java
@@ -28,7 +28,7 @@
RedisConnection connection = this.listenerContainer.getConnectionFactory().getConnection();
Properties config = connection.getConfig("notify-keyspace-events");
try {
- if (!config.getProperty("notify-keyspace-events").equals(keyspaceNotificationsConfigParameter)) {
+ if (!keyspaceNotificationsConfigParameter.equals(config.getProperty("notify-keyspace-events"))) {
connection.setConfig("notify-keyspace-events", keyspaceNotificationsConfigParameter);
}
} finally {
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 a3428b1..c1811bf 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
@@ -53,10 +53,15 @@
* gov/nist/javax/sip/SipStackImpl.class
*/
properties.setProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT", "true");
- properties.setProperty("gov.nist.javax.sip.DELIVER_UNSOLICITED_NOTIFY", "true"); // 鎺ユ敹鎵�鏈塶otify璇锋眰锛屽嵆浣挎病鏈夎闃�
- properties.setProperty("gov.nist.javax.sip.DELIVER_TERMINATED_EVENT_FOR_NULL_DIALOG", "true"); // 涓篲NULL _瀵硅瘽妗嗕紶閫抇缁堟鐨刜浜嬩欢
- properties.setProperty("gov.nist.javax.sip.RELEASE_REFERENCES_STRATEGY", "Normal"); // 浼氳瘽娓呯悊绛栫暐
- properties.setProperty("gov.nist.javax.sip.RELIABLE_CONNECTION_KEEP_ALIVE_TIMEOUT", "10");
+ // 鎺ユ敹鎵�鏈塶otify璇锋眰锛屽嵆浣挎病鏈夎闃�
+ properties.setProperty("gov.nist.javax.sip.DELIVER_UNSOLICITED_NOTIFY", "true");
+ // 涓篲NULL _瀵硅瘽妗嗕紶閫抇缁堟鐨刜浜嬩欢
+ properties.setProperty("gov.nist.javax.sip.DELIVER_TERMINATED_EVENT_FOR_NULL_DIALOG", "true");
+ // 浼氳瘽娓呯悊绛栫暐
+ properties.setProperty("gov.nist.javax.sip.RELEASE_REFERENCES_STRATEGY", "Normal");
+ // 澶勭悊鐢辫鏈嶅姟鍣ㄥ鐞嗙殑鍩轰簬搴曞眰TCP鐨勪繚鎸佺敓瀛樿秴鏃�
+ properties.setProperty("gov.nist.javax.sip.RELIABLE_CONNECTION_KEEP_ALIVE_TIMEOUT", "60");
+
/**
* sip_server_log.log 鍜� sip_debug_log.log public static final int TRACE_NONE =
* 0; public static final int TRACE_MESSAGES = 16; public static final int
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java
index 1c2e611..ad8043f 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java
@@ -62,7 +62,7 @@
// Forwards
MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
// ceq
- CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.MESSAGE), Request.MESSAGE);
+ CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.MESSAGE);
request = sipFactory.createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards);
@@ -120,7 +120,7 @@
String callId, WWWAuthenticateHeader www , CallIdHeader callIdHeader) throws ParseException, PeerUnavailableException, InvalidArgumentException {
- Request registerRequest = createRegisterRequest(parentPlatform, redisCatchStorage.getCSEQ(Request.REGISTER), fromTag, viaTag, callIdHeader);
+ Request registerRequest = createRegisterRequest(parentPlatform, redisCatchStorage.getCSEQ(), fromTag, viaTag, callIdHeader);
SipURI requestURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIP() + ":" + parentPlatform.getServerPort());
if (www == null) {
AuthorizationHeader authorizationHeader = sipFactory.createHeaderFactory().createAuthorizationHeader("Digest");
@@ -213,7 +213,7 @@
// Forwards
MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
// ceq
- CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.MESSAGE), Request.MESSAGE);
+ CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.MESSAGE);
MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory();
// 璁剧疆缂栫爜锛� 闃叉涓枃涔辩爜
messageFactory.setDefaultContentEncodingCharset(parentPlatform.getCharacterSet());
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 349732b..b89fd8e 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
@@ -2,11 +2,9 @@
import java.text.ParseException;
import java.util.ArrayList;
+import java.util.List;
-import javax.sip.Dialog;
-import javax.sip.InvalidArgumentException;
-import javax.sip.PeerUnavailableException;
-import javax.sip.SipFactory;
+import javax.sip.*;
import javax.sip.address.Address;
import javax.sip.address.SipURI;
import javax.sip.header.*;
@@ -15,7 +13,11 @@
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import gov.nist.javax.sip.SipProviderImpl;
+import gov.nist.javax.sip.SipStackImpl;
+import gov.nist.javax.sip.stack.SIPDialog;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.genersoft.iot.vmp.conf.SipConfig;
@@ -40,6 +42,14 @@
@Autowired
private VideoStreamSessionManager streamSession;
+
+ @Autowired
+ @Qualifier(value="tcpSipProvider")
+ private SipProviderImpl tcpSipProvider;
+
+ @Autowired
+ @Qualifier(value="udpSipProvider")
+ private SipProviderImpl udpSipProvider;
public Request createMessageRequest(Device device, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException {
Request request = null;
@@ -95,7 +105,7 @@
MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
//ceq
- CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.INVITE), Request.INVITE);
+ CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);
request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));
@@ -131,7 +141,7 @@
MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
//ceq
- CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.INVITE), Request.INVITE);
+ CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);
request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));
@@ -200,7 +210,7 @@
MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
// ceq
- CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.SUBSCRIBE), Request.SUBSCRIBE);
+ CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.SUBSCRIBE);
request = sipFactory.createMessageFactory().createRequest(requestURI, Request.SUBSCRIBE, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards);
@@ -226,55 +236,55 @@
}
public Request createInfoRequest(Device device, StreamInfo streamInfo, String content)
- throws PeerUnavailableException, ParseException, InvalidArgumentException {
- Request request = null;
+ throws SipException, ParseException, InvalidArgumentException {
if (streamInfo == null) {
return null;
}
- Dialog dialog = streamSession.getDialogByStream(streamInfo.getDeviceID(), streamInfo.getChannelId(), streamInfo.getStream());
+ Request request = null;
+ SIPDialog dialog = streamSession.getDialogByStream(streamInfo.getDeviceID(), streamInfo.getChannelId(), streamInfo.getStream());
if (dialog == null) {
return null;
}
- SipURI requestLine = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(),
- device.getHostAddress());
- // via
- ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
- ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(device.getIp(), device.getPort(),
- device.getTransport(), null);
+ SipStack sipStack = udpSipProvider.getSipStack();
+ SIPDialog sipDialog = ((SipStackImpl) sipStack).putDialog(dialog);
+ if (dialog != sipDialog) {
+ dialog = sipDialog;
+ }else {
+ dialog.setSipProvider(udpSipProvider);
+ }
+ streamSession.put(streamInfo.getDeviceID(), streamInfo.getChannelId(), dialog.getCallId().getCallId(), dialog);
+ Request infoRequest = dialog.createRequest(Request.INFO);
+ SipURI sipURI = (SipURI) infoRequest.getRequestURI();
+ sipURI.setHost(device.getIp());
+ sipURI.setPort(device.getPort());
+ sipURI.setUser(streamInfo.getChannelId());
+
+ ViaHeader viaHeader = (ViaHeader) infoRequest.getHeader(ViaHeader.NAME);
viaHeader.setRPort();
- viaHeaders.add(viaHeader);
- // from
- SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(),
- sipConfig.getDomain());
- Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);
- FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, dialog.getLocalTag());
- // to
- SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(streamInfo.getChannelId(),
- sipConfig.getDomain());
- Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);
- ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, dialog.getRemoteTag());
-
- // callid
- CallIdHeader callIdHeader = dialog.getCallId();
-
- // Forwards
- MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
-
- Long cseq = redisCatchStorage.getCSEQ(Request.INVITE);
- // ceq
- CSeqHeader cSeqHeader = sipFactory.createHeaderFactory()
- .createCSeqHeader(cseq, Request.INFO);
-
- request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INFO, callIdHeader, cSeqHeader,
- fromHeader, toHeader, viaHeaders, maxForwards);
+ // 澧炲姞Contact header
Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory()
.createSipURI(sipConfig.getId(), sipConfig.getIp() + ":" + sipConfig.getPort()));
- request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress));
+ infoRequest.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress));
+ List<String> agentParam = new ArrayList<>();
+ agentParam.add("wvp-pro");
+ // TODO 娣诲姞鐗堟湰淇℃伅浠ュ強鏃ユ湡
+ UserAgentHeader userAgentHeader = null;
+ try {
+ userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ infoRequest.addHeader(userAgentHeader);
ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application",
"MANSRTSP");
- request.setContent(content, contentTypeHeader);
- return request;
+ infoRequest.setContent(content, contentTypeHeader);
+
+ CSeqHeader cSeqHeader = (CSeqHeader)infoRequest.getHeader(CSeqHeader.NAME);
+ cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ());
+ // ceq
+ infoRequest.addHeader(cSeqHeader);
+ return infoRequest;
}
}
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 96b92e9..c7d70d9 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
@@ -727,34 +727,48 @@
}
}
- streamByeCmd(dialog, (SIPRequest)transaction.getRequest(), okEvent);
+ Request byeRequest = dialog.createRequest(Request.BYE);
+ SipURI byeURI = (SipURI) byeRequest.getRequestURI();
+ SIPRequest request = (SIPRequest)transaction.getRequest();
+ byeURI.setHost(request.getRemoteAddress().getHostAddress());
+ byeURI.setPort(request.getRemotePort());
+ byeURI.setUser(channelId);
+ ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME);
+ String protocol = viaHeader.getTransport().toUpperCase();
+ viaHeader.setRPort();
+ // 澧炲姞Contact header
+ Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));
+ byeRequest.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress));
+ List<String> agentParam = new ArrayList<>();
+ agentParam.add("wvp-pro");
+ // TODO 娣诲姞鐗堟湰淇℃伅浠ュ強鏃ユ湡
+ UserAgentHeader userAgentHeader = null;
+ try {
+ userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ byeRequest.addHeader(userAgentHeader);
+ ClientTransaction clientTransaction = null;
+ if("TCP".equals(protocol)) {
+ clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest);
+ } else if("UDP".equals(protocol)) {
+ clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest);
+ }
+
+ CallIdHeader callIdHeader = (CallIdHeader) byeRequest.getHeader(CallIdHeader.NAME);
+ if (okEvent != null) {
+ sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent);
+ }
+ CSeqHeader cSeqHeader = (CSeqHeader)byeRequest.getHeader(CSeqHeader.NAME);
+ cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ());
+ dialog.sendRequest(clientTransaction);
} catch (SipException | ParseException e) {
e.printStackTrace();
+ } catch (InvalidArgumentException e) {
+ throw new RuntimeException(e);
}
- }
-
- @Override
- public void streamByeCmd(SIPDialog dialog, SIPRequest request, SipSubscribe.Event okEvent) throws SipException, ParseException {
- Request byeRequest = dialog.createRequest(Request.BYE);
- SipURI byeURI = (SipURI) byeRequest.getRequestURI();
- byeURI.setHost(request.getRemoteAddress().getHostAddress());
- byeURI.setPort(request.getRemotePort());
- ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME);
- String protocol = viaHeader.getTransport().toUpperCase();
- ClientTransaction clientTransaction = null;
- if("TCP".equals(protocol)) {
- clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest);
- } else if("UDP".equals(protocol)) {
- clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest);
- }
-
- CallIdHeader callIdHeader = (CallIdHeader) byeRequest.getHeader(CallIdHeader.NAME);
- if (okEvent != null) {
- sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent);
- }
-
- dialog.sendRequest(clientTransaction);
}
/**
@@ -1450,7 +1464,7 @@
request.setContent(subscribePostitionXml.toString(), contentTypeHeader);
CSeqHeader cSeqHeader = (CSeqHeader)request.getHeader(CSeqHeader.NAME);
- cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ(Request.SUBSCRIBE));
+ cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ());
request.removeHeader(CSeqHeader.NAME);
request.addHeader(cSeqHeader);
}else {
@@ -1554,7 +1568,7 @@
request.setContent(cmdXml.toString(), contentTypeHeader);
CSeqHeader cSeqHeader = (CSeqHeader)request.getHeader(CSeqHeader.NAME);
- cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ(Request.SUBSCRIBE));
+ cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ());
request.removeHeader(CSeqHeader.NAME);
request.addHeader(cSeqHeader);
@@ -1664,10 +1678,9 @@
@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: " + cseq + "\r\n");
+ content.append("CSeq: " + getInfoCseq() + "\r\n");
content.append("PauseTime: now\r\n");
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString());
if (request == null) {
@@ -1695,10 +1708,9 @@
@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: " + cseq + "\r\n");
+ content.append("CSeq: " + getInfoCseq() + "\r\n");
content.append("Range: npt=now-\r\n");
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString());
if (request == null) {
@@ -1725,10 +1737,9 @@
@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: " + cseq + "\r\n");
+ content.append("CSeq: " + getInfoCseq() + "\r\n");
content.append("Range: npt=" + Math.abs(seekTime) + "-\r\n");
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString());
@@ -1756,11 +1767,11 @@
@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: " + cseq + "\r\n");
- content.append("Scale: " + String.format("%.1f",speed) + "\r\n");
+ content.append("CSeq: " + getInfoCseq() + "\r\n");
+ content.append("Scale: " + String.format("%.6f",speed) + "\r\n");
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString());
if (request == null) {
return;
@@ -1779,7 +1790,11 @@
e.printStackTrace();
}
}
-
+
+ private int getInfoCseq() {
+ return (int) ((Math.random() * 9 + 1) * Math.pow(10, 8));
+ }
+
@Override
public void playbackControlCmd(Device device, StreamInfo streamInfo, String content,SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) {
try {
@@ -1787,7 +1802,6 @@
if (request == null) {
return;
}
- logger.info(request.toString());
ClientTransaction clientTransaction = null;
if ("TCP".equals(device.getTransport())) {
clientTransaction = tcpSipProvider.getNewClientTransaction(request);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
index c87b554..01b0bd2 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
@@ -105,7 +105,7 @@
}
request = headerProviderPlarformProvider.createRegisterRequest(parentPlatform,
- redisCatchStorage.getCSEQ(Request.REGISTER), "FromRegister" + tm,
+ redisCatchStorage.getCSEQ(), "FromRegister" + tm,
"z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""), callIdHeader);
// 灏� callid 鍐欏叆缂撳瓨锛� 绛夋敞鍐屾垚鍔熷彲浠ユ洿鏂扮姸鎬�
String callIdFromHeader = callIdHeader.getCallId();
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java
index 89958e9..04a11b9 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java
@@ -2,24 +2,32 @@
import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.gb28181.SipLayer;
+import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
import com.genersoft.iot.vmp.gb28181.transmit.event.response.SIPResponseProcessorAbstract;
import gov.nist.javax.sip.ResponseEventExt;
+import gov.nist.javax.sip.message.SIPResponse;
import gov.nist.javax.sip.stack.SIPDialog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
-import javax.sip.InvalidArgumentException;
-import javax.sip.ResponseEvent;
-import javax.sip.SipException;
+import javax.sdp.SdpFactory;
+import javax.sdp.SdpParseException;
+import javax.sdp.SessionDescription;
+import javax.sip.*;
+import javax.sip.address.Address;
import javax.sip.address.SipURI;
import javax.sip.header.CSeqHeader;
+import javax.sip.header.CallIdHeader;
+import javax.sip.header.UserAgentHeader;
import javax.sip.message.Request;
import javax.sip.message.Response;
import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
/**
@@ -34,14 +42,16 @@
private final String method = "INVITE";
@Autowired
- private SipLayer sipLayer;
-
- @Autowired
- private SipConfig config;
-
+ private VideoStreamSessionManager streamSession;
@Autowired
private SIPProcessorObserver sipProcessorObserver;
+
+ @Autowired
+ private SipConfig sipConfig;
+
+ @Autowired
+ private SipFactory sipFactory;
@Override
public void afterPropertiesSet() throws Exception {
@@ -49,8 +59,7 @@
sipProcessorObserver.addResponseProcessor(method, this);
}
- @Autowired
- private VideoStreamSessionManager streamSession;
+
/**
* 澶勭悊invite鍝嶅簲
@@ -74,6 +83,19 @@
CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
Request reqAck = dialog.createAck(cseq.getSeqNumber());
SipURI requestURI = (SipURI) reqAck.getRequestURI();
+ String contentString = new String(response.getRawContent());
+ // jainSip涓嶆敮鎸亂=瀛楁锛� 绉婚櫎浠ヨВ鏋愩��
+ int ssrcIndex = contentString.indexOf("y=");
+ // 妫�鏌ユ槸鍚︽湁y瀛楁
+ SessionDescription sdp;
+ if (ssrcIndex >= 0) {
+ //ssrc瑙勫畾闀垮害涓�10瀛楄妭锛屼笉鍙栦綑涓嬮暱搴︿互閬垮厤鍚庣画杩樻湁鈥渇=鈥濆瓧娈�
+ String substring = contentString.substring(0, contentString.indexOf("y="));
+ sdp = SdpFactory.getInstance().createSessionDescription(substring);
+ } else {
+ sdp = SdpFactory.getInstance().createSessionDescription(contentString);
+ }
+ requestURI.setUser(sdp.getOrigin().getUsername());
try {
requestURI.setHost(event.getRemoteIpAddress());
} catch (ParseException e) {
@@ -81,6 +103,18 @@
}
requestURI.setPort(event.getRemotePort());
reqAck.setRequestURI(requestURI);
+ List<String> agentParam = new ArrayList<>();
+ agentParam.add("wvp-pro");
+ // TODO 娣诲姞鐗堟湰淇℃伅浠ュ強鏃ユ湡
+ UserAgentHeader userAgentHeader = null;
+ try {
+ userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ reqAck.addHeader(userAgentHeader);
+ Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));
+ reqAck.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress));
logger.info("[鍥炲ack] {}-> {}:{} ",requestURI, event.getRemoteIpAddress(), event.getRemotePort());
dialog.sendAck(reqAck);
@@ -88,6 +122,10 @@
}
} catch (InvalidArgumentException | SipException e) {
e.printStackTrace();
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ } catch (SdpParseException e) {
+ throw new RuntimeException(e);
}
}
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 2e11833..a7bb201 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
@@ -98,9 +98,7 @@
@PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8")
public ResponseEntity<String> onServerKeepalive(@RequestBody JSONObject json){
- if (logger.isDebugEnabled()) {
- logger.debug("[ ZLM HOOK ] on_server_keepalive API璋冪敤锛屽弬鏁帮細" + json.toString());
- }
+ logger.info("[ ZLM HOOK ] on_server_keepalive API璋冪敤锛屽弬鏁帮細" + json.toString());
String mediaServerId = json.getString("mediaServerId");
List<ZLMHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(HookType.on_server_keepalive);
if (subscribes != null && subscribes.size() > 0) {
@@ -445,12 +443,15 @@
if (streamInfo!=null){
redisCatchStorage.stopPlay(streamInfo);
storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
+ // 濡傛灉姝e湪缁欎笂绾ф帹閫侊紝鍒欏彂閫乥ye
+
}else{
streamInfo = redisCatchStorage.queryPlayback(null, null, stream, null);
if (streamInfo != null) {
redisCatchStorage.stopPlayback(streamInfo.getDeviceID(), streamInfo.getChannelId(),
streamInfo.getStream(), null);
}
+ // 濡傛灉姝e湪缁欎笂绾ф帹閫侊紝鍒欏彂閫乥ye
}
}else {
if (!"rtp".equals(app)){
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 b1c6a9a..eb02002 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
@@ -38,7 +38,6 @@
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
import com.genersoft.iot.vmp.storager.dao.MediaServerMapper;
import com.genersoft.iot.vmp.utils.DateUtil;
-import com.genersoft.iot.vmp.utils.redis.JedisUtil;
import com.genersoft.iot.vmp.utils.redis.RedisUtil;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
@@ -100,9 +99,6 @@
@Autowired
private EventPublisher publisher;
-
- @Autowired
- JedisUtil jedisUtil;
/**
* 鍒濆鍖�
@@ -291,13 +287,7 @@
return null;
}
String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerId;
- MediaServerItem serverItem=(MediaServerItem)redisUtil.get(key);
- if(null==serverItem){
- //zlm鏈嶅姟涓嶅湪绾匡紝鍚姩閲嶈繛
- reloadZlm();
- serverItem=(MediaServerItem)redisUtil.get(key);
- }
- return serverItem;
+ return (MediaServerItem)redisUtil.get(key);
}
@Override
@@ -426,7 +416,6 @@
}
redisUtil.set(key, serverItem);
resetOnlineServerItem(serverItem);
- updateMediaServerKeepalive(serverItem.getId(), null);
if (serverItem.isAutoConfig()) {
setZLMConfig(serverItem, "0".equals(zlmServerConfig.getHookEnable()));
}
@@ -490,9 +479,6 @@
String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId();
if (redisUtil.zSize(key) == null || redisUtil.zSize(key) == 0) {
- logger.info("鑾峰彇璐熻浇鏈�浣庣殑鑺傜偣鏃舵棤鍦ㄧ嚎鑺傜偣锛屽惎鍔ㄩ噸杩炴満鍒�");
- //鍚姩閲嶈繛
- reloadZlm();
if (redisUtil.zSize(key) == null || redisUtil.zSize(key) == 0) {
logger.info("鑾峰彇璐熻浇鏈�浣庣殑鑺傜偣鏃舵棤鍦ㄧ嚎鑺傜偣");
return null;
@@ -657,6 +643,11 @@
public void updateMediaServerKeepalive(String mediaServerId, JSONObject data) {
MediaServerItem mediaServerItem = getOne(mediaServerId);
if (mediaServerItem == null) {
+ // 缂撳瓨涓嶅瓨鍦紝浠庢暟鎹簱鏌ヨ锛屽鏋滄暟鎹簱涓嶅瓨鍦ㄥ垯鏄敊璇殑
+ MediaServerItem mediaServerItemFromDatabase = getOneFromDatabase(mediaServerId);
+ if (mediaServerItemFromDatabase == null) {
+ return;
+ }
// zlm杩炴帴閲嶈瘯
logger.warn("[鏇存柊ZLM 淇濇椿淇℃伅]澶辫触锛屾湭鎵惧埌娴佸獟浣撲俊鎭�,灏濊瘯閲嶈繛zlm");
reloadZlm();
@@ -672,6 +663,10 @@
redisUtil.set(key, data, hookAliveInterval);
}
+ private MediaServerItem getOneFromDatabase(String mediaServerId) {
+ return mediaServerMapper.queryOne(mediaServerId);
+ }
+
@Override
public void syncCatchFromDatabase() {
List<MediaServerItem> allInCatch = getAll();
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 9036839..b615d33 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
@@ -2,9 +2,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
-import java.util.List;
-import java.util.Objects;
-import java.util.UUID;
+import java.util.*;
import javax.sip.ResponseEvent;
@@ -12,8 +10,10 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.async.DeferredResult;
@@ -131,6 +131,10 @@
private ZLMHttpHookSubscribe subscribe;
+ @Qualifier("taskExecutor")
+ @Autowired
+ private ThreadPoolTaskExecutor taskExecutor;
+
@Override
@@ -162,21 +166,23 @@
result.onCompletion(()->{
// 鐐规挱缁撴潫鏃惰皟鐢ㄦ埅鍥炬帴鍙�
- // TODO 搴旇鍦ㄤ笂娴佹椂璋冪敤鏇村ソ锛岀粨鏉熶篃鍙兘鏄敊璇粨鏉�
- String path = "snap";
- String fileName = deviceId + "_" + channelId + ".jpg";
- ResponseEntity responseEntity = (ResponseEntity)result.getResult();
- if (responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK) {
- WVPResult wvpResult = (WVPResult)responseEntity.getBody();
- if (Objects.requireNonNull(wvpResult).getCode() == 0) {
- StreamInfo streamInfoForSuccess = (StreamInfo)wvpResult.getData();
- MediaServerItem mediaInfo = mediaServerService.getOne(streamInfoForSuccess.getMediaServerId());
- String streamUrl = streamInfoForSuccess.getFmp4();
- // 璇锋眰鎴浘
- logger.info("[璇锋眰鎴浘]: " + fileName);
- zlmresTfulUtils.getSnap(mediaInfo, streamUrl, 15, 1, path, fileName);
+ taskExecutor.execute(()->{
+ // TODO 搴旇鍦ㄤ笂娴佹椂璋冪敤鏇村ソ锛岀粨鏉熶篃鍙兘鏄敊璇粨鏉�
+ String path = "snap";
+ String fileName = deviceId + "_" + channelId + ".jpg";
+ ResponseEntity responseEntity = (ResponseEntity)result.getResult();
+ if (responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK) {
+ WVPResult wvpResult = (WVPResult)responseEntity.getBody();
+ if (Objects.requireNonNull(wvpResult).getCode() == 0) {
+ StreamInfo streamInfoForSuccess = (StreamInfo)wvpResult.getData();
+ MediaServerItem mediaInfo = mediaServerService.getOne(streamInfoForSuccess.getMediaServerId());
+ String streamUrl = streamInfoForSuccess.getFmp4();
+ // 璇锋眰鎴浘
+ logger.info("[璇锋眰鎴浘]: " + fileName);
+ zlmresTfulUtils.getSnap(mediaInfo, streamUrl, 15, 1, path, fileName);
+ }
}
- }
+ });
});
if (streamInfo != null) {
String streamId = streamInfo.getStream();
@@ -759,6 +765,53 @@
@Override
public void zlmServerOnline(String mediaServerId) {
- // 浼间箮娌″暐闇�瑕佸仛鐨�
+ // TODO 鏌ユ壘涔嬪墠鐨勭偣鎾紝娴佸鏋滀笉瀛樺湪鍒欑粰涓嬬骇鍙戦�乥ye
+// MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
+// zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{
+// Integer code = mediaList.getInteger("code");
+// if (code == 0) {
+// JSONArray data = mediaList.getJSONArray("data");
+// if (data == null || data.size() == 0) {
+// zlmServerOffline(mediaServerId);
+// }else {
+// Map<String, JSONObject> mediaListMap = new HashMap<>();
+// for (int i = 0; i < data.size(); i++) {
+// JSONObject json = data.getJSONObject(i);
+// String app = json.getString("app");
+// if ("rtp".equals(app)) {
+// String stream = json.getString("stream");
+// if (mediaListMap.get(stream) != null) {
+// continue;
+// }
+// mediaListMap.put(stream, json);
+// // 澶勭悊姝e湪瑙傜湅鐨勫浗鏍囪澶�
+// List<SsrcTransaction> ssrcTransactions = streamSession.getSsrcTransactionForAll(null, null, null, stream);
+// if (ssrcTransactions.size() > 0) {
+// for (SsrcTransaction ssrcTransaction : ssrcTransactions) {
+// if(ssrcTransaction.getMediaServerId().equals(mediaServerId)) {
+// cmder.streamByeCmd(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(),
+// ssrcTransaction.getStream(), null);
+// }
+// }
+// }
+// }
+// }
+// if (mediaListMap.size() > 0 ) {
+// // 澶勭悊姝e湪鍚戜笂鎺ㄦ祦鐨勪笂绾у钩鍙�
+// List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServer(null);
+// if (sendRtpItems.size() > 0) {
+// for (SendRtpItem sendRtpItem : sendRtpItems) {
+// if (sendRtpItem.getMediaServerId().equals(mediaServerId)) {
+// if (mediaListMap.get(sendRtpItem.getStreamId()) == null) {
+// ParentPlatform platform = storager.queryParentPlatByServerGBId(sendRtpItem.getPlatformId());
+// sipCommanderFroPlatform.streamByeCmd(platform, sendRtpItem.getCallId());
+// }
+// }
+// }
+// }
+// }
+// }
+// }
+// }));
}
}
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 b9811da..d10de48 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -17,10 +17,9 @@
/**
* 璁℃暟鍣ㄣ�備负cseq杩涜璁℃暟
*
- * @param method sip 鏂规硶
* @return
*/
- Long getCSEQ(String method);
+ Long getCSEQ();
/**
* 寮�濮嬫挱鏀炬椂灏嗘祦瀛樺叆
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 31294a0..81920b8 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
@@ -42,8 +42,8 @@
private UserSetting userSetting;
@Override
- public Long getCSEQ(String method) {
- String key = VideoManagerConstants.SIP_CSEQ_PREFIX + userSetting.getServerId() + "_" + method;
+ public Long getCSEQ() {
+ String key = VideoManagerConstants.SIP_CSEQ_PREFIX + userSetting.getServerId();
long result = redis.incr(key, 1L);
if (result > Integer.MAX_VALUE) {
diff --git a/src/main/java/com/genersoft/iot/vmp/utils/redis/JedisUtil.java b/src/main/java/com/genersoft/iot/vmp/utils/redis/JedisUtil.java
deleted file mode 100644
index 1fb1d17..0000000
--- a/src/main/java/com/genersoft/iot/vmp/utils/redis/JedisUtil.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package com.genersoft.iot.vmp.utils.redis;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import redis.clients.jedis.Jedis;
-import redis.clients.jedis.JedisPool;
-
-import java.util.Set;
-
-/**
- * @description:Jedis宸ュ叿绫�
- * @author: wangshaopeng@sunnybs.com
- * @date: 2021骞�03鏈�22鏃� 涓嬪崍8:27:29
- */
-@Component
-public class JedisUtil {
-
- @Autowired
- private JedisPool jedisPool;
-
- // ============================== Key ==============================
-
- /**
- * 妫�鏌ョ粰瀹� key 鏄惁瀛樺湪銆�
- *
- * @param key
- * @return
- */
- public Boolean exists(String key) {
- Jedis jedis = null;
- try {
- jedis = jedisPool.getResource();
- Boolean exists = jedis.exists(key);
- return exists;
- } finally {
- returnToPool(jedis);
- }
- }
-
-
- // ============================== Set ==============================
-
- /**
- * SADD key member [member ...]
- * 灏嗕竴涓垨澶氫釜 member 鍏冪礌鍔犲叆鍒伴泦鍚� key 褰撲腑锛屽凡缁忓瓨鍦ㄤ簬闆嗗悎鐨� member 鍏冪礌灏嗚蹇界暐銆�
- * 鍋囧 key 涓嶅瓨鍦紝鍒欏垱寤轰竴涓彧鍖呭惈 member 鍏冪礌浣滄垚鍛樼殑闆嗗悎銆�
- * 褰� key 涓嶆槸闆嗗悎绫诲瀷鏃讹紝杩斿洖涓�涓敊璇��
- */
- public Long sadd(String key, String... members) {
- Jedis jedis = null;
- try {
- jedis = jedisPool.getResource();
- Long smove = jedis.sadd(key, members);
- return smove;
- } finally {
- returnToPool(jedis);
- }
- }
-
- /**
- * SMEMBERS key
- * 杩斿洖闆嗗悎 key 涓殑鎵�鏈夋垚鍛樸��
- * 涓嶅瓨鍦ㄧ殑 key 琚涓虹┖闆嗗悎銆�
- */
- public Set<String> smembers(String key) {
- Jedis jedis = null;
- try {
- jedis = jedisPool.getResource();
- Set<String> smembers = jedis.smembers(key);
- return smembers;
- } finally {
- returnToPool(jedis);
- }
- }
-
-
- /**
- * SREM key member1 [member2]
- * 绉婚櫎闆嗗悎涓竴涓垨澶氫釜鎴愬憳
- */
- public Long srem(String key, String... member) {
- Jedis jedis = null;
- try {
- jedis = jedisPool.getResource();
- Long srem = jedis.srem(key, member);
- return srem;
- } finally {
- returnToPool(jedis);
- }
- }
-
- private void returnToPool(Jedis jedis) {
- if (jedis != null) {
- jedis.close();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
index eae186e..e87c106 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
@@ -152,6 +152,8 @@
// 瓒呮椂澶勭悊
result.onTimeout(()->{
logger.warn(String.format("璁惧棰勮/鍥炴斁鍋滄瓒呮椂锛宒eviceId/channelId锛�%s_%s ", deviceId, channelId));
+ redisCatchStorage.stopPlay(streamInfo);
+ storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
RequestMessage msg = new RequestMessage();
msg.setId(uuid);
msg.setKey(key);
--
Gitblit v1.8.0