diff --git a/.gitignore b/.gitignore
index 51ebf9e9..21f40064 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,7 +3,7 @@
# Log file
*.log
-
+logs/*
# BlueJ files
*.ctxt
diff --git a/README.md b/README.md
index cc295d5a..93b3ffba 100644
--- a/README.md
+++ b/README.md
@@ -105,6 +105,10 @@ https://gitee.com/pan648540858/wvp-GB28181-pro.git
- [X] WEB端支持播放H264与H265,音频支持G.711A/G.711U/AAC,覆盖国标常用编码格式。
# docker快速体验
+目前作者的docker-compose因为时间有限维护不及时,这里提供第三方提供的供大家使用,维护不易,大家记得给这位小伙伴点个star。
+https://github.com/SaltFish001/wvp_pro_compose
+[https://github.com/SaltFish001/wvp_pro_compose](https://github.com/SaltFish001/wvp_pro_compose)
+这是作者维护的一个镜像,可能存在不及时的问题。
```shell
docker pull 648540858/wvp_pro
diff --git a/pom.xml b/pom.xml
index f1ac4581..9d31f729 100644
--- a/pom.xml
+++ b/pom.xml
@@ -90,8 +90,8 @@
com.alibaba
- druid
- 1.2.3
+ druid-spring-boot-starter
+ 1.1.22
@@ -183,6 +183,15 @@
4.9.0
+
+
+ com.squareup.okhttp3
+ logging-interceptor
+ 4.9.0
+
+
+
+
com.burgstaller
diff --git a/sql/mysql.sql b/sql/mysql.sql
index 3734db27..e71adf30 100644
--- a/sql/mysql.sql
+++ b/sql/mysql.sql
@@ -44,7 +44,7 @@ CREATE TABLE `device` (
`charset` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `device_deviceId_uindex` (`deviceId`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -95,39 +95,41 @@ DROP TABLE IF EXISTS `device_channel`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `device_channel` (
- `channelId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
- `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
- `manufacture` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
- `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
- `owner` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
- `civilCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
- `block` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
- `address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
- `parentId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `id` int NOT NULL AUTO_INCREMENT,
+ `channelId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
+ `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `manufacture` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `model` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `owner` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `civilCode` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `block` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `address` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `parentId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
`safetyWay` int DEFAULT NULL,
`registerWay` int DEFAULT NULL,
- `certNum` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `certNum` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
`certifiable` int DEFAULT NULL,
`errCode` int DEFAULT NULL,
- `endTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
- `secrecy` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
- `ipAddress` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `endTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `secrecy` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `ipAddress` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
`port` int DEFAULT NULL,
- `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`PTZType` int DEFAULT NULL,
`status` int DEFAULT NULL,
`longitude` double DEFAULT NULL,
`latitude` double DEFAULT NULL,
- `streamId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
- `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
- `parental` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `streamId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `deviceId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
+ `parental` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
`hasAudio` bit(1) DEFAULT NULL,
- `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
- `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `createTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
+ `updateTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
`subCount` int DEFAULT '0',
- PRIMARY KEY (`channelId`,`deviceId`) USING BTREE,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `device_channel_id_uindex` (`id`),
UNIQUE KEY `device_channel_pk` (`channelId`,`deviceId`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -196,7 +198,7 @@ CREATE TABLE `gb_stream` (
PRIMARY KEY (`gbStreamId`) USING BTREE,
UNIQUE KEY `app` (`app`,`stream`) USING BTREE,
UNIQUE KEY `gbId` (`gbId`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=291 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+) ENGINE=InnoDB AUTO_INCREMENT=375 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -226,7 +228,7 @@ CREATE TABLE `log` (
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=245 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+) ENGINE=InnoDB AUTO_INCREMENT=313 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -315,7 +317,7 @@ CREATE TABLE `parent_platform` (
PRIMARY KEY (`id`),
UNIQUE KEY `parent_platform_id_uindex` (`id`),
UNIQUE KEY `parent_platform_pk` (`serverGBId`)
-) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -361,13 +363,11 @@ DROP TABLE IF EXISTS `platform_gb_channel`;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `platform_gb_channel` (
`id` int NOT NULL AUTO_INCREMENT,
- `channelId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
- `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
- `platformId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
- `deviceAndChannelId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
- `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `platformId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
+ `catalogId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
+ `deviceChannelId` int NOT NULL,
PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -393,7 +393,7 @@ CREATE TABLE `platform_gb_stream` (
`id` int NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
UNIQUE KEY `platform_gb_stream_pk` (`platformId`,`catalogId`,`gbStreamId`)
-) ENGINE=InnoDB AUTO_INCREMENT=256 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+) ENGINE=InnoDB AUTO_INCREMENT=406 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -415,6 +415,7 @@ DROP TABLE IF EXISTS `stream_proxy`;
CREATE TABLE `stream_proxy` (
`id` int NOT NULL AUTO_INCREMENT,
`type` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
+ `name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
`app` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
`name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
`stream` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
@@ -464,7 +465,7 @@ CREATE TABLE `stream_push` (
`mediaServerId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `stream_push_pk` (`app`,`stream`)
-) ENGINE=InnoDB AUTO_INCREMENT=310 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+) ENGINE=InnoDB AUTO_INCREMENT=394 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -541,4 +542,4 @@ UNLOCK TABLES;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2022-02-24 16:52:12
+-- Dump completed on 2022-02-25 20:32:21
diff --git a/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java b/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
index bfe58419..9dacbade 100644
--- a/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
+++ b/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
@@ -2,6 +2,7 @@ package com.genersoft.iot.vmp;
import java.util.logging.LogManager;
+import com.genersoft.iot.vmp.conf.druid.EnableDruidSupport;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@@ -17,6 +18,7 @@ import springfox.documentation.oas.annotations.EnableOpenApi;
@SpringBootApplication
@EnableScheduling
@EnableOpenApi
+@EnableDruidSupport
public class VManageBootstrap extends LogManager {
private static String[] args;
private static ConfigurableApplicationContext context;
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 e16c1add..06263840 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
@@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONArray;
public class StreamInfo {
private String app;
- private String streamId;
+ private String stream;
private String deviceID;
private String channelId;
private String flv;
@@ -153,12 +153,12 @@ public class StreamInfo {
this.ws_ts = ws_ts;
}
- public String getStreamId() {
- return streamId;
+ public String getStream() {
+ return stream;
}
- public void setStreamId(String streamId) {
- this.streamId = streamId;
+ public void setStream(String stream) {
+ this.stream = stream;
}
public String getRtc() {
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 923e411e..0d638435 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
@@ -29,6 +29,7 @@ public class VideoManagerConstants {
// 此处多了一个_,暂不修改
public static final String PLAYER_PREFIX = "VMP_PLAYER_";
public static final String PLAY_BLACK_PREFIX = "VMP_PLAYBACK_";
+ public static final String PLAY_INFO_PREFIX = "VMP_PLAY_INFO_";
public static final String DOWNLOAD_PREFIX = "VMP_DOWNLOAD_";
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java b/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java
index 41b68cc0..b69bf68e 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java
@@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.conf;
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
@@ -30,7 +31,7 @@ public class SipPlatformRunner implements CommandLineRunner {
private EventPublisher publisher;
@Autowired
- private ZLMRTPServerFactory zlmrtpServerFactory;
+ private ISIPCommanderForPlatform sipCommanderForPlatform;
@Override
@@ -57,6 +58,9 @@ public class SipPlatformRunner implements CommandLineRunner {
parentPlatformCatch.setId(parentPlatform.getServerGBId());
redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch);
+ // 取消订阅
+ sipCommanderForPlatform.unregister(parentPlatform, null, null);
+ Thread.sleep(500);
// 发送平台未注册消息
publisher.platformNotRegisterEventPublish(parentPlatform.getServerGBId());
}
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/Swagger3Config.java b/src/main/java/com/genersoft/iot/vmp/conf/Swagger3Config.java
index 2f0faba7..7ee13f84 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/Swagger3Config.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/Swagger3Config.java
@@ -14,7 +14,7 @@ import springfox.documentation.spring.web.plugins.Docket;
@Configuration
public class Swagger3Config {
- @Value("${swagger-ui.enabled}")
+ @Value("${swagger-ui.enabled: true}")
private boolean enable;
@Bean
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/druid/DruidConfiguration.java b/src/main/java/com/genersoft/iot/vmp/conf/druid/DruidConfiguration.java
new file mode 100644
index 00000000..12f6e636
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/conf/druid/DruidConfiguration.java
@@ -0,0 +1,64 @@
+package com.genersoft.iot.vmp.conf.druid;
+
+import com.alibaba.druid.support.http.StatViewServlet;
+import com.alibaba.druid.support.http.WebStatFilter;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.annotation.Bean;
+
+import javax.servlet.Filter;
+import javax.servlet.Servlet;
+
+/**
+ * druid监控配置
+ * @author
+ */
+public class DruidConfiguration {
+
+ @Value("${rj-druid-manage.allow:127.0.0.1}")
+ private String allow;
+
+ @Value("${rj-druid-manage.deny:}")
+ private String deny;
+
+ @Value("${rj-druid-manage.loginUsername:admin}")
+ private String loginUsername;
+
+ @Value("${rj-druid-manage.loginPassword:admin}")
+ private String loginPassword;
+
+ @Value("${rj-druid-manage.resetEnable:false}")
+ private String resetEnable;
+
+ /**
+ * druid监控页面开启
+ */
+ @Bean
+ public ServletRegistrationBean druidServlet() {
+ ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
+ // IP白名单
+ servletRegistrationBean.addInitParameter("allow", allow);
+ // IP黑名单(共同存在时,deny优先于allow)
+ servletRegistrationBean.addInitParameter("deny", deny);
+ //控制台管理用户
+ servletRegistrationBean.addInitParameter("loginUsername", loginUsername);
+ servletRegistrationBean.addInitParameter("loginPassword", loginPassword);
+ //是否能够重置数据 禁用HTML页面上的“Reset All”功能
+ servletRegistrationBean.addInitParameter("resetEnable", resetEnable);
+ return servletRegistrationBean;
+ }
+
+ /**
+ * druid url监控配置
+ */
+ @Bean
+ public FilterRegistrationBean filterRegistrationBean() {
+ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(new WebStatFilter());
+ filterRegistrationBean.addUrlPatterns("/*");
+ filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
+ return filterRegistrationBean;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/druid/EnableDruidSupport.java b/src/main/java/com/genersoft/iot/vmp/conf/druid/EnableDruidSupport.java
new file mode 100644
index 00000000..5fd710be
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/conf/druid/EnableDruidSupport.java
@@ -0,0 +1,24 @@
+package com.genersoft.iot.vmp.conf.druid;
+
+import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.context.annotation.Import;
+
+import java.lang.annotation.*;
+
+/**
+ * druid监控支持注解
+ *
+ * @author
+ * {@link DruidConfiguration} druid监控页面安全配置支持
+ * {@link ServletComponentScan} druid监控页面需要扫描servlet
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+@Import({
+ DruidConfiguration.class,
+})
+@ServletComponentScan
+public @interface EnableDruidSupport {
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
index 6d40e360..36337895 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
@@ -3,6 +3,10 @@ package com.genersoft.iot.vmp.gb28181.bean;
public class DeviceChannel {
+ /**
+ * 数据库自赠ID
+ */
+ private int id;
/**
* 通道id
@@ -165,6 +169,14 @@ public class DeviceChannel {
*/
private boolean hasAudio;
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
public String getDeviceId() {
return deviceId;
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SsrcTransaction.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SsrcTransaction.java
index 9700f8a5..c2dedec1 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SsrcTransaction.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SsrcTransaction.java
@@ -4,11 +4,12 @@ public class SsrcTransaction {
private String deviceId;
private String channelId;
- private String ssrc;
- private String streamId;
+ private String callId;
+ private String stream;
private byte[] transaction;
private byte[] dialog;
private String mediaServerId;
+ private String ssrc;
public String getDeviceId() {
return deviceId;
@@ -26,20 +27,20 @@ public class SsrcTransaction {
this.channelId = channelId;
}
- public String getSsrc() {
- return ssrc;
+ public String getCallId() {
+ return callId;
}
- public void setSsrc(String ssrc) {
- this.ssrc = ssrc;
+ public void setCallId(String callId) {
+ this.callId = callId;
}
- public String getStreamId() {
- return streamId;
+ public String getStream() {
+ return stream;
}
- public void setStreamId(String streamId) {
- this.streamId = streamId;
+ public void setStream(String stream) {
+ this.stream = stream;
}
public byte[] getTransaction() {
@@ -65,4 +66,12 @@ public class SsrcTransaction {
public void setMediaServerId(String mediaServerId) {
this.mediaServerId = mediaServerId;
}
+
+ public String getSsrc() {
+ return ssrc;
+ }
+
+ public void setSsrc(String ssrc) {
+ this.ssrc = ssrc;
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java
index 60418f2c..e9d41678 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java
@@ -18,15 +18,21 @@ public class SubscribeInfo {
this.fromTag = fromHeader.getTag();
ExpiresHeader expiresHeader = (ExpiresHeader)request.getHeader(ExpiresHeader.NAME);
this.expires = expiresHeader.getExpires();
- this.event = ((EventHeader)request.getHeader(EventHeader.NAME)).getName();
+ EventHeader eventHeader = (EventHeader)request.getHeader(EventHeader.NAME);
+ this.eventId = eventHeader.getEventId();
+ this.eventType = eventHeader.getEventType();
+ ViaHeader viaHeader = (ViaHeader)request.getHeader(ViaHeader.NAME);
+ this.branch = viaHeader.getBranch();
}
private String id;
private int expires;
private String callId;
- private String event;
+ private String eventId;
+ private String eventType;
private String fromTag;
private String toTag;
+ private String branch;
public String getId() {
return id;
@@ -68,11 +74,27 @@ public class SubscribeInfo {
this.fromTag = fromTag;
}
- public String getEvent() {
- return event;
+ public String getEventId() {
+ return eventId;
}
- public void setEvent(String event) {
- this.event = event;
+ public void setEventId(String eventId) {
+ this.eventId = eventId;
+ }
+
+ public String getEventType() {
+ return eventType;
+ }
+
+ public void setEventType(String eventType) {
+ this.eventType = eventType;
+ }
+
+ public String getBranch() {
+ return branch;
+ }
+
+ public void setBranch(String branch) {
+ this.branch = branch;
}
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java
index 8c8565be..746467d6 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java
@@ -101,14 +101,14 @@ public class EventPublisher {
applicationEventPublisher.publishEvent(outEvent);
}
- @Async
+
public void catalogEventPublish(String platformId, DeviceChannel deviceChannel, String type) {
List deviceChannelList = new ArrayList<>();
deviceChannelList.add(deviceChannel);
catalogEventPublish(platformId, deviceChannelList, type);
}
- @Async
+
public void catalogEventPublish(String platformId, List deviceChannels, String type) {
CatalogEvent outEvent = new CatalogEvent(this);
List channels = new ArrayList<>();
@@ -130,8 +130,8 @@ public class EventPublisher {
applicationEventPublisher.publishEvent(outEvent);
}
- @Async
- public void catalogEventPublishForStream(String platformId, GbStream[] gbStreams, String type) {
+
+ public void catalogEventPublishForStream(String platformId, List gbStreams, String type) {
CatalogEvent outEvent = new CatalogEvent(this);
outEvent.setGbStreams(gbStreams);
outEvent.setType(type);
@@ -139,9 +139,10 @@ public class EventPublisher {
applicationEventPublisher.publishEvent(outEvent);
}
- @Async
+
public void catalogEventPublishForStream(String platformId, GbStream gbStream, String type) {
- GbStream[] gbStreams = {gbStream};
- catalogEventPublishForStream(platformId, gbStreams, type);
+ List gbStreamList = new ArrayList<>();
+ gbStreamList.add(gbStream);
+ catalogEventPublishForStream(platformId, gbStreamList, type);
}
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/SipSubscribe.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/SipSubscribe.java
index a00ac630..49c52d5e 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/SipSubscribe.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/SipSubscribe.java
@@ -23,24 +23,36 @@ public class SipSubscribe {
private Map okSubscribes = new ConcurrentHashMap<>();
- private Map timeSubscribes = new ConcurrentHashMap<>();
+ private Map okTimeSubscribes = new ConcurrentHashMap<>();
+ private Map errorTimeSubscribes = new ConcurrentHashMap<>();
-// @Scheduled(cron="*/5 * * * * ?") //每五秒执行一次
+ // @Scheduled(cron="*/5 * * * * ?") //每五秒执行一次
// @Scheduled(fixedRate= 100 * 60 * 60 )
- @Scheduled(cron="0 0 * * * ?") //每小时执行一次, 每个整点
+ @Scheduled(cron="0 0/5 * * * ?") //每5分钟执行一次
public void execute(){
logger.info("[定时任务] 清理过期的订阅信息");
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
- calendar.set(Calendar.HOUR, calendar.get(Calendar.HOUR) - 1);
- for (String key : timeSubscribes.keySet()) {
- if (timeSubscribes.get(key).before(calendar.getTime())){
- logger.info("[定时任务] 清理过期的订阅信息: {}", key);
- errorSubscribes.remove(key);
+ calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) - 5);
+
+ for (String key : okTimeSubscribes.keySet()) {
+ if (okTimeSubscribes.get(key).before(calendar.getTime())){
+// logger.info("[定时任务] 清理过期的订阅信息: {}", key);
okSubscribes.remove(key);
- timeSubscribes.remove(key);
+ okTimeSubscribes.remove(key);
}
}
+ for (String key : errorTimeSubscribes.keySet()) {
+ if (errorTimeSubscribes.get(key).before(calendar.getTime())){
+// logger.info("[定时任务] 清理过期的订阅信息: {}", key);
+ errorSubscribes.remove(key);
+ errorTimeSubscribes.remove(key);
+ }
+ }
+ logger.info("okTimeSubscribes.size:{}",okTimeSubscribes.size());
+ logger.info("okSubscribes.size:{}",okSubscribes.size());
+ logger.info("errorTimeSubscribes.size:{}",errorTimeSubscribes.size());
+ logger.info("errorSubscribes.size:{}",errorSubscribes.size());
}
public interface Event {
@@ -105,12 +117,12 @@ public class SipSubscribe {
public void addErrorSubscribe(String key, SipSubscribe.Event event) {
errorSubscribes.put(key, event);
- timeSubscribes.put(key, new Date());
+ errorTimeSubscribes.put(key, new Date());
}
public void addOkSubscribe(String key, SipSubscribe.Event event) {
okSubscribes.put(key, event);
- timeSubscribes.put(key, new Date());
+ okTimeSubscribes.put(key, new Date());
}
public SipSubscribe.Event getErrorSubscribe(String key) {
@@ -119,7 +131,7 @@ public class SipSubscribe {
public void removeErrorSubscribe(String key) {
errorSubscribes.remove(key);
- timeSubscribes.remove(key);
+ errorTimeSubscribes.remove(key);
}
public SipSubscribe.Event getOkSubscribe(String key) {
@@ -128,7 +140,7 @@ public class SipSubscribe {
public void removeOkSubscribe(String key) {
okSubscribes.remove(key);
- timeSubscribes.remove(key);
+ okTimeSubscribes.remove(key);
}
public int getErrorSubscribesSize(){
return errorSubscribes.size();
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEvent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEvent.java
index e343fec7..c035b808 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEvent.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEvent.java
@@ -20,7 +20,7 @@ public class CatalogEvent extends ApplicationEvent {
public static final String UPDATE = "UPDATE"; // 更新
private List deviceChannels;
- private GbStream[] gbStreams;
+ private List gbStreams;
private String type;
private String platformId;
@@ -48,11 +48,11 @@ public class CatalogEvent extends ApplicationEvent {
this.platformId = platformId;
}
- public GbStream[] getGbStreams() {
+ public List getGbStreams() {
return gbStreams;
}
- public void setGbStreams(GbStream[] gbStreams) {
+ public void setGbStreams(List gbStreams) {
this.gbStreams = gbStreams;
}
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java
index 997031b6..f9593633 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java
@@ -60,10 +60,14 @@ public class CatalogEventLister implements ApplicationListener {
Map> parentPlatformMap = new HashMap<>();
if (event.getPlatformId() != null) {
parentPlatform = storager.queryParentPlatByServerGBId(event.getPlatformId());
- if (!parentPlatform.isStatus())return;
+ if (parentPlatform != null && !parentPlatform.isStatus())return;
String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetup.getServerId() + "_Catalog_" + event.getPlatformId();
subscribe = redisCatchStorage.getSubscribe(key);
- if (subscribe == null) return;
+
+ if (subscribe == null) {
+ logger.debug("发送订阅消息时发现订阅信息已经不存在");
+ return;
+ }
}else {
// 获取所用订阅
List platforms = redisCatchStorage.getAllSubscribePlatform();
@@ -94,7 +98,7 @@ public class CatalogEventLister implements ApplicationListener {
if (event.getDeviceChannels() != null) {
deviceChannelList.addAll(event.getDeviceChannels());
}
- if (event.getGbStreams() != null && event.getGbStreams().length > 0){
+ if (event.getGbStreams() != null && event.getGbStreams().size() > 0){
for (GbStream gbStream : event.getGbStreams()) {
DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStream(gbStream, gbStream.getCatalogId(), parentPlatform.getDeviceGBId());
deviceChannelList.add(deviceChannelByStream);
@@ -102,7 +106,7 @@ public class CatalogEventLister implements ApplicationListener {
}
if (deviceChannelList.size() > 0) {
logger.info("[Catalog事件: {}]平台:{},影响通道{}个", event.getType(), event.getPlatformId(), deviceChannelList.size());
- sipCommanderFroPlatform.sendNotifyForCatalogOther(event.getType(), parentPlatform, deviceChannelList, subscribe);
+ sipCommanderFroPlatform.sendNotifyForCatalogOther(event.getType(), parentPlatform, deviceChannelList, subscribe, null);
}
}else if (parentPlatformMap.keySet().size() > 0) {
for (String gbId : parentPlatformMap.keySet()) {
@@ -117,7 +121,7 @@ public class CatalogEventLister implements ApplicationListener {
DeviceChannel deviceChannel = new DeviceChannel();
deviceChannel.setChannelId(gbId);
deviceChannelList.add(deviceChannel);
- sipCommanderFroPlatform.sendNotifyForCatalogOther(event.getType(), platform, deviceChannelList, subscribeInfo);
+ sipCommanderFroPlatform.sendNotifyForCatalogOther(event.getType(), platform, deviceChannelList, subscribeInfo, null);
}
}
}
@@ -134,7 +138,7 @@ public class CatalogEventLister implements ApplicationListener {
if (event.getDeviceChannels() != null) {
deviceChannelList.addAll(event.getDeviceChannels());
}
- if (event.getGbStreams() != null && event.getGbStreams().length > 0){
+ if (event.getGbStreams() != null && event.getGbStreams().size() > 0){
for (GbStream gbStream : event.getGbStreams()) {
DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStream(gbStream, gbStream.getCatalogId(), parentPlatform.getDeviceGBId());
deviceChannelList.add(deviceChannelByStream);
@@ -142,7 +146,7 @@ public class CatalogEventLister implements ApplicationListener {
}
if (deviceChannelList.size() > 0) {
logger.info("[Catalog事件: {}]平台:{},影响通道{}个", event.getType(), event.getPlatformId(), deviceChannelList.size());
- sipCommanderFroPlatform.sendNotifyForCatalogAddOrUpdate(event.getType(), parentPlatform, deviceChannelList, subscribe);
+ sipCommanderFroPlatform.sendNotifyForCatalogAddOrUpdate(event.getType(), parentPlatform, deviceChannelList, subscribe, null);
}
}else if (parentPlatformMap.keySet().size() > 0) {
for (String gbId : parentPlatformMap.keySet()) {
@@ -159,7 +163,7 @@ public class CatalogEventLister implements ApplicationListener {
GbStream gbStream = storager.queryStreamInParentPlatform(platform.getServerGBId(), gbId);
DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStream(gbStream, gbStream.getCatalogId(), platform.getDeviceGBId());
deviceChannelList.add(deviceChannelByStream);
- sipCommanderFroPlatform.sendNotifyForCatalogOther(event.getType(), platform, deviceChannelList, subscribeInfo);
+ sipCommanderFroPlatform.sendNotifyForCatalogOther(event.getType(), platform, deviceChannelList, subscribeInfo, null);
}
}
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
index d41b04da..3e9f28aa 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
@@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.utils.redis.RedisUtil;
import gov.nist.javax.sip.stack.SIPDialog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
/**
* @description:视频流session管理器,管理视频预览、预览回放的通信句柄
@@ -29,39 +30,55 @@ public class VideoStreamSessionManager {
@Autowired
private UserSetup userSetup;
- public void put(String deviceId, String channelId ,String ssrc, String streamId, String mediaServerId, ClientTransaction transaction){
+ /**
+ * 添加一个点播/回放的事务信息
+ * 后续可以通过流Id/callID
+ * @param deviceId 设备ID
+ * @param channelId 通道ID
+ * @param callId 一次请求的CallID
+ * @param stream 流名称
+ * @param mediaServerId 所使用的流媒体ID
+ * @param transaction 事务
+ */
+ public void put(String deviceId, String channelId, String callId, String stream, String ssrc, String mediaServerId, ClientTransaction transaction){
SsrcTransaction ssrcTransaction = new SsrcTransaction();
ssrcTransaction.setDeviceId(deviceId);
ssrcTransaction.setChannelId(channelId);
- ssrcTransaction.setStreamId(streamId);
+ ssrcTransaction.setStream(stream);
byte[] transactionByteArray = SerializeUtils.serialize(transaction);
ssrcTransaction.setTransaction(transactionByteArray);
+ ssrcTransaction.setCallId(callId);
ssrcTransaction.setSsrc(ssrc);
ssrcTransaction.setMediaServerId(mediaServerId);
- redisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetup.getServerId() + "_" + deviceId + "_" + channelId, ssrcTransaction);
+ redisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetup.getServerId()
+ + "_" + deviceId + "_" + channelId + "_" + callId + "_" + stream, ssrcTransaction);
+ redisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetup.getServerId()
+ + "_" + deviceId + "_" + channelId + "_" + callId + "_" + stream, ssrcTransaction);
}
- public void put(String deviceId, String channelId , Dialog dialog){
- SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId);
+ public void put(String deviceId, String channelId, String callId, Dialog dialog){
+ SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, callId, null);
if (ssrcTransaction != null) {
byte[] dialogByteArray = SerializeUtils.serialize(dialog);
ssrcTransaction.setDialog(dialogByteArray);
}
- redisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetup.getServerId() + "_" + deviceId + "_" + channelId, ssrcTransaction);
+ redisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetup.getServerId()
+ + "_" + deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_"
+ + ssrcTransaction.getStream(), ssrcTransaction);
}
- public ClientTransaction getTransaction(String deviceId, String channelId){
- SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId);
+ public ClientTransaction getTransactionByStream(String deviceId, String channelId, String stream){
+ SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
if (ssrcTransaction == null) return null;
byte[] transactionByteArray = ssrcTransaction.getTransaction();
ClientTransaction clientTransaction = (ClientTransaction)SerializeUtils.deSerialize(transactionByteArray);
return clientTransaction;
}
- public SIPDialog getDialog(String deviceId, String channelId){
- SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId);
+ public SIPDialog getDialogByStream(String deviceId, String channelId, String stream){
+ SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
if (ssrcTransaction == null) return null;
byte[] dialogByteArray = ssrcTransaction.getDialog();
if (dialogByteArray == null) return null;
@@ -69,36 +86,37 @@ public class VideoStreamSessionManager {
return dialog;
}
- public SsrcTransaction getSsrcTransaction(String deviceId, String channelId){
- SsrcTransaction ssrcTransaction = (SsrcTransaction)redisUtil.get(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetup.getServerId() + "_" + deviceId + "_" + channelId);
- return ssrcTransaction;
+ public SsrcTransaction getSsrcTransaction(String deviceId, String channelId, String callId, String stream){
+ if (StringUtils.isEmpty(callId)) callId ="*";
+ if (StringUtils.isEmpty(stream)) stream ="*";
+ String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetup.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream;
+ List