Commit a59095db0c240987028d4d05ab561665ed8fe7ea

Authored by mrjackwang
Committed by GitHub
2 parents 8d87741d e05d0aa0

Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0

Showing 56 changed files with 1293 additions and 926 deletions
@@ -61,6 +61,13 @@ @@ -61,6 +61,13 @@
61 <dependency> 61 <dependency>
62 <groupId>org.springframework.boot</groupId> 62 <groupId>org.springframework.boot</groupId>
63 <artifactId>spring-boot-starter-data-redis</artifactId> 63 <artifactId>spring-boot-starter-data-redis</artifactId>
  64 + <exclusions>
  65 + <!-- 去掉 Lettuce 的依赖, Spring Boot 优先使用 Lettuce 作为 Redis 客户端 -->
  66 + <exclusion>
  67 + <groupId>io.lettuce</groupId>
  68 + <artifactId>lettuce-core</artifactId>
  69 + </exclusion>
  70 + </exclusions>
64 </dependency> 71 </dependency>
65 <dependency> 72 <dependency>
66 <groupId>org.springframework.boot</groupId> 73 <groupId>org.springframework.boot</groupId>
@@ -75,6 +82,12 @@ @@ -75,6 +82,12 @@
75 <groupId>org.mybatis.spring.boot</groupId> 82 <groupId>org.mybatis.spring.boot</groupId>
76 <artifactId>mybatis-spring-boot-starter</artifactId> 83 <artifactId>mybatis-spring-boot-starter</artifactId>
77 <version>2.1.4</version> 84 <version>2.1.4</version>
  85 + <exclusions>
  86 + <exclusion>
  87 + <groupId>com.zaxxer</groupId>
  88 + <artifactId>HikariCP</artifactId>
  89 + </exclusion>
  90 + </exclusions>
78 </dependency> 91 </dependency>
79 <dependency> 92 <dependency>
80 <groupId>org.springframework.boot</groupId> 93 <groupId>org.springframework.boot</groupId>
@@ -84,7 +97,6 @@ @@ -84,7 +97,6 @@
84 <dependency> 97 <dependency>
85 <groupId>redis.clients</groupId> 98 <groupId>redis.clients</groupId>
86 <artifactId>jedis</artifactId> 99 <artifactId>jedis</artifactId>
87 - <version>${jedis-version}</version>  
88 </dependency> 100 </dependency>
89 101
90 <!-- druid数据库连接池 --> 102 <!-- druid数据库连接池 -->
sql/mysql.sql
@@ -2,55 +2,60 @@ @@ -2,55 +2,60 @@
2 -- 2 --
3 -- Host: 127.0.0.1 Database: wvp2 3 -- Host: 127.0.0.1 Database: wvp2
4 -- ------------------------------------------------------ 4 -- ------------------------------------------------------
5 --- Server version 8.0.29-0ubuntu0.22.04.2 5 +-- Server version 8.0.29-0ubuntu0.22.04.3
6 6
7 -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;  
8 -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;  
9 -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 7 +/*!40101 SET @OLD_CHARACTER_SET_CLIENT = @@CHARACTER_SET_CLIENT */;
  8 +/*!40101 SET @OLD_CHARACTER_SET_RESULTS = @@CHARACTER_SET_RESULTS */;
  9 +/*!40101 SET @OLD_COLLATION_CONNECTION = @@COLLATION_CONNECTION */;
10 /*!50503 SET NAMES utf8mb4 */; 10 /*!50503 SET NAMES utf8mb4 */;
11 -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;  
12 -/*!40103 SET TIME_ZONE='+00:00' */;  
13 -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;  
14 -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;  
15 -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;  
16 -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; 11 +/*!40103 SET @OLD_TIME_ZONE = @@TIME_ZONE */;
  12 +/*!40103 SET TIME_ZONE = ' + 00:00' */;
  13 +/*!40014 SET @OLD_UNIQUE_CHECKS = @@UNIQUE_CHECKS, UNIQUE_CHECKS = 0 */;
  14 +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS = @@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0 */;
  15 +/*!40101 SET @OLD_SQL_MODE = @@SQL_MODE, SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO' */;
  16 +/*!40111 SET @OLD_SQL_NOTES = @@SQL_NOTES, SQL_NOTES = 0 */;
17 17
18 -- 18 --
19 -- Table structure for table `device` 19 -- Table structure for table `device`
20 -- 20 --
21 21
22 DROP TABLE IF EXISTS `device`; 22 DROP TABLE IF EXISTS `device`;
23 -/*!40101 SET @saved_cs_client = @@character_set_client */; 23 +/*!40101 SET @saved_cs_client = @@character_set_client */;
24 /*!50503 SET character_set_client = utf8mb4 */; 24 /*!50503 SET character_set_client = utf8mb4 */;
25 -CREATE TABLE `device` (  
26 - `id` int NOT NULL AUTO_INCREMENT,  
27 - `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
28 - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
29 - `manufacturer` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
30 - `model` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
31 - `firmware` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
32 - `transport` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
33 - `streamMode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
34 - `online` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
35 - `registerTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
36 - `keepaliveTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
37 - `ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
38 - `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
39 - `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
40 - `port` int NOT NULL,  
41 - `expires` int NOT NULL,  
42 - `subscribeCycleForCatalog` int NOT NULL,  
43 - `hostAddress` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
44 - `charset` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
45 - `subscribeCycleForMobilePosition` int DEFAULT NULL,  
46 - `mobilePositionSubmissionInterval` int DEFAULT '5',  
47 - `subscribeCycleForAlarm` int DEFAULT NULL,  
48 - `ssrcCheck` int DEFAULT '0',  
49 - `geoCoordSys` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,  
50 - `treeType` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,  
51 - PRIMARY KEY (`id`) USING BTREE,  
52 - UNIQUE KEY `device_deviceId_uindex` (`deviceId`) USING BTREE  
53 -) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 25 +CREATE TABLE `device`
  26 +(
  27 + `id` int NOT NULL AUTO_INCREMENT,
  28 + `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  29 + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  30 + `manufacturer` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  31 + `model` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  32 + `firmware` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  33 + `transport` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  34 + `streamMode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  35 + `online` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  36 + `registerTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  37 + `keepaliveTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  38 + `ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  39 + `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  40 + `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  41 + `port` int NOT NULL,
  42 + `expires` int NOT NULL,
  43 + `subscribeCycleForCatalog` int NOT NULL,
  44 + `hostAddress` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  45 + `charset` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  46 + `subscribeCycleForMobilePosition` int DEFAULT NULL,
  47 + `mobilePositionSubmissionInterval` int DEFAULT '5 ',
  48 + `subscribeCycleForAlarm` int DEFAULT NULL,
  49 + `ssrcCheck` int DEFAULT '0 ',
  50 + `geoCoordSys` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
  51 + `treeType` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
  52 + PRIMARY KEY (`id`) USING BTREE,
  53 + UNIQUE KEY `device_deviceId_uindex` (`deviceId`) USING BTREE
  54 +) ENGINE = InnoDB
  55 + AUTO_INCREMENT = 53
  56 + DEFAULT CHARSET = utf8mb4
  57 + COLLATE = utf8mb4_general_ci
  58 + ROW_FORMAT = DYNAMIC;
54 /*!40101 SET character_set_client = @saved_cs_client */; 59 /*!40101 SET character_set_client = @saved_cs_client */;
55 60
56 -- 61 --
@@ -58,8 +63,10 @@ CREATE TABLE `device` ( @@ -58,8 +63,10 @@ CREATE TABLE `device` (
58 -- 63 --
59 64
60 LOCK TABLES `device` WRITE; 65 LOCK TABLES `device` WRITE;
61 -/*!40000 ALTER TABLE `device` DISABLE KEYS */;  
62 -/*!40000 ALTER TABLE `device` ENABLE KEYS */; 66 +/*!40000 ALTER TABLE `device`
  67 + DISABLE KEYS */;
  68 +/*!40000 ALTER TABLE `device`
  69 + ENABLE KEYS */;
63 UNLOCK TABLES; 70 UNLOCK TABLES;
64 71
65 -- 72 --
@@ -67,22 +74,26 @@ UNLOCK TABLES; @@ -67,22 +74,26 @@ UNLOCK TABLES;
67 -- 74 --
68 75
69 DROP TABLE IF EXISTS `device_alarm`; 76 DROP TABLE IF EXISTS `device_alarm`;
70 -/*!40101 SET @saved_cs_client = @@character_set_client */; 77 +/*!40101 SET @saved_cs_client = @@character_set_client */;
71 /*!50503 SET character_set_client = utf8mb4 */; 78 /*!50503 SET character_set_client = utf8mb4 */;
72 -CREATE TABLE `device_alarm` (  
73 - `id` int NOT NULL AUTO_INCREMENT,  
74 - `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
75 - `channelId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
76 - `alarmPriority` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
77 - `alarmMethod` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
78 - `alarmTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
79 - `alarmDescription` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
80 - `longitude` double DEFAULT NULL,  
81 - `latitude` double DEFAULT NULL,  
82 - `alarmType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
83 - `createTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
84 - PRIMARY KEY (`id`) USING BTREE  
85 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 79 +CREATE TABLE `device_alarm`
  80 +(
  81 + `id` int NOT NULL AUTO_INCREMENT,
  82 + `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  83 + `channelId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  84 + `alarmPriority` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  85 + `alarmMethod` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  86 + `alarmTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  87 + `alarmDescription` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  88 + `longitude` double DEFAULT NULL,
  89 + `latitude` double DEFAULT NULL,
  90 + `alarmType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  91 + `createTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  92 + PRIMARY KEY (`id`) USING BTREE
  93 +) ENGINE = InnoDB
  94 + DEFAULT CHARSET = utf8mb4
  95 + COLLATE = utf8mb4_general_ci
  96 + ROW_FORMAT = DYNAMIC;
86 /*!40101 SET character_set_client = @saved_cs_client */; 97 /*!40101 SET character_set_client = @saved_cs_client */;
87 98
88 -- 99 --
@@ -90,8 +101,10 @@ CREATE TABLE `device_alarm` ( @@ -90,8 +101,10 @@ CREATE TABLE `device_alarm` (
90 -- 101 --
91 102
92 LOCK TABLES `device_alarm` WRITE; 103 LOCK TABLES `device_alarm` WRITE;
93 -/*!40000 ALTER TABLE `device_alarm` DISABLE KEYS */;  
94 -/*!40000 ALTER TABLE `device_alarm` ENABLE KEYS */; 104 +/*!40000 ALTER TABLE `device_alarm`
  105 + DISABLE KEYS */;
  106 +/*!40000 ALTER TABLE `device_alarm`
  107 + ENABLE KEYS */;
95 UNLOCK TABLES; 108 UNLOCK TABLES;
96 109
97 -- 110 --
@@ -99,50 +112,55 @@ UNLOCK TABLES; @@ -99,50 +112,55 @@ UNLOCK TABLES;
99 -- 112 --
100 113
101 DROP TABLE IF EXISTS `device_channel`; 114 DROP TABLE IF EXISTS `device_channel`;
102 -/*!40101 SET @saved_cs_client = @@character_set_client */; 115 +/*!40101 SET @saved_cs_client = @@character_set_client */;
103 /*!50503 SET character_set_client = utf8mb4 */; 116 /*!50503 SET character_set_client = utf8mb4 */;
104 -CREATE TABLE `device_channel` (  
105 - `id` int NOT NULL AUTO_INCREMENT,  
106 - `channelId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
107 - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
108 - `manufacture` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
109 - `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
110 - `owner` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
111 - `civilCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
112 - `block` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
113 - `address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
114 - `parentId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
115 - `safetyWay` int DEFAULT NULL,  
116 - `registerWay` int DEFAULT NULL,  
117 - `certNum` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
118 - `certifiable` int DEFAULT NULL,  
119 - `errCode` int DEFAULT NULL,  
120 - `endTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
121 - `secrecy` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
122 - `ipAddress` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
123 - `port` int DEFAULT NULL,  
124 - `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
125 - `PTZType` int DEFAULT NULL,  
126 - `status` int DEFAULT NULL,  
127 - `longitude` double DEFAULT NULL,  
128 - `latitude` double DEFAULT NULL,  
129 - `streamId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
130 - `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
131 - `parental` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
132 - `hasAudio` bit(1) DEFAULT NULL,  
133 - `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
134 - `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
135 - `subCount` int DEFAULT '0',  
136 - `longitudeGcj02` double DEFAULT NULL,  
137 - `latitudeGcj02` double DEFAULT NULL,  
138 - `longitudeWgs84` double DEFAULT NULL,  
139 - `latitudeWgs84` double DEFAULT NULL,  
140 - `businessGroupId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
141 - `gpsTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
142 - PRIMARY KEY (`id`) USING BTREE,  
143 - UNIQUE KEY `device_channel_id_uindex` (`id`) USING BTREE,  
144 - UNIQUE KEY `device_channel_pk` (`channelId`,`deviceId`) USING BTREE  
145 -) ENGINE=InnoDB AUTO_INCREMENT=19336 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 117 +CREATE TABLE `device_channel`
  118 +(
  119 + `id` int NOT NULL AUTO_INCREMENT,
  120 + `channelId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  121 + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  122 + `manufacture` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  123 + `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  124 + `owner` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  125 + `civilCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  126 + `block` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  127 + `address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  128 + `parentId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  129 + `safetyWay` int DEFAULT NULL,
  130 + `registerWay` int DEFAULT NULL,
  131 + `certNum` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  132 + `certifiable` int DEFAULT NULL,
  133 + `errCode` int DEFAULT NULL,
  134 + `endTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  135 + `secrecy` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  136 + `ipAddress` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  137 + `port` int DEFAULT NULL,
  138 + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  139 + `PTZType` int DEFAULT NULL,
  140 + `status` int DEFAULT NULL,
  141 + `longitude` double DEFAULT NULL,
  142 + `latitude` double DEFAULT NULL,
  143 + `streamId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  144 + `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  145 + `parental` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  146 + `hasAudio` bit(1) DEFAULT NULL,
  147 + `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  148 + `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  149 + `subCount` int DEFAULT '0 ',
  150 + `longitudeGcj02` double DEFAULT NULL,
  151 + `latitudeGcj02` double DEFAULT NULL,
  152 + `longitudeWgs84` double DEFAULT NULL,
  153 + `latitudeWgs84` double DEFAULT NULL,
  154 + `businessGroupId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  155 + `gpsTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  156 + PRIMARY KEY (`id`) USING BTREE,
  157 + UNIQUE KEY `device_channel_id_uindex` (`id`) USING BTREE,
  158 + UNIQUE KEY `device_channel_pk` (`channelId`, `deviceId`) USING BTREE
  159 +) ENGINE = InnoDB
  160 + AUTO_INCREMENT = 19496
  161 + DEFAULT CHARSET = utf8mb4
  162 + COLLATE = utf8mb4_general_ci
  163 + ROW_FORMAT = DYNAMIC;
146 /*!40101 SET character_set_client = @saved_cs_client */; 164 /*!40101 SET character_set_client = @saved_cs_client */;
147 165
148 -- 166 --
@@ -150,8 +168,10 @@ CREATE TABLE `device_channel` ( @@ -150,8 +168,10 @@ CREATE TABLE `device_channel` (
150 -- 168 --
151 169
152 LOCK TABLES `device_channel` WRITE; 170 LOCK TABLES `device_channel` WRITE;
153 -/*!40000 ALTER TABLE `device_channel` DISABLE KEYS */;  
154 -/*!40000 ALTER TABLE `device_channel` ENABLE KEYS */; 171 +/*!40000 ALTER TABLE `device_channel`
  172 + DISABLE KEYS */;
  173 +/*!40000 ALTER TABLE `device_channel`
  174 + ENABLE KEYS */;
155 UNLOCK TABLES; 175 UNLOCK TABLES;
156 176
157 -- 177 --
@@ -159,27 +179,32 @@ UNLOCK TABLES; @@ -159,27 +179,32 @@ UNLOCK TABLES;
159 -- 179 --
160 180
161 DROP TABLE IF EXISTS `device_mobile_position`; 181 DROP TABLE IF EXISTS `device_mobile_position`;
162 -/*!40101 SET @saved_cs_client = @@character_set_client */; 182 +/*!40101 SET @saved_cs_client = @@character_set_client */;
163 /*!50503 SET character_set_client = utf8mb4 */; 183 /*!50503 SET character_set_client = utf8mb4 */;
164 -CREATE TABLE `device_mobile_position` (  
165 - `id` int NOT NULL AUTO_INCREMENT,  
166 - `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
167 - `channelId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
168 - `deviceName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
169 - `time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
170 - `longitude` double NOT NULL,  
171 - `latitude` double NOT NULL,  
172 - `altitude` double DEFAULT NULL,  
173 - `speed` double DEFAULT NULL,  
174 - `direction` double DEFAULT NULL,  
175 - `reportSource` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
176 - `longitudeGcj02` double DEFAULT NULL,  
177 - `latitudeGcj02` double DEFAULT NULL,  
178 - `longitudeWgs84` double DEFAULT NULL,  
179 - `latitudeWgs84` double DEFAULT NULL,  
180 - `createTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
181 - PRIMARY KEY (`id`) USING BTREE  
182 -) ENGINE=InnoDB AUTO_INCREMENT=6751 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 184 +CREATE TABLE `device_mobile_position`
  185 +(
  186 + `id` int NOT NULL AUTO_INCREMENT,
  187 + `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  188 + `channelId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  189 + `deviceName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  190 + `time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  191 + `longitude` double NOT NULL,
  192 + `latitude` double NOT NULL,
  193 + `altitude` double DEFAULT NULL,
  194 + `speed` double DEFAULT NULL,
  195 + `direction` double DEFAULT NULL,
  196 + `reportSource` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  197 + `longitudeGcj02` double DEFAULT NULL,
  198 + `latitudeGcj02` double DEFAULT NULL,
  199 + `longitudeWgs84` double DEFAULT NULL,
  200 + `latitudeWgs84` double DEFAULT NULL,
  201 + `createTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  202 + PRIMARY KEY (`id`) USING BTREE
  203 +) ENGINE = InnoDB
  204 + AUTO_INCREMENT = 6956
  205 + DEFAULT CHARSET = utf8mb4
  206 + COLLATE = utf8mb4_general_ci
  207 + ROW_FORMAT = DYNAMIC;
183 /*!40101 SET character_set_client = @saved_cs_client */; 208 /*!40101 SET character_set_client = @saved_cs_client */;
184 209
185 -- 210 --
@@ -187,8 +212,10 @@ CREATE TABLE `device_mobile_position` ( @@ -187,8 +212,10 @@ CREATE TABLE `device_mobile_position` (
187 -- 212 --
188 213
189 LOCK TABLES `device_mobile_position` WRITE; 214 LOCK TABLES `device_mobile_position` WRITE;
190 -/*!40000 ALTER TABLE `device_mobile_position` DISABLE KEYS */;  
191 -/*!40000 ALTER TABLE `device_mobile_position` ENABLE KEYS */; 215 +/*!40000 ALTER TABLE `device_mobile_position`
  216 + DISABLE KEYS */;
  217 +/*!40000 ALTER TABLE `device_mobile_position`
  218 + ENABLE KEYS */;
192 UNLOCK TABLES; 219 UNLOCK TABLES;
193 220
194 -- 221 --
@@ -196,24 +223,29 @@ UNLOCK TABLES; @@ -196,24 +223,29 @@ UNLOCK TABLES;
196 -- 223 --
197 224
198 DROP TABLE IF EXISTS `gb_stream`; 225 DROP TABLE IF EXISTS `gb_stream`;
199 -/*!40101 SET @saved_cs_client = @@character_set_client */; 226 +/*!40101 SET @saved_cs_client = @@character_set_client */;
200 /*!50503 SET character_set_client = utf8mb4 */; 227 /*!50503 SET character_set_client = utf8mb4 */;
201 -CREATE TABLE `gb_stream` (  
202 - `gbStreamId` int NOT NULL AUTO_INCREMENT,  
203 - `app` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
204 - `stream` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
205 - `gbId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
206 - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
207 - `longitude` double DEFAULT NULL,  
208 - `latitude` double DEFAULT NULL,  
209 - `streamType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
210 - `mediaServerId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
211 - `createTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
212 - `gpsTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
213 - PRIMARY KEY (`gbStreamId`) USING BTREE,  
214 - UNIQUE KEY `app` (`app`,`stream`) USING BTREE,  
215 - UNIQUE KEY `gbId` (`gbId`) USING BTREE  
216 -) ENGINE=InnoDB AUTO_INCREMENT=301740 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 228 +CREATE TABLE `gb_stream`
  229 +(
  230 + `gbStreamId` int NOT NULL AUTO_INCREMENT,
  231 + `app` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  232 + `stream` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  233 + `gbId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  234 + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  235 + `longitude` double DEFAULT NULL,
  236 + `latitude` double DEFAULT NULL,
  237 + `streamType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  238 + `mediaServerId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  239 + `createTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  240 + `gpsTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  241 + PRIMARY KEY (`gbStreamId`) USING BTREE,
  242 + UNIQUE KEY `app` (`app`, `stream`) USING BTREE,
  243 + UNIQUE KEY `gbId` (`gbId`) USING BTREE
  244 +) ENGINE = InnoDB
  245 + AUTO_INCREMENT = 301754
  246 + DEFAULT CHARSET = utf8mb4
  247 + COLLATE = utf8mb4_general_ci
  248 + ROW_FORMAT = DYNAMIC;
217 /*!40101 SET character_set_client = @saved_cs_client */; 249 /*!40101 SET character_set_client = @saved_cs_client */;
218 250
219 -- 251 --
@@ -221,8 +253,10 @@ CREATE TABLE `gb_stream` ( @@ -221,8 +253,10 @@ CREATE TABLE `gb_stream` (
221 -- 253 --
222 254
223 LOCK TABLES `gb_stream` WRITE; 255 LOCK TABLES `gb_stream` WRITE;
224 -/*!40000 ALTER TABLE `gb_stream` DISABLE KEYS */;  
225 -/*!40000 ALTER TABLE `gb_stream` ENABLE KEYS */; 256 +/*!40000 ALTER TABLE `gb_stream`
  257 + DISABLE KEYS */;
  258 +/*!40000 ALTER TABLE `gb_stream`
  259 + ENABLE KEYS */;
226 UNLOCK TABLES; 260 UNLOCK TABLES;
227 261
228 -- 262 --
@@ -230,20 +264,25 @@ UNLOCK TABLES; @@ -230,20 +264,25 @@ UNLOCK TABLES;
230 -- 264 --
231 265
232 DROP TABLE IF EXISTS `log`; 266 DROP TABLE IF EXISTS `log`;
233 -/*!40101 SET @saved_cs_client = @@character_set_client */; 267 +/*!40101 SET @saved_cs_client = @@character_set_client */;
234 /*!50503 SET character_set_client = utf8mb4 */; 268 /*!50503 SET character_set_client = utf8mb4 */;
235 -CREATE TABLE `log` (  
236 - `id` int NOT NULL AUTO_INCREMENT,  
237 - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
238 - `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
239 - `uri` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
240 - `address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
241 - `result` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
242 - `timing` bigint NOT NULL,  
243 - `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
244 - `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
245 - PRIMARY KEY (`id`) USING BTREE  
246 -) ENGINE=InnoDB AUTO_INCREMENT=37760 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 269 +CREATE TABLE `log`
  270 +(
  271 + `id` int NOT NULL AUTO_INCREMENT,
  272 + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  273 + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  274 + `uri` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  275 + `address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  276 + `result` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  277 + `timing` bigint NOT NULL,
  278 + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  279 + `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  280 + PRIMARY KEY (`id`) USING BTREE
  281 +) ENGINE = InnoDB
  282 + AUTO_INCREMENT = 42703
  283 + DEFAULT CHARSET = utf8mb4
  284 + COLLATE = utf8mb4_general_ci
  285 + ROW_FORMAT = DYNAMIC;
247 /*!40101 SET character_set_client = @saved_cs_client */; 286 /*!40101 SET character_set_client = @saved_cs_client */;
248 287
249 -- 288 --
@@ -251,8 +290,10 @@ CREATE TABLE `log` ( @@ -251,8 +290,10 @@ CREATE TABLE `log` (
251 -- 290 --
252 291
253 LOCK TABLES `log` WRITE; 292 LOCK TABLES `log` WRITE;
254 -/*!40000 ALTER TABLE `log` DISABLE KEYS */;  
255 -/*!40000 ALTER TABLE `log` ENABLE KEYS */; 293 +/*!40000 ALTER TABLE `log`
  294 + DISABLE KEYS */;
  295 +/*!40000 ALTER TABLE `log`
  296 + ENABLE KEYS */;
256 UNLOCK TABLES; 297 UNLOCK TABLES;
257 298
258 -- 299 --
@@ -260,35 +301,39 @@ UNLOCK TABLES; @@ -260,35 +301,39 @@ UNLOCK TABLES;
260 -- 301 --
261 302
262 DROP TABLE IF EXISTS `media_server`; 303 DROP TABLE IF EXISTS `media_server`;
263 -/*!40101 SET @saved_cs_client = @@character_set_client */; 304 +/*!40101 SET @saved_cs_client = @@character_set_client */;
264 /*!50503 SET character_set_client = utf8mb4 */; 305 /*!50503 SET character_set_client = utf8mb4 */;
265 -CREATE TABLE `media_server` (  
266 - `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
267 - `ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
268 - `hookIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
269 - `sdpIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
270 - `streamIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
271 - `httpPort` int NOT NULL,  
272 - `httpSSlPort` int NOT NULL,  
273 - `rtmpPort` int NOT NULL,  
274 - `rtmpSSlPort` int NOT NULL,  
275 - `rtpProxyPort` int NOT NULL,  
276 - `rtspPort` int NOT NULL,  
277 - `rtspSSLPort` int NOT NULL,  
278 - `autoConfig` int NOT NULL,  
279 - `secret` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
280 - `streamNoneReaderDelayMS` int NOT NULL,  
281 - `rtpEnable` int NOT NULL,  
282 - `rtpPortRange` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
283 - `sendRtpPortRange` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
284 - `recordAssistPort` int NOT NULL,  
285 - `defaultServer` int NOT NULL,  
286 - `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
287 - `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
288 - `hookAliveInterval` int NOT NULL,  
289 - PRIMARY KEY (`id`) USING BTREE,  
290 - UNIQUE KEY `media_server_i` (`ip`,`httpPort`) USING BTREE  
291 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 306 +CREATE TABLE `media_server`
  307 +(
  308 + `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  309 + `ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  310 + `hookIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  311 + `sdpIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  312 + `streamIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  313 + `httpPort` int NOT NULL,
  314 + `httpSSlPort` int NOT NULL,
  315 + `rtmpPort` int NOT NULL,
  316 + `rtmpSSlPort` int NOT NULL,
  317 + `rtpProxyPort` int NOT NULL,
  318 + `rtspPort` int NOT NULL,
  319 + `rtspSSLPort` int NOT NULL,
  320 + `autoConfig` int NOT NULL,
  321 + `secret` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  322 + `streamNoneReaderDelayMS` int NOT NULL,
  323 + `rtpEnable` int NOT NULL,
  324 + `rtpPortRange` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  325 + `sendRtpPortRange` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  326 + `recordAssistPort` int NOT NULL,
  327 + `defaultServer` int NOT NULL,
  328 + `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  329 + `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  330 + `hookAliveInterval` int NOT NULL,
  331 + PRIMARY KEY (`id`) USING BTREE,
  332 + UNIQUE KEY `media_server_i` (`ip`, `httpPort`) USING BTREE
  333 +) ENGINE = InnoDB
  334 + DEFAULT CHARSET = utf8mb4
  335 + COLLATE = utf8mb4_general_ci
  336 + ROW_FORMAT = DYNAMIC;
292 /*!40101 SET character_set_client = @saved_cs_client */; 337 /*!40101 SET character_set_client = @saved_cs_client */;
293 338
294 -- 339 --
@@ -296,8 +341,10 @@ CREATE TABLE `media_server` ( @@ -296,8 +341,10 @@ CREATE TABLE `media_server` (
296 -- 341 --
297 342
298 LOCK TABLES `media_server` WRITE; 343 LOCK TABLES `media_server` WRITE;
299 -/*!40000 ALTER TABLE `media_server` DISABLE KEYS */;  
300 -/*!40000 ALTER TABLE `media_server` ENABLE KEYS */; 344 +/*!40000 ALTER TABLE `media_server`
  345 + DISABLE KEYS */;
  346 +/*!40000 ALTER TABLE `media_server`
  347 + ENABLE KEYS */;
301 UNLOCK TABLES; 348 UNLOCK TABLES;
302 349
303 -- 350 --
@@ -305,39 +352,44 @@ UNLOCK TABLES; @@ -305,39 +352,44 @@ UNLOCK TABLES;
305 -- 352 --
306 353
307 DROP TABLE IF EXISTS `parent_platform`; 354 DROP TABLE IF EXISTS `parent_platform`;
308 -/*!40101 SET @saved_cs_client = @@character_set_client */; 355 +/*!40101 SET @saved_cs_client = @@character_set_client */;
309 /*!50503 SET character_set_client = utf8mb4 */; 356 /*!50503 SET character_set_client = utf8mb4 */;
310 -CREATE TABLE `parent_platform` (  
311 - `id` int NOT NULL AUTO_INCREMENT,  
312 - `enable` int DEFAULT NULL,  
313 - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
314 - `serverGBId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
315 - `serverGBDomain` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
316 - `serverIP` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
317 - `serverPort` int DEFAULT NULL,  
318 - `deviceGBId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
319 - `deviceIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
320 - `devicePort` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
321 - `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
322 - `password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
323 - `expires` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
324 - `keepTimeout` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
325 - `transport` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
326 - `characterSet` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
327 - `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
328 - `ptz` int DEFAULT NULL,  
329 - `rtcp` int DEFAULT NULL,  
330 - `status` bit(1) DEFAULT NULL,  
331 - `startOfflinePush` int DEFAULT '0',  
332 - `administrativeDivision` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
333 - `catalogGroup` int DEFAULT '1',  
334 - `createTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
335 - `updateTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
336 - `treeType` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,  
337 - PRIMARY KEY (`id`) USING BTREE,  
338 - UNIQUE KEY `parent_platform_id_uindex` (`id`) USING BTREE,  
339 - UNIQUE KEY `parent_platform_pk` (`serverGBId`) USING BTREE  
340 -) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 357 +CREATE TABLE `parent_platform`
  358 +(
  359 + `id` int NOT NULL AUTO_INCREMENT,
  360 + `enable` int DEFAULT NULL,
  361 + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  362 + `serverGBId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  363 + `serverGBDomain` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  364 + `serverIP` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  365 + `serverPort` int DEFAULT NULL,
  366 + `deviceGBId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  367 + `deviceIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  368 + `devicePort` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  369 + `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  370 + `password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  371 + `expires` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  372 + `keepTimeout` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  373 + `transport` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  374 + `characterSet` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  375 + `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  376 + `ptz` int DEFAULT NULL,
  377 + `rtcp` int DEFAULT NULL,
  378 + `status` bit(1) DEFAULT NULL,
  379 + `startOfflinePush` int DEFAULT '0 ',
  380 + `administrativeDivision` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  381 + `catalogGroup` int DEFAULT '1 ',
  382 + `createTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  383 + `updateTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  384 + `treeType` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
  385 + PRIMARY KEY (`id`) USING BTREE,
  386 + UNIQUE KEY `parent_platform_id_uindex` (`id`) USING BTREE,
  387 + UNIQUE KEY `parent_platform_pk` (`serverGBId`) USING BTREE
  388 +) ENGINE = InnoDB
  389 + AUTO_INCREMENT = 40
  390 + DEFAULT CHARSET = utf8mb4
  391 + COLLATE = utf8mb4_general_ci
  392 + ROW_FORMAT = DYNAMIC;
341 /*!40101 SET character_set_client = @saved_cs_client */; 393 /*!40101 SET character_set_client = @saved_cs_client */;
342 394
343 -- 395 --
@@ -345,8 +397,10 @@ CREATE TABLE `parent_platform` ( @@ -345,8 +397,10 @@ CREATE TABLE `parent_platform` (
345 -- 397 --
346 398
347 LOCK TABLES `parent_platform` WRITE; 399 LOCK TABLES `parent_platform` WRITE;
348 -/*!40000 ALTER TABLE `parent_platform` DISABLE KEYS */;  
349 -/*!40000 ALTER TABLE `parent_platform` ENABLE KEYS */; 400 +/*!40000 ALTER TABLE `parent_platform`
  401 + DISABLE KEYS */;
  402 +/*!40000 ALTER TABLE `parent_platform`
  403 + ENABLE KEYS */;
350 UNLOCK TABLES; 404 UNLOCK TABLES;
351 405
352 -- 406 --
@@ -354,17 +408,21 @@ UNLOCK TABLES; @@ -354,17 +408,21 @@ UNLOCK TABLES;
354 -- 408 --
355 409
356 DROP TABLE IF EXISTS `platform_catalog`; 410 DROP TABLE IF EXISTS `platform_catalog`;
357 -/*!40101 SET @saved_cs_client = @@character_set_client */; 411 +/*!40101 SET @saved_cs_client = @@character_set_client */;
358 /*!50503 SET character_set_client = utf8mb4 */; 412 /*!50503 SET character_set_client = utf8mb4 */;
359 -CREATE TABLE `platform_catalog` (  
360 - `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
361 - `platformId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
362 - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
363 - `parentId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
364 - `civilCode` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
365 - `businessGroupId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
366 - PRIMARY KEY (`id`) USING BTREE  
367 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 413 +CREATE TABLE `platform_catalog`
  414 +(
  415 + `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  416 + `platformId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  417 + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  418 + `parentId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  419 + `civilCode` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  420 + `businessGroupId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  421 + PRIMARY KEY (`id`) USING BTREE
  422 +) ENGINE = InnoDB
  423 + DEFAULT CHARSET = utf8mb4
  424 + COLLATE = utf8mb4_general_ci
  425 + ROW_FORMAT = DYNAMIC;
368 /*!40101 SET character_set_client = @saved_cs_client */; 426 /*!40101 SET character_set_client = @saved_cs_client */;
369 427
370 -- 428 --
@@ -372,8 +430,10 @@ CREATE TABLE `platform_catalog` ( @@ -372,8 +430,10 @@ CREATE TABLE `platform_catalog` (
372 -- 430 --
373 431
374 LOCK TABLES `platform_catalog` WRITE; 432 LOCK TABLES `platform_catalog` WRITE;
375 -/*!40000 ALTER TABLE `platform_catalog` DISABLE KEYS */;  
376 -/*!40000 ALTER TABLE `platform_catalog` ENABLE KEYS */; 433 +/*!40000 ALTER TABLE `platform_catalog`
  434 + DISABLE KEYS */;
  435 +/*!40000 ALTER TABLE `platform_catalog`
  436 + ENABLE KEYS */;
377 UNLOCK TABLES; 437 UNLOCK TABLES;
378 438
379 -- 439 --
@@ -381,15 +441,20 @@ UNLOCK TABLES; @@ -381,15 +441,20 @@ UNLOCK TABLES;
381 -- 441 --
382 442
383 DROP TABLE IF EXISTS `platform_gb_channel`; 443 DROP TABLE IF EXISTS `platform_gb_channel`;
384 -/*!40101 SET @saved_cs_client = @@character_set_client */; 444 +/*!40101 SET @saved_cs_client = @@character_set_client */;
385 /*!50503 SET character_set_client = utf8mb4 */; 445 /*!50503 SET character_set_client = utf8mb4 */;
386 -CREATE TABLE `platform_gb_channel` (  
387 - `id` int NOT NULL AUTO_INCREMENT,  
388 - `platformId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
389 - `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
390 - `deviceChannelId` int NOT NULL,  
391 - PRIMARY KEY (`id`) USING BTREE  
392 -) ENGINE=InnoDB AUTO_INCREMENT=4912 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 446 +CREATE TABLE `platform_gb_channel`
  447 +(
  448 + `id` int NOT NULL AUTO_INCREMENT,
  449 + `platformId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  450 + `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  451 + `deviceChannelId` int NOT NULL,
  452 + PRIMARY KEY (`id`) USING BTREE
  453 +) ENGINE = InnoDB
  454 + AUTO_INCREMENT = 4915
  455 + DEFAULT CHARSET = utf8mb4
  456 + COLLATE = utf8mb4_general_ci
  457 + ROW_FORMAT = DYNAMIC;
393 /*!40101 SET character_set_client = @saved_cs_client */; 458 /*!40101 SET character_set_client = @saved_cs_client */;
394 459
395 -- 460 --
@@ -397,8 +462,10 @@ CREATE TABLE `platform_gb_channel` ( @@ -397,8 +462,10 @@ CREATE TABLE `platform_gb_channel` (
397 -- 462 --
398 463
399 LOCK TABLES `platform_gb_channel` WRITE; 464 LOCK TABLES `platform_gb_channel` WRITE;
400 -/*!40000 ALTER TABLE `platform_gb_channel` DISABLE KEYS */;  
401 -/*!40000 ALTER TABLE `platform_gb_channel` ENABLE KEYS */; 465 +/*!40000 ALTER TABLE `platform_gb_channel`
  466 + DISABLE KEYS */;
  467 +/*!40000 ALTER TABLE `platform_gb_channel`
  468 + ENABLE KEYS */;
402 UNLOCK TABLES; 469 UNLOCK TABLES;
403 470
404 -- 471 --
@@ -406,16 +473,21 @@ UNLOCK TABLES; @@ -406,16 +473,21 @@ UNLOCK TABLES;
406 -- 473 --
407 474
408 DROP TABLE IF EXISTS `platform_gb_stream`; 475 DROP TABLE IF EXISTS `platform_gb_stream`;
409 -/*!40101 SET @saved_cs_client = @@character_set_client */; 476 +/*!40101 SET @saved_cs_client = @@character_set_client */;
410 /*!50503 SET character_set_client = utf8mb4 */; 477 /*!50503 SET character_set_client = utf8mb4 */;
411 -CREATE TABLE `platform_gb_stream` (  
412 - `platformId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
413 - `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
414 - `gbStreamId` int NOT NULL,  
415 - `id` int NOT NULL AUTO_INCREMENT,  
416 - PRIMARY KEY (`id`) USING BTREE,  
417 - UNIQUE KEY `platform_gb_stream_pk` (`platformId`,`catalogId`,`gbStreamId`) USING BTREE  
418 -) ENGINE=InnoDB AUTO_INCREMENT=302134 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 478 +CREATE TABLE `platform_gb_stream`
  479 +(
  480 + `platformId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  481 + `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  482 + `gbStreamId` int NOT NULL,
  483 + `id` int NOT NULL AUTO_INCREMENT,
  484 + PRIMARY KEY (`id`) USING BTREE,
  485 + UNIQUE KEY `platform_gb_stream_pk` (`platformId`, `catalogId`, `gbStreamId`) USING BTREE
  486 +) ENGINE = InnoDB
  487 + AUTO_INCREMENT = 302149
  488 + DEFAULT CHARSET = utf8mb4
  489 + COLLATE = utf8mb4_general_ci
  490 + ROW_FORMAT = DYNAMIC;
419 /*!40101 SET character_set_client = @saved_cs_client */; 491 /*!40101 SET character_set_client = @saved_cs_client */;
420 492
421 -- 493 --
@@ -423,8 +495,10 @@ CREATE TABLE `platform_gb_stream` ( @@ -423,8 +495,10 @@ CREATE TABLE `platform_gb_stream` (
423 -- 495 --
424 496
425 LOCK TABLES `platform_gb_stream` WRITE; 497 LOCK TABLES `platform_gb_stream` WRITE;
426 -/*!40000 ALTER TABLE `platform_gb_stream` DISABLE KEYS */;  
427 -/*!40000 ALTER TABLE `platform_gb_stream` ENABLE KEYS */; 498 +/*!40000 ALTER TABLE `platform_gb_stream`
  499 + DISABLE KEYS */;
  500 +/*!40000 ALTER TABLE `platform_gb_stream`
  501 + ENABLE KEYS */;
428 UNLOCK TABLES; 502 UNLOCK TABLES;
429 503
430 -- 504 --
@@ -432,31 +506,36 @@ UNLOCK TABLES; @@ -432,31 +506,36 @@ UNLOCK TABLES;
432 -- 506 --
433 507
434 DROP TABLE IF EXISTS `stream_proxy`; 508 DROP TABLE IF EXISTS `stream_proxy`;
435 -/*!40101 SET @saved_cs_client = @@character_set_client */; 509 +/*!40101 SET @saved_cs_client = @@character_set_client */;
436 /*!50503 SET character_set_client = utf8mb4 */; 510 /*!50503 SET character_set_client = utf8mb4 */;
437 -CREATE TABLE `stream_proxy` (  
438 - `id` int NOT NULL AUTO_INCREMENT,  
439 - `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
440 - `app` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
441 - `stream` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
442 - `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
443 - `src_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
444 - `dst_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
445 - `timeout_ms` int DEFAULT NULL,  
446 - `ffmpeg_cmd_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
447 - `rtp_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
448 - `mediaServerId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
449 - `enable_hls` bit(1) DEFAULT NULL,  
450 - `enable_mp4` bit(1) DEFAULT NULL,  
451 - `enable` bit(1) NOT NULL,  
452 - `status` bit(1) NOT NULL,  
453 - `enable_remove_none_reader` bit(1) NOT NULL,  
454 - `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
455 - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
456 - `updateTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
457 - PRIMARY KEY (`id`) USING BTREE,  
458 - UNIQUE KEY `stream_proxy_pk` (`app`,`stream`) USING BTREE  
459 -) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 511 +CREATE TABLE `stream_proxy`
  512 +(
  513 + `id` int NOT NULL AUTO_INCREMENT,
  514 + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  515 + `app` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  516 + `stream` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  517 + `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  518 + `src_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  519 + `dst_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  520 + `timeout_ms` int DEFAULT NULL,
  521 + `ffmpeg_cmd_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  522 + `rtp_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  523 + `mediaServerId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  524 + `enable_hls` bit(1) DEFAULT NULL,
  525 + `enable_mp4` bit(1) DEFAULT NULL,
  526 + `enable` bit(1) NOT NULL,
  527 + `status` bit(1) NOT NULL,
  528 + `enable_remove_none_reader` bit(1) NOT NULL,
  529 + `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  530 + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  531 + `updateTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  532 + PRIMARY KEY (`id`) USING BTREE,
  533 + UNIQUE KEY `stream_proxy_pk` (`app`, `stream`) USING BTREE
  534 +) ENGINE = InnoDB
  535 + AUTO_INCREMENT = 66
  536 + DEFAULT CHARSET = utf8mb4
  537 + COLLATE = utf8mb4_general_ci
  538 + ROW_FORMAT = DYNAMIC;
460 /*!40101 SET character_set_client = @saved_cs_client */; 539 /*!40101 SET character_set_client = @saved_cs_client */;
461 540
462 -- 541 --
@@ -464,8 +543,10 @@ CREATE TABLE `stream_proxy` ( @@ -464,8 +543,10 @@ CREATE TABLE `stream_proxy` (
464 -- 543 --
465 544
466 LOCK TABLES `stream_proxy` WRITE; 545 LOCK TABLES `stream_proxy` WRITE;
467 -/*!40000 ALTER TABLE `stream_proxy` DISABLE KEYS */;  
468 -/*!40000 ALTER TABLE `stream_proxy` ENABLE KEYS */; 546 +/*!40000 ALTER TABLE `stream_proxy`
  547 + DISABLE KEYS */;
  548 +/*!40000 ALTER TABLE `stream_proxy`
  549 + ENABLE KEYS */;
469 UNLOCK TABLES; 550 UNLOCK TABLES;
470 551
471 -- 552 --
@@ -473,25 +554,32 @@ UNLOCK TABLES; @@ -473,25 +554,32 @@ UNLOCK TABLES;
473 -- 554 --
474 555
475 DROP TABLE IF EXISTS `stream_push`; 556 DROP TABLE IF EXISTS `stream_push`;
476 -/*!40101 SET @saved_cs_client = @@character_set_client */; 557 +/*!40101 SET @saved_cs_client = @@character_set_client */;
477 /*!50503 SET character_set_client = utf8mb4 */; 558 /*!50503 SET character_set_client = utf8mb4 */;
478 -CREATE TABLE `stream_push` (  
479 - `id` int NOT NULL AUTO_INCREMENT,  
480 - `app` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
481 - `stream` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
482 - `totalReaderCount` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
483 - `originType` int DEFAULT NULL,  
484 - `originTypeStr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
485 - `createTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
486 - `aliveSecond` int DEFAULT NULL,  
487 - `mediaServerId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,  
488 - `serverId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,  
489 - `pushTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
490 - `updateTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
491 - `status` int DEFAULT NULL,  
492 - PRIMARY KEY (`id`) USING BTREE,  
493 - UNIQUE KEY `stream_push_pk` (`app`,`stream`) USING BTREE  
494 -) ENGINE=InnoDB AUTO_INCREMENT=305390 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 559 +CREATE TABLE `stream_push`
  560 +(
  561 + `id` int NOT NULL AUTO_INCREMENT,
  562 + `app` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  563 + `stream` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  564 + `totalReaderCount` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  565 + `originType` int DEFAULT NULL,
  566 + `originTypeStr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  567 + `createTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  568 + `aliveSecond` int DEFAULT NULL,
  569 + `mediaServerId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  570 + `serverId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
  571 + `pushTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  572 + `updateTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  573 + `status` int DEFAULT NULL,
  574 + `pushIng` int DEFAULT NULL,
  575 + `self` int DEFAULT NULL,
  576 + PRIMARY KEY (`id`) USING BTREE,
  577 + UNIQUE KEY `stream_push_pk` (`app`, `stream`) USING BTREE
  578 +) ENGINE = InnoDB
  579 + AUTO_INCREMENT = 305415
  580 + DEFAULT CHARSET = utf8mb4
  581 + COLLATE = utf8mb4_general_ci
  582 + ROW_FORMAT = DYNAMIC;
495 /*!40101 SET character_set_client = @saved_cs_client */; 583 /*!40101 SET character_set_client = @saved_cs_client */;
496 584
497 -- 585 --
@@ -499,8 +587,10 @@ CREATE TABLE `stream_push` ( @@ -499,8 +587,10 @@ CREATE TABLE `stream_push` (
499 -- 587 --
500 588
501 LOCK TABLES `stream_push` WRITE; 589 LOCK TABLES `stream_push` WRITE;
502 -/*!40000 ALTER TABLE `stream_push` DISABLE KEYS */;  
503 -/*!40000 ALTER TABLE `stream_push` ENABLE KEYS */; 590 +/*!40000 ALTER TABLE `stream_push`
  591 + DISABLE KEYS */;
  592 +/*!40000 ALTER TABLE `stream_push`
  593 + ENABLE KEYS */;
504 UNLOCK TABLES; 594 UNLOCK TABLES;
505 595
506 -- 596 --
@@ -508,19 +598,24 @@ UNLOCK TABLES; @@ -508,19 +598,24 @@ UNLOCK TABLES;
508 -- 598 --
509 599
510 DROP TABLE IF EXISTS `user`; 600 DROP TABLE IF EXISTS `user`;
511 -/*!40101 SET @saved_cs_client = @@character_set_client */; 601 +/*!40101 SET @saved_cs_client = @@character_set_client */;
512 /*!50503 SET character_set_client = utf8mb4 */; 602 /*!50503 SET character_set_client = utf8mb4 */;
513 -CREATE TABLE `user` (  
514 - `id` int NOT NULL AUTO_INCREMENT,  
515 - `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
516 - `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
517 - `roleId` int NOT NULL,  
518 - `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
519 - `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
520 - `pushKey` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,  
521 - PRIMARY KEY (`id`) USING BTREE,  
522 - UNIQUE KEY `user_username_uindex` (`username`) USING BTREE  
523 -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 603 +CREATE TABLE `user`
  604 +(
  605 + `id` int NOT NULL AUTO_INCREMENT,
  606 + `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  607 + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  608 + `roleId` int NOT NULL,
  609 + `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  610 + `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  611 + `pushKey` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  612 + PRIMARY KEY (`id`) USING BTREE,
  613 + UNIQUE KEY `user_username_uindex` (`username`) USING BTREE
  614 +) ENGINE = InnoDB
  615 + AUTO_INCREMENT = 2
  616 + DEFAULT CHARSET = utf8mb4
  617 + COLLATE = utf8mb4_general_ci
  618 + ROW_FORMAT = DYNAMIC;
524 /*!40101 SET character_set_client = @saved_cs_client */; 619 /*!40101 SET character_set_client = @saved_cs_client */;
525 620
526 -- 621 --
@@ -528,9 +623,13 @@ CREATE TABLE `user` ( @@ -528,9 +623,13 @@ CREATE TABLE `user` (
528 -- 623 --
529 624
530 LOCK TABLES `user` WRITE; 625 LOCK TABLES `user` WRITE;
531 -/*!40000 ALTER TABLE `user` DISABLE KEYS */;  
532 -INSERT INTO `user` VALUES (1,'admin','21232f297a57a5a743894a0e4a801fc3',1,'2021 - 04 - 13 14:14:57','2021 - 04 - 13 14:14:57','453df297a57a5a7438934sda801fc3');  
533 -/*!40000 ALTER TABLE `user` ENABLE KEYS */; 626 +/*!40000 ALTER TABLE `user`
  627 + DISABLE KEYS */;
  628 +INSERT INTO `user`
  629 +VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 1, '2021 - 04 - 13 14:14:57', '2021 - 04 - 13 14:14:57',
  630 + '01685cb9573ae25ec6c52142402da7c5');
  631 +/*!40000 ALTER TABLE `user`
  632 + ENABLE KEYS */;
534 UNLOCK TABLES; 633 UNLOCK TABLES;
535 634
536 -- 635 --
@@ -538,16 +637,21 @@ UNLOCK TABLES; @@ -538,16 +637,21 @@ UNLOCK TABLES;
538 -- 637 --
539 638
540 DROP TABLE IF EXISTS `user_role`; 639 DROP TABLE IF EXISTS `user_role`;
541 -/*!40101 SET @saved_cs_client = @@character_set_client */; 640 +/*!40101 SET @saved_cs_client = @@character_set_client */;
542 /*!50503 SET character_set_client = utf8mb4 */; 641 /*!50503 SET character_set_client = utf8mb4 */;
543 -CREATE TABLE `user_role` (  
544 - `id` int NOT NULL AUTO_INCREMENT,  
545 - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
546 - `authority` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
547 - `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
548 - `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
549 - PRIMARY KEY (`id`) USING BTREE  
550 -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 642 +CREATE TABLE `user_role`
  643 +(
  644 + `id` int NOT NULL AUTO_INCREMENT,
  645 + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  646 + `authority` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  647 + `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  648 + `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  649 + PRIMARY KEY (`id`) USING BTREE
  650 +) ENGINE = InnoDB
  651 + AUTO_INCREMENT = 2
  652 + DEFAULT CHARSET = utf8mb4
  653 + COLLATE = utf8mb4_general_ci
  654 + ROW_FORMAT = DYNAMIC;
551 /*!40101 SET character_set_client = @saved_cs_client */; 655 /*!40101 SET character_set_client = @saved_cs_client */;
552 656
553 -- 657 --
@@ -555,18 +659,21 @@ CREATE TABLE `user_role` ( @@ -555,18 +659,21 @@ CREATE TABLE `user_role` (
555 -- 659 --
556 660
557 LOCK TABLES `user_role` WRITE; 661 LOCK TABLES `user_role` WRITE;
558 -/*!40000 ALTER TABLE `user_role` DISABLE KEYS */;  
559 -INSERT INTO `user_role` VALUES (1,'admin','0','2021-04-13 14:14:57','2021-04-13 14:14:57');  
560 -/*!40000 ALTER TABLE `user_role` ENABLE KEYS */; 662 +/*!40000 ALTER TABLE `user_role`
  663 + DISABLE KEYS */;
  664 +INSERT INTO `user_role`
  665 +VALUES (1, 'admin', '0 ', '2021 - 04 - 13 14:14:57', '2021 - 04 - 13 14:14:57');
  666 +/*!40000 ALTER TABLE `user_role`
  667 + ENABLE KEYS */;
561 UNLOCK TABLES; 668 UNLOCK TABLES;
562 -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 669 +/*!40103 SET TIME_ZONE = @OLD_TIME_ZONE */;
563 670
564 -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;  
565 -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;  
566 -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;  
567 -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;  
568 -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;  
569 -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;  
570 -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 671 +/*!40101 SET SQL_MODE = @OLD_SQL_MODE */;
  672 +/*!40014 SET FOREIGN_KEY_CHECKS = @OLD_FOREIGN_KEY_CHECKS */;
  673 +/*!40014 SET UNIQUE_CHECKS = @OLD_UNIQUE_CHECKS */;
  674 +/*!40101 SET CHARACTER_SET_CLIENT = @OLD_CHARACTER_SET_CLIENT */;
  675 +/*!40101 SET CHARACTER_SET_RESULTS = @OLD_CHARACTER_SET_RESULTS */;
  676 +/*!40101 SET COLLATION_CONNECTION = @OLD_COLLATION_CONNECTION */;
  677 +/*!40111 SET SQL_NOTES = @OLD_SQL_NOTES */;
571 678
572 --- Dump completed on 2022-07-17 23:15:09 679 +-- Dump completed on 2022-07-27 14:51:08
sql/update.sql
@@ -77,5 +77,8 @@ alter table platform_catalog @@ -77,5 +77,8 @@ alter table platform_catalog
77 alter table platform_catalog 77 alter table platform_catalog
78 add businessGroupId varchar(50) default null; 78 add businessGroupId varchar(50) default null;
79 79
  80 +/********************* ADD ***************************/
  81 +alter table stream_push
  82 + add self int DEFAULT NULL;
80 83
81 84
src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
1 package com.genersoft.iot.vmp.conf; 1 package com.genersoft.iot.vmp.conf;
2 2
3 -import io.swagger.models.auth.In;  
4 import org.springframework.boot.context.properties.ConfigurationProperties; 3 import org.springframework.boot.context.properties.ConfigurationProperties;
5 import org.springframework.stereotype.Component; 4 import org.springframework.stereotype.Component;
6 5
src/main/java/com/genersoft/iot/vmp/conf/security/DefaultUserDetailsServiceImpl.java
1 package com.genersoft.iot.vmp.conf.security; 1 package com.genersoft.iot.vmp.conf.security;
2 2
3 -import com.genersoft.iot.vmp.conf.security.dto.LoginUser;  
4 -import com.genersoft.iot.vmp.service.IUserService;  
5 -import com.genersoft.iot.vmp.storager.dao.dto.User;  
6 -import com.github.xiaoymin.knife4j.core.util.StrUtil; 3 +import java.time.LocalDateTime;
  4 +
7 import org.slf4j.Logger; 5 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory; 6 import org.slf4j.LoggerFactory;
9 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.beans.factory.annotation.Autowired;
@@ -12,7 +10,10 @@ import org.springframework.security.core.userdetails.UserDetailsService; @@ -12,7 +10,10 @@ import org.springframework.security.core.userdetails.UserDetailsService;
12 import org.springframework.security.core.userdetails.UsernameNotFoundException; 10 import org.springframework.security.core.userdetails.UsernameNotFoundException;
13 import org.springframework.stereotype.Component; 11 import org.springframework.stereotype.Component;
14 12
15 -import java.time.LocalDateTime; 13 +import com.alibaba.excel.util.StringUtils;
  14 +import com.genersoft.iot.vmp.conf.security.dto.LoginUser;
  15 +import com.genersoft.iot.vmp.service.IUserService;
  16 +import com.genersoft.iot.vmp.storager.dao.dto.User;
16 17
17 /** 18 /**
18 * 用户登录认证逻辑 19 * 用户登录认证逻辑
@@ -27,7 +28,7 @@ public class DefaultUserDetailsServiceImpl implements UserDetailsService { @@ -27,7 +28,7 @@ public class DefaultUserDetailsServiceImpl implements UserDetailsService {
27 28
28 @Override 29 @Override
29 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 30 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
30 - if (StrUtil.isBlank(username)) { 31 + if (StringUtils.isBlank(username)) {
31 logger.info("登录用户:{} 不存在", username); 32 logger.info("登录用户:{} 不存在", username);
32 throw new UsernameNotFoundException("登录用户:" + username + " 不存在"); 33 throw new UsernameNotFoundException("登录用户:" + username + " 不存在");
33 } 34 }
src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java
@@ -3,8 +3,14 @@ package com.genersoft.iot.vmp.gb28181.bean; @@ -3,8 +3,14 @@ package com.genersoft.iot.vmp.gb28181.bean;
3 import java.time.Instant; 3 import java.time.Instant;
4 import java.util.List; 4 import java.util.List;
5 5
  6 +/**
  7 + * @author lin
  8 + */
6 public class CatalogData { 9 public class CatalogData {
7 - private int sn; // 命令序列号 10 + /**
  11 + * 命令序列号
  12 + */
  13 + private int sn;
8 private int total; 14 private int total;
9 private List<DeviceChannel> channelList; 15 private List<DeviceChannel> channelList;
10 private Instant lastTime; 16 private Instant lastTime;
src/main/java/com/genersoft/iot/vmp/gb28181/bean/SyncStatus.java
@@ -2,12 +2,15 @@ package com.genersoft.iot.vmp.gb28181.bean; @@ -2,12 +2,15 @@ package com.genersoft.iot.vmp.gb28181.bean;
2 2
3 /** 3 /**
4 * 摄像机同步状态 4 * 摄像机同步状态
  5 + * @author lin
5 */ 6 */
6 public class SyncStatus { 7 public class SyncStatus {
7 private int total; 8 private int total;
8 private int current; 9 private int current;
9 private String errorMsg; 10 private String errorMsg;
10 11
  12 + private boolean syncIng;
  13 +
11 public int getTotal() { 14 public int getTotal() {
12 return total; 15 return total;
13 } 16 }
@@ -31,4 +34,12 @@ public class SyncStatus { @@ -31,4 +34,12 @@ public class SyncStatus {
31 public void setErrorMsg(String errorMsg) { 34 public void setErrorMsg(String errorMsg) {
32 this.errorMsg = errorMsg; 35 this.errorMsg = errorMsg;
33 } 36 }
  37 +
  38 + public boolean isSyncIng() {
  39 + return syncIng;
  40 + }
  41 +
  42 + public void setSyncIng(boolean syncIng) {
  43 + this.syncIng = syncIng;
  44 + }
34 } 45 }
src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java
@@ -84,6 +84,11 @@ public class CatalogDataCatch { @@ -84,6 +84,11 @@ public class CatalogDataCatch {
84 syncStatus.setCurrent(catalogData.getChannelList().size()); 84 syncStatus.setCurrent(catalogData.getChannelList().size());
85 syncStatus.setTotal(catalogData.getTotal()); 85 syncStatus.setTotal(catalogData.getTotal());
86 syncStatus.setErrorMsg(catalogData.getErrorMsg()); 86 syncStatus.setErrorMsg(catalogData.getErrorMsg());
  87 + if (catalogData.getStatus().equals(CatalogData.CatalogDataStatus.end)) {
  88 + syncStatus.setSyncIng(false);
  89 + }else {
  90 + syncStatus.setSyncIng(true);
  91 + }
87 return syncStatus; 92 return syncStatus;
88 } 93 }
89 94
src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeTask.java
@@ -39,9 +39,9 @@ public class MobilePositionSubscribeTask implements ISubscribeTask { @@ -39,9 +39,9 @@ public class MobilePositionSubscribeTask implements ISubscribeTask {
39 dynamicTask.stop(taskKey); 39 dynamicTask.stop(taskKey);
40 } 40 }
41 sipCommander.mobilePositionSubscribe(device, dialog, eventResult -> { 41 sipCommander.mobilePositionSubscribe(device, dialog, eventResult -> {
42 -// if (eventResult.dialog != null || eventResult.dialog.getState().equals(DialogState.CONFIRMED)) {  
43 -// dialog = eventResult.dialog;  
44 -// } 42 + if (eventResult.dialog != null || eventResult.dialog.getState().equals(DialogState.CONFIRMED)) {
  43 + dialog = eventResult.dialog;
  44 + }
45 ResponseEvent event = (ResponseEvent) eventResult.event; 45 ResponseEvent event = (ResponseEvent) eventResult.event;
46 if (event.getResponse().getRawContent() != null) { 46 if (event.getResponse().getRawContent() != null) {
47 // 成功 47 // 成功
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -10,6 +10,9 @@ import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; @@ -10,6 +10,9 @@ import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
10 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; 10 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
11 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; 11 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
12 import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider; 12 import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider;
  13 +import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory;
  14 +import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange;
  15 +import com.genersoft.iot.vmp.media.zlm.dto.HookType;
13 import com.genersoft.iot.vmp.utils.DateUtil; 16 import com.genersoft.iot.vmp.utils.DateUtil;
14 import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; 17 import com.genersoft.iot.vmp.gb28181.utils.NumericUtil;
15 import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; 18 import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
@@ -348,25 +351,19 @@ public class SIPCommander implements ISIPCommander { @@ -348,25 +351,19 @@ public class SIPCommander implements ISIPCommander {
348 @Override 351 @Override
349 public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, 352 public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
350 ZLMHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) { 353 ZLMHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) {
351 - String streamId = ssrcInfo.getStream(); 354 + String stream = ssrcInfo.getStream();
352 try { 355 try {
353 if (device == null) { 356 if (device == null) {
354 return; 357 return;
355 } 358 }
356 String streamMode = device.getStreamMode().toUpperCase(); 359 String streamMode = device.getStreamMode().toUpperCase();
357 360
358 - logger.info("{} 分配的ZLM为: {} [{}:{}]", streamId, mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort());  
359 - // 添加订阅  
360 - JSONObject subscribeKey = new JSONObject();  
361 - subscribeKey.put("app", "rtp");  
362 - subscribeKey.put("stream", streamId);  
363 - subscribeKey.put("regist", true);  
364 - subscribeKey.put("schema", "rtmp");  
365 - subscribeKey.put("mediaServerId", mediaServerItem.getId());  
366 - subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey,  
367 - (MediaServerItem mediaServerItemInUse, JSONObject json)->{ 361 + logger.info("{} 分配的ZLM为: {} [{}:{}]", stream, mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort());
  362 + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtmp", mediaServerItem.getId());
  363 + subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{
368 if (event != null) { 364 if (event != null) {
369 event.response(mediaServerItemInUse, json); 365 event.response(mediaServerItemInUse, json);
  366 + subscribe.removeSubscribe(hookSubscribe);
370 } 367 }
371 }); 368 });
372 // 369 //
@@ -440,7 +437,7 @@ public class SIPCommander implements ISIPCommander { @@ -440,7 +437,7 @@ public class SIPCommander implements ISIPCommander {
440 errorEvent.response(e); 437 errorEvent.response(e);
441 }), e ->{ 438 }), e ->{
442 // 这里为例避免一个通道的点播只有一个callID这个参数使用一个固定值 439 // 这里为例避免一个通道的点播只有一个callID这个参数使用一个固定值
443 - streamSession.put(device.getDeviceId(), channelId ,"play", streamId, ssrcInfo.getSsrc(), mediaServerItem.getId(), ((ResponseEvent)e.event).getClientTransaction(), VideoStreamSessionManager.SessionType.play); 440 + streamSession.put(device.getDeviceId(), channelId ,"play", stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), ((ResponseEvent)e.event).getClientTransaction(), VideoStreamSessionManager.SessionType.play);
444 streamSession.put(device.getDeviceId(), channelId ,"play", e.dialog); 441 streamSession.put(device.getDeviceId(), channelId ,"play", e.dialog);
445 okEvent.response(e); 442 okEvent.response(e);
446 }); 443 });
@@ -530,21 +527,14 @@ public class SIPCommander implements ISIPCommander { @@ -530,21 +527,14 @@ public class SIPCommander implements ISIPCommander {
530 527
531 CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() 528 CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
532 : udpSipProvider.getNewCallId(); 529 : udpSipProvider.getNewCallId();
533 - 530 + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtmp", mediaServerItem.getId());
534 // 添加订阅 531 // 添加订阅
535 - JSONObject subscribeKey = new JSONObject();  
536 - subscribeKey.put("app", "rtp");  
537 - subscribeKey.put("stream", ssrcInfo.getStream());  
538 - subscribeKey.put("regist", true);  
539 - subscribeKey.put("schema", "rtmp");  
540 - subscribeKey.put("mediaServerId", mediaServerItem.getId());  
541 - logger.debug("录像回放添加订阅,订阅内容:" + subscribeKey);  
542 - subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey,  
543 - (MediaServerItem mediaServerItemInUse, JSONObject json)->{ 532 + subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{
544 if (hookEvent != null) { 533 if (hookEvent != null) {
545 InviteStreamInfo inviteStreamInfo = new InviteStreamInfo(mediaServerItemInUse, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream()); 534 InviteStreamInfo inviteStreamInfo = new InviteStreamInfo(mediaServerItemInUse, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream());
546 hookEvent.call(inviteStreamInfo); 535 hookEvent.call(inviteStreamInfo);
547 } 536 }
  537 + subscribe.removeSubscribe(hookSubscribe);
548 }); 538 });
549 Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader, ssrcInfo.getSsrc()); 539 Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader, ssrcInfo.getSsrc());
550 540
@@ -643,21 +633,15 @@ public class SIPCommander implements ISIPCommander { @@ -643,21 +633,15 @@ public class SIPCommander implements ISIPCommander {
643 CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() 633 CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
644 : udpSipProvider.getNewCallId(); 634 : udpSipProvider.getNewCallId();
645 635
  636 + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, null, mediaServerItem.getId());
646 // 添加订阅 637 // 添加订阅
647 - JSONObject subscribeKey = new JSONObject();  
648 - subscribeKey.put("app", "rtp");  
649 - subscribeKey.put("stream", ssrcInfo.getStream());  
650 - subscribeKey.put("regist", true);  
651 - subscribeKey.put("mediaServerId", mediaServerItem.getId());  
652 - logger.debug("录像回放添加订阅,订阅内容:" + subscribeKey.toString());  
653 - subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey,  
654 - (MediaServerItem mediaServerItemInUse, JSONObject json)->{ 638 + subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{
655 hookEvent.call(new InviteStreamInfo(mediaServerItem, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); 639 hookEvent.call(new InviteStreamInfo(mediaServerItem, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream()));
656 - subscribe.removeSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey);  
657 - subscribeKey.put("regist", false);  
658 - subscribeKey.put("schema", "rtmp"); 640 + subscribe.removeSubscribe(hookSubscribe);
  641 + hookSubscribe.getContent().put("regist", false);
  642 + hookSubscribe.getContent().put("schema", "rtmp");
659 // 添加流注销的订阅,注销了后向设备发送bye 643 // 添加流注销的订阅,注销了后向设备发送bye
660 - subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, 644 + subscribe.addSubscribe(hookSubscribe,
661 (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd)->{ 645 (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd)->{
662 ClientTransaction transaction = streamSession.getTransaction(device.getDeviceId(), channelId, ssrcInfo.getStream(), callIdHeader.getCallId()); 646 ClientTransaction transaction = streamSession.getTransaction(device.getDeviceId(), channelId, ssrcInfo.getStream(), callIdHeader.getCallId());
663 if (transaction != null) { 647 if (transaction != null) {
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
@@ -126,7 +126,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In @@ -126,7 +126,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
126 SsrcTransaction ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, "play", null); 126 SsrcTransaction ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, "play", null);
127 if (ssrcTransactionForPlay != null){ 127 if (ssrcTransactionForPlay != null){
128 SIPDialog dialogForPlay = (SIPDialog) SerializeUtils.deSerialize(ssrcTransactionForPlay.getDialog()); 128 SIPDialog dialogForPlay = (SIPDialog) SerializeUtils.deSerialize(ssrcTransactionForPlay.getDialog());
129 - if (dialogForPlay.getCallId().equals(callIdHeader.getCallId())){ 129 + if (dialogForPlay.getCallId().getCallId().equals(callIdHeader.getCallId())){
130 // 释放ssrc 130 // 释放ssrc
131 MediaServerItem mediaServerItem = mediaServerService.getOne(ssrcTransactionForPlay.getMediaServerId()); 131 MediaServerItem mediaServerItem = mediaServerService.getOne(ssrcTransactionForPlay.getMediaServerId());
132 if (mediaServerItem != null) { 132 if (mediaServerItem != null) {
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -419,18 +419,16 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -419,18 +419,16 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
419 } 419 }
420 } 420 }
421 } else if (gbStream != null) { 421 } else if (gbStream != null) {
422 - if (streamPushItem.isStatus()) {  
423 - // 在线状态 422 + if (streamPushItem != null && streamPushItem.isPushIng()) {
  423 + // 推流状态
424 pushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, 424 pushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
425 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); 425 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
426 } else { 426 } else {
427 - // 不在线 拉起 427 + // 未推流 拉起
428 notifyStreamOnline(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, 428 notifyStreamOnline(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
429 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); 429 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
430 } 430 }
431 -  
432 } 431 }
433 -  
434 } 432 }
435 433
436 } catch (SipException | InvalidArgumentException | ParseException e) { 434 } catch (SipException | InvalidArgumentException | ParseException e) {
@@ -453,7 +451,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -453,7 +451,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
453 int port, Boolean tcpActive, boolean mediaTransmissionTCP, 451 int port, Boolean tcpActive, boolean mediaTransmissionTCP,
454 String channelId, String addressStr, String ssrc, String requesterId) throws InvalidArgumentException, ParseException, SipException { 452 String channelId, String addressStr, String ssrc, String requesterId) throws InvalidArgumentException, ParseException, SipException {
455 // 推流 453 // 推流
456 - if (streamPushItem.getServerId().equals(userSetting.getServerId())) { 454 + if (streamPushItem.isSelf()) {
457 Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, gbStream.getApp(), gbStream.getStream()); 455 Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, gbStream.getApp(), gbStream.getStream());
458 if (streamReady) { 456 if (streamReady) {
459 // 自平台内容 457 // 自平台内容
@@ -502,7 +500,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -502,7 +500,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
502 String channelId, String addressStr, String ssrc, String requesterId) throws InvalidArgumentException, ParseException, SipException { 500 String channelId, String addressStr, String ssrc, String requesterId) throws InvalidArgumentException, ParseException, SipException {
503 if ("proxy".equals(gbStream.getStreamType())) { 501 if ("proxy".equals(gbStream.getStreamType())) {
504 // TODO 控制启用以使设备上线 502 // TODO 控制启用以使设备上线
505 - logger.info("[ app={}, stream={} ]通道离线,启用流后开始推流", gbStream.getApp(), gbStream.getStream()); 503 + logger.info("[ app={}, stream={} ]通道未推流,启用流后开始推流", gbStream.getApp(), gbStream.getStream());
506 responseAck(evt, Response.BAD_REQUEST, "channel [" + gbStream.getGbId() + "] offline"); 504 responseAck(evt, Response.BAD_REQUEST, "channel [" + gbStream.getGbId() + "] offline");
507 } else if ("push".equals(gbStream.getStreamType())) { 505 } else if ("push".equals(gbStream.getStreamType())) {
508 if (!platform.isStartOfflinePush()) { 506 if (!platform.isStartOfflinePush()) {
@@ -510,7 +508,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -510,7 +508,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
510 return; 508 return;
511 } 509 }
512 // 发送redis消息以使设备上线 510 // 发送redis消息以使设备上线
513 - logger.info("[ app={}, stream={} ]通道离线,发送redis信息控制设备开始推流", gbStream.getApp(), gbStream.getStream()); 511 + logger.info("[ app={}, stream={} ]通道未推流,发送redis信息控制设备开始推流", gbStream.getApp(), gbStream.getStream());
514 512
515 MessageForPushChannel messageForPushChannel = MessageForPushChannel.getInstance(1, 513 MessageForPushChannel messageForPushChannel = MessageForPushChannel.getInstance(1,
516 gbStream.getApp(), gbStream.getStream(), gbStream.getGbId(), gbStream.getPlatformId(), 514 gbStream.getApp(), gbStream.getStream(), gbStream.getGbId(), gbStream.getPlatformId(),
@@ -520,7 +518,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -520,7 +518,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
520 dynamicTask.startDelay(callIdHeader.getCallId(), () -> { 518 dynamicTask.startDelay(callIdHeader.getCallId(), () -> {
521 logger.info("[ app={}, stream={} ] 等待设备开始推流超时", gbStream.getApp(), gbStream.getStream()); 519 logger.info("[ app={}, stream={} ] 等待设备开始推流超时", gbStream.getApp(), gbStream.getStream());
522 try { 520 try {
523 - mediaListManager.removedChannelOnlineEventLister(gbStream.getGbId()); 521 + mediaListManager.removedChannelOnlineEventLister(gbStream.getApp(), gbStream.getStream());
524 responseAck(evt, Response.REQUEST_TIMEOUT); // 超时 522 responseAck(evt, Response.REQUEST_TIMEOUT); // 超时
525 } catch (SipException e) { 523 } catch (SipException e) {
526 e.printStackTrace(); 524 e.printStackTrace();
@@ -535,7 +533,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -535,7 +533,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
535 Boolean finalTcpActive = tcpActive; 533 Boolean finalTcpActive = tcpActive;
536 534
537 // 添加在本机上线的通知 535 // 添加在本机上线的通知
538 - mediaListManager.addChannelOnlineEventLister(gbStream.getGbId(), (app, stream, serverId) -> { 536 + mediaListManager.addChannelOnlineEventLister(gbStream.getApp(), gbStream.getStream(), (app, stream, serverId) -> {
539 dynamicTask.stop(callIdHeader.getCallId()); 537 dynamicTask.stop(callIdHeader.getCallId());
540 if (serverId.equals(userSetting.getServerId())) { 538 if (serverId.equals(userSetting.getServerId())) {
541 SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, finalPort, ssrc, requesterId, 539 SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, finalPort, ssrc, requesterId,
@@ -623,7 +621,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -623,7 +621,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
623 // 离线 621 // 离线
624 // 查询是否在本机上线了 622 // 查询是否在本机上线了
625 StreamPushItem currentStreamPushItem = streamPushService.getPush(streamPushItem.getApp(), streamPushItem.getStream()); 623 StreamPushItem currentStreamPushItem = streamPushService.getPush(streamPushItem.getApp(), streamPushItem.getStream());
626 - if (currentStreamPushItem.isStatus()) { 624 + if (currentStreamPushItem.isPushIng()) {
627 // 在线状态 625 // 在线状态
628 pushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, 626 pushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
629 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); 627 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
@@ -92,39 +92,36 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -92,39 +92,36 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
92 @Override 92 @Override
93 public void process(RequestEvent evt) { 93 public void process(RequestEvent evt) {
94 try { 94 try {
95 -  
96 taskQueue.offer(new HandlerCatchData(evt, null, null)); 95 taskQueue.offer(new HandlerCatchData(evt, null, null));
97 responseAck(evt, Response.OK); 96 responseAck(evt, Response.OK);
98 if (!taskQueueHandlerRun) { 97 if (!taskQueueHandlerRun) {
99 taskQueueHandlerRun = true; 98 taskQueueHandlerRun = true;
100 taskExecutor.execute(()-> { 99 taskExecutor.execute(()-> {
101 - while (!taskQueue.isEmpty()) {  
102 - try {  
103 - HandlerCatchData take = taskQueue.poll();  
104 - Element rootElement = getRootElement(take.getEvt());  
105 - String cmd = XmlUtil.getText(rootElement, "CmdType");  
106 -  
107 - if (CmdType.CATALOG.equals(cmd)) {  
108 - logger.info("接收到Catalog通知");  
109 - processNotifyCatalogList(take.getEvt());  
110 - } else if (CmdType.ALARM.equals(cmd)) {  
111 - logger.info("接收到Alarm通知");  
112 - processNotifyAlarm(take.getEvt());  
113 - } else if (CmdType.MOBILE_POSITION.equals(cmd)) {  
114 - logger.info("接收到MobilePosition通知");  
115 - processNotifyMobilePosition(take.getEvt());  
116 - } else {  
117 - logger.info("接收到消息:" + cmd);  
118 - }  
119 - } catch (DocumentException e) {  
120 - throw new RuntimeException(e);  
121 - } 100 + while (!taskQueue.isEmpty()) {
  101 + try {
  102 + HandlerCatchData take = taskQueue.poll();
  103 + Element rootElement = getRootElement(take.getEvt());
  104 + String cmd = XmlUtil.getText(rootElement, "CmdType");
  105 +
  106 + if (CmdType.CATALOG.equals(cmd)) {
  107 + logger.info("接收到Catalog通知");
  108 + processNotifyCatalogList(take.getEvt());
  109 + } else if (CmdType.ALARM.equals(cmd)) {
  110 + logger.info("接收到Alarm通知");
  111 + processNotifyAlarm(take.getEvt());
  112 + } else if (CmdType.MOBILE_POSITION.equals(cmd)) {
  113 + logger.info("接收到MobilePosition通知");
  114 + processNotifyMobilePosition(take.getEvt());
  115 + } else {
  116 + logger.info("接收到消息:" + cmd);
122 } 117 }
123 - taskQueueHandlerRun = false;  
124 - }); 118 + } catch (DocumentException e) {
  119 + throw new RuntimeException(e);
  120 + }
  121 + }
  122 + taskQueueHandlerRun = false;
  123 + });
125 } 124 }
126 -  
127 -  
128 } catch (SipException | InvalidArgumentException | ParseException e) { 125 } catch (SipException | InvalidArgumentException | ParseException e) {
129 e.printStackTrace(); 126 e.printStackTrace();
130 } 127 }
@@ -174,7 +171,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -174,7 +171,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
174 } else { 171 } else {
175 mobilePosition.setAltitude(0.0); 172 mobilePosition.setAltitude(0.0);
176 } 173 }
177 - logger.info("[收到 移动位置订阅]:{}/{}->{}.{}", mobilePosition.getDeviceId(), mobilePosition.getChannelId(), 174 + logger.info("[收到移动位置订阅通知]:{}/{}->{}.{}", mobilePosition.getDeviceId(), mobilePosition.getChannelId(),
178 mobilePosition.getLongitude(), mobilePosition.getLatitude()); 175 mobilePosition.getLongitude(), mobilePosition.getLatitude());
179 mobilePosition.setReportSource("Mobile Position"); 176 mobilePosition.setReportSource("Mobile Position");
180 177
@@ -318,7 +315,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -318,7 +315,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
318 315
319 Device device = redisCatchStorage.getDevice(deviceId); 316 Device device = redisCatchStorage.getDevice(deviceId);
320 if (device == null || device.getOnline() == 0) { 317 if (device == null || device.getOnline() == 0) {
321 - logger.warn("[收到 目录订阅]:{}, 但是设备已经离线", (device != null ? device.getDeviceId():"" )); 318 + logger.warn("[收到目录订阅]:{}, 但是设备已经离线", (device != null ? device.getDeviceId():"" ));
322 return; 319 return;
323 } 320 }
324 Element rootElement = getRootElement(evt, device.getCharset()); 321 Element rootElement = getRootElement(evt, device.getCharset());
@@ -339,28 +336,28 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -339,28 +336,28 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
339 Element eventElement = itemDevice.element("Event"); 336 Element eventElement = itemDevice.element("Event");
340 String event; 337 String event;
341 if (eventElement == null) { 338 if (eventElement == null) {
342 - logger.warn("[收到 目录订阅]:{}, 但是Event为空, 设为默认值 ADD", (device != null ? device.getDeviceId():"" )); 339 + logger.warn("[收到目录订阅]:{}, 但是Event为空, 设为默认值 ADD", (device != null ? device.getDeviceId():"" ));
343 event = CatalogEvent.ADD; 340 event = CatalogEvent.ADD;
344 }else { 341 }else {
345 event = eventElement.getText().toUpperCase(); 342 event = eventElement.getText().toUpperCase();
346 } 343 }
347 DeviceChannel channel = XmlUtil.channelContentHander(itemDevice, device, event); 344 DeviceChannel channel = XmlUtil.channelContentHander(itemDevice, device, event);
348 channel.setDeviceId(device.getDeviceId()); 345 channel.setDeviceId(device.getDeviceId());
349 - logger.info("[收到 目录订阅]:{}/{}", device.getDeviceId(), channel.getChannelId()); 346 + logger.info("[收到目录订阅]:{}/{}", device.getDeviceId(), channel.getChannelId());
350 switch (event) { 347 switch (event) {
351 case CatalogEvent.ON: 348 case CatalogEvent.ON:
352 // 上线 349 // 上线
353 - logger.info("收到来自设备【{}】的通道【{}】上线通知", device.getDeviceId(), channel.getChannelId()); 350 + logger.info("[收到通道上线通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId());
354 storager.deviceChannelOnline(deviceId, channel.getChannelId()); 351 storager.deviceChannelOnline(deviceId, channel.getChannelId());
355 break; 352 break;
356 case CatalogEvent.OFF : 353 case CatalogEvent.OFF :
357 // 离线 354 // 离线
358 - logger.info("收到来自设备【{}】的通道【{}】离线通知", device.getDeviceId(), channel.getChannelId()); 355 + logger.info("[收到通道离线通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId());
359 storager.deviceChannelOffline(deviceId, channel.getChannelId()); 356 storager.deviceChannelOffline(deviceId, channel.getChannelId());
360 break; 357 break;
361 case CatalogEvent.VLOST: 358 case CatalogEvent.VLOST:
362 // 视频丢失 359 // 视频丢失
363 - logger.info("收到来自设备【{}】的通道【{}】视频丢失通知", device.getDeviceId(), channel.getChannelId()); 360 + logger.info("[收到通道视频丢失通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId());
364 storager.deviceChannelOffline(deviceId, channel.getChannelId()); 361 storager.deviceChannelOffline(deviceId, channel.getChannelId());
365 break; 362 break;
366 case CatalogEvent.DEFECT: 363 case CatalogEvent.DEFECT:
@@ -368,17 +365,17 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -368,17 +365,17 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
368 break; 365 break;
369 case CatalogEvent.ADD: 366 case CatalogEvent.ADD:
370 // 增加 367 // 增加
371 - logger.info("收到来自设备【{}】的增加通道【{}】通知", device.getDeviceId(), channel.getChannelId()); 368 + logger.info("[收到增加通道通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId());
372 deviceChannelService.updateChannel(deviceId, channel); 369 deviceChannelService.updateChannel(deviceId, channel);
373 break; 370 break;
374 case CatalogEvent.DEL: 371 case CatalogEvent.DEL:
375 // 删除 372 // 删除
376 - logger.info("收到来自设备【{}】的删除通道【{}】通知", device.getDeviceId(), channel.getChannelId()); 373 + logger.info("[收到删除通道通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId());
377 storager.delChannel(deviceId, channel.getChannelId()); 374 storager.delChannel(deviceId, channel.getChannelId());
378 break; 375 break;
379 case CatalogEvent.UPDATE: 376 case CatalogEvent.UPDATE:
380 // 更新 377 // 更新
381 - logger.info("收到来自设备【{}】的更新通道【{}】通知", device.getDeviceId(), channel.getChannelId()); 378 + logger.info("[收到更新通道通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId());
382 deviceChannelService.updateChannel(deviceId, channel); 379 deviceChannelService.updateChannel(deviceId, channel);
383 break; 380 break;
384 default: 381 default:
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
@@ -143,6 +143,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen @@ -143,6 +143,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
143 device.setGeoCoordSys("WGS84"); 143 device.setGeoCoordSys("WGS84");
144 device.setTreeType("CivilCode"); 144 device.setTreeType("CivilCode");
145 device.setDeviceId(deviceId); 145 device.setDeviceId(deviceId);
  146 + device.setOnline(0);
146 } 147 }
147 device.setIp(received); 148 device.setIp(received);
148 device.setPort(rPort); 149 device.setPort(rPort);
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java
@@ -69,7 +69,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme @@ -69,7 +69,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
69 69
70 @Override 70 @Override
71 public void handForDevice(RequestEvent evt, Device device, Element rootElement) { 71 public void handForDevice(RequestEvent evt, Device device, Element rootElement) {
72 - logger.info("收到来自设备[{}]的报警通知", device.getDeviceId()); 72 + logger.info("[收到报警通知]设备:{}", device.getDeviceId());
73 // 回复200 OK 73 // 回复200 OK
74 try { 74 try {
75 responseAck(evt, Response.OK); 75 responseAck(evt, Response.OK);
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceInfoQueryMessageHandler.java
@@ -44,7 +44,7 @@ public class DeviceInfoQueryMessageHandler extends SIPRequestProcessorParent imp @@ -44,7 +44,7 @@ public class DeviceInfoQueryMessageHandler extends SIPRequestProcessorParent imp
44 44
45 @Override 45 @Override
46 public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { 46 public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) {
47 - logger.info("接收到DeviceInfo查询消息"); 47 + logger.info("[DeviceInfo查询]消息");
48 FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME); 48 FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
49 try { 49 try {
50 // 回复200 OK 50 // 回复200 OK
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java
@@ -111,6 +111,7 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp @@ -111,6 +111,7 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp
111 int sumNum = Integer.parseInt(sumNumElement.getText()); 111 int sumNum = Integer.parseInt(sumNumElement.getText());
112 112
113 if (sumNum == 0) { 113 if (sumNum == 0) {
  114 + logger.info("[收到通道]设备:{}的: 0个", take.getDevice().getDeviceId());
114 // 数据已经完整接收 115 // 数据已经完整接收
115 storager.cleanChannelsForDevice(take.getDevice().getDeviceId()); 116 storager.cleanChannelsForDevice(take.getDevice().getDeviceId());
116 catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), null); 117 catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), null);
@@ -132,7 +133,7 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp @@ -132,7 +133,7 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp
132 } 133 }
133 int sn = Integer.parseInt(snElement.getText()); 134 int sn = Integer.parseInt(snElement.getText());
134 catalogDataCatch.put(take.getDevice().getDeviceId(), sn, sumNum, take.getDevice(), channelList); 135 catalogDataCatch.put(take.getDevice().getDeviceId(), sn, sumNum, take.getDevice(), channelList);
135 - logger.info("收到来自设备【{}】的通道: {}个,{}/{}", take.getDevice().getDeviceId(), channelList.size(), catalogDataCatch.get(take.getDevice().getDeviceId()) == null ? 0 :catalogDataCatch.get(take.getDevice().getDeviceId()).size(), sumNum); 136 + logger.info("[收到通道]设备: {} -> {}个,{}/{}", take.getDevice().getDeviceId(), channelList.size(), catalogDataCatch.get(take.getDevice().getDeviceId()) == null ? 0 :catalogDataCatch.get(take.getDevice().getDeviceId()).size(), sumNum);
136 if (catalogDataCatch.get(take.getDevice().getDeviceId()).size() == sumNum) { 137 if (catalogDataCatch.get(take.getDevice().getDeviceId()).size() == sumNum) {
137 // 数据已经完整接收 138 // 数据已经完整接收
138 boolean resetChannelsResult = storager.resetChannels(take.getDevice().getDeviceId(), catalogDataCatch.get(take.getDevice().getDeviceId())); 139 boolean resetChannelsResult = storager.resetChannels(take.getDevice().getDeviceId(), catalogDataCatch.get(take.getDevice().getDeviceId()));
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/RegisterResponseProcessor.java
@@ -26,7 +26,7 @@ import javax.sip.message.Response; @@ -26,7 +26,7 @@ import javax.sip.message.Response;
26 @Component 26 @Component
27 public class RegisterResponseProcessor extends SIPResponseProcessorAbstract { 27 public class RegisterResponseProcessor extends SIPResponseProcessorAbstract {
28 28
29 - private Logger logger = LoggerFactory.getLogger(RegisterResponseProcessor.class); 29 + private final Logger logger = LoggerFactory.getLogger(RegisterResponseProcessor.class);
30 private final String method = "REGISTER"; 30 private final String method = "REGISTER";
31 31
32 @Autowired 32 @Autowired
@@ -69,11 +69,11 @@ public class RegisterResponseProcessor extends SIPResponseProcessorAbstract { @@ -69,11 +69,11 @@ public class RegisterResponseProcessor extends SIPResponseProcessorAbstract {
69 69
70 ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(platformGBId); 70 ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(platformGBId);
71 if (parentPlatformCatch == null) { 71 if (parentPlatformCatch == null) {
72 - logger.warn(String.format("收到 %s 的注册/注销%S请求, 但是平台缓存信息未查询到!!!", platformGBId, response.getStatusCode())); 72 + logger.warn(String.format("[收到注册/注销%S请求]平台:%s,但是平台缓存信息未查询到!!!", response.getStatusCode(),platformGBId));
73 return; 73 return;
74 } 74 }
75 String action = parentPlatformCatch.getParentPlatform().getExpires().equals("0") ? "注销" : "注册"; 75 String action = parentPlatformCatch.getParentPlatform().getExpires().equals("0") ? "注销" : "注册";
76 - logger.info(String.format("收到 %s %s的%S响应", platformGBId, action, response.getStatusCode() )); 76 + logger.info(String.format("[%s %S响应]%s ", action, response.getStatusCode(), platformGBId ));
77 ParentPlatform parentPlatform = parentPlatformCatch.getParentPlatform(); 77 ParentPlatform parentPlatform = parentPlatformCatch.getParentPlatform();
78 if (parentPlatform == null) { 78 if (parentPlatform == null) {
79 logger.warn(String.format("收到 %s %s的%S请求, 但是平台信息未查询到!!!", platformGBId, action, response.getStatusCode())); 79 logger.warn(String.format("收到 %s %s的%S请求, 但是平台信息未查询到!!!", platformGBId, action, response.getStatusCode()));
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -102,12 +102,13 @@ public class ZLMHttpHookListener { @@ -102,12 +102,13 @@ public class ZLMHttpHookListener {
102 logger.debug("[ ZLM HOOK ] on_server_keepalive API调用,参数:" + json.toString()); 102 logger.debug("[ ZLM HOOK ] on_server_keepalive API调用,参数:" + json.toString());
103 } 103 }
104 String mediaServerId = json.getString("mediaServerId"); 104 String mediaServerId = json.getString("mediaServerId");
105 - List<ZLMHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(ZLMHttpHookSubscribe.HookType.on_server_keepalive); 105 + List<ZLMHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(HookType.on_server_keepalive);
106 if (subscribes != null && subscribes.size() > 0) { 106 if (subscribes != null && subscribes.size() > 0) {
107 for (ZLMHttpHookSubscribe.Event subscribe : subscribes) { 107 for (ZLMHttpHookSubscribe.Event subscribe : subscribes) {
108 subscribe.response(null, json); 108 subscribe.response(null, json);
109 } 109 }
110 } 110 }
  111 + mediaServerService.updateMediaServerKeepalive(mediaServerId, json.getJSONObject("data"));
111 112
112 JSONObject ret = new JSONObject(); 113 JSONObject ret = new JSONObject();
113 ret.put("code", 0); 114 ret.put("code", 0);
@@ -167,7 +168,7 @@ public class ZLMHttpHookListener { @@ -167,7 +168,7 @@ public class ZLMHttpHookListener {
167 logger.debug("[ ZLM HOOK ]on_play API调用,参数:" + JSON.toJSONString(param)); 168 logger.debug("[ ZLM HOOK ]on_play API调用,参数:" + JSON.toJSONString(param));
168 } 169 }
169 String mediaServerId = param.getMediaServerId(); 170 String mediaServerId = param.getMediaServerId();
170 - ZLMHttpHookSubscribe.Event subscribe = this.subscribe.getSubscribe(ZLMHttpHookSubscribe.HookType.on_play, json); 171 + ZLMHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_play, json);
171 if (subscribe != null ) { 172 if (subscribe != null ) {
172 MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId); 173 MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);
173 if (mediaInfo != null) { 174 if (mediaInfo != null) {
@@ -240,6 +241,8 @@ public class ZLMHttpHookListener { @@ -240,6 +241,8 @@ public class ZLMHttpHookListener {
240 if (mediaInfo != null) { 241 if (mediaInfo != null) {
241 assistRESTfulUtils.addStreamCallInfo(mediaInfo, param.getApp(), param.getStream(), callId, null); 242 assistRESTfulUtils.addStreamCallInfo(mediaInfo, param.getApp(), param.getStream(), callId, null);
242 } 243 }
  244 + }else {
  245 + zlmMediaListManager.sendStreamEvent(param.getApp(),param.getStream(), param.getMediaServerId());
243 } 246 }
244 247
245 ret.put("code", 0); 248 ret.put("code", 0);
@@ -250,7 +253,7 @@ public class ZLMHttpHookListener { @@ -250,7 +253,7 @@ public class ZLMHttpHookListener {
250 } 253 }
251 254
252 255
253 - ZLMHttpHookSubscribe.Event subscribe = this.subscribe.getSubscribe(ZLMHttpHookSubscribe.HookType.on_publish, json); 256 + ZLMHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_publish, json);
254 if (subscribe != null) { 257 if (subscribe != null) {
255 if (mediaInfo != null) { 258 if (mediaInfo != null) {
256 subscribe.response(mediaInfo, json); 259 subscribe.response(mediaInfo, json);
@@ -374,7 +377,7 @@ public class ZLMHttpHookListener { @@ -374,7 +377,7 @@ public class ZLMHttpHookListener {
374 logger.debug("[ ZLM HOOK ]on_shell_login API调用,参数:" + json.toString()); 377 logger.debug("[ ZLM HOOK ]on_shell_login API调用,参数:" + json.toString());
375 } 378 }
376 String mediaServerId = json.getString("mediaServerId"); 379 String mediaServerId = json.getString("mediaServerId");
377 - ZLMHttpHookSubscribe.Event subscribe = this.subscribe.getSubscribe(ZLMHttpHookSubscribe.HookType.on_shell_login, json); 380 + ZLMHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_shell_login, json);
378 if (subscribe != null ) { 381 if (subscribe != null ) {
379 MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId); 382 MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);
380 if (mediaInfo != null) { 383 if (mediaInfo != null) {
@@ -400,7 +403,7 @@ public class ZLMHttpHookListener { @@ -400,7 +403,7 @@ public class ZLMHttpHookListener {
400 logger.info("[ ZLM HOOK ]on_stream_changed API调用,参数:" + JSONObject.toJSONString(item)); 403 logger.info("[ ZLM HOOK ]on_stream_changed API调用,参数:" + JSONObject.toJSONString(item));
401 String mediaServerId = item.getMediaServerId(); 404 String mediaServerId = item.getMediaServerId();
402 JSONObject json = (JSONObject) JSON.toJSON(item); 405 JSONObject json = (JSONObject) JSON.toJSON(item);
403 - ZLMHttpHookSubscribe.Event subscribe = this.subscribe.getSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, json); 406 + ZLMHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_stream_changed, json);
404 if (subscribe != null ) { 407 if (subscribe != null ) {
405 MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId); 408 MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);
406 if (mediaInfo != null) { 409 if (mediaInfo != null) {
@@ -461,7 +464,6 @@ public class ZLMHttpHookListener { @@ -461,7 +464,6 @@ public class ZLMHttpHookListener {
461 StreamInfo streamInfoByAppAndStream = mediaService.getStreamInfoByAppAndStream(mediaServerItem, 464 StreamInfo streamInfoByAppAndStream = mediaService.getStreamInfoByAppAndStream(mediaServerItem,
462 app, stream, tracks, streamAuthorityInfo.getCallId()); 465 app, stream, tracks, streamAuthorityInfo.getCallId());
463 item.setStreamInfo(streamInfoByAppAndStream); 466 item.setStreamInfo(streamInfoByAppAndStream);
464 - item.setSeverId(userSetting.getServerId());  
465 redisCatchStorage.addStream(mediaServerItem, type, app, stream, item); 467 redisCatchStorage.addStream(mediaServerItem, type, app, stream, item);
466 if (item.getOriginType() == OriginType.RTSP_PUSH.ordinal() 468 if (item.getOriginType() == OriginType.RTSP_PUSH.ordinal()
467 || item.getOriginType() == OriginType.RTMP_PUSH.ordinal() 469 || item.getOriginType() == OriginType.RTMP_PUSH.ordinal()
@@ -469,20 +471,6 @@ public class ZLMHttpHookListener { @@ -469,20 +471,6 @@ public class ZLMHttpHookListener {
469 item.setSeverId(userSetting.getServerId()); 471 item.setSeverId(userSetting.getServerId());
470 zlmMediaListManager.addPush(item); 472 zlmMediaListManager.addPush(item);
471 } 473 }
472 -  
473 -// List<GbStream> gbStreams = new ArrayList<>();  
474 -// if (streamPushItem == null || streamPushItem.getGbId() == null) {  
475 -// GbStream gbStream = storager.getGbStream(app, streamId);  
476 -// gbStreams.add(gbStream);  
477 -// }else {  
478 -// if (streamPushItem.getGbId() != null) {  
479 -// gbStreams.add(streamPushItem);  
480 -// }  
481 -// }  
482 -// if (gbStreams.size() > 0) {  
483 -// eventPublisher.catalogEventPublishForStream(null, gbStreams, CatalogEvent.ON);  
484 -// }  
485 -  
486 }else { 474 }else {
487 // 兼容流注销时类型从redis记录获取 475 // 兼容流注销时类型从redis记录获取
488 MediaItem mediaItem = redisCatchStorage.getStreamInfo(app, stream, mediaServerId); 476 MediaItem mediaItem = redisCatchStorage.getStreamInfo(app, stream, mediaServerId);
@@ -626,16 +614,21 @@ public class ZLMHttpHookListener { @@ -626,16 +614,21 @@ public class ZLMHttpHookListener {
626 } 614 }
627 String remoteAddr = request.getRemoteAddr(); 615 String remoteAddr = request.getRemoteAddr();
628 jsonObject.put("ip", remoteAddr); 616 jsonObject.put("ip", remoteAddr);
629 - List<ZLMHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(ZLMHttpHookSubscribe.HookType.on_server_started); 617 + List<ZLMHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(HookType.on_server_started);
630 if (subscribes != null && subscribes.size() > 0) { 618 if (subscribes != null && subscribes.size() > 0) {
631 for (ZLMHttpHookSubscribe.Event subscribe : subscribes) { 619 for (ZLMHttpHookSubscribe.Event subscribe : subscribes) {
632 subscribe.response(null, jsonObject); 620 subscribe.response(null, jsonObject);
633 } 621 }
634 } 622 }
  623 +
  624 + ZLMServerConfig zlmServerConfig = JSONObject.toJavaObject(jsonObject, ZLMServerConfig.class);
  625 + if (zlmServerConfig !=null ) {
  626 + mediaServerService.zlmServerOnline(zlmServerConfig);
  627 + }
635 JSONObject ret = new JSONObject(); 628 JSONObject ret = new JSONObject();
636 ret.put("code", 0); 629 ret.put("code", 0);
637 ret.put("msg", "success"); 630 ret.put("msg", "success");
638 - return new ResponseEntity<String>(ret.toString(),HttpStatus.OK); 631 + return new ResponseEntity<>(ret.toString(),HttpStatus.OK);
639 } 632 }
640 633
641 private Map<String, String> urlParamToMap(String params) { 634 private Map<String, String> urlParamToMap(String params) {
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java
1 package com.genersoft.iot.vmp.media.zlm; 1 package com.genersoft.iot.vmp.media.zlm;
2 2
3 import com.alibaba.fastjson.JSONObject; 3 import com.alibaba.fastjson.JSONObject;
  4 +import com.genersoft.iot.vmp.media.zlm.dto.HookType;
  5 +import com.genersoft.iot.vmp.media.zlm.dto.IHookSubscribe;
4 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 6 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
5 import org.springframework.stereotype.Component; 7 import org.springframework.stereotype.Component;
6 import org.springframework.util.CollectionUtils; 8 import org.springframework.util.CollectionUtils;
7 9
  10 +import java.time.Instant;
8 import java.util.*; 11 import java.util.*;
9 import java.util.concurrent.ConcurrentHashMap; 12 import java.util.concurrent.ConcurrentHashMap;
  13 +import java.util.concurrent.TimeUnit;
10 14
11 /** 15 /**
12 * @description:针对 ZLMediaServer的hook事件订阅 16 * @description:针对 ZLMediaServer的hook事件订阅
@@ -16,51 +20,39 @@ import java.util.concurrent.ConcurrentHashMap; @@ -16,51 +20,39 @@ import java.util.concurrent.ConcurrentHashMap;
16 @Component 20 @Component
17 public class ZLMHttpHookSubscribe { 21 public class ZLMHttpHookSubscribe {
18 22
19 - public enum HookType{  
20 - on_flow_report,  
21 - on_http_access,  
22 - on_play,  
23 - on_publish,  
24 - on_record_mp4,  
25 - on_rtsp_auth,  
26 - on_rtsp_realm,  
27 - on_shell_login,  
28 - on_stream_changed,  
29 - on_stream_none_reader,  
30 - on_stream_not_found,  
31 - on_server_started,  
32 - on_server_keepalive  
33 - }  
34 -  
35 @FunctionalInterface 23 @FunctionalInterface
36 public interface Event{ 24 public interface Event{
37 void response(MediaServerItem mediaServerItem, JSONObject response); 25 void response(MediaServerItem mediaServerItem, JSONObject response);
38 } 26 }
39 27
40 - private Map<HookType, Map<JSONObject, ZLMHttpHookSubscribe.Event>> allSubscribes = new ConcurrentHashMap<>(); 28 + private Map<HookType, Map<IHookSubscribe, ZLMHttpHookSubscribe.Event>> allSubscribes = new ConcurrentHashMap<>();
41 29
42 - public void addSubscribe(HookType type, JSONObject hookResponse, ZLMHttpHookSubscribe.Event event) {  
43 - allSubscribes.computeIfAbsent(type, k -> new ConcurrentHashMap<>()).put(hookResponse, event); 30 + public void addSubscribe(IHookSubscribe hookSubscribe, ZLMHttpHookSubscribe.Event event) {
  31 + if (hookSubscribe.getExpires() == null) {
  32 + // 默认5分钟过期
  33 + Instant expiresInstant = Instant.now().plusSeconds(TimeUnit.MINUTES.toSeconds(5));
  34 + hookSubscribe.setExpires(expiresInstant);
  35 + }
  36 + allSubscribes.computeIfAbsent(hookSubscribe.getHookType(), k -> new ConcurrentHashMap<>()).put(hookSubscribe, event);
44 } 37 }
45 38
46 - public ZLMHttpHookSubscribe.Event getSubscribe(HookType type, JSONObject hookResponse) { 39 + public ZLMHttpHookSubscribe.Event sendNotify(HookType type, JSONObject hookResponse) {
47 ZLMHttpHookSubscribe.Event event= null; 40 ZLMHttpHookSubscribe.Event event= null;
48 - Map<JSONObject, Event> eventMap = allSubscribes.get(type); 41 + Map<IHookSubscribe, Event> eventMap = allSubscribes.get(type);
49 if (eventMap == null) { 42 if (eventMap == null) {
50 return null; 43 return null;
51 } 44 }
52 - for (JSONObject key : eventMap.keySet()) { 45 + for (IHookSubscribe key : eventMap.keySet()) {
53 Boolean result = null; 46 Boolean result = null;
54 - for (String s : key.keySet()) { 47 + for (String s : key.getContent().keySet()) {
55 if (result == null) { 48 if (result == null) {
56 - result = key.getString(s).equals(hookResponse.getString(s)); 49 + result = key.getContent().getString(s).equals(hookResponse.getString(s));
57 }else { 50 }else {
58 - if (key.getString(s) == null) { 51 + if (key.getContent().getString(s) == null) {
59 continue; 52 continue;
60 } 53 }
61 - result = result && key.getString(s).equals(hookResponse.getString(s)); 54 + result = result && key.getContent().getString(s).equals(hookResponse.getString(s));
62 } 55 }
63 -  
64 } 56 }
65 if (null != result && result) { 57 if (null != result && result) {
66 event = eventMap.get(key); 58 event = eventMap.get(key);
@@ -69,26 +61,30 @@ public class ZLMHttpHookSubscribe { @@ -69,26 +61,30 @@ public class ZLMHttpHookSubscribe {
69 return event; 61 return event;
70 } 62 }
71 63
72 - public void removeSubscribe(HookType type, JSONObject hookResponse) {  
73 - Map<JSONObject, Event> eventMap = allSubscribes.get(type); 64 + public void removeSubscribe(IHookSubscribe hookSubscribe) {
  65 + Map<IHookSubscribe, Event> eventMap = allSubscribes.get(hookSubscribe.getHookType());
74 if (eventMap == null) { 66 if (eventMap == null) {
75 return; 67 return;
76 } 68 }
77 69
78 - Set<Map.Entry<JSONObject, Event>> entries = eventMap.entrySet(); 70 + Set<Map.Entry<IHookSubscribe, Event>> entries = eventMap.entrySet();
79 if (entries.size() > 0) { 71 if (entries.size() > 0) {
80 - List<Map.Entry<JSONObject, ZLMHttpHookSubscribe.Event>> entriesToRemove = new ArrayList<>();  
81 - for (Map.Entry<JSONObject, ZLMHttpHookSubscribe.Event> entry : entries) {  
82 - JSONObject key = entry.getKey(); 72 + List<Map.Entry<IHookSubscribe, ZLMHttpHookSubscribe.Event>> entriesToRemove = new ArrayList<>();
  73 + for (Map.Entry<IHookSubscribe, ZLMHttpHookSubscribe.Event> entry : entries) {
  74 + JSONObject content = entry.getKey().getContent();
  75 + if (content == null || content.size() == 0) {
  76 + entriesToRemove.add(entry);
  77 + continue;
  78 + }
83 Boolean result = null; 79 Boolean result = null;
84 - for (String s : key.keySet()) { 80 + for (String s : content.keySet()) {
85 if (result == null) { 81 if (result == null) {
86 - result = key.getString(s).equals(hookResponse.getString(s)); 82 + result = content.getString(s).equals(hookSubscribe.getContent().getString(s));
87 }else { 83 }else {
88 - if (key.getString(s) == null) { 84 + if (content.getString(s) == null) {
89 continue; 85 continue;
90 } 86 }
91 - result = result && key.getString(s).equals(hookResponse.getString(s)); 87 + result = result && content.getString(s).equals(hookSubscribe.getContent().getString(s));
92 } 88 }
93 } 89 }
94 if (null != result && result){ 90 if (null != result && result){
@@ -97,7 +93,7 @@ public class ZLMHttpHookSubscribe { @@ -97,7 +93,7 @@ public class ZLMHttpHookSubscribe {
97 } 93 }
98 94
99 if (!CollectionUtils.isEmpty(entriesToRemove)) { 95 if (!CollectionUtils.isEmpty(entriesToRemove)) {
100 - for (Map.Entry<JSONObject, ZLMHttpHookSubscribe.Event> entry : entriesToRemove) { 96 + for (Map.Entry<IHookSubscribe, ZLMHttpHookSubscribe.Event> entry : entriesToRemove) {
101 entries.remove(entry); 97 entries.remove(entry);
102 } 98 }
103 } 99 }
@@ -111,17 +107,25 @@ public class ZLMHttpHookSubscribe { @@ -111,17 +107,25 @@ public class ZLMHttpHookSubscribe {
111 * @return 107 * @return
112 */ 108 */
113 public List<ZLMHttpHookSubscribe.Event> getSubscribes(HookType type) { 109 public List<ZLMHttpHookSubscribe.Event> getSubscribes(HookType type) {
114 - // ZLMHttpHookSubscribe.Event event= null;  
115 - Map<JSONObject, Event> eventMap = allSubscribes.get(type); 110 + Map<IHookSubscribe, Event> eventMap = allSubscribes.get(type);
116 if (eventMap == null) { 111 if (eventMap == null) {
117 return null; 112 return null;
118 } 113 }
119 List<ZLMHttpHookSubscribe.Event> result = new ArrayList<>(); 114 List<ZLMHttpHookSubscribe.Event> result = new ArrayList<>();
120 - for (JSONObject key : eventMap.keySet()) { 115 + for (IHookSubscribe key : eventMap.keySet()) {
121 result.add(eventMap.get(key)); 116 result.add(eventMap.get(key));
122 } 117 }
123 return result; 118 return result;
124 } 119 }
125 120
  121 + public List<IHookSubscribe> getAll(){
  122 + ArrayList<IHookSubscribe> result = new ArrayList<>();
  123 + Collection<Map<IHookSubscribe, Event>> values = allSubscribes.values();
  124 + for (Map<IHookSubscribe, Event> value : values) {
  125 + result.addAll(value.keySet());
  126 + }
  127 + return result;
  128 + }
  129 +
126 130
127 } 131 }
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
4 import com.genersoft.iot.vmp.conf.UserSetting; 4 import com.genersoft.iot.vmp.conf.UserSetting;
5 import com.genersoft.iot.vmp.gb28181.bean.GbStream; 5 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
6 import com.genersoft.iot.vmp.media.zlm.dto.*; 6 import com.genersoft.iot.vmp.media.zlm.dto.*;
  7 +import com.genersoft.iot.vmp.service.IMediaServerService;
7 import com.genersoft.iot.vmp.service.IStreamProxyService; 8 import com.genersoft.iot.vmp.service.IStreamProxyService;
8 import com.genersoft.iot.vmp.service.IStreamPushService; 9 import com.genersoft.iot.vmp.service.IStreamPushService;
9 import com.genersoft.iot.vmp.service.bean.ThirdPartyGB; 10 import com.genersoft.iot.vmp.service.bean.ThirdPartyGB;
@@ -63,99 +64,48 @@ public class ZLMMediaListManager { @@ -63,99 +64,48 @@ public class ZLMMediaListManager {
63 @Autowired 64 @Autowired
64 private UserSetting userSetting; 65 private UserSetting userSetting;
65 66
66 - private Map<String, ChannelOnlineEvent> channelOnlineEvents = new ConcurrentHashMap<>();  
67 -  
68 -  
69 - public void updateMediaList(MediaServerItem mediaServerItem) {  
70 - storager.clearMediaList();  
71 -  
72 - // 使用异步的当时更新媒体流列表  
73 - zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{  
74 - if (mediaList == null) {  
75 - return;  
76 - }  
77 - String dataStr = mediaList.getString("data");  
78 -  
79 - Integer code = mediaList.getInteger("code");  
80 - Map<String, StreamPushItem> result = new HashMap<>();  
81 - List<StreamPushItem> streamPushItems = null;  
82 - // 获取所有的国标关联  
83 -// List<GbStream> gbStreams = gbStreamMapper.selectAllByMediaServerId(mediaServerItem.getId());  
84 - if (code == 0 ) {  
85 - if (dataStr != null) {  
86 - streamPushItems = streamPushService.handleJSON(dataStr, mediaServerItem);  
87 - }  
88 - }else {  
89 - logger.warn("更新视频流失败,错误code: " + code);  
90 - }  
91 -  
92 - if (streamPushItems != null) {  
93 - storager.updateMediaList(streamPushItems);  
94 - for (StreamPushItem streamPushItem : streamPushItems) {  
95 - JSONObject jsonObject = new JSONObject();  
96 - jsonObject.put("app", streamPushItem.getApp());  
97 - jsonObject.put("stream", streamPushItem.getStream());  
98 - jsonObject.put("mediaServerId", mediaServerItem.getId());  
99 - subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_play,jsonObject,  
100 - (MediaServerItem mediaServerItemInuse, JSONObject response)->{  
101 - updateMedia(mediaServerItem, response.getString("app"), response.getString("stream"));  
102 - }  
103 - );  
104 - }  
105 - }  
106 - })); 67 + @Autowired
  68 + private ZLMRTPServerFactory zlmrtpServerFactory;
107 69
108 - } 70 + @Autowired
  71 + private IMediaServerService mediaServerService;
109 72
110 - public void addMedia(MediaServerItem mediaServerItem, String app, String streamId) {  
111 - //使用异步更新推流  
112 - updateMedia(mediaServerItem, app, streamId);  
113 - } 73 + private Map<String, ChannelOnlineEvent> channelOnPublishEvents = new ConcurrentHashMap<>();
114 74
115 public StreamPushItem addPush(MediaItem mediaItem) { 75 public StreamPushItem addPush(MediaItem mediaItem) {
116 // 查找此直播流是否存在redis预设gbId 76 // 查找此直播流是否存在redis预设gbId
117 StreamPushItem transform = streamPushService.transform(mediaItem); 77 StreamPushItem transform = streamPushService.transform(mediaItem);
118 StreamPushItem pushInDb = streamPushService.getPush(mediaItem.getApp(), mediaItem.getStream()); 78 StreamPushItem pushInDb = streamPushService.getPush(mediaItem.getApp(), mediaItem.getStream());
119 - transform.setPushIng(true); 79 + transform.setPushIng(mediaItem.isRegist());
120 transform.setUpdateTime(DateUtil.getNow()); 80 transform.setUpdateTime(DateUtil.getNow());
121 transform.setPushTime(DateUtil.getNow()); 81 transform.setPushTime(DateUtil.getNow());
  82 + transform.setSelf(userSetting.getServerId().equals(mediaItem.getSeverId()));
122 if (pushInDb == null) { 83 if (pushInDb == null) {
123 transform.setCreateTime(DateUtil.getNow()); 84 transform.setCreateTime(DateUtil.getNow());
124 streamPushMapper.add(transform); 85 streamPushMapper.add(transform);
125 }else { 86 }else {
126 streamPushMapper.update(transform); 87 streamPushMapper.update(transform);
127 } 88 }
  89 + if (transform != null) {
  90 + if (getChannelOnlineEventLister(transform.getApp(), transform.getStream()) != null) {
  91 + getChannelOnlineEventLister(transform.getApp(), transform.getStream()).run(transform.getApp(), transform.getStream(), transform.getServerId());
  92 + removedChannelOnlineEventLister(transform.getApp(), transform.getStream());
  93 + }
  94 + }
128 return transform; 95 return transform;
129 } 96 }
130 97
131 -  
132 - public void updateMedia(MediaServerItem mediaServerItem, String app, String streamId) {  
133 - //使用异步更新推流  
134 - zlmresTfulUtils.getMediaList(mediaServerItem, app, streamId, "rtmp", json->{  
135 -  
136 - if (json == null) {  
137 - return;  
138 - }  
139 - String dataStr = json.getString("data");  
140 -  
141 - Integer code = json.getInteger("code");  
142 - Map<String, StreamPushItem> result = new HashMap<>();  
143 - List<StreamPushItem> streamPushItems = null;  
144 - if (code == 0 ) {  
145 - if (dataStr != null) {  
146 - streamPushItems = streamPushService.handleJSON(dataStr, mediaServerItem);  
147 - }  
148 - }else {  
149 - logger.warn("更新视频流失败,错误code: " + code); 98 + public void sendStreamEvent(String app, String stream, String mediaServerId) {
  99 + MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
  100 + // 查看推流状态
  101 + if (zlmrtpServerFactory.isStreamReady(mediaServerItem, app, stream)) {
  102 + if (getChannelOnlineEventLister(app, stream) != null) {
  103 + getChannelOnlineEventLister(app, stream).run(app, stream, mediaServerId);
  104 + removedChannelOnlineEventLister(app, stream);
150 } 105 }
151 -  
152 - if (streamPushItems != null && streamPushItems.size() == 1) {  
153 - storager.updateMedia(streamPushItems.get(0));  
154 - }  
155 - }); 106 + }
156 } 107 }
157 108
158 -  
159 public int removeMedia(String app, String streamId) { 109 public int removeMedia(String app, String streamId) {
160 // 查找是否关联了国标, 关联了不删除, 置为离线 110 // 查找是否关联了国标, 关联了不删除, 置为离线
161 GbStream gbStream = gbStreamMapper.selectOne(app, streamId); 111 GbStream gbStream = gbStreamMapper.selectOne(app, streamId);
@@ -163,48 +113,21 @@ public class ZLMMediaListManager { @@ -163,48 +113,21 @@ public class ZLMMediaListManager {
163 if (gbStream == null) { 113 if (gbStream == null) {
164 result = storager.removeMedia(app, streamId); 114 result = storager.removeMedia(app, streamId);
165 }else { 115 }else {
166 - // TODO 暂不设置为离线  
167 result =storager.mediaOffline(app, streamId); 116 result =storager.mediaOffline(app, streamId);
168 } 117 }
169 return result; 118 return result;
170 } 119 }
171 120
172 - public void addChannelOnlineEventLister(String key, ChannelOnlineEvent callback) {  
173 - this.channelOnlineEvents.put(key,callback); 121 + public void addChannelOnlineEventLister(String app, String stream, ChannelOnlineEvent callback) {
  122 + this.channelOnPublishEvents.put(app + "_" + stream, callback);
174 } 123 }
175 124
176 - public void removedChannelOnlineEventLister(String key) {  
177 - this.channelOnlineEvents.remove(key); 125 + public void removedChannelOnlineEventLister(String app, String stream) {
  126 + this.channelOnPublishEvents.remove(app + "_" + stream);
178 } 127 }
179 128
  129 + public ChannelOnlineEvent getChannelOnlineEventLister(String app, String stream) {
  130 + return this.channelOnPublishEvents.get(app + "_" + stream);
  131 + }
180 132
181 -  
182 -// public void clearAllSessions() {  
183 -// logger.info("清空所有国标相关的session");  
184 -// JSONObject allSessionJSON = zlmresTfulUtils.getAllSession();  
185 -// ZLMServerConfig mediaInfo = redisCatchStorage.getMediaInfo();  
186 -// HashSet<String> allLocalPorts = new HashSet();  
187 -// if (allSessionJSON.getInteger("code") == 0) {  
188 -// JSONArray data = allSessionJSON.getJSONArray("data");  
189 -// if (data.size() > 0) {  
190 -// for (int i = 0; i < data.size(); i++) {  
191 -// JSONObject sessionJOSN = data.getJSONObject(i);  
192 -// Integer local_port = sessionJOSN.getInteger("local_port");  
193 -// if (!local_port.equals(Integer.valueOf(mediaInfo.getHttpPort())) &&  
194 -// !local_port.equals(Integer.valueOf(mediaInfo.getHttpSSLport())) &&  
195 -// !local_port.equals(Integer.valueOf(mediaInfo.getRtmpPort())) &&  
196 -// !local_port.equals(Integer.valueOf(mediaInfo.getRtspPort())) &&  
197 -// !local_port.equals(Integer.valueOf(mediaInfo.getRtspSSlport())) &&  
198 -// !local_port.equals(Integer.valueOf(mediaInfo.getHookOnFlowReport()))){  
199 -// allLocalPorts.add(sessionJOSN.getInteger("local_port") + "");  
200 -// }  
201 -// }  
202 -// }  
203 -// }  
204 -// if (allLocalPorts.size() > 0) {  
205 -// List<String> result = new ArrayList<>(allLocalPorts);  
206 -// String localPortSStr = String.join(",", result);  
207 -// zlmresTfulUtils.kickSessions(localPortSStr);  
208 -// }  
209 -// }  
210 } 133 }
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
@@ -87,7 +87,7 @@ public class ZLMRTPServerFactory { @@ -87,7 +87,7 @@ public class ZLMRTPServerFactory {
87 return result; 87 return result;
88 } 88 }
89 89
90 - public int createRTPServer(MediaServerItem mediaServerItem, String streamId, int ssrc) { 90 + public int createRTPServer(MediaServerItem mediaServerItem, String streamId, int ssrc, Integer port) {
91 int result = -1; 91 int result = -1;
92 // 查询此rtp server 是否已经存在 92 // 查询此rtp server 是否已经存在
93 JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaServerItem, streamId); 93 JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaServerItem, streamId);
@@ -105,7 +105,11 @@ public class ZLMRTPServerFactory { @@ -105,7 +105,11 @@ public class ZLMRTPServerFactory {
105 param.put("enable_tcp", 1); 105 param.put("enable_tcp", 1);
106 param.put("stream_id", streamId); 106 param.put("stream_id", streamId);
107 // 推流端口设置0则使用随机端口 107 // 推流端口设置0则使用随机端口
108 - param.put("port", 0); 108 + if (port == null) {
  109 + param.put("port", 0);
  110 + }else {
  111 + param.put("port", port);
  112 + }
109 param.put("ssrc", ssrc); 113 param.put("ssrc", ssrc);
110 JSONObject openRtpServerResultJson = zlmresTfulUtils.openRtpServer(mediaServerItem, param); 114 JSONObject openRtpServerResultJson = zlmresTfulUtils.openRtpServer(mediaServerItem, param);
111 115
@@ -273,8 +277,10 @@ public class ZLMRTPServerFactory { @@ -273,8 +277,10 @@ public class ZLMRTPServerFactory {
273 * 查询待转推的流是否就绪 277 * 查询待转推的流是否就绪
274 */ 278 */
275 public Boolean isStreamReady(MediaServerItem mediaServerItem, String app, String streamId) { 279 public Boolean isStreamReady(MediaServerItem mediaServerItem, String app, String streamId) {
276 - JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServerItem, app, "rtmp", streamId);  
277 - return (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")); 280 + JSONObject mediaInfo = zlmresTfulUtils.getMediaList(mediaServerItem, app, streamId);
  281 + return (mediaInfo.getInteger("code") == 0
  282 + && mediaInfo.getJSONArray("data") != null
  283 + && mediaInfo.getJSONArray("data").size() > 0);
278 } 284 }
279 285
280 /** 286 /**
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
@@ -6,22 +6,22 @@ import com.alibaba.fastjson.JSONObject; @@ -6,22 +6,22 @@ import com.alibaba.fastjson.JSONObject;
6 import com.genersoft.iot.vmp.conf.DynamicTask; 6 import com.genersoft.iot.vmp.conf.DynamicTask;
7 import com.genersoft.iot.vmp.conf.MediaConfig; 7 import com.genersoft.iot.vmp.conf.MediaConfig;
8 import com.genersoft.iot.vmp.gb28181.event.EventPublisher; 8 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
  9 +import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory;
  10 +import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForServerStarted;
  11 +import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange;
9 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 12 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
10 import com.genersoft.iot.vmp.service.IMediaServerService; 13 import com.genersoft.iot.vmp.service.IMediaServerService;
11 -import com.genersoft.iot.vmp.service.IStreamProxyService;  
12 -import com.genersoft.iot.vmp.storager.IRedisCatchStorage;  
13 import org.slf4j.Logger; 14 import org.slf4j.Logger;
14 import org.slf4j.LoggerFactory; 15 import org.slf4j.LoggerFactory;
15 import org.springframework.beans.factory.annotation.Autowired; 16 import org.springframework.beans.factory.annotation.Autowired;
16 -import org.springframework.beans.factory.annotation.Qualifier;  
17 import org.springframework.boot.CommandLineRunner; 17 import org.springframework.boot.CommandLineRunner;
18 import org.springframework.core.annotation.Order; 18 import org.springframework.core.annotation.Order;
19 import org.springframework.scheduling.annotation.Async; 19 import org.springframework.scheduling.annotation.Async;
20 -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;  
21 import org.springframework.stereotype.Component; 20 import org.springframework.stereotype.Component;
22 -import org.springframework.util.StringUtils;  
23 21
  22 +import java.time.Instant;
24 import java.util.*; 23 import java.util.*;
  24 +import java.util.concurrent.TimeUnit;
25 25
26 @Component 26 @Component
27 @Order(value=1) 27 @Order(value=1)
@@ -38,18 +38,12 @@ public class ZLMRunner implements CommandLineRunner { @@ -38,18 +38,12 @@ public class ZLMRunner implements CommandLineRunner {
38 private ZLMHttpHookSubscribe hookSubscribe; 38 private ZLMHttpHookSubscribe hookSubscribe;
39 39
40 @Autowired 40 @Autowired
41 - private IStreamProxyService streamProxyService;  
42 -  
43 - @Autowired  
44 private EventPublisher publisher; 41 private EventPublisher publisher;
45 42
46 @Autowired 43 @Autowired
47 private IMediaServerService mediaServerService; 44 private IMediaServerService mediaServerService;
48 45
49 @Autowired 46 @Autowired
50 - private IRedisCatchStorage redisCatchStorage;  
51 -  
52 - @Autowired  
53 private MediaConfig mediaConfig; 47 private MediaConfig mediaConfig;
54 48
55 @Autowired 49 @Autowired
@@ -67,26 +61,24 @@ public class ZLMRunner implements CommandLineRunner { @@ -67,26 +61,24 @@ public class ZLMRunner implements CommandLineRunner {
67 mediaServerService.updateToDatabase(mediaSerItem); 61 mediaServerService.updateToDatabase(mediaSerItem);
68 } 62 }
69 mediaServerService.syncCatchFromDatabase(); 63 mediaServerService.syncCatchFromDatabase();
  64 + HookSubscribeForServerStarted hookSubscribeForServerStarted = HookSubscribeFactory.on_server_started();
  65 +// Instant expiresInstant = Instant.now().plusSeconds(TimeUnit.SECONDS.toSeconds(60));
  66 +// hookSubscribeForStreamChange.setExpires(expiresInstant);
70 // 订阅 zlm启动事件, 新的zlm也会从这里进入系统 67 // 订阅 zlm启动事件, 新的zlm也会从这里进入系统
71 - hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_started,new JSONObject(), 68 + hookSubscribe.addSubscribe(hookSubscribeForServerStarted,
72 (MediaServerItem mediaServerItem, JSONObject response)->{ 69 (MediaServerItem mediaServerItem, JSONObject response)->{
73 ZLMServerConfig zlmServerConfig = JSONObject.toJavaObject(response, ZLMServerConfig.class); 70 ZLMServerConfig zlmServerConfig = JSONObject.toJavaObject(response, ZLMServerConfig.class);
74 if (zlmServerConfig !=null ) { 71 if (zlmServerConfig !=null ) {
75 if (startGetMedia != null) { 72 if (startGetMedia != null) {
76 startGetMedia.remove(zlmServerConfig.getGeneralMediaServerId()); 73 startGetMedia.remove(zlmServerConfig.getGeneralMediaServerId());
  74 + if (startGetMedia.size() == 0) {
  75 + hookSubscribe.removeSubscribe(HookSubscribeFactory.on_server_started());
  76 + }
77 } 77 }
78 - mediaServerService.zlmServerOnline(zlmServerConfig);  
79 } 78 }
80 }); 79 });
81 80
82 - // 订阅 zlm保活事件, 当zlm离线时做业务的处理  
83 - hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_keepalive,new JSONObject(),  
84 - (MediaServerItem mediaServerItem, JSONObject response)->{  
85 - String mediaServerId = response.getString("mediaServerId");  
86 - if (mediaServerId !=null ) {  
87 - mediaServerService.updateMediaServerKeepalive(mediaServerId, response.getJSONObject("data"));  
88 - }  
89 - }); 81 +
90 82
91 // 获取zlm信息 83 // 获取zlm信息
92 logger.info("[zlm] 等待默认zlm中..."); 84 logger.info("[zlm] 等待默认zlm中...");
@@ -125,6 +117,9 @@ public class ZLMRunner implements CommandLineRunner { @@ -125,6 +117,9 @@ public class ZLMRunner implements CommandLineRunner {
125 zlmServerConfigFirst.setIp(mediaServerItem.getIp()); 117 zlmServerConfigFirst.setIp(mediaServerItem.getIp());
126 zlmServerConfigFirst.setHttpPort(mediaServerItem.getHttpPort()); 118 zlmServerConfigFirst.setHttpPort(mediaServerItem.getHttpPort());
127 startGetMedia.remove(mediaServerItem.getId()); 119 startGetMedia.remove(mediaServerItem.getId());
  120 + if (startGetMedia.size() == 0) {
  121 + hookSubscribe.removeSubscribe(HookSubscribeFactory.on_server_started());
  122 + }
128 mediaServerService.zlmServerOnline(zlmServerConfigFirst); 123 mediaServerService.zlmServerOnline(zlmServerConfigFirst);
129 }else { 124 }else {
130 logger.info("[ {} ]-[ {}:{} ]主动连接失败, 清理相关资源, 开始尝试重试连接", 125 logger.info("[ {} ]-[ {}:{} ]主动连接失败, 清理相关资源, 开始尝试重试连接",
@@ -139,6 +134,9 @@ public class ZLMRunner implements CommandLineRunner { @@ -139,6 +134,9 @@ public class ZLMRunner implements CommandLineRunner {
139 zlmServerConfig.setIp(mediaServerItem.getIp()); 134 zlmServerConfig.setIp(mediaServerItem.getIp());
140 zlmServerConfig.setHttpPort(mediaServerItem.getHttpPort()); 135 zlmServerConfig.setHttpPort(mediaServerItem.getHttpPort());
141 startGetMedia.remove(mediaServerItem.getId()); 136 startGetMedia.remove(mediaServerItem.getId());
  137 + if (startGetMedia.size() == 0) {
  138 + hookSubscribe.removeSubscribe(HookSubscribeFactory.on_server_started());
  139 + }
142 mediaServerService.zlmServerOnline(zlmServerConfig); 140 mediaServerService.zlmServerOnline(zlmServerConfig);
143 } 141 }
144 }, 2000); 142 }, 2000);
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/HookSubscribeFactory.java 0 → 100644
  1 +package com.genersoft.iot.vmp.media.zlm.dto;
  2 +
  3 +
  4 +import com.alibaba.fastjson.JSONObject;
  5 +
  6 +/**
  7 + * hook 订阅工厂
  8 + * @author lin
  9 + */
  10 +public class HookSubscribeFactory {
  11 +
  12 + public static HookSubscribeForStreamChange on_stream_changed(String app, String stream, boolean regist, String scheam, String mediaServerId) {
  13 + HookSubscribeForStreamChange hookSubscribe = new HookSubscribeForStreamChange();
  14 + JSONObject subscribeKey = new com.alibaba.fastjson.JSONObject();
  15 + subscribeKey.put("app", app);
  16 + subscribeKey.put("stream", stream);
  17 + subscribeKey.put("regist", regist);
  18 + if (scheam != null) {
  19 + subscribeKey.put("schema", scheam);
  20 + }
  21 + subscribeKey.put("mediaServerId", mediaServerId);
  22 + hookSubscribe.setContent(subscribeKey);
  23 +
  24 + return hookSubscribe;
  25 + }
  26 +
  27 + public static HookSubscribeForServerStarted on_server_started() {
  28 + HookSubscribeForServerStarted hookSubscribe = new HookSubscribeForServerStarted();
  29 + hookSubscribe.setContent(new JSONObject());
  30 +
  31 + return hookSubscribe;
  32 + }
  33 +}
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/HookSubscribeForServerStarted.java 0 → 100644
  1 +package com.genersoft.iot.vmp.media.zlm.dto;
  2 +
  3 +import com.alibaba.fastjson.JSONObject;
  4 +import com.alibaba.fastjson.annotation.JSONField;
  5 +
  6 +import java.time.Instant;
  7 +
  8 +/**
  9 + * hook订阅-流变化
  10 + * @author lin
  11 + */
  12 +public class HookSubscribeForServerStarted implements IHookSubscribe{
  13 +
  14 + private HookType hookType = HookType.on_server_started;
  15 +
  16 + private JSONObject content;
  17 +
  18 + @JSONField(format="yyyy-MM-dd HH:mm:ss")
  19 + private Instant expires;
  20 +
  21 + @Override
  22 + public HookType getHookType() {
  23 + return hookType;
  24 + }
  25 +
  26 + @Override
  27 + public JSONObject getContent() {
  28 + return content;
  29 + }
  30 +
  31 + public void setContent(JSONObject content) {
  32 + this.content = content;
  33 + }
  34 +
  35 + @Override
  36 + public Instant getExpires() {
  37 + return expires;
  38 + }
  39 +
  40 + @Override
  41 + public void setExpires(Instant expires) {
  42 + this.expires = expires;
  43 + }
  44 +}
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/HookSubscribeForStreamChange.java 0 → 100644
  1 +package com.genersoft.iot.vmp.media.zlm.dto;
  2 +
  3 +import com.alibaba.fastjson.JSONObject;
  4 +import com.alibaba.fastjson.annotation.JSONField;
  5 +
  6 +import java.time.Instant;
  7 +
  8 +/**
  9 + * hook订阅-流变化
  10 + * @author lin
  11 + */
  12 +public class HookSubscribeForStreamChange implements IHookSubscribe{
  13 +
  14 + private HookType hookType = HookType.on_stream_changed;
  15 +
  16 + private JSONObject content;
  17 +
  18 + private Instant expires;
  19 +
  20 + @Override
  21 + public HookType getHookType() {
  22 + return hookType;
  23 + }
  24 +
  25 + @Override
  26 + public JSONObject getContent() {
  27 + return content;
  28 + }
  29 +
  30 + public void setContent(JSONObject content) {
  31 + this.content = content;
  32 + }
  33 +
  34 + @Override
  35 + public Instant getExpires() {
  36 + return expires;
  37 + }
  38 +
  39 + @Override
  40 + public void setExpires(Instant expires) {
  41 + this.expires = expires;
  42 + }
  43 +}
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/HookType.java 0 → 100644
  1 +package com.genersoft.iot.vmp.media.zlm.dto;
  2 +
  3 +/**
  4 + * hook类型
  5 + * @author lin
  6 + */
  7 +
  8 +public enum HookType {
  9 +
  10 + on_flow_report,
  11 + on_http_access,
  12 + on_play,
  13 + on_publish,
  14 + on_record_mp4,
  15 + on_rtsp_auth,
  16 + on_rtsp_realm,
  17 + on_shell_login,
  18 + on_stream_changed,
  19 + on_stream_none_reader,
  20 + on_stream_not_found,
  21 + on_server_started,
  22 + on_server_keepalive
  23 +}
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/IHookSubscribe.java 0 → 100644
  1 +package com.genersoft.iot.vmp.media.zlm.dto;
  2 +
  3 +import com.alibaba.fastjson.JSONObject;
  4 +
  5 +import java.time.Instant;
  6 +
  7 +/**
  8 + * zlm hook事件的参数
  9 + * @author lin
  10 + */
  11 +public interface IHookSubscribe {
  12 +
  13 + /**
  14 + * 获取hook类型
  15 + * @return hook类型
  16 + */
  17 + HookType getHookType();
  18 +
  19 + /**
  20 + * 获取hook的具体内容
  21 + * @return hook的具体内容
  22 + */
  23 + JSONObject getContent();
  24 +
  25 + /**
  26 + * 设置过期时间
  27 + * @param instant 过期时间
  28 + */
  29 + void setExpires(Instant instant);
  30 +
  31 + /**
  32 + * 获取过期时间
  33 + * @return 过期时间
  34 + */
  35 + Instant getExpires();
  36 +}
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamPushItem.java
@@ -108,6 +108,13 @@ public class StreamPushItem extends GbStream implements Comparable&lt;StreamPushIte @@ -108,6 +108,13 @@ public class StreamPushItem extends GbStream implements Comparable&lt;StreamPushIte
108 */ 108 */
109 private boolean pushIng; 109 private boolean pushIng;
110 110
  111 + /**
  112 + * 是否自己平台的推流
  113 + */
  114 + private boolean self;
  115 +
  116 +
  117 +
111 public String getVhost() { 118 public String getVhost() {
112 return vhost; 119 return vhost;
113 } 120 }
@@ -290,5 +297,13 @@ public class StreamPushItem extends GbStream implements Comparable&lt;StreamPushIte @@ -290,5 +297,13 @@ public class StreamPushItem extends GbStream implements Comparable&lt;StreamPushIte
290 public void setPushIng(boolean pushIng) { 297 public void setPushIng(boolean pushIng) {
291 this.pushIng = pushIng; 298 this.pushIng = pushIng;
292 } 299 }
  300 +
  301 + public boolean isSelf() {
  302 + return self;
  303 + }
  304 +
  305 + public void setSelf(boolean self) {
  306 + this.self = self;
  307 + }
293 } 308 }
294 309
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
@@ -48,6 +48,8 @@ public interface IMediaServerService { @@ -48,6 +48,8 @@ public interface IMediaServerService {
48 48
49 SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, String ssrc, boolean ssrcCheck, boolean isPlayback); 49 SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, String ssrc, boolean ssrcCheck, boolean isPlayback);
50 50
  51 + SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, String ssrc, boolean ssrcCheck, boolean isPlayback, Integer port);
  52 +
51 void closeRTPServer(String deviceId, String channelId, String ssrc); 53 void closeRTPServer(String deviceId, String channelId, String ssrc);
52 54
53 void clearRTPServer(MediaServerItem mediaServerItem); 55 void clearRTPServer(MediaServerItem mediaServerItem);
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
@@ -96,4 +96,8 @@ public interface IStreamPushService { @@ -96,4 +96,8 @@ public interface IStreamPushService {
96 */ 96 */
97 void online(List<StreamPushItemFromRedis> onlineStreams); 97 void online(List<StreamPushItemFromRedis> onlineStreams);
98 98
  99 + /**
  100 + * 增加推流
  101 + */
  102 + boolean add(StreamPushItem stream);
99 } 103 }
src/main/java/com/genersoft/iot/vmp/service/StreamGPSSubscribeTask.java deleted 100644 → 0
1 -package com.genersoft.iot.vmp.service;  
2 -  
3 -import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;  
4 -import com.genersoft.iot.vmp.storager.IRedisCatchStorage;  
5 -import com.genersoft.iot.vmp.storager.IVideoManagerStorage;  
6 -import org.springframework.beans.factory.annotation.Autowired;  
7 -import org.springframework.scheduling.annotation.Scheduled;  
8 -import org.springframework.stereotype.Component;  
9 -  
10 -import java.util.List;  
11 -  
12 -  
13 -/**  
14 - * 定时查找redis中的GPS推送消息,并保存到对应的流中  
15 - */  
16 -@Component  
17 -public class StreamGPSSubscribeTask {  
18 -  
19 - @Autowired  
20 - private IRedisCatchStorage redisCatchStorage;  
21 -  
22 - @Autowired  
23 - private IVideoManagerStorage storager;  
24 -  
25 -  
26 - @Scheduled(fixedRate = 30 * 1000) //每30秒执行一次  
27 - public void execute(){  
28 - List<GPSMsgInfo> gpsMsgInfo = redisCatchStorage.getAllGpsMsgInfo();  
29 - if (gpsMsgInfo.size() > 0) {  
30 - storager.updateStreamGPS(gpsMsgInfo);  
31 - for (GPSMsgInfo msgInfo : gpsMsgInfo) {  
32 - msgInfo.setStored(true);  
33 - redisCatchStorage.updateGpsMsgInfo(msgInfo);  
34 - }  
35 - }  
36 -  
37 - }  
38 -}  
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
@@ -86,10 +86,10 @@ public class DeviceServiceImpl implements IDeviceService { @@ -86,10 +86,10 @@ public class DeviceServiceImpl implements IDeviceService {
86 redisCatchStorage.clearCatchByDeviceId(device.getDeviceId()); 86 redisCatchStorage.clearCatchByDeviceId(device.getDeviceId());
87 } 87 }
88 device.setUpdateTime(now); 88 device.setUpdateTime(now);
89 - device.setOnline(1);  
90 89
91 - // 第一次上线 90 + // 第一次上线 或则设备之前是离线状态--进行通道同步和设备信息查询
92 if (device.getCreateTime() == null) { 91 if (device.getCreateTime() == null) {
  92 + device.setOnline(1);
93 device.setCreateTime(now); 93 device.setCreateTime(now);
94 logger.info("[设备上线,首次注册]: {},查询设备信息以及通道信息", device.getDeviceId()); 94 logger.info("[设备上线,首次注册]: {},查询设备信息以及通道信息", device.getDeviceId());
95 deviceMapper.add(device); 95 deviceMapper.add(device);
@@ -97,8 +97,19 @@ public class DeviceServiceImpl implements IDeviceService { @@ -97,8 +97,19 @@ public class DeviceServiceImpl implements IDeviceService {
97 commander.deviceInfoQuery(device); 97 commander.deviceInfoQuery(device);
98 sync(device); 98 sync(device);
99 }else { 99 }else {
100 - deviceMapper.update(device);  
101 - redisCatchStorage.updateDevice(device); 100 + if(device.getOnline() == 0){
  101 + device.setOnline(1);
  102 + device.setCreateTime(now);
  103 + logger.info("[设备上线,离线状态下重新注册]: {},查询设备信息以及通道信息", device.getDeviceId());
  104 + deviceMapper.update(device);
  105 + redisCatchStorage.updateDevice(device);
  106 + commander.deviceInfoQuery(device);
  107 + sync(device);
  108 + }else {
  109 + deviceMapper.update(device);
  110 + redisCatchStorage.updateDevice(device);
  111 + }
  112 +
102 } 113 }
103 114
104 // 上线添加订阅 115 // 上线添加订阅
@@ -125,6 +136,8 @@ public class DeviceServiceImpl implements IDeviceService { @@ -125,6 +136,8 @@ public class DeviceServiceImpl implements IDeviceService {
125 device.setOnline(0); 136 device.setOnline(0);
126 redisCatchStorage.updateDevice(device); 137 redisCatchStorage.updateDevice(device);
127 deviceMapper.update(device); 138 deviceMapper.update(device);
  139 + //进行通道离线
  140 + deviceChannelMapper.offlineByDeviceId(deviceId);
128 // 离线释放所有ssrc 141 // 离线释放所有ssrc
129 List<SsrcTransaction> ssrcTransactions = streamSession.getSsrcTransactionForAll(deviceId, null, null, null); 142 List<SsrcTransaction> ssrcTransactions = streamSession.getSsrcTransactionForAll(deviceId, null, null, null);
130 if (ssrcTransactions != null && ssrcTransactions.size() > 0) { 143 if (ssrcTransactions != null && ssrcTransactions.size() > 0) {
@@ -147,7 +160,7 @@ public class DeviceServiceImpl implements IDeviceService { @@ -147,7 +160,7 @@ public class DeviceServiceImpl implements IDeviceService {
147 logger.info("[添加目录订阅] 设备{}", device.getDeviceId()); 160 logger.info("[添加目录订阅] 设备{}", device.getDeviceId());
148 // 添加目录订阅 161 // 添加目录订阅
149 CatalogSubscribeTask catalogSubscribeTask = new CatalogSubscribeTask(device, sipCommander, dynamicTask); 162 CatalogSubscribeTask catalogSubscribeTask = new CatalogSubscribeTask(device, sipCommander, dynamicTask);
150 - // 提前开始刷新订阅 163 + // 刷新订阅
151 int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForCatalog(),30); 164 int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForCatalog(),30);
152 // 设置最小值为30 165 // 设置最小值为30
153 dynamicTask.startCron(device.getDeviceId() + "catalog", catalogSubscribeTask, (subscribeCycleForCatalog -1) * 1000); 166 dynamicTask.startCron(device.getDeviceId() + "catalog", catalogSubscribeTask, (subscribeCycleForCatalog -1) * 1000);
@@ -182,8 +195,8 @@ public class DeviceServiceImpl implements IDeviceService { @@ -182,8 +195,8 @@ public class DeviceServiceImpl implements IDeviceService {
182 MobilePositionSubscribeTask mobilePositionSubscribeTask = new MobilePositionSubscribeTask(device, sipCommander, dynamicTask); 195 MobilePositionSubscribeTask mobilePositionSubscribeTask = new MobilePositionSubscribeTask(device, sipCommander, dynamicTask);
183 // 设置最小值为30 196 // 设置最小值为30
184 int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForMobilePosition(),30); 197 int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForMobilePosition(),30);
185 - // 提前开始刷新订阅  
186 - dynamicTask.startCron(device.getDeviceId() + "mobile_position" , mobilePositionSubscribeTask, (subscribeCycleForCatalog -1 ) * 1000); 198 + // 刷新订阅
  199 + dynamicTask.startCron(device.getDeviceId() + "mobile_position" , mobilePositionSubscribeTask, (subscribeCycleForCatalog) * 1000);
187 return true; 200 return true;
188 } 201 }
189 202
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
1 package com.genersoft.iot.vmp.service.impl; 1 package com.genersoft.iot.vmp.service.impl;
2 2
  3 +import java.time.LocalDateTime;
  4 +import java.util.ArrayList;
  5 +import java.util.Collections;
  6 +import java.util.HashMap;
  7 +import java.util.List;
  8 +import java.util.Map;
  9 +import java.util.Set;
  10 +
  11 +import org.slf4j.Logger;
  12 +import org.slf4j.LoggerFactory;
  13 +import org.springframework.beans.factory.annotation.Autowired;
  14 +import org.springframework.beans.factory.annotation.Value;
  15 +import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  16 +import org.springframework.stereotype.Service;
  17 +import org.springframework.transaction.TransactionDefinition;
  18 +import org.springframework.transaction.TransactionStatus;
  19 +import org.springframework.util.StringUtils;
  20 +
3 import com.alibaba.fastjson.JSON; 21 import com.alibaba.fastjson.JSON;
4 import com.alibaba.fastjson.JSONArray; 22 import com.alibaba.fastjson.JSONArray;
5 import com.alibaba.fastjson.JSONObject; 23 import com.alibaba.fastjson.JSONObject;
6 import com.genersoft.iot.vmp.common.VideoManagerConstants; 24 import com.genersoft.iot.vmp.common.VideoManagerConstants;
7 import com.genersoft.iot.vmp.conf.SipConfig; 25 import com.genersoft.iot.vmp.conf.SipConfig;
8 import com.genersoft.iot.vmp.conf.UserSetting; 26 import com.genersoft.iot.vmp.conf.UserSetting;
9 -import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;  
10 import com.genersoft.iot.vmp.gb28181.event.EventPublisher; 27 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
11 import com.genersoft.iot.vmp.gb28181.session.SsrcConfig; 28 import com.genersoft.iot.vmp.gb28181.session.SsrcConfig;
12 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; 29 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
@@ -15,30 +32,16 @@ import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; @@ -15,30 +32,16 @@ import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
15 import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; 32 import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
16 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 33 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
17 import com.genersoft.iot.vmp.service.IMediaServerService; 34 import com.genersoft.iot.vmp.service.IMediaServerService;
18 -import com.genersoft.iot.vmp.service.IStreamProxyService;  
19 import com.genersoft.iot.vmp.service.bean.SSRCInfo; 35 import com.genersoft.iot.vmp.service.bean.SSRCInfo;
20 -import com.genersoft.iot.vmp.storager.IVideoManagerStorage;  
21 import com.genersoft.iot.vmp.storager.dao.MediaServerMapper; 36 import com.genersoft.iot.vmp.storager.dao.MediaServerMapper;
22 import com.genersoft.iot.vmp.utils.DateUtil; 37 import com.genersoft.iot.vmp.utils.DateUtil;
23 import com.genersoft.iot.vmp.utils.redis.JedisUtil; 38 import com.genersoft.iot.vmp.utils.redis.JedisUtil;
24 import com.genersoft.iot.vmp.utils.redis.RedisUtil; 39 import com.genersoft.iot.vmp.utils.redis.RedisUtil;
25 import com.genersoft.iot.vmp.vmanager.bean.WVPResult; 40 import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
26 -import okhttp3.*;  
27 -import org.slf4j.Logger;  
28 -import org.slf4j.LoggerFactory;  
29 -import org.springframework.beans.factory.annotation.Autowired;  
30 -import org.springframework.beans.factory.annotation.Value;  
31 -import org.springframework.jdbc.datasource.DataSourceTransactionManager;  
32 -import org.springframework.stereotype.Service;  
33 -import org.springframework.transaction.TransactionDefinition;  
34 -import org.springframework.transaction.TransactionStatus;  
35 -import org.springframework.util.StringUtils;  
36 41
37 -import java.text.ParseException;  
38 -import java.text.SimpleDateFormat;  
39 -import java.time.LocalDateTime;  
40 -import java.util.*;  
41 -import java.util.stream.Collectors; 42 +import okhttp3.OkHttpClient;
  43 +import okhttp3.Request;
  44 +import okhttp3.Response;
42 45
43 /** 46 /**
44 * 媒体服务器节点管理 47 * 媒体服务器节点管理
@@ -82,12 +85,6 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -82,12 +85,6 @@ public class MediaServerServiceImpl implements IMediaServerService {
82 private RedisUtil redisUtil; 85 private RedisUtil redisUtil;
83 86
84 @Autowired 87 @Autowired
85 - private IVideoManagerStorage storager;  
86 -  
87 - @Autowired  
88 - private IStreamProxyService streamProxyService;  
89 -  
90 - @Autowired  
91 private EventPublisher publisher; 88 private EventPublisher publisher;
92 89
93 @Autowired 90 @Autowired
@@ -124,7 +121,7 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -124,7 +121,7 @@ public class MediaServerServiceImpl implements IMediaServerService {
124 } 121 }
125 122
126 @Override 123 @Override
127 - public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, String presetSsrc, boolean ssrcCheck, boolean isPlayback) { 124 + public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, String presetSsrc, boolean ssrcCheck, boolean isPlayback, Integer port) {
128 if (mediaServerItem == null || mediaServerItem.getId() == null) { 125 if (mediaServerItem == null || mediaServerItem.getId() == null) {
129 return null; 126 return null;
130 } 127 }
@@ -152,7 +149,7 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -152,7 +149,7 @@ public class MediaServerServiceImpl implements IMediaServerService {
152 } 149 }
153 int rtpServerPort = mediaServerItem.getRtpProxyPort(); 150 int rtpServerPort = mediaServerItem.getRtpProxyPort();
154 if (mediaServerItem.isRtpEnable()) { 151 if (mediaServerItem.isRtpEnable()) {
155 - rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId, ssrcCheck?Integer.parseInt(ssrc):0); 152 + rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId, ssrcCheck?Integer.parseInt(ssrc):0, port);
156 } 153 }
157 redisUtil.set(key, mediaServerItem); 154 redisUtil.set(key, mediaServerItem);
158 return new SSRCInfo(rtpServerPort, ssrc, streamId); 155 return new SSRCInfo(rtpServerPort, ssrc, streamId);
@@ -160,6 +157,11 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -160,6 +157,11 @@ public class MediaServerServiceImpl implements IMediaServerService {
160 } 157 }
161 158
162 @Override 159 @Override
  160 + public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, String ssrc, boolean ssrcCheck, boolean isPlayback) {
  161 + return openRTPServer(mediaServerItem, streamId, ssrc, ssrcCheck, isPlayback, null);
  162 + }
  163 +
  164 + @Override
163 public void closeRTPServer(String deviceId, String channelId, String stream) { 165 public void closeRTPServer(String deviceId, String channelId, String stream) {
164 String mediaServerId = streamSession.getMediaServerId(deviceId, channelId, stream); 166 String mediaServerId = streamSession.getMediaServerId(deviceId, channelId, stream);
165 String ssrc = streamSession.getSSRC(deviceId, channelId, stream); 167 String ssrc = streamSession.getSSRC(deviceId, channelId, stream);
@@ -355,14 +357,15 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -355,14 +357,15 @@ public class MediaServerServiceImpl implements IMediaServerService {
355 */ 357 */
356 @Override 358 @Override
357 public void zlmServerOnline(ZLMServerConfig zlmServerConfig) { 359 public void zlmServerOnline(ZLMServerConfig zlmServerConfig) {
358 - logger.info("[ZLM] 正在连接 : {} -> {}:{}",  
359 - zlmServerConfig.getGeneralMediaServerId(), zlmServerConfig.getIp(), zlmServerConfig.getHttpPort());  
360 360
361 MediaServerItem serverItem = mediaServerMapper.queryOne(zlmServerConfig.getGeneralMediaServerId()); 361 MediaServerItem serverItem = mediaServerMapper.queryOne(zlmServerConfig.getGeneralMediaServerId());
362 if (serverItem == null) { 362 if (serverItem == null) {
363 logger.warn("[未注册的zlm] 拒接接入:{}来自{}:{}", zlmServerConfig.getGeneralMediaServerId(), zlmServerConfig.getIp(),zlmServerConfig.getHttpPort() ); 363 logger.warn("[未注册的zlm] 拒接接入:{}来自{}:{}", zlmServerConfig.getGeneralMediaServerId(), zlmServerConfig.getIp(),zlmServerConfig.getHttpPort() );
364 logger.warn("请检查ZLM的<general.mediaServerId>配置是否与WVP的<media.id>一致"); 364 logger.warn("请检查ZLM的<general.mediaServerId>配置是否与WVP的<media.id>一致");
365 return; 365 return;
  366 + }else {
  367 + logger.info("[ZLM] 正在连接 : {} -> {}:{}",
  368 + zlmServerConfig.getGeneralMediaServerId(), zlmServerConfig.getIp(), zlmServerConfig.getHttpPort());
366 } 369 }
367 serverItem.setHookAliveInterval(zlmServerConfig.getHookAliveInterval()); 370 serverItem.setHookAliveInterval(zlmServerConfig.getHookAliveInterval());
368 if (serverItem.getHttpPort() == 0) { 371 if (serverItem.getHttpPort() == 0) {
@@ -599,9 +602,6 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -599,9 +602,6 @@ public class MediaServerServiceImpl implements IMediaServerService {
599 boolean result = false; 602 boolean result = false;
600 OkHttpClient client = new OkHttpClient(); 603 OkHttpClient client = new OkHttpClient();
601 String url = String.format("http://%s:%s/index/api/record", ip, port); 604 String url = String.format("http://%s:%s/index/api/record", ip, port);
602 -  
603 - FormBody.Builder builder = new FormBody.Builder();  
604 -  
605 Request request = new Request.Builder() 605 Request request = new Request.Builder()
606 .get() 606 .get()
607 .url(url) 607 .url(url)
@@ -633,7 +633,6 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -633,7 +633,6 @@ public class MediaServerServiceImpl implements IMediaServerService {
633 MediaServerItem mediaServerItem = getOne(mediaServerId); 633 MediaServerItem mediaServerItem = getOne(mediaServerId);
634 if (mediaServerItem == null) { 634 if (mediaServerItem == null) {
635 // zlm连接重试 635 // zlm连接重试
636 -  
637 logger.warn("[更新ZLM 保活信息]失败,未找到流媒体信息"); 636 logger.warn("[更新ZLM 保活信息]失败,未找到流媒体信息");
638 return; 637 return;
639 } 638 }
@@ -652,7 +651,7 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -652,7 +651,7 @@ public class MediaServerServiceImpl implements IMediaServerService {
652 mediaServerItemMap.put(mediaServerItem.getId(), mediaServerItem); 651 mediaServerItemMap.put(mediaServerItem.getId(), mediaServerItem);
653 } 652 }
654 for (MediaServerItem mediaServerItem : allInCatch) { 653 for (MediaServerItem mediaServerItem : allInCatch) {
655 - if (mediaServerItemMap.get(mediaServerItem) == null) { 654 + if (!mediaServerItemMap.containsKey(mediaServerItem.getId())) {
656 delete(mediaServerItem.getId()); 655 delete(mediaServerItem.getId());
657 } 656 }
658 } 657 }
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
@@ -67,9 +67,9 @@ public class MediaServiceImpl implements IMediaService { @@ -67,9 +67,9 @@ public class MediaServiceImpl implements IMediaService {
67 JSONObject mediaJSON = JSON.parseObject(JSON.toJSONString(data.get(0)), JSONObject.class); 67 JSONObject mediaJSON = JSON.parseObject(JSON.toJSONString(data.get(0)), JSONObject.class);
68 JSONArray tracks = mediaJSON.getJSONArray("tracks"); 68 JSONArray tracks = mediaJSON.getJSONArray("tracks");
69 if (authority) { 69 if (authority) {
70 - streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks, streamAuthorityInfo.getCallId()); 70 + streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks, addr,streamAuthorityInfo.getCallId());
71 }else { 71 }else {
72 - streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks, null); 72 + streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks, addr,null);
73 } 73 }
74 74
75 } 75 }
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
1 package com.genersoft.iot.vmp.service.impl; 1 package com.genersoft.iot.vmp.service.impl;
2 2
  3 +import java.math.BigDecimal;
  4 +import java.math.RoundingMode;
  5 +import java.util.List;
  6 +import java.util.Objects;
  7 +import java.util.UUID;
  8 +
  9 +import javax.sip.ResponseEvent;
  10 +
  11 +import org.slf4j.Logger;
  12 +import org.slf4j.LoggerFactory;
  13 +import org.springframework.beans.factory.annotation.Autowired;
  14 +import org.springframework.http.HttpStatus;
  15 +import org.springframework.http.ResponseEntity;
  16 +import org.springframework.stereotype.Service;
  17 +import org.springframework.web.context.request.async.DeferredResult;
  18 +
3 import com.alibaba.fastjson.JSON; 19 import com.alibaba.fastjson.JSON;
4 import com.alibaba.fastjson.JSONArray; 20 import com.alibaba.fastjson.JSONArray;
5 import com.alibaba.fastjson.JSONObject; 21 import com.alibaba.fastjson.JSONObject;
6 import com.genersoft.iot.vmp.common.StreamInfo; 22 import com.genersoft.iot.vmp.common.StreamInfo;
7 import com.genersoft.iot.vmp.conf.DynamicTask; 23 import com.genersoft.iot.vmp.conf.DynamicTask;
8 import com.genersoft.iot.vmp.conf.UserSetting; 24 import com.genersoft.iot.vmp.conf.UserSetting;
9 -import com.genersoft.iot.vmp.gb28181.bean.*; 25 +import com.genersoft.iot.vmp.gb28181.bean.Device;
  26 +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
  27 +import com.genersoft.iot.vmp.gb28181.bean.InviteStreamCallback;
  28 +import com.genersoft.iot.vmp.gb28181.bean.InviteStreamInfo;
  29 +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
  30 +import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
  31 +import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
10 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; 32 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
11 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; 33 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
12 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; 34 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
13 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; 35 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
14 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; 36 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
15 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; 37 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
  38 +import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory;
  39 +import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange;
  40 +import com.genersoft.iot.vmp.media.zlm.dto.HookType;
16 import com.genersoft.iot.vmp.utils.DateUtil; 41 import com.genersoft.iot.vmp.utils.DateUtil;
17 import com.genersoft.iot.vmp.media.zlm.AssistRESTfulUtils; 42 import com.genersoft.iot.vmp.media.zlm.AssistRESTfulUtils;
18 import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; 43 import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
@@ -27,23 +52,11 @@ import com.genersoft.iot.vmp.service.bean.PlayBackResult; @@ -27,23 +52,11 @@ import com.genersoft.iot.vmp.service.bean.PlayBackResult;
27 import com.genersoft.iot.vmp.service.bean.SSRCInfo; 52 import com.genersoft.iot.vmp.service.bean.SSRCInfo;
28 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 53 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
29 import com.genersoft.iot.vmp.storager.IVideoManagerStorage; 54 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
  55 +import com.genersoft.iot.vmp.utils.DateUtil;
30 import com.genersoft.iot.vmp.vmanager.bean.WVPResult; 56 import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
31 import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult; 57 import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult;
32 -import gov.nist.javax.sip.stack.SIPDialog;  
33 -import org.slf4j.Logger;  
34 -import org.slf4j.LoggerFactory;  
35 -import org.springframework.beans.factory.annotation.Autowired;  
36 -import org.springframework.http.HttpStatus;  
37 -import org.springframework.http.ResponseEntity;  
38 -import org.springframework.stereotype.Service;  
39 -import org.springframework.util.ResourceUtils;  
40 -import org.springframework.web.context.request.async.DeferredResult;  
41 58
42 -import javax.sip.ResponseEvent;  
43 -import java.io.FileNotFoundException;  
44 -import java.math.BigDecimal;  
45 -import java.math.RoundingMode;  
46 -import java.util.*; 59 +import gov.nist.javax.sip.stack.SIPDialog;
47 60
48 @SuppressWarnings(value = {"rawtypes", "unchecked"}) 61 @SuppressWarnings(value = {"rawtypes", "unchecked"})
49 @Service 62 @Service
@@ -296,16 +309,10 @@ public class PlayServiceImpl implements IPlayService { @@ -296,16 +309,10 @@ public class PlayServiceImpl implements IPlayService {
296 // 单端口模式streamId也有变化,需要重新设置监听 309 // 单端口模式streamId也有变化,需要重新设置监听
297 if (!mediaServerItem.isRtpEnable()) { 310 if (!mediaServerItem.isRtpEnable()) {
298 // 添加订阅 311 // 添加订阅
299 - JSONObject subscribeKey = new JSONObject();  
300 - subscribeKey.put("app", "rtp");  
301 - subscribeKey.put("stream", stream);  
302 - subscribeKey.put("regist", true);  
303 - subscribeKey.put("schema", "rtmp");  
304 - subscribeKey.put("mediaServerId", mediaServerItem.getId());  
305 - subscribe.removeSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed,subscribeKey);  
306 - subscribeKey.put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase());  
307 - subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey,  
308 - (MediaServerItem mediaServerItemInUse, JSONObject response)->{ 312 + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtmp", mediaServerItem.getId());
  313 + subscribe.removeSubscribe(hookSubscribe);
  314 + hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase());
  315 + subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response)->{
309 logger.info("[ZLM HOOK] ssrc修正后收到订阅消息: " + response.toJSONString()); 316 logger.info("[ZLM HOOK] ssrc修正后收到订阅消息: " + response.toJSONString());
310 dynamicTask.stop(timeOutTaskKey); 317 dynamicTask.stop(timeOutTaskKey);
311 // hook响应 318 // hook响应
@@ -316,7 +323,7 @@ public class PlayServiceImpl implements IPlayService { @@ -316,7 +323,7 @@ public class PlayServiceImpl implements IPlayService {
316 // 关闭rtp server 323 // 关闭rtp server
317 mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); 324 mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
318 // 重新开启ssrc server 325 // 重新开启ssrc server
319 - mediaServerService.openRTPServer(mediaServerItem, finalSsrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false); 326 + mediaServerService.openRTPServer(mediaServerItem, finalSsrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, finalSsrcInfo.getPort());
320 327
321 } 328 }
322 } 329 }
@@ -531,14 +538,6 @@ public class PlayServiceImpl implements IPlayService { @@ -531,14 +538,6 @@ public class PlayServiceImpl implements IPlayService {
531 StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId); 538 StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId);
532 streamInfo.setStartTime(startTime); 539 streamInfo.setStartTime(startTime);
533 streamInfo.setEndTime(endTime); 540 streamInfo.setEndTime(endTime);
534 - if (streamInfo == null) {  
535 - logger.warn("录像下载API调用失败!");  
536 - wvpResult.setCode(-1);  
537 - wvpResult.setMsg("录像下载API调用失败");  
538 - downloadResult.setCode(-1);  
539 - hookCallBack.call(downloadResult);  
540 - return ;  
541 - }  
542 redisCatchStorage.startDownload(streamInfo, inviteStreamInfo.getCallId()); 541 redisCatchStorage.startDownload(streamInfo, inviteStreamInfo.getCallId());
543 wvpResult.setCode(0); 542 wvpResult.setCode(0);
544 wvpResult.setMsg("success"); 543 wvpResult.setMsg("success");
src/main/java/com/genersoft/iot/vmp/service/impl/RedisGbPlayMsgListener.java
@@ -8,6 +8,9 @@ import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; @@ -8,6 +8,9 @@ import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
8 import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; 8 import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
9 import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager; 9 import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager;
10 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; 10 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
  11 +import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory;
  12 +import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange;
  13 +import com.genersoft.iot.vmp.media.zlm.dto.HookType;
11 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 14 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
12 import com.genersoft.iot.vmp.service.IMediaServerService; 15 import com.genersoft.iot.vmp.service.IMediaServerService;
13 import com.genersoft.iot.vmp.service.bean.*; 16 import com.genersoft.iot.vmp.service.bean.*;
@@ -270,14 +273,9 @@ public class RedisGbPlayMsgListener implements MessageListener { @@ -270,14 +273,9 @@ public class RedisGbPlayMsgListener implements MessageListener {
270 }, userSetting.getPlatformPlayTimeout()); 273 }, userSetting.getPlatformPlayTimeout());
271 274
272 // 添加订阅 275 // 添加订阅
273 - JSONObject subscribeKey = new JSONObject();  
274 - subscribeKey.put("app", content.getApp());  
275 - subscribeKey.put("stream", content.getStream());  
276 - subscribeKey.put("regist", true);  
277 - subscribeKey.put("schema", "rtmp");  
278 - subscribeKey.put("mediaServerId", mediaServerItem.getId());  
279 - subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey,  
280 - (MediaServerItem mediaServerItemInUse, JSONObject json)->{ 276 + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed(content.getApp(), content.getStream(), true, "rtmp", mediaServerItem.getId());
  277 +
  278 + subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{
281 dynamicTask.stop(taskKey); 279 dynamicTask.stop(taskKey);
282 responseSendItem(mediaServerItem, content, toId, serial); 280 responseSendItem(mediaServerItem, content, toId, serial);
283 }); 281 });
src/main/java/com/genersoft/iot/vmp/service/impl/RedisGpsMsgListener.java
1 package com.genersoft.iot.vmp.service.impl; 1 package com.genersoft.iot.vmp.service.impl;
2 2
3 import com.alibaba.fastjson.JSON; 3 import com.alibaba.fastjson.JSON;
  4 +import com.genersoft.iot.vmp.gb28181.bean.HandlerCatchData;
4 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; 5 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
5 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 6 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
  7 +import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
6 import org.jetbrains.annotations.NotNull; 8 import org.jetbrains.annotations.NotNull;
7 import org.slf4j.Logger; 9 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory; 10 import org.slf4j.LoggerFactory;
9 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.beans.factory.annotation.Qualifier;
10 import org.springframework.data.redis.connection.Message; 13 import org.springframework.data.redis.connection.Message;
11 import org.springframework.data.redis.connection.MessageListener; 14 import org.springframework.data.redis.connection.MessageListener;
  15 +import org.springframework.scheduling.annotation.Scheduled;
  16 +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
12 import org.springframework.stereotype.Component; 17 import org.springframework.stereotype.Component;
13 18
  19 +import java.util.List;
  20 +import java.util.concurrent.ConcurrentLinkedQueue;
  21 +
14 /** 22 /**
15 * 接收来自redis的GPS更新通知 23 * 接收来自redis的GPS更新通知
16 * @author lin 24 * @author lin
@@ -20,13 +28,50 @@ public class RedisGpsMsgListener implements MessageListener { @@ -20,13 +28,50 @@ public class RedisGpsMsgListener implements MessageListener {
20 28
21 private final static Logger logger = LoggerFactory.getLogger(RedisGpsMsgListener.class); 29 private final static Logger logger = LoggerFactory.getLogger(RedisGpsMsgListener.class);
22 30
  31 + private boolean taskQueueHandlerRun = false;
  32 +
23 @Autowired 33 @Autowired
24 private IRedisCatchStorage redisCatchStorage; 34 private IRedisCatchStorage redisCatchStorage;
25 35
  36 + @Autowired
  37 + private IVideoManagerStorage storager;
  38 +
  39 + private final ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
  40 +
  41 + @Qualifier("taskExecutor")
  42 + @Autowired
  43 + private ThreadPoolTaskExecutor taskExecutor;
  44 +
  45 +
26 @Override 46 @Override
27 public void onMessage(@NotNull Message message, byte[] bytes) { 47 public void onMessage(@NotNull Message message, byte[] bytes) {
28 - // TODO 加消息队列  
29 - GPSMsgInfo gpsMsgInfo = JSON.parseObject(message.getBody(), GPSMsgInfo.class);  
30 - redisCatchStorage.updateGpsMsgInfo(gpsMsgInfo); 48 + taskQueue.offer(message);
  49 + if (!taskQueueHandlerRun) {
  50 + taskQueueHandlerRun = true;
  51 + taskExecutor.execute(() -> {
  52 + while (!taskQueue.isEmpty()) {
  53 + Message msg = taskQueue.poll();
  54 + GPSMsgInfo gpsMsgInfo = JSON.parseObject(msg.getBody(), GPSMsgInfo.class);
  55 + // 只是放入redis缓存起来
  56 + redisCatchStorage.updateGpsMsgInfo(gpsMsgInfo);
  57 + }
  58 + taskQueueHandlerRun = false;
  59 + });
  60 + }
  61 + }
  62 +
  63 + /**
  64 + * 定时将经纬度更新到数据库
  65 + */
  66 + @Scheduled(fixedRate = 2 * 1000) //每2秒执行一次
  67 + public void execute(){
  68 + List<GPSMsgInfo> gpsMsgInfo = redisCatchStorage.getAllGpsMsgInfo();
  69 + if (gpsMsgInfo.size() > 0) {
  70 + storager.updateStreamGPS(gpsMsgInfo);
  71 + for (GPSMsgInfo msgInfo : gpsMsgInfo) {
  72 + msgInfo.setStored(true);
  73 + redisCatchStorage.updateGpsMsgInfo(msgInfo);
  74 + }
  75 + }
31 } 76 }
32 } 77 }
src/main/java/com/genersoft/iot/vmp/service/impl/RedisPushStreamStatusMsgListener.java
@@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager; @@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager;
14 import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; 14 import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
15 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; 15 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
16 import com.genersoft.iot.vmp.service.IStreamPushService; 16 import com.genersoft.iot.vmp.service.IStreamPushService;
  17 +import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
17 import com.genersoft.iot.vmp.service.bean.PushStreamStatusChangeFromRedisDto; 18 import com.genersoft.iot.vmp.service.bean.PushStreamStatusChangeFromRedisDto;
18 import com.genersoft.iot.vmp.service.bean.StreamPushItemFromRedis; 19 import com.genersoft.iot.vmp.service.bean.StreamPushItemFromRedis;
19 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 20 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
@@ -21,14 +22,17 @@ import com.genersoft.iot.vmp.storager.IVideoManagerStorage; @@ -21,14 +22,17 @@ import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
21 import org.slf4j.Logger; 22 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory; 23 import org.slf4j.LoggerFactory;
23 import org.springframework.beans.factory.annotation.Autowired; 24 import org.springframework.beans.factory.annotation.Autowired;
  25 +import org.springframework.beans.factory.annotation.Qualifier;
24 import org.springframework.boot.ApplicationArguments; 26 import org.springframework.boot.ApplicationArguments;
25 import org.springframework.boot.ApplicationRunner; 27 import org.springframework.boot.ApplicationRunner;
26 import org.springframework.data.redis.connection.Message; 28 import org.springframework.data.redis.connection.Message;
27 import org.springframework.data.redis.connection.MessageListener; 29 import org.springframework.data.redis.connection.MessageListener;
  30 +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
28 import org.springframework.stereotype.Component; 31 import org.springframework.stereotype.Component;
29 32
30 import java.util.ArrayList; 33 import java.util.ArrayList;
31 import java.util.List; 34 import java.util.List;
  35 +import java.util.concurrent.ConcurrentLinkedQueue;
32 36
33 37
34 /** 38 /**
@@ -40,6 +44,8 @@ public class RedisPushStreamStatusMsgListener implements MessageListener, Applic @@ -40,6 +44,8 @@ public class RedisPushStreamStatusMsgListener implements MessageListener, Applic
40 44
41 private final static Logger logger = LoggerFactory.getLogger(RedisPushStreamStatusMsgListener.class); 45 private final static Logger logger = LoggerFactory.getLogger(RedisPushStreamStatusMsgListener.class);
42 46
  47 + private boolean taskQueueHandlerRun = false;
  48 +
43 @Autowired 49 @Autowired
44 private IRedisCatchStorage redisCatchStorage; 50 private IRedisCatchStorage redisCatchStorage;
45 51
@@ -47,34 +53,51 @@ public class RedisPushStreamStatusMsgListener implements MessageListener, Applic @@ -47,34 +53,51 @@ public class RedisPushStreamStatusMsgListener implements MessageListener, Applic
47 private IStreamPushService streamPushService; 53 private IStreamPushService streamPushService;
48 54
49 @Autowired 55 @Autowired
50 - private EventPublisher eventPublisher; 56 + private DynamicTask dynamicTask;
51 57
52 - @Autowired  
53 - private UserSetting userSetting;  
54 58
  59 +
  60 + private final ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
  61 +
  62 + @Qualifier("taskExecutor")
55 @Autowired 63 @Autowired
56 - private DynamicTask dynamicTask; 64 + private ThreadPoolTaskExecutor taskExecutor;
57 65
58 @Override 66 @Override
59 public void onMessage(Message message, byte[] bytes) { 67 public void onMessage(Message message, byte[] bytes) {
60 - PushStreamStatusChangeFromRedisDto statusChangeFromPushStream = JSON.parseObject(message.getBody(), PushStreamStatusChangeFromRedisDto.class);  
61 - if (statusChangeFromPushStream == null) {  
62 - logger.warn("[REDIS 消息]推流设备状态变化消息解析失败");  
63 - return;  
64 - }  
65 - if (statusChangeFromPushStream.isSetAllOffline()) {  
66 - // 所有设备离线  
67 - streamPushService.allStreamOffline();  
68 - }  
69 - if (statusChangeFromPushStream.getOfflineStreams() != null  
70 - && statusChangeFromPushStream.getOfflineStreams().size() > 0) {  
71 - // 更新部分设备离线  
72 - streamPushService.offline(statusChangeFromPushStream.getOfflineStreams());  
73 - }  
74 - if (statusChangeFromPushStream.getOnlineStreams() != null &&  
75 - statusChangeFromPushStream.getOnlineStreams().size() > 0) {  
76 - // 更新部分设备上线  
77 - streamPushService.online(statusChangeFromPushStream.getOnlineStreams()); 68 + // TODO 增加队列
  69 + logger.warn("[REDIS消息-推流设备状态变化]: {}", new String(message.getBody()));
  70 + taskQueue.offer(message);
  71 +
  72 + if (!taskQueueHandlerRun) {
  73 + taskQueueHandlerRun = true;
  74 + taskExecutor.execute(() -> {
  75 + while (!taskQueue.isEmpty()) {
  76 + Message msg = taskQueue.poll();
  77 + PushStreamStatusChangeFromRedisDto statusChangeFromPushStream = JSON.parseObject(msg.getBody(), PushStreamStatusChangeFromRedisDto.class);
  78 + if (statusChangeFromPushStream == null) {
  79 + logger.warn("[REDIS消息]推流设备状态变化消息解析失败");
  80 + return;
  81 + }
  82 + // 取消定时任务
  83 + dynamicTask.stop(VideoManagerConstants.VM_MSG_GET_ALL_ONLINE_REQUESTED);
  84 + if (statusChangeFromPushStream.isSetAllOffline()) {
  85 + // 所有设备离线
  86 + streamPushService.allStreamOffline();
  87 + }
  88 + if (statusChangeFromPushStream.getOfflineStreams() != null
  89 + && statusChangeFromPushStream.getOfflineStreams().size() > 0) {
  90 + // 更新部分设备离线
  91 + streamPushService.offline(statusChangeFromPushStream.getOfflineStreams());
  92 + }
  93 + if (statusChangeFromPushStream.getOnlineStreams() != null &&
  94 + statusChangeFromPushStream.getOnlineStreams().size() > 0) {
  95 + // 更新部分设备上线
  96 + streamPushService.online(statusChangeFromPushStream.getOnlineStreams());
  97 + }
  98 + }
  99 + taskQueueHandlerRun = false;
  100 + });
78 } 101 }
79 } 102 }
80 103
@@ -83,7 +106,7 @@ public class RedisPushStreamStatusMsgListener implements MessageListener, Applic @@ -83,7 +106,7 @@ public class RedisPushStreamStatusMsgListener implements MessageListener, Applic
83 // 启动时设置所有推流通道离线,发起查询请求 106 // 启动时设置所有推流通道离线,发起查询请求
84 redisCatchStorage.sendStreamPushRequestedMsgForStatus(); 107 redisCatchStorage.sendStreamPushRequestedMsgForStatus();
85 dynamicTask.startDelay(VideoManagerConstants.VM_MSG_GET_ALL_ONLINE_REQUESTED, ()->{ 108 dynamicTask.startDelay(VideoManagerConstants.VM_MSG_GET_ALL_ONLINE_REQUESTED, ()->{
86 - logger.info("[REDIS 消息]未收到redis回复推流设备状态,执行推流设备离线"); 109 + logger.info("[REDIS消息]未收到redis回复推流设备状态,执行推流设备离线");
87 // 五秒收不到请求就设置通道离线,然后通知上级离线 110 // 五秒收不到请求就设置通道离线,然后通知上级离线
88 streamPushService.allStreamOffline(); 111 streamPushService.allStreamOffline();
89 }, 5000); 112 }, 5000);
src/main/java/com/genersoft/iot/vmp/service/impl/RedisStreamMsgListener.java
@@ -46,7 +46,7 @@ public class RedisStreamMsgListener implements MessageListener { @@ -46,7 +46,7 @@ public class RedisStreamMsgListener implements MessageListener {
46 46
47 JSONObject steamMsgJson = JSON.parseObject(message.getBody(), JSONObject.class); 47 JSONObject steamMsgJson = JSON.parseObject(message.getBody(), JSONObject.class);
48 if (steamMsgJson == null) { 48 if (steamMsgJson == null) {
49 - logger.warn("[REDIS的ALARM通知]消息解析失败"); 49 + logger.warn("[收到redis 流变化]消息解析失败");
50 return; 50 return;
51 } 51 }
52 String serverId = steamMsgJson.getString("serverId"); 52 String serverId = steamMsgJson.getString("serverId");
@@ -55,7 +55,7 @@ public class RedisStreamMsgListener implements MessageListener { @@ -55,7 +55,7 @@ public class RedisStreamMsgListener implements MessageListener {
55 // 自己发送的消息忽略即可 55 // 自己发送的消息忽略即可
56 return; 56 return;
57 } 57 }
58 - logger.info("[REDIS通知] 流变化: {}", new String(message.getBody())); 58 + logger.info("[收到redis 流变化]: {}", new String(message.getBody()));
59 String app = steamMsgJson.getString("app"); 59 String app = steamMsgJson.getString("app");
60 String stream = steamMsgJson.getString("stream"); 60 String stream = steamMsgJson.getString("stream");
61 boolean register = steamMsgJson.getBoolean("register"); 61 boolean register = steamMsgJson.getBoolean("register");
@@ -72,9 +72,10 @@ public class RedisStreamMsgListener implements MessageListener { @@ -72,9 +72,10 @@ public class RedisStreamMsgListener implements MessageListener {
72 mediaItem.setOriginType(0); 72 mediaItem.setOriginType(0);
73 mediaItem.setOriginTypeStr("0"); 73 mediaItem.setOriginTypeStr("0");
74 mediaItem.setOriginTypeStr("unknown"); 74 mediaItem.setOriginTypeStr("unknown");
75 -  
76 - zlmMediaListManager.addPush(mediaItem);  
77 -  
78 - 75 + if (register) {
  76 + zlmMediaListManager.addPush(mediaItem);
  77 + }else {
  78 + zlmMediaListManager.removeMedia(app, stream);
  79 + }
79 } 80 }
80 } 81 }
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
@@ -22,7 +22,10 @@ import com.github.pagehelper.PageInfo; @@ -22,7 +22,10 @@ import com.github.pagehelper.PageInfo;
22 import org.slf4j.Logger; 22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory; 23 import org.slf4j.LoggerFactory;
24 import org.springframework.beans.factory.annotation.Autowired; 24 import org.springframework.beans.factory.annotation.Autowired;
  25 +import org.springframework.jdbc.datasource.DataSourceTransactionManager;
25 import org.springframework.stereotype.Service; 26 import org.springframework.stereotype.Service;
  27 +import org.springframework.transaction.TransactionDefinition;
  28 +import org.springframework.transaction.TransactionStatus;
26 import org.springframework.util.StringUtils; 29 import org.springframework.util.StringUtils;
27 30
28 import java.util.*; 31 import java.util.*;
@@ -69,6 +72,12 @@ public class StreamPushServiceImpl implements IStreamPushService { @@ -69,6 +72,12 @@ public class StreamPushServiceImpl implements IStreamPushService {
69 @Autowired 72 @Autowired
70 private IMediaServerService mediaServerService; 73 private IMediaServerService mediaServerService;
71 74
  75 + @Autowired
  76 + DataSourceTransactionManager dataSourceTransactionManager;
  77 +
  78 + @Autowired
  79 + TransactionDefinition transactionDefinition;
  80 +
72 @Override 81 @Override
73 public List<StreamPushItem> handleJSON(String jsonData, MediaServerItem mediaServerItem) { 82 public List<StreamPushItem> handleJSON(String jsonData, MediaServerItem mediaServerItem) {
74 if (jsonData == null) { 83 if (jsonData == null) {
@@ -463,4 +472,27 @@ public class StreamPushServiceImpl implements IStreamPushService { @@ -463,4 +472,27 @@ public class StreamPushServiceImpl implements IStreamPushService {
463 // 发送通知 472 // 发送通知
464 eventPublisher.catalogEventPublishForStream(null, onlinePushers, CatalogEvent.ON); 473 eventPublisher.catalogEventPublishForStream(null, onlinePushers, CatalogEvent.ON);
465 } 474 }
  475 +
  476 + @Override
  477 + public boolean add(StreamPushItem stream) {
  478 + stream.setUpdateTime(DateUtil.getNow());
  479 + stream.setCreateTime(DateUtil.getNow());
  480 + stream.setServerId(userSetting.getServerId());
  481 +
  482 + // 放在事务内执行
  483 + boolean result = false;
  484 + TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
  485 + try {
  486 + int addStreamResult = streamPushMapper.add(stream);
  487 + if (!StringUtils.isEmpty(stream.getGbId())) {
  488 + gbStreamMapper.add(stream);
  489 + }
  490 + dataSourceTransactionManager.commit(transactionStatus);
  491 + result = true;
  492 + }catch (Exception e) {
  493 + logger.error("批量移除流与平台的关系时错误", e);
  494 + dataSourceTransactionManager.rollback(transactionStatus);
  495 + }
  496 + return result;
  497 + }
466 } 498 }
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java
@@ -300,39 +300,12 @@ public interface IVideoManagerStorage { @@ -300,39 +300,12 @@ public interface IVideoManagerStorage {
300 List<DeviceChannel> queryGbStreamListInPlatform(String platformId); 300 List<DeviceChannel> queryGbStreamListInPlatform(String platformId);
301 301
302 /** 302 /**
303 - * 批量更新推流列表  
304 - * @param streamPushItems  
305 - */  
306 - void updateMediaList(List<StreamPushItem> streamPushItems);  
307 -  
308 - /**  
309 - * 更新单个推流  
310 - * @param streamPushItem  
311 - */  
312 - void updateMedia(StreamPushItem streamPushItem);  
313 -  
314 - /**  
315 * 移除单个推流 303 * 移除单个推流
316 * @param app 304 * @param app
317 * @param stream 305 * @param stream
318 */ 306 */
319 int removeMedia(String app, String stream); 307 int removeMedia(String app, String stream);
320 308
321 -  
322 - /**  
323 - * 获取但个推流  
324 - * @param app  
325 - * @param stream  
326 - * @return  
327 - */  
328 - StreamPushItem getMedia(String app, String stream);  
329 -  
330 -  
331 - /**  
332 - * 清空推流列表  
333 - */  
334 - void clearMediaList();  
335 -  
336 /** 309 /**
337 * 设置流离线 310 * 设置流离线
338 */ 311 */
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
@@ -140,6 +140,9 @@ public interface DeviceChannelMapper { @@ -140,6 +140,9 @@ public interface DeviceChannelMapper {
140 @Update(value = {"UPDATE device_channel SET status=0 WHERE deviceId=#{deviceId} AND channelId=#{channelId}"}) 140 @Update(value = {"UPDATE device_channel SET status=0 WHERE deviceId=#{deviceId} AND channelId=#{channelId}"})
141 void offline(String deviceId, String channelId); 141 void offline(String deviceId, String channelId);
142 142
  143 + @Update(value = {"UPDATE device_channel SET status=0 WHERE deviceId=#{deviceId}"})
  144 + void offlineByDeviceId(String deviceId);
  145 +
143 @Update(value = {"UPDATE device_channel SET status=1 WHERE deviceId=#{deviceId} AND channelId=#{channelId}"}) 146 @Update(value = {"UPDATE device_channel SET status=1 WHERE deviceId=#{deviceId} AND channelId=#{channelId}"})
144 void online(String deviceId, String channelId); 147 void online(String deviceId, String channelId);
145 148
src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformCatalogMapper.java
@@ -50,7 +50,7 @@ public interface PlatformCatalogMapper { @@ -50,7 +50,7 @@ public interface PlatformCatalogMapper {
50 @Select("SELECT pc.* FROM platform_catalog pc WHERE pc.id = #{id}") 50 @Select("SELECT pc.* FROM platform_catalog pc WHERE pc.id = #{id}")
51 PlatformCatalog selectParentCatalog(String id); 51 PlatformCatalog selectParentCatalog(String id);
52 52
53 - @Select("SELECT pc.id as channelId, pc.name, pc.civilCode, pc.businessGroupId,'0' as parental, pc.parentId " + 53 + @Select("SELECT pc.id as channelId, pc.name, pc.civilCode, pc.businessGroupId,'1' as parental, pc.parentId " +
54 " FROM platform_catalog pc WHERE pc.platformId=#{platformId}") 54 " FROM platform_catalog pc WHERE pc.platformId=#{platformId}")
55 List<DeviceChannel> queryCatalogInPlatform(String platformId); 55 List<DeviceChannel> queryCatalogInPlatform(String platformId);
56 } 56 }
src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java
@@ -15,9 +15,10 @@ import java.util.List; @@ -15,9 +15,10 @@ import java.util.List;
15 public interface StreamPushMapper { 15 public interface StreamPushMapper {
16 16
17 @Insert("INSERT INTO stream_push (app, stream, totalReaderCount, originType, originTypeStr, " + 17 @Insert("INSERT INTO stream_push (app, stream, totalReaderCount, originType, originTypeStr, " +
18 - "pushTime, aliveSecond, mediaServerId, serverId, updateTime, createTime, pushIng) VALUES" + 18 + "pushTime, aliveSecond, mediaServerId, serverId, updateTime, createTime, pushIng, self) VALUES" +
19 "('${app}', '${stream}', '${totalReaderCount}', '${originType}', '${originTypeStr}', " + 19 "('${app}', '${stream}', '${totalReaderCount}', '${originType}', '${originTypeStr}', " +
20 - "'${pushTime}', '${aliveSecond}', '${mediaServerId}' , '${serverId}' , '${updateTime}' , '${createTime}', ${pushIng} )") 20 + "'${pushTime}', '${aliveSecond}', '${mediaServerId}' , '${serverId}' , '${updateTime}' , '${createTime}', " +
  21 + "${pushIng}, ${self} )")
21 int add(StreamPushItem streamPushItem); 22 int add(StreamPushItem streamPushItem);
22 23
23 24
@@ -31,6 +32,7 @@ public interface StreamPushMapper { @@ -31,6 +32,7 @@ public interface StreamPushMapper {
31 "<if test=\"pushTime != null\">, pushTime='${pushTime}'</if>" + 32 "<if test=\"pushTime != null\">, pushTime='${pushTime}'</if>" +
32 "<if test=\"aliveSecond != null\">, aliveSecond='${aliveSecond}'</if>" + 33 "<if test=\"aliveSecond != null\">, aliveSecond='${aliveSecond}'</if>" +
33 "<if test=\"pushIng != null\">, pushIng=${pushIng}</if>" + 34 "<if test=\"pushIng != null\">, pushIng=${pushIng}</if>" +
  35 + "<if test=\"self != null\">, self=${self}</if>" +
34 "WHERE app=#{app} AND stream=#{stream}"+ 36 "WHERE app=#{app} AND stream=#{stream}"+
35 " </script>"}) 37 " </script>"})
36 int update(StreamPushItem streamPushItem); 38 int update(StreamPushItem streamPushItem);
@@ -119,7 +121,7 @@ public interface StreamPushMapper { @@ -119,7 +121,7 @@ public interface StreamPushMapper {
119 @Update("UPDATE stream_push " + 121 @Update("UPDATE stream_push " +
120 "SET pushIng=${pushIng} " + 122 "SET pushIng=${pushIng} " +
121 "WHERE app=#{app} AND stream=#{stream}") 123 "WHERE app=#{app} AND stream=#{stream}")
122 - int updatePushStatus(String app, String stream, boolean status); 124 + int updatePushStatus(String app, String stream, boolean pushIng);
123 125
124 @Update("UPDATE stream_push " + 126 @Update("UPDATE stream_push " +
125 "SET status=#{status} " + 127 "SET status=#{status} " +
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -479,7 +479,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @@ -479,7 +479,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
479 @Override 479 @Override
480 public void sendStreamChangeMsg(String type, JSONObject jsonObject) { 480 public void sendStreamChangeMsg(String type, JSONObject jsonObject) {
481 String key = VideoManagerConstants.WVP_MSG_STREAM_CHANGE_PREFIX + type; 481 String key = VideoManagerConstants.WVP_MSG_STREAM_CHANGE_PREFIX + type;
482 - logger.debug("[redis 流变化事件] {}: {}", key, jsonObject.toString()); 482 + logger.info("[redis 流变化事件] {}: {}", key, jsonObject.toString());
483 redis.convertAndSend(key, jsonObject); 483 redis.convertAndSend(key, jsonObject);
484 } 484 }
485 485
@@ -688,21 +688,21 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @@ -688,21 +688,21 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
688 @Override 688 @Override
689 public void sendMobilePositionMsg(JSONObject jsonObject) { 689 public void sendMobilePositionMsg(JSONObject jsonObject) {
690 String key = VideoManagerConstants.VM_MSG_SUBSCRIBE_MOBILE_POSITION; 690 String key = VideoManagerConstants.VM_MSG_SUBSCRIBE_MOBILE_POSITION;
691 - logger.info("[redis 移动位置订阅通知] {}: {}", key, jsonObject.toString()); 691 + logger.info("[redis发送通知]移动位置 {}: {}", key, jsonObject.toString());
692 redis.convertAndSend(key, jsonObject); 692 redis.convertAndSend(key, jsonObject);
693 } 693 }
694 694
695 @Override 695 @Override
696 public void sendStreamPushRequestedMsg(MessageForPushChannel msg) { 696 public void sendStreamPushRequestedMsg(MessageForPushChannel msg) {
697 String key = VideoManagerConstants.VM_MSG_STREAM_PUSH_REQUESTED; 697 String key = VideoManagerConstants.VM_MSG_STREAM_PUSH_REQUESTED;
698 - logger.info("[redis 推流被请求通知] {}: {}/{}", key, msg.getApp(), msg.getStream()); 698 + logger.info("[redis发送通知]推流被请求 {}: {}/{}", key, msg.getApp(), msg.getStream());
699 redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg)); 699 redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg));
700 } 700 }
701 701
702 @Override 702 @Override
703 public void sendAlarmMsg(AlarmChannelMessage msg) { 703 public void sendAlarmMsg(AlarmChannelMessage msg) {
704 String key = VideoManagerConstants.VM_MSG_SUBSCRIBE_ALARM; 704 String key = VideoManagerConstants.VM_MSG_SUBSCRIBE_ALARM;
705 - logger.info("[redis 报警通知] {}: {}", key, JSON.toJSON(msg)); 705 + logger.info("[redis发送通知] 报警{}: {}", key, JSON.toJSON(msg));
706 redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg)); 706 redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg));
707 } 707 }
708 708
@@ -715,7 +715,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @@ -715,7 +715,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
715 @Override 715 @Override
716 public void sendStreamPushRequestedMsgForStatus() { 716 public void sendStreamPushRequestedMsgForStatus() {
717 String key = VideoManagerConstants.VM_MSG_GET_ALL_ONLINE_REQUESTED; 717 String key = VideoManagerConstants.VM_MSG_GET_ALL_ONLINE_REQUESTED;
718 - logger.info("[redis 通知]获取所有推流设备的状态"); 718 + logger.info("[redis通知]获取所有推流设备的状态");
719 JSONObject jsonObject = new JSONObject(); 719 JSONObject jsonObject = new JSONObject();
720 jsonObject.put(key, key); 720 jsonObject.put(key, key);
721 redis.convertAndSend(key, jsonObject); 721 redis.convertAndSend(key, jsonObject);
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java
@@ -636,54 +636,18 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { @@ -636,54 +636,18 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage {
636 } 636 }
637 637
638 @Override 638 @Override
639 - public void updateMediaList(List<StreamPushItem> streamPushItems) {  
640 - if (streamPushItems == null || streamPushItems.size() == 0) {  
641 - return;  
642 - }  
643 - logger.info("updateMediaList: " + streamPushItems.size());  
644 - streamPushMapper.addAll(streamPushItems);  
645 - // TODO 待优化  
646 - for (int i = 0; i < streamPushItems.size(); i++) {  
647 - int onlineResult = mediaOnline(streamPushItems.get(i).getApp(), streamPushItems.get(i).getStream());  
648 - if (onlineResult > 0) {  
649 - // 发送上线通知  
650 - eventPublisher.catalogEventPublishForStream(null, streamPushItems.get(i), CatalogEvent.ON);  
651 - }  
652 - }  
653 - }  
654 -  
655 -  
656 -  
657 - @Override  
658 - public void updateMedia(StreamPushItem streamPushItem) {  
659 - streamPushMapper.del(streamPushItem.getApp(), streamPushItem.getStream());  
660 - streamPushMapper.add(streamPushItem);  
661 - mediaOffline(streamPushItem.getApp(), streamPushItem.getStream());  
662 - }  
663 -  
664 - @Override  
665 public int removeMedia(String app, String stream) { 639 public int removeMedia(String app, String stream) {
666 return streamPushMapper.del(app, stream); 640 return streamPushMapper.del(app, stream);
667 } 641 }
668 642
669 @Override 643 @Override
670 - public StreamPushItem getMedia(String app, String stream) {  
671 - return streamPushMapper.selectOne(app, stream);  
672 - }  
673 -  
674 - @Override  
675 - public void clearMediaList() {  
676 - streamPushMapper.clear();  
677 - }  
678 -  
679 - @Override  
680 public int mediaOffline(String app, String stream) { 644 public int mediaOffline(String app, String stream) {
681 GbStream gbStream = gbStreamMapper.selectOne(app, stream); 645 GbStream gbStream = gbStreamMapper.selectOne(app, stream);
682 int result; 646 int result;
683 if ("proxy".equals(gbStream.getStreamType())) { 647 if ("proxy".equals(gbStream.getStreamType())) {
684 result = streamProxyMapper.updateStatus(app, stream, false); 648 result = streamProxyMapper.updateStatus(app, stream, false);
685 }else { 649 }else {
686 - result = streamPushMapper.updateStatus(app, stream, false); 650 + result = streamPushMapper.updatePushStatus(app, stream, false);
687 } 651 }
688 return result; 652 return result;
689 } 653 }
@@ -695,7 +659,7 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { @@ -695,7 +659,7 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage {
695 if ("proxy".equals(gbStream.getStreamType())) { 659 if ("proxy".equals(gbStream.getStreamType())) {
696 result = streamProxyMapper.updateStatus(app, stream, true); 660 result = streamProxyMapper.updateStatus(app, stream, true);
697 }else { 661 }else {
698 - result = streamPushMapper.updateStatus(app, stream, true); 662 + result = streamPushMapper.updatePushStatus(app, stream, true);
699 } 663 }
700 return result; 664 return result;
701 } 665 }
@@ -741,6 +705,7 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { @@ -741,6 +705,7 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage {
741 if (platformCatalog.getPlatformId().equals(platformCatalog.getParentId())) { 705 if (platformCatalog.getPlatformId().equals(platformCatalog.getParentId())) {
742 // 第一层节点 706 // 第一层节点
743 platformCatalog.setBusinessGroupId(platformCatalog.getId()); 707 platformCatalog.setBusinessGroupId(platformCatalog.getId());
  708 + platformCatalog.setParentId(platform.getDeviceGBId());
744 }else { 709 }else {
745 // 获取顶层的 710 // 获取顶层的
746 PlatformCatalog topCatalog = getTopCatalog(platformCatalog.getParentId(), platformCatalog.getPlatformId()); 711 PlatformCatalog topCatalog = getTopCatalog(platformCatalog.getParentId(), platformCatalog.getPlatformId());
@@ -749,6 +714,10 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { @@ -749,6 +714,10 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage {
749 } 714 }
750 if (platform.getTreeType().equals(TreeType.CIVIL_CODE)) { 715 if (platform.getTreeType().equals(TreeType.CIVIL_CODE)) {
751 platformCatalog.setCivilCode(platformCatalog.getId()); 716 platformCatalog.setCivilCode(platformCatalog.getId());
  717 + if (platformCatalog.getPlatformId().equals(platformCatalog.getParentId())) {
  718 + // 第一层节点
  719 + platformCatalog.setParentId(platform.getDeviceGBId());
  720 + }
752 } 721 }
753 722
754 int result = catalogMapper.add(platformCatalog); 723 int result = catalogMapper.add(platformCatalog);
src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java
@@ -12,6 +12,7 @@ public class WVPResult&lt;T&gt; { @@ -12,6 +12,7 @@ public class WVPResult&lt;T&gt; {
12 this.data = data; 12 this.data = data;
13 } 13 }
14 14
  15 +
15 private int code; 16 private int code;
16 private String msg; 17 private String msg;
17 private T data; 18 private T data;
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java
@@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.conf.UserSetting; @@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.conf.UserSetting;
8 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 8 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
9 import com.genersoft.iot.vmp.gb28181.bean.PlatformCatalog; 9 import com.genersoft.iot.vmp.gb28181.bean.PlatformCatalog;
10 import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder; 10 import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder;
  11 +import com.genersoft.iot.vmp.gb28181.bean.TreeType;
11 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; 12 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
12 import com.genersoft.iot.vmp.service.IPlatformChannelService; 13 import com.genersoft.iot.vmp.service.IPlatformChannelService;
13 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 14 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
@@ -463,13 +464,20 @@ public class PlatformController { @@ -463,13 +464,20 @@ public class PlatformController {
463 if (logger.isDebugEnabled()) { 464 if (logger.isDebugEnabled()) {
464 logger.debug("查询目录,platformId: {}, parentId: {}", platformId, parentId); 465 logger.debug("查询目录,platformId: {}, parentId: {}", platformId, parentId);
465 } 466 }
  467 + ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId);
  468 + if (platform == null) {
  469 + return new ResponseEntity<>(new WVPResult<>(400, "平台未找到", null), HttpStatus.OK);
  470 + }
  471 + if (platformId.equals(parentId)) {
  472 + parentId = platform.getDeviceGBId();
  473 + }
466 List<PlatformCatalog> platformCatalogList = storager.getChildrenCatalogByPlatform(platformId, parentId); 474 List<PlatformCatalog> platformCatalogList = storager.getChildrenCatalogByPlatform(platformId, parentId);
467 - // 查询下属的国标通道  
468 -// List<PlatformCatalog> catalogsForChannel = storager.queryChannelInParentPlatformAndCatalog(platformId, parentId);  
469 - // 查询下属的直播流通道  
470 -// List<PlatformCatalog> catalogsForStream = storager.queryStreamInParentPlatformAndCatalog(platformId, parentId);  
471 -// platformCatalogList.addAll(catalogsForChannel);  
472 -// platformCatalogList.addAll(catalogsForStream); 475 +// if (platform.getTreeType().equals(TreeType.BUSINESS_GROUP)) {
  476 +// platformCatalogList = storager.getChildrenCatalogByPlatform(platformId, parentId);
  477 +// }else {
  478 +//
  479 +// }
  480 +
473 WVPResult<List<PlatformCatalog>> result = new WVPResult<>(); 481 WVPResult<List<PlatformCatalog>> result = new WVPResult<>();
474 result.setCode(0); 482 result.setCode(0);
475 result.setMsg("success"); 483 result.setMsg("success");
src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java
@@ -8,6 +8,8 @@ import com.genersoft.iot.vmp.conf.DynamicTask; @@ -8,6 +8,8 @@ import com.genersoft.iot.vmp.conf.DynamicTask;
8 import com.genersoft.iot.vmp.conf.SipConfig; 8 import com.genersoft.iot.vmp.conf.SipConfig;
9 import com.genersoft.iot.vmp.conf.UserSetting; 9 import com.genersoft.iot.vmp.conf.UserSetting;
10 import com.genersoft.iot.vmp.conf.VersionInfo; 10 import com.genersoft.iot.vmp.conf.VersionInfo;
  11 +import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
  12 +import com.genersoft.iot.vmp.media.zlm.dto.IHookSubscribe;
11 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 13 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
12 import com.genersoft.iot.vmp.service.IMediaServerService; 14 import com.genersoft.iot.vmp.service.IMediaServerService;
13 import com.genersoft.iot.vmp.utils.SpringBeanFactory; 15 import com.genersoft.iot.vmp.utils.SpringBeanFactory;
@@ -38,7 +40,7 @@ import java.util.Set; @@ -38,7 +40,7 @@ import java.util.Set;
38 public class ServerController { 40 public class ServerController {
39 41
40 @Autowired 42 @Autowired
41 - private ConfigurableApplicationContext context; 43 + private ZLMHttpHookSubscribe zlmHttpHookSubscribe;
42 44
43 @Autowired 45 @Autowired
44 private IMediaServerService mediaServerService; 46 private IMediaServerService mediaServerService;
@@ -254,6 +256,18 @@ public class ServerController { @@ -254,6 +256,18 @@ public class ServerController {
254 return result; 256 return result;
255 } 257 }
256 258
  259 + @ApiOperation("获取当前所有hook")
  260 + @GetMapping(value = "/hooks")
  261 + @ResponseBody
  262 + public WVPResult<List<IHookSubscribe>> getHooks(){
  263 + WVPResult<List<IHookSubscribe>> result = new WVPResult<>();
  264 + result.setCode(0);
  265 + result.setMsg("success");
  266 + List<IHookSubscribe> all = zlmHttpHookSubscribe.getAll();
  267 + result.setData(all);
  268 + return result;
  269 + }
  270 +
257 // @ApiOperation("当前进行中的动态任务") 271 // @ApiOperation("当前进行中的动态任务")
258 // @GetMapping(value = "/dynamicTask") 272 // @GetMapping(value = "/dynamicTask")
259 // @ResponseBody 273 // @ResponseBody
src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java
@@ -4,6 +4,7 @@ import com.alibaba.excel.EasyExcel; @@ -4,6 +4,7 @@ import com.alibaba.excel.EasyExcel;
4 import com.alibaba.excel.ExcelReader; 4 import com.alibaba.excel.ExcelReader;
5 import com.alibaba.excel.read.metadata.ReadSheet; 5 import com.alibaba.excel.read.metadata.ReadSheet;
6 import com.genersoft.iot.vmp.common.StreamInfo; 6 import com.genersoft.iot.vmp.common.StreamInfo;
  7 +import com.genersoft.iot.vmp.conf.UserSetting;
7 import com.genersoft.iot.vmp.conf.security.SecurityUtils; 8 import com.genersoft.iot.vmp.conf.security.SecurityUtils;
8 import com.genersoft.iot.vmp.conf.security.dto.LoginUser; 9 import com.genersoft.iot.vmp.conf.security.dto.LoginUser;
9 import com.genersoft.iot.vmp.gb28181.bean.GbStream; 10 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
@@ -63,6 +64,9 @@ public class StreamPushController { @@ -63,6 +64,9 @@ public class StreamPushController {
63 @Autowired 64 @Autowired
64 private IMediaService mediaService; 65 private IMediaService mediaService;
65 66
  67 + @Autowired
  68 + private UserSetting userSetting;
  69 +
66 @ApiOperation("推流列表查询") 70 @ApiOperation("推流列表查询")
67 @ApiImplicitParams({ 71 @ApiImplicitParams({
68 @ApiImplicitParam(name="page", value = "当前页", required = true, dataTypeClass = Integer.class), 72 @ApiImplicitParam(name="page", value = "当前页", required = true, dataTypeClass = Integer.class),
@@ -260,29 +264,63 @@ public class StreamPushController { @@ -260,29 +264,63 @@ public class StreamPushController {
260 }) 264 })
261 @GetMapping(value = "/getPlayUrl") 265 @GetMapping(value = "/getPlayUrl")
262 @ResponseBody 266 @ResponseBody
263 - public WVPResult<StreamInfo> getPlayUrl(HttpServletRequest request, @RequestParam String app,  
264 - @RequestParam String stream,  
265 - @RequestParam(required = false) String mediaServerId){ 267 + public WVPResult<StreamInfo> getPlayUrl(@RequestParam String app,@RequestParam String stream,
  268 + @RequestParam(required = false) String mediaServerId){
266 boolean authority = false; 269 boolean authority = false;
267 // 是否登陆用户, 登陆用户返回完整信息 270 // 是否登陆用户, 登陆用户返回完整信息
268 LoginUser userInfo = SecurityUtils.getUserInfo(); 271 LoginUser userInfo = SecurityUtils.getUserInfo();
269 if (userInfo!= null) { 272 if (userInfo!= null) {
270 authority = true; 273 authority = true;
271 } 274 }
272 -  
273 - StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, authority);  
274 -  
275 WVPResult<StreamInfo> result = new WVPResult<>(); 275 WVPResult<StreamInfo> result = new WVPResult<>();
  276 + StreamPushItem push = streamPushService.getPush(app, stream);
  277 + if (push != null && !push.isSelf()) {
  278 + result.setCode(-1);
  279 + result.setMsg("来自其他平台的推流信息");
  280 + return result;
  281 + }
  282 + StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, authority);
276 if (streamInfo != null){ 283 if (streamInfo != null){
277 result.setCode(0); 284 result.setCode(0);
278 - result.setMsg("scccess"); 285 + result.setMsg("success");
279 result.setData(streamInfo); 286 result.setData(streamInfo);
280 }else { 287 }else {
281 result.setCode(-1); 288 result.setCode(-1);
282 - result.setMsg("fail"); 289 + result.setMsg("获取播放地址失败");
283 } 290 }
  291 +
284 return result; 292 return result;
285 } 293 }
286 294
  295 + /**
  296 + * 获取推流播放地址
  297 + * @param stream 推流信息
  298 + * @return
  299 + */
  300 + @ApiOperation("获取推流播放地址")
  301 + @ApiImplicitParams({
  302 + @ApiImplicitParam(name = "stream", value = "推流信息", dataTypeClass = StreamPushItem.class),
  303 + })
  304 + @PostMapping(value = "/add")
  305 + @ResponseBody
  306 + public WVPResult<StreamInfo> add(@RequestBody StreamPushItem stream){
  307 + if (StringUtils.isEmpty(stream.getGbId())) {
  308 +
  309 + return new WVPResult<>(400, "国标ID不可为空", null);
  310 + }
  311 + if (StringUtils.isEmpty(stream.getApp()) && StringUtils.isEmpty(stream.getStream())) {
  312 + return new WVPResult<>(400, "app或stream不可为空", null);
  313 + }
  314 + stream.setStatus(false);
  315 + stream.setPushIng(false);
  316 + stream.setAliveSecond(0L);
  317 + stream.setTotalReaderCount("0");
  318 + boolean result = streamPushService.add(stream);
287 319
  320 + if (result) {
  321 + return new WVPResult<>(0, "success", null);
  322 + }else {
  323 + return new WVPResult<>(-1, "fail", null);
  324 + }
  325 + }
288 } 326 }
web_src/src/components/PushVideoList.vue
@@ -34,6 +34,8 @@ @@ -34,6 +34,8 @@
34 <el-button icon="el-icon-delete" size="mini" style="margin-right: 1rem;" 34 <el-button icon="el-icon-delete" size="mini" style="margin-right: 1rem;"
35 :disabled="multipleSelection.length === 0" type="danger" @click="batchDel">批量移除 35 :disabled="multipleSelection.length === 0" type="danger" @click="batchDel">批量移除
36 </el-button> 36 </el-button>
  37 + <el-button icon="el-icon-plus" size="mini" style="margin-right: 1rem;" type="primary" @click="addStream">添加通道
  38 + </el-button>
37 <el-button icon="el-icon-refresh-right" circle size="mini" @click="refresh()"></el-button> 39 <el-button icon="el-icon-refresh-right" circle size="mini" @click="refresh()"></el-button>
38 </div> 40 </div>
39 </div> 41 </div>
@@ -67,14 +69,14 @@ @@ -67,14 +69,14 @@
67 </el-table-column> 69 </el-table-column>
68 <el-table-column label="本平台推流" min-width="100"> 70 <el-table-column label="本平台推流" min-width="100">
69 <template slot-scope="scope"> 71 <template slot-scope="scope">
70 - {{scope.row.pushIng && !!!scope.row.serverId ? '是' : '否' }} 72 + {{scope.row.pushIng && !!scope.row.self ? '是' : '否' }}
71 </template> 73 </template>
72 </el-table-column> 74 </el-table-column>
73 75
74 <el-table-column label="操作" min-width="360" fixed="right"> 76 <el-table-column label="操作" min-width="360" fixed="right">
75 <template slot-scope="scope"> 77 <template slot-scope="scope">
76 <el-button size="medium" icon="el-icon-video-play" 78 <el-button size="medium" icon="el-icon-video-play"
77 - v-if="(scope.row.status == false && scope.row.gbId == null) || scope.row.status" 79 + v-if="scope.row.pushIng === true"
78 @click="playPush(scope.row)" type="text">播放 80 @click="playPush(scope.row)" type="text">播放
79 </el-button> 81 </el-button>
80 <el-divider direction="vertical"></el-divider> 82 <el-divider direction="vertical"></el-divider>
@@ -108,7 +110,7 @@ @@ -108,7 +110,7 @@
108 <script> 110 <script>
109 import streamProxyEdit from './dialog/StreamProxyEdit.vue' 111 import streamProxyEdit from './dialog/StreamProxyEdit.vue'
110 import devicePlayer from './dialog/devicePlayer.vue' 112 import devicePlayer from './dialog/devicePlayer.vue'
111 -import addStreamTOGB from './dialog/addStreamTOGB.vue' 113 +import addStreamTOGB from './dialog/pushStreamEdit.vue'
112 import uiHeader from '../layout/UiHeader.vue' 114 import uiHeader from '../layout/UiHeader.vue'
113 import importChannel from './dialog/importChannel.vue' 115 import importChannel from './dialog/importChannel.vue'
114 import MediaServer from './service/MediaServer' 116 import MediaServer from './service/MediaServer'
@@ -200,10 +202,15 @@ export default { @@ -200,10 +202,15 @@ export default {
200 } 202 }
201 }).then(function (res) { 203 }).then(function (res) {
202 that.getListLoading = false; 204 that.getListLoading = false;
203 - that.$refs.devicePlayer.openDialog("streamPlay", null, null, {  
204 - streamInfo: res.data.data,  
205 - hasAudio: true  
206 - }); 205 + if (res.data.code === 0 ) {
  206 + that.$refs.devicePlayer.openDialog("streamPlay", null, null, {
  207 + streamInfo: res.data.data,
  208 + hasAudio: true
  209 + });
  210 + }else {
  211 + that.$message.error(res.data.msg);
  212 + }
  213 +
207 }).catch(function (error) { 214 }).catch(function (error) {
208 console.error(error); 215 console.error(error);
209 that.getListLoading = false; 216 that.getListLoading = false;
@@ -252,6 +259,9 @@ export default { @@ -252,6 +259,9 @@ export default {
252 259
253 }) 260 })
254 }, 261 },
  262 + addStream: function (){
  263 + this.$refs.addStreamTOGB.openDialog(null, this.initData);
  264 + },
255 batchDel: function () { 265 batchDel: function () {
256 this.$confirm(`确定删除选中的${this.multipleSelection.length}个通道?`, '提示', { 266 this.$confirm(`确定删除选中的${this.multipleSelection.length}个通道?`, '提示', {
257 confirmButtonText: '确定', 267 confirmButtonText: '确定',
web_src/src/components/channelList.vue
@@ -124,7 +124,6 @@ @@ -124,7 +124,6 @@
124 import devicePlayer from './dialog/devicePlayer.vue' 124 import devicePlayer from './dialog/devicePlayer.vue'
125 import uiHeader from '../layout/UiHeader.vue' 125 import uiHeader from '../layout/UiHeader.vue'
126 import moment from "moment"; 126 import moment from "moment";
127 -import DviceService from "./service/DeviceService";  
128 import DeviceService from "./service/DeviceService"; 127 import DeviceService from "./service/DeviceService";
129 import DeviceTree from "./common/DeviceTree"; 128 import DeviceTree from "./common/DeviceTree";
130 129
@@ -318,7 +317,7 @@ export default { @@ -318,7 +317,7 @@ export default {
318 changeSubchannel(itemData) { 317 changeSubchannel(itemData) {
319 this.beforeUrl = this.$router.currentRoute.path; 318 this.beforeUrl = this.$router.currentRoute.path;
320 319
321 - var url = `/${this.$router.currentRoute.name}/${this.$router.currentRoute.params.deviceId}/${itemData.channelId}/${this.$router.currentRoute.params.count}/1` 320 + var url = `/${this.$router.currentRoute.name}/${this.$router.currentRoute.params.deviceId}/${itemData.channelId}`
322 this.$router.push(url).then(() => { 321 this.$router.push(url).then(() => {
323 this.searchSrt = ""; 322 this.searchSrt = "";
324 this.channelType = ""; 323 this.channelType = "";
web_src/src/components/dialog/SyncChannelProgress.vue
@@ -63,34 +63,39 @@ export default { @@ -63,34 +63,39 @@ export default {
63 } 63 }
64 64
65 if (res.data.data != null) { 65 if (res.data.data != null) {
66 - if (res.data.data.total == 0) {  
67 - if (res.data.data.errorMsg !== null ){  
68 - this.msg = res.data.data.errorMsg;  
69 - this.syncStatus = "exception"  
70 - }else {  
71 - this.msg = `等待同步中`;  
72 - this.timmer = setTimeout(this.getProgress, 300)  
73 - }  
74 - }else {  
75 - if (res.data.data.total == res.data.data.current) {  
76 - this.syncStatus = "success"  
77 - this.percentage = 100;  
78 - this.msg = '同步成功';  
79 - }else { 66 + if (res.data.syncIng) {
  67 + if (res.data.data.total == 0) {
80 if (res.data.data.errorMsg !== null ){ 68 if (res.data.data.errorMsg !== null ){
81 this.msg = res.data.data.errorMsg; 69 this.msg = res.data.data.errorMsg;
82 this.syncStatus = "exception" 70 this.syncStatus = "exception"
83 }else { 71 }else {
84 - this.total = res.data.data.total;  
85 - this.current = res.data.data.current;  
86 - this.percentage = Math.floor(Number(res.data.data.current)/Number(res.data.data.total)* 10000)/100;  
87 - this.msg = `同步中...[${res.data.data.current}/${res.data.data.total}]`; 72 + this.msg = `等待同步中`;
88 this.timmer = setTimeout(this.getProgress, 300) 73 this.timmer = setTimeout(this.getProgress, 300)
89 } 74 }
  75 + }else {
  76 + if (res.data.data.total == res.data.data.current) {
  77 + this.syncStatus = "success"
  78 + this.percentage = 100;
  79 + this.msg = '同步成功';
  80 + }else {
  81 + if (res.data.data.errorMsg !== null ){
  82 + this.msg = res.data.data.errorMsg;
  83 + this.syncStatus = "exception"
  84 + }else {
  85 + this.total = res.data.data.total;
  86 + this.current = res.data.data.current;
  87 + this.percentage = Math.floor(Number(res.data.data.current)/Number(res.data.data.total)* 10000)/100;
  88 + this.msg = `同步中...[${res.data.data.current}/${res.data.data.total}]`;
  89 + this.timmer = setTimeout(this.getProgress, 300)
  90 + }
  91 + }
90 } 92 }
  93 + }else {
  94 + this.syncStatus = "success"
  95 + this.percentage = 100;
  96 + this.msg = '同步成功';
91 } 97 }
92 } 98 }
93 -  
94 }else { 99 }else {
95 if (this.syncFlag) { 100 if (this.syncFlag) {
96 this.syncStatus = "success" 101 this.syncStatus = "success"
web_src/src/components/dialog/catalogEdit.vue
@@ -70,12 +70,11 @@ export default { @@ -70,12 +70,11 @@ export default {
70 console.log(catalogType) 70 console.log(catalogType)
71 // 216 为虚拟组织 215 为业务分组;目录第一级必须为业务分组, 业务分组下为虚拟组织,虚拟组织下可以有其他虚拟组织 71 // 216 为虚拟组织 215 为业务分组;目录第一级必须为业务分组, 业务分组下为虚拟组织,虚拟组织下可以有其他虚拟组织
72 if (this.level === 1 && catalogType !== "215") { 72 if (this.level === 1 && catalogType !== "215") {
73 - return callback(new Error('业务分组模式下第一层目录的编号10到13位必须为215')); 73 + return callback(new Error('业务分组模式下第一层目录的编号11到13位必须为215'));
74 } 74 }
75 if (this.level > 1 && catalogType !== "216") { 75 if (this.level > 1 && catalogType !== "216") {
76 - return callback(new Error('业务分组模式下第一层以下目录的编号10到13位必须为216')); 76 + return callback(new Error('业务分组模式下第一层以下目录的编号11到13位必须为216'));
77 } 77 }
78 -  
79 } 78 }
80 callback(); 79 callback();
81 } 80 }
@@ -94,7 +93,7 @@ export default { @@ -94,7 +93,7 @@ export default {
94 }, 93 },
95 rules: { 94 rules: {
96 name: [{ required: true, message: "请输入名称", trigger: "blur" }], 95 name: [{ required: true, message: "请输入名称", trigger: "blur" }],
97 - id: [{ trigger: "blur",validator: checkId }] 96 + id: [{ required: true, trigger: "blur",validator: checkId }]
98 }, 97 },
99 }; 98 };
100 }, 99 },
web_src/src/components/dialog/addStreamTOGB.vue renamed to web_src/src/components/dialog/pushStreamEdit.vue
@@ -15,10 +15,10 @@ @@ -15,10 +15,10 @@
15 <el-input v-model="proxyParam.name" clearable></el-input> 15 <el-input v-model="proxyParam.name" clearable></el-input>
16 </el-form-item> 16 </el-form-item>
17 <el-form-item label="流应用名" prop="app"> 17 <el-form-item label="流应用名" prop="app">
18 - <el-input v-model="proxyParam.app" clearable :disabled="true"></el-input> 18 + <el-input v-model="proxyParam.app" clearable :disabled="edit"></el-input>
19 </el-form-item> 19 </el-form-item>
20 <el-form-item label="流ID" prop="stream"> 20 <el-form-item label="流ID" prop="stream">
21 - <el-input v-model="proxyParam.stream" clearable :disabled="true"></el-input> 21 + <el-input v-model="proxyParam.stream" clearable :disabled="edit"></el-input>
22 </el-form-item> 22 </el-form-item>
23 <el-form-item label="国标编码" prop="gbId"> 23 <el-form-item label="国标编码" prop="gbId">
24 <el-input v-model="proxyParam.gbId" placeholder="设置国标编码可推送到国标" clearable></el-input> 24 <el-input v-model="proxyParam.gbId" placeholder="设置国标编码可推送到国标" clearable></el-input>
@@ -28,7 +28,6 @@ @@ -28,7 +28,6 @@
28 <el-button type="primary" @click="onSubmit">保存</el-button> 28 <el-button type="primary" @click="onSubmit">保存</el-button>
29 <el-button @click="close">取消</el-button> 29 <el-button @click="close">取消</el-button>
30 </div> 30 </div>
31 -  
32 </el-form-item> 31 </el-form-item>
33 </el-form> 32 </el-form>
34 </div> 33 </div>
@@ -38,7 +37,7 @@ @@ -38,7 +37,7 @@
38 37
39 <script> 38 <script>
40 export default { 39 export default {
41 - name: "streamProxyEdit", 40 + name: "pushStreamEdit",
42 props: {}, 41 props: {},
43 computed: {}, 42 computed: {},
44 created() {}, 43 created() {},
@@ -63,13 +62,13 @@ export default { @@ -63,13 +62,13 @@ export default {
63 listChangeCallback: null, 62 listChangeCallback: null,
64 showDialog: false, 63 showDialog: false,
65 isLoging: false, 64 isLoging: false,
  65 + edit: false,
66 proxyParam: { 66 proxyParam: {
67 name: null, 67 name: null,
68 app: null, 68 app: null,
69 stream: null, 69 stream: null,
70 gbId: null, 70 gbId: null,
71 }, 71 },
72 -  
73 rules: { 72 rules: {
74 name: [{ required: true, message: "请输入名称", trigger: "blur" }], 73 name: [{ required: true, message: "请输入名称", trigger: "blur" }],
75 app: [{ required: true, message: "请输入应用名", trigger: "blur" }], 74 app: [{ required: true, message: "请输入应用名", trigger: "blur" }],
@@ -84,30 +83,53 @@ export default { @@ -84,30 +83,53 @@ export default {
84 this.listChangeCallback = callback; 83 this.listChangeCallback = callback;
85 if (proxyParam != null) { 84 if (proxyParam != null) {
86 this.proxyParam = proxyParam; 85 this.proxyParam = proxyParam;
87 - } 86 + this.edit = true
  87 + }
88 }, 88 },
89 onSubmit: function () { 89 onSubmit: function () {
90 console.log("onSubmit"); 90 console.log("onSubmit");
91 - var that = this;  
92 - that.$axios({  
93 - method:"post",  
94 - url:`/api/push/save_to_gb`,  
95 - data: that.proxyParam  
96 - }).then(function (res) { 91 + if (this.edit) {
  92 + this.$axios({
  93 + method:"post",
  94 + url:`/api/push/save_to_gb`,
  95 + data: this.proxyParam
  96 + }).then( (res) => {
97 if (res.data == "success") { 97 if (res.data == "success") {
98 - that.$message({ 98 + this.$message({
99 showClose: true, 99 showClose: true,
100 message: "保存成功", 100 message: "保存成功",
101 type: "success", 101 type: "success",
102 }); 102 });
103 - that.showDialog = false;  
104 - if (that.listChangeCallback != null) {  
105 - that.listChangeCallback(); 103 + this.showDialog = false;
  104 + if (this.listChangeCallback != null) {
  105 + this.listChangeCallback();
106 } 106 }
107 } 107 }
108 - }).catch(function (error) { 108 + }).catch((error)=> {
109 console.log(error); 109 console.log(error);
110 - }); 110 + });
  111 + }else {
  112 + this.$axios({
  113 + method:"post",
  114 + url:`/api/push/add`,
  115 + data: this.proxyParam
  116 + }).then( (res) => {
  117 + if (res.data.code === 0) {
  118 + this.$message({
  119 + showClose: true,
  120 + message: "保存成功",
  121 + type: "success",
  122 + });
  123 + this.showDialog = false;
  124 + if (this.listChangeCallback != null) {
  125 + this.listChangeCallback();
  126 + }
  127 + }
  128 + }).catch((error)=> {
  129 + console.log(error);
  130 + });
  131 + }
  132 +
111 }, 133 },
112 close: function () { 134 close: function () {
113 console.log("关闭加入GB"); 135 console.log("关闭加入GB");
@@ -131,6 +153,9 @@ export default { @@ -131,6 +153,9 @@ export default {
131 if (this.platform.enable && this.platform.expires == "0") { 153 if (this.platform.enable && this.platform.expires == "0") {
132 this.platform.expires = "300"; 154 this.platform.expires = "300";
133 } 155 }
  156 + },
  157 + handleNodeClick: function (node){
  158 +
134 } 159 }
135 }, 160 },
136 }; 161 };