648540858
2022-04-20 088419b4d8965e37774a217c5a8135e95fc82c5a
Merge remote-tracking branch 'origin/wvp-28181-2.0' into map
37个文件已修改
2个文件已添加
1169 ■■■■■ 已修改文件
README.md 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bootstrap.sh 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/clean.sql 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql.sql 426 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/update.sql 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/CatalogSubscribeTask.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeHandlerTask.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/IDeviceService.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/components/dialog/SyncChannelProgress.vue 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/components/dialog/catalogEdit.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/components/dialog/deviceEdit.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/components/dialog/platformEdit.vue 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md
@@ -134,10 +134,10 @@
感谢作者[dexter langhuihui](https://github.com/langhuihui) 开源这么好用的WEB播放器。     
感谢作者[Kyle](https://gitee.com/kkkkk5G) 开源了好用的前端页面     
感谢各位大佬的赞助以及对项目的指正与帮助。包括但不限于代码贡献、问题反馈、资金捐赠等各种方式的支持!以下排名不分先后:  
[lawrencehj](https://github.com/lawrencehj) @陆丰-创奇科技 [swwhaha](https://github.com/swwheihei)
[lawrencehj](https://github.com/lawrencehj) [Smallwhitepig](https://github.com/Smallwhitepig) [swwhaha](https://github.com/swwheihei)
[hotcoffie](https://github.com/hotcoffie) [xiaomu](https://github.com/nikmu) [TristingChen](https://github.com/TristingChen)
[chenparty](https://github.com/chenparty) [Hotleave](https://github.com/hotleave) [ydwxb](https://github.com/ydwxb)
[ydpd](https://github.com/ydpd) [szy833](https://github.com/szy833) [ydwxb](https://github.com/ydwxb)
[ydpd](https://github.com/ydpd) [szy833](https://github.com/szy833) [ydwxb](https://github.com/ydwxb) [Albertzhu666](https://github.com/Albertzhu666)
ps: 刚增加了这个名单,肯定遗漏了一些大佬,欢迎大佬联系我添加。
bootstrap.sh
New file
@@ -0,0 +1,91 @@
#!/bin/bash
######################################################
# Copyright 2019 Pham Ngoc Hoai
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Repo: https://github.com/tyrion9/spring-boot-startup-script
#
######### PARAM ######################################
JAVA_OPT=-Xmx1024m
JARFILE=`ls -1r *.jar 2>/dev/null | head -n 1`
PID_FILE=pid.file
RUNNING=N
PWD=`pwd`
######### DO NOT MODIFY ########
if [ -f $PID_FILE ]; then
        PID=`cat $PID_FILE`
        if [ ! -z "$PID" ] && kill -0 $PID 2>/dev/null; then
                RUNNING=Y
        fi
fi
start()
{
        if [ $RUNNING == "Y" ]; then
                echo "Application already started"
        else
                if [ -z "$JARFILE" ]
                then
                        echo "ERROR: jar file not found"
                else
                        nohup java  $JAVA_OPT -Djava.security.egd=file:/dev/./urandom -jar $PWD/$JARFILE > nohup.out 2>&1  &
                        echo $! > $PID_FILE
                        echo "Application $JARFILE starting..."
                        tail -f nohup.out
                fi
        fi
}
stop()
{
        if [ $RUNNING == "Y" ]; then
                kill -9 $PID
                rm -f $PID_FILE
                echo "Application stopped"
        else
                echo "Application not running"
        fi
}
restart()
{
        stop
        start
}
case "$1" in
        'start')
                start
                ;;
        'stop')
                stop
                ;;
        'restart')
                restart
                ;;
        *)
                echo "Usage: $0 {  start | stop | restart  }"
                exit 1
                ;;
esac
exit 0
pom.xml
@@ -11,7 +11,7 @@
    <groupId>com.genersoft</groupId>
    <artifactId>wvp-pro</artifactId>
    <version>2.0.2</version>
    <version>2.1.1</version>
    <name>web video platform</name>
    <description>国标28181视频平台</description>
sql/clean.sql
New file
@@ -0,0 +1,13 @@
delete from  device;
delete from  device_alarm;
delete from  device_channel;
delete from  device_mobile_position;
delete from  gb_stream;
delete from  log;
delete from  media_server;
delete from  parent_platform;
delete from  platform_catalog;
delete from  platform_gb_channel;
delete from  platform_gb_stream;
delete from  stream_proxy;
delete from  stream_push;
sql/mysql.sql
@@ -1,13 +1,13 @@
-- MySQL dump 10.13  Distrib 8.0.28, for Linux (x86_64)
-- MariaDB dump 10.19  Distrib 10.7.3-MariaDB, for Linux (x86_64)
--
-- Host: 127.0.0.1    Database: wvp
-- Host: 127.0.0.1    Database: wvp3
-- ------------------------------------------------------
-- Server version    8.0.28-0ubuntu0.20.04.3
-- Server version    8.0.0-dmr
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
@@ -21,33 +21,34 @@
DROP TABLE IF EXISTS `device`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `device` (
                          `id` int NOT NULL AUTO_INCREMENT,
                          `deviceId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                          `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
                          `manufacturer` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
                          `model` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
                          `firmware` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
                          `transport` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                          `streamMode` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                          `online` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                          `registerTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                          `keepaliveTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                          `ip` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                          `createTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                          `updateTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                          `port` int NOT NULL,
                          `expires` int NOT NULL,
                          `subscribeCycleForCatalog` int NOT NULL,
                          `subscribeCycleForMobilePosition` int NOT NULL,
                          `mobilePositionSubmissionInterval` int DEFAULT 5 NOT NULL,
                          `subscribeCycleForAlarm` int NOT NULL,
                          `hostAddress` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                          `charset` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                          `id` int(11) NOT NULL AUTO_INCREMENT,
                          `deviceId` varchar(50) NOT NULL,
                          `name` varchar(255) DEFAULT NULL,
                          `manufacturer` varchar(255) DEFAULT NULL,
                          `model` varchar(255) DEFAULT NULL,
                          `firmware` varchar(255) DEFAULT NULL,
                          `transport` varchar(50) DEFAULT NULL,
                          `streamMode` varchar(50) DEFAULT NULL,
                          `online` varchar(50) DEFAULT NULL,
                          `registerTime` varchar(50) DEFAULT NULL,
                          `keepaliveTime` varchar(50) DEFAULT NULL,
                          `ip` varchar(50) NOT NULL,
                          `createTime` varchar(50) NOT NULL,
                          `updateTime` varchar(50) NOT NULL,
                          `port` int(11) NOT NULL,
                          `expires` int(11) NOT NULL,
                          `subscribeCycleForCatalog` int(11) NOT NULL,
                          `subscribeCycleForMobilePosition` int(11) NOT NULL,
                          `mobilePositionSubmissionInterval` int(11) NOT NULL DEFAULT '5',
                          `subscribeCycleForAlarm` int(11) NOT NULL,
                          `hostAddress` varchar(50) NOT NULL,
                          `charset` varchar(50) NOT NULL,
                          `ssrcCheck` int(11) DEFAULT '0',
                          PRIMARY KEY (`id`),
                          UNIQUE KEY `device_deviceId_uindex` (`deviceId`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -65,20 +66,20 @@
DROP TABLE IF EXISTS `device_alarm`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `device_alarm` (
                                `id` int NOT NULL AUTO_INCREMENT,
                                `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                `channelId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                `alarmPriority` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                `alarmMethod` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                `alarmTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                `alarmDescription` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                `id` int(11) NOT NULL AUTO_INCREMENT,
                                `deviceId` varchar(50) NOT NULL,
                                `channelId` varchar(50) NOT NULL,
                                `alarmPriority` varchar(50) NOT NULL,
                                `alarmMethod` varchar(50) DEFAULT NULL,
                                `alarmTime` varchar(50) NOT NULL,
                                `alarmDescription` varchar(255) DEFAULT NULL,
                                `longitude` double DEFAULT NULL,
                                `latitude` double DEFAULT NULL,
                                `alarmType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                `alarmType` varchar(50) DEFAULT NULL,
                                PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -96,43 +97,43 @@
DROP TABLE IF EXISTS `device_channel`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `device_channel` (
                                  `id` int NOT NULL AUTO_INCREMENT,
                                  `channelId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                                  `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `manufacture` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `model` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `owner` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `civilCode` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `block` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `address` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `parentId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `safetyWay` int DEFAULT NULL,
                                  `registerWay` int DEFAULT NULL,
                                  `certNum` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `certifiable` int DEFAULT NULL,
                                  `errCode` int DEFAULT NULL,
                                  `endTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `secrecy` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `ipAddress` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `port` int DEFAULT NULL,
                                  `password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `PTZType` int DEFAULT NULL,
                                  `status` int DEFAULT NULL,
                                  `id` int(11) NOT NULL AUTO_INCREMENT,
                                  `channelId` varchar(50) NOT NULL,
                                  `name` varchar(255) DEFAULT NULL,
                                  `manufacture` varchar(50) DEFAULT NULL,
                                  `model` varchar(50) DEFAULT NULL,
                                  `owner` varchar(50) DEFAULT NULL,
                                  `civilCode` varchar(50) DEFAULT NULL,
                                  `block` varchar(50) DEFAULT NULL,
                                  `address` varchar(50) DEFAULT NULL,
                                  `parentId` varchar(50) DEFAULT NULL,
                                  `safetyWay` int(11) DEFAULT NULL,
                                  `registerWay` int(11) DEFAULT NULL,
                                  `certNum` varchar(50) DEFAULT NULL,
                                  `certifiable` int(11) DEFAULT NULL,
                                  `errCode` int(11) DEFAULT NULL,
                                  `endTime` varchar(50) DEFAULT NULL,
                                  `secrecy` varchar(50) DEFAULT NULL,
                                  `ipAddress` varchar(50) DEFAULT NULL,
                                  `port` int(11) DEFAULT NULL,
                                  `password` varchar(255) DEFAULT NULL,
                                  `PTZType` int(11) DEFAULT NULL,
                                  `status` int(11) DEFAULT NULL,
                                  `longitude` double DEFAULT NULL,
                                  `latitude` double DEFAULT NULL,
                                  `streamId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `deviceId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                                  `parental` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                  `streamId` varchar(50) DEFAULT NULL,
                                  `deviceId` varchar(50) NOT NULL,
                                  `parental` varchar(50) DEFAULT NULL,
                                  `hasAudio` bit(1) DEFAULT NULL,
                                  `createTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                                  `updateTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                                  `subCount` int DEFAULT '0',
                                  `createTime` varchar(50) NOT NULL,
                                  `updateTime` varchar(50) NOT NULL,
                                  `subCount` int(11) DEFAULT '0',
                                  PRIMARY KEY (`id`),
                                  UNIQUE KEY `device_channel_id_uindex` (`id`),
                                  UNIQUE KEY `device_channel_pk` (`channelId`,`deviceId`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB AUTO_INCREMENT=81657 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -150,24 +151,24 @@
DROP TABLE IF EXISTS `device_mobile_position`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `device_mobile_position` (
                                          `id` int NOT NULL AUTO_INCREMENT,
                                          `deviceId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                                          `channelId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                                          `deviceName` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                          `time` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                                          `id` int(11) NOT NULL AUTO_INCREMENT,
                                          `deviceId` varchar(50) NOT NULL,
                                          `channelId` varchar(50) NOT NULL,
                                          `deviceName` varchar(255) DEFAULT NULL,
                                          `time` varchar(50) NOT NULL,
                                          `longitude` double NOT NULL,
                                          `latitude` double NOT NULL,
                                          `altitude` double DEFAULT NULL,
                                          `speed` double DEFAULT NULL,
                                          `direction` double DEFAULT NULL,
                                          `reportSource` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                          `geodeticSystem` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                          `cnLng` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                          `cnLat` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                          `reportSource` varchar(50) DEFAULT NULL,
                                          `geodeticSystem` varchar(50) DEFAULT NULL,
                                          `cnLng` varchar(50) DEFAULT NULL,
                                          `cnLat` varchar(50) DEFAULT NULL,
                                          PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB AUTO_INCREMENT=6108 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -185,23 +186,23 @@
DROP TABLE IF EXISTS `gb_stream`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `gb_stream` (
                             `gbStreamId` int NOT NULL AUTO_INCREMENT,
                             `app` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                             `stream` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                             `gbId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                             `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                             `gbStreamId` int(11) NOT NULL AUTO_INCREMENT,
                             `app` varchar(255) NOT NULL,
                             `stream` varchar(255) NOT NULL,
                             `gbId` varchar(50) NOT NULL,
                             `name` varchar(255) DEFAULT NULL,
                             `longitude` double DEFAULT NULL,
                             `latitude` double DEFAULT NULL,
                             `streamType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                             `mediaServerId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                             `status` int DEFAULT NULL,
                             `createStamp` bigint DEFAULT NULL,
                             `streamType` varchar(50) DEFAULT NULL,
                             `mediaServerId` varchar(50) DEFAULT NULL,
                             `status` int(11) DEFAULT NULL,
                             `createStamp` bigint(20) DEFAULT NULL,
                             PRIMARY KEY (`gbStreamId`) USING BTREE,
                             UNIQUE KEY `app` (`app`,`stream`) USING BTREE,
                             UNIQUE KEY `gbId` (`gbId`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=300766 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB AUTO_INCREMENT=300769 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -219,19 +220,19 @@
DROP TABLE IF EXISTS `log`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `log` (
                       `id` int NOT NULL AUTO_INCREMENT,
                       `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                       `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                       `uri` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                       `address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                       `result` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                       `timing` bigint NOT NULL,
                       `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                       `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                       `id` int(11) NOT NULL AUTO_INCREMENT,
                       `name` varchar(50) NOT NULL,
                       `type` varchar(50) NOT NULL,
                       `uri` varchar(200) NOT NULL,
                       `address` varchar(50) NOT NULL,
                       `result` varchar(50) NOT NULL,
                       `timing` bigint(20) NOT NULL,
                       `username` varchar(50) NOT NULL,
                       `createTime` varchar(50) NOT NULL,
                       PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=962 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB AUTO_INCREMENT=1552 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -249,34 +250,34 @@
DROP TABLE IF EXISTS `media_server`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `media_server` (
                                `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                `ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                `hookIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                `sdpIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                `streamIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                `httpPort` int NOT NULL,
                                `httpSSlPort` int NOT NULL,
                                `rtmpPort` int NOT NULL,
                                `rtmpSSlPort` int NOT NULL,
                                `rtpProxyPort` int NOT NULL,
                                `rtspPort` int NOT NULL,
                                `rtspSSLPort` int NOT NULL,
                                `autoConfig` int NOT NULL,
                                `secret` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                `streamNoneReaderDelayMS` int NOT NULL,
                                `rtpEnable` int NOT NULL,
                                `rtpPortRange` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                `sendRtpPortRange` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                `recordAssistPort` int NOT NULL,
                                `defaultServer` int NOT NULL,
                                `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                `hookAliveInterval` int NOT NULL,
                                `id` varchar(255) NOT NULL,
                                `ip` varchar(50) NOT NULL,
                                `hookIp` varchar(50) NOT NULL,
                                `sdpIp` varchar(50) NOT NULL,
                                `streamIp` varchar(50) NOT NULL,
                                `httpPort` int(11) NOT NULL,
                                `httpSSlPort` int(11) NOT NULL,
                                `rtmpPort` int(11) NOT NULL,
                                `rtmpSSlPort` int(11) NOT NULL,
                                `rtpProxyPort` int(11) NOT NULL,
                                `rtspPort` int(11) NOT NULL,
                                `rtspSSLPort` int(11) NOT NULL,
                                `autoConfig` int(11) NOT NULL,
                                `secret` varchar(50) NOT NULL,
                                `streamNoneReaderDelayMS` int(11) NOT NULL,
                                `rtpEnable` int(11) NOT NULL,
                                `rtpPortRange` varchar(50) NOT NULL,
                                `sendRtpPortRange` varchar(50) NOT NULL,
                                `recordAssistPort` int(11) NOT NULL,
                                `defaultServer` int(11) NOT NULL,
                                `createTime` varchar(50) NOT NULL,
                                `updateTime` varchar(50) NOT NULL,
                                `hookAliveInterval` int(11) NOT NULL,
                                PRIMARY KEY (`id`) USING BTREE,
                                UNIQUE KEY `media_server_i` (`ip`,`httpPort`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -294,33 +295,36 @@
DROP TABLE IF EXISTS `parent_platform`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `parent_platform` (
                                   `id` int NOT NULL AUTO_INCREMENT,
                                   `enable` int DEFAULT NULL,
                                   `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                   `serverGBId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                   `serverGBDomain` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                   `serverIP` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                   `serverPort` int DEFAULT NULL,
                                   `deviceGBId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                   `deviceIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                   `devicePort` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                   `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                   `password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                   `expires` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                   `keepTimeout` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                   `transport` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                   `characterSet` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                   `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                   `ptz` int DEFAULT NULL,
                                   `rtcp` int DEFAULT NULL,
                                   `id` int(11) NOT NULL AUTO_INCREMENT,
                                   `enable` int(11) DEFAULT NULL,
                                   `name` varchar(255) DEFAULT NULL,
                                   `serverGBId` varchar(50) NOT NULL,
                                   `serverGBDomain` varchar(50) DEFAULT NULL,
                                   `serverIP` varchar(50) DEFAULT NULL,
                                   `serverPort` int(11) DEFAULT NULL,
                                   `deviceGBId` varchar(50) NOT NULL,
                                   `deviceIp` varchar(50) DEFAULT NULL,
                                   `devicePort` varchar(50) DEFAULT NULL,
                                   `username` varchar(255) DEFAULT NULL,
                                   `password` varchar(50) DEFAULT NULL,
                                   `expires` varchar(50) DEFAULT NULL,
                                   `keepTimeout` varchar(50) DEFAULT NULL,
                                   `transport` varchar(50) DEFAULT NULL,
                                   `characterSet` varchar(50) DEFAULT NULL,
                                   `catalogId` varchar(50) NOT NULL,
                                   `ptz` int(11) DEFAULT NULL,
                                   `rtcp` int(11) DEFAULT NULL,
                                   `status` bit(1) DEFAULT NULL,
                                   `shareAllLiveStream` int DEFAULT NULL,
                                   `shareAllLiveStream` int(11) DEFAULT NULL,
                                   `startOfflinePush` int(11) DEFAULT '0',
                                   `administrativeDivision` varchar(50) NOT NULL,
                                   `catalogGroup` int(11) DEFAULT '1',
                                   PRIMARY KEY (`id`),
                                   UNIQUE KEY `parent_platform_id_uindex` (`id`),
                                   UNIQUE KEY `parent_platform_pk` (`serverGBId`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -338,14 +342,14 @@
DROP TABLE IF EXISTS `platform_catalog`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `platform_catalog` (
                                    `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                    `platformId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                    `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                    `parentId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
                                    `id` varchar(50) NOT NULL,
                                    `platformId` varchar(50) NOT NULL,
                                    `name` varchar(255) NOT NULL,
                                    `parentId` varchar(50) DEFAULT NULL,
                                    PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -363,14 +367,14 @@
DROP TABLE IF EXISTS `platform_gb_channel`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `platform_gb_channel` (
                                       `id` int NOT NULL AUTO_INCREMENT,
                                       `platformId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                                       `catalogId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                                       `deviceChannelId` int NOT NULL,
                                       `id` int(11) NOT NULL AUTO_INCREMENT,
                                       `platformId` varchar(50) NOT NULL,
                                       `catalogId` varchar(50) NOT NULL,
                                       `deviceChannelId` int(11) NOT NULL,
                                       PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -388,15 +392,15 @@
DROP TABLE IF EXISTS `platform_gb_stream`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `platform_gb_stream` (
                                      `platformId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                      `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                      `gbStreamId` int NOT NULL,
                                      `id` int NOT NULL AUTO_INCREMENT,
                                      `platformId` varchar(50) NOT NULL,
                                      `catalogId` varchar(50) NOT NULL,
                                      `gbStreamId` int(11) NOT NULL,
                                      `id` int(11) NOT NULL AUTO_INCREMENT,
                                      PRIMARY KEY (`id`),
                                      UNIQUE KEY `platform_gb_stream_pk` (`platformId`,`catalogId`,`gbStreamId`)
) ENGINE=InnoDB AUTO_INCREMENT=301207 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB AUTO_INCREMENT=301210 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -414,29 +418,29 @@
DROP TABLE IF EXISTS `stream_proxy`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `stream_proxy` (
                                `id` int NOT NULL AUTO_INCREMENT,
                                `type` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                                `app` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
                                `stream` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
                                `url` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                `src_url` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                `dst_url` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                `timeout_ms` int DEFAULT NULL,
                                `ffmpeg_cmd_key` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                `rtp_type` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                `mediaServerId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                `id` int(11) NOT NULL AUTO_INCREMENT,
                                `type` varchar(50) NOT NULL,
                                `app` varchar(255) NOT NULL,
                                `stream` varchar(255) NOT NULL,
                                `url` varchar(255) DEFAULT NULL,
                                `src_url` varchar(255) DEFAULT NULL,
                                `dst_url` varchar(255) DEFAULT NULL,
                                `timeout_ms` int(11) DEFAULT NULL,
                                `ffmpeg_cmd_key` varchar(255) DEFAULT NULL,
                                `rtp_type` varchar(50) DEFAULT NULL,
                                `mediaServerId` varchar(50) DEFAULT NULL,
                                `enable_hls` bit(1) DEFAULT NULL,
                                `enable_mp4` bit(1) DEFAULT NULL,
                                `enable` bit(1) NOT NULL,
                                `status` bit(1) NOT NULL,
                                `enable_remove_none_reader` bit(1) NOT NULL,
                                `createTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
                                `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
                                `createTime` varchar(50) NOT NULL,
                                `name` varchar(255) DEFAULT NULL,
                                PRIMARY KEY (`id`),
                                UNIQUE KEY `stream_proxy_pk` (`app`,`stream`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -454,20 +458,20 @@
DROP TABLE IF EXISTS `stream_push`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `stream_push` (
                               `id` int NOT NULL AUTO_INCREMENT,
                               `app` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
                               `stream` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
                               `totalReaderCount` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                               `originType` int DEFAULT NULL,
                               `originTypeStr` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                               `createStamp` bigint DEFAULT NULL,
                               `aliveSecond` int DEFAULT NULL,
                               `mediaServerId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
                               `id` int(11) NOT NULL AUTO_INCREMENT,
                               `app` varchar(255) NOT NULL,
                               `stream` varchar(255) NOT NULL,
                               `totalReaderCount` varchar(50) DEFAULT NULL,
                               `originType` int(11) DEFAULT NULL,
                               `originTypeStr` varchar(50) DEFAULT NULL,
                               `createStamp` bigint(20) DEFAULT NULL,
                               `aliveSecond` int(11) DEFAULT NULL,
                               `mediaServerId` varchar(50) DEFAULT NULL,
                               PRIMARY KEY (`id`),
                               UNIQUE KEY `stream_push_pk` (`app`,`stream`)
) ENGINE=InnoDB AUTO_INCREMENT=300799 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
) ENGINE=InnoDB AUTO_INCREMENT=300838 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -485,17 +489,17 @@
DROP TABLE IF EXISTS `user`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `user` (
                        `id` int NOT NULL AUTO_INCREMENT,
                        `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                        `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                        `roleId` int NOT NULL,
                        `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                        `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                        `id` int(11) NOT NULL AUTO_INCREMENT,
                        `username` varchar(255) NOT NULL,
                        `password` varchar(255) NOT NULL,
                        `roleId` int(11) NOT NULL,
                        `createTime` varchar(50) NOT NULL,
                        `updateTime` varchar(50) NOT NULL,
                        PRIMARY KEY (`id`) USING BTREE,
                        UNIQUE KEY `user_username_uindex` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -504,7 +508,8 @@
LOCK TABLES `user` WRITE;
/*!40000 ALTER TABLE `user` DISABLE KEYS */;
INSERT INTO `user` VALUES (1,'admin','21232f297a57a5a743894a0e4a801fc3',1,'2021 - 04 - 13 14:14:57','2021 - 04 - 13 14:14:57');
INSERT INTO `user` VALUES
    (1,'admin','21232f297a57a5a743894a0e4a801fc3',1,'2021 - 04 - 13 14:14:57','2021 - 04 - 13 14:14:57');
/*!40000 ALTER TABLE `user` ENABLE KEYS */;
UNLOCK TABLES;
@@ -514,15 +519,15 @@
DROP TABLE IF EXISTS `user_role`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `user_role` (
                             `id` int NOT NULL AUTO_INCREMENT,
                             `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                             `authority` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                             `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                             `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                             `id` int(11) NOT NULL AUTO_INCREMENT,
                             `name` varchar(50) NOT NULL,
                             `authority` varchar(50) NOT NULL,
                             `createTime` varchar(50) NOT NULL,
                             `updateTime` varchar(50) NOT NULL,
                             PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -531,7 +536,8 @@
LOCK TABLES `user_role` WRITE;
/*!40000 ALTER TABLE `user_role` DISABLE KEYS */;
INSERT INTO `user_role` VALUES (1,'admin','0','2021-04-13 14:14:57','2021-04-13 14:14:57');
INSERT INTO `user_role` VALUES
    (1,'admin','0','2021-04-13 14:14:57','2021-04-13 14:14:57');
/*!40000 ALTER TABLE `user_role` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -544,4 +550,4 @@
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2022-03-07  8:26:30
-- Dump completed on 2022-04-18 10:50:27
sql/update.sql
@@ -1,8 +1,12 @@
alter table device
    add subscribeCycleForMobilePosition int null;
alter table parent_platform
    add startOfflinePush int default 0 null;
alter table parent_platform
    add administrativeDivision varchar(50) not null;
alter table parent_platform
    add catalogGroup int default 1 null;
alter table device
    add mobilePositionSubmissionInterval int default 5 null;
    add ssrcCheck int default 0 null;
alter table device
    add subscribeCycleForAlarm int null;
src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
@@ -76,7 +76,6 @@
     */
    public void startDelay(String key, Runnable task, int delay) {
        stop(key);
        System.out.println("定时任务开始了");
        Date starTime = new Date(System.currentTimeMillis() + delay);
        ScheduledFuture future = futureMap.get(key);
@@ -100,7 +99,6 @@
    }
    public void stop(String key) {
        System.out.println("定时任务结束了");
        if (futureMap.get(key) != null && !futureMap.get(key).isCancelled()) {
            futureMap.get(key).cancel(true);
            Runnable runnable = runnableMap.get(key);
src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
@@ -48,6 +48,7 @@
        properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP");
        properties.setProperty("javax.sip.IP_ADDRESS", sipConfig.getMonitorIp());
        properties.setProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT", "true");
        properties.setProperty("gov.nist.javax.sip.DELIVER_UNSOLICITED_NOTIFY", "true"); // 接收所有notify请求,即使没有订阅
        /**
         * sip_server_log.log 和 sip_debug_log.log public static final int TRACE_NONE =
         * 0; public static final int TRACE_MESSAGES = 16; public static final int
src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java
@@ -4,6 +4,7 @@
import java.util.List;
public class CatalogData {
    private int sn; // 命令序列号
    private int total;
    private List<DeviceChannel> channelList;
    private Date lastTime;
@@ -15,6 +16,15 @@
    }
    private CatalogDataStatus status;
    public int getSn() {
        return sn;
    }
    public void setSn(int sn) {
        this.sn = sn;
    }
    public int getTotal() {
        return total;
    }
src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
@@ -129,6 +129,11 @@
     */
    private int subscribeCycleForAlarm;
    /**
     * 是否开启ssrc校验,默认关闭,开启可以防止串流
     */
    private boolean ssrcCheck;
    public String getDeviceId() {
        return deviceId;
@@ -321,4 +326,12 @@
    public void setSubscribeCycleForAlarm(int subscribeCycleForAlarm) {
        this.subscribeCycleForAlarm = subscribeCycleForAlarm;
    }
    public boolean isSsrcCheck() {
        return ssrcCheck;
    }
    public void setSsrcCheck(boolean ssrcCheck) {
        this.ssrcCheck = ssrcCheck;
    }
}
src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
@@ -169,6 +169,11 @@
     */
    private boolean hasAudio;
    /**
     * 标记通道的类型,0->国标通道 1->直播流通道 2->业务分组/虚拟组织/行政区划
     */
    private int channelType;
    public int getId() {
        return id;
    }
@@ -441,4 +446,12 @@
    public void setUpdateTime(String updateTime) {
        this.updateTime = updateTime;
    }
    public int getChannelType() {
        return channelType;
    }
    public void setChannelType(int channelType) {
        this.channelType = channelType;
    }
}
src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java
@@ -129,6 +129,21 @@
     */
    private boolean mobilePositionSubscribe;
    /**
     * 点播未推流的设备时是否使用redis通知拉起
     */
    private boolean startOfflinePush;
    /**
     * 目录分组-每次向上级发送通道信息时单个包携带的通道数量,取值1,2,4,8
     */
    private int catalogGroup;
    /**
     * 行政区划
     */
    private String administrativeDivision;
    public Integer getId() {
        return id;
    }
@@ -329,4 +344,28 @@
    public void setMobilePositionSubscribe(boolean mobilePositionSubscribe) {
        this.mobilePositionSubscribe = mobilePositionSubscribe;
    }
    public boolean isStartOfflinePush() {
        return startOfflinePush;
    }
    public void setStartOfflinePush(boolean startOfflinePush) {
        this.startOfflinePush = startOfflinePush;
    }
    public int getCatalogGroup() {
        return catalogGroup;
    }
    public void setCatalogGroup(int catalogGroup) {
        this.catalogGroup = catalogGroup;
    }
    public String getAdministrativeDivision() {
        return administrativeDivision;
    }
    public void setAdministrativeDivision(String administrativeDivision) {
        this.administrativeDivision = administrativeDivision;
    }
}
src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java
@@ -54,6 +54,7 @@
    @Autowired
    private SIPCommander cmder;
    private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @Override
@@ -74,7 +75,7 @@
            if (deviceInStore == null) { //第一次上线
                logger.info("[{}] 首次注册,查询设备信息以及通道信息", device.getDeviceId());
                cmder.deviceInfoQuery(device);
                cmder.catalogQuery(device, null);
                deviceService.sync(device);
            }
            break;
        // 设备主动发送心跳触发的在线事件
src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java
@@ -26,28 +26,35 @@
    @Autowired
    private IVideoManagerStorage storager;
    public void addReady(String key) {
        CatalogData catalogData = data.get(key);
    public void addReady(Device device, int sn ) {
        CatalogData catalogData = data.get(device.getDeviceId());
        if (catalogData == null || catalogData.getStatus().equals(CatalogData.CatalogDataStatus.end)) {
            catalogData = new CatalogData();
            catalogData.setChannelList(new ArrayList<>());
            catalogData.setDevice(device);
            catalogData.setSn(sn);
            catalogData.setStatus(CatalogData.CatalogDataStatus.ready);
            catalogData.setLastTime(new Date(System.currentTimeMillis()));
            data.put(key, catalogData);
            data.put(device.getDeviceId(), catalogData);
        }
    }
    public void put(String key, int total, Device device, List<DeviceChannel> deviceChannelList) {
        CatalogData catalogData = data.get(key);
    public void put(String deviceId, int sn, int total, Device device, List<DeviceChannel> deviceChannelList) {
        CatalogData catalogData = data.get(deviceId);
        if (catalogData == null) {
            catalogData = new CatalogData();
            catalogData.setSn(sn);
            catalogData.setTotal(total);
            catalogData.setDevice(device);
            catalogData.setChannelList(new ArrayList<>());
            catalogData.setStatus(CatalogData.CatalogDataStatus.runIng);
            catalogData.setLastTime(new Date(System.currentTimeMillis()));
            data.put(key, catalogData);
            data.put(deviceId, catalogData);
        }else {
            // 同一个设备的通道同步请求只考虑一个,其他的直接忽略
            if (catalogData.getSn() != sn) {
                return;
            }
            catalogData.setTotal(total);
            catalogData.setDevice(device);
            catalogData.setStatus(CatalogData.CatalogDataStatus.runIng);
@@ -56,20 +63,20 @@
        }
    }
    public List<DeviceChannel> get(String key) {
        CatalogData catalogData = data.get(key);
    public List<DeviceChannel> get(String deviceId) {
        CatalogData catalogData = data.get(deviceId);
        if (catalogData == null) return null;
        return catalogData.getChannelList();
    }
    public int getTotal(String key) {
        CatalogData catalogData = data.get(key);
    public int getTotal(String deviceId) {
        CatalogData catalogData = data.get(deviceId);
        if (catalogData == null) return 0;
        return catalogData.getTotal();
    }
    public SyncStatus getSyncStatus(String key) {
        CatalogData catalogData = data.get(key);
    public SyncStatus getSyncStatus(String deviceId) {
        CatalogData catalogData = data.get(deviceId);
        if (catalogData == null) return null;
        SyncStatus syncStatus = new SyncStatus();
        syncStatus.setCurrent(catalogData.getChannelList().size());
@@ -78,8 +85,10 @@
        return syncStatus;
    }
    public void del(String key) {
        data.remove(key);
    public boolean isSyncRunning(String deviceId) {
        CatalogData catalogData = data.get(deviceId);
        if (catalogData == null) return false;
        return !catalogData.getStatus().equals(CatalogData.CatalogDataStatus.end);
    }
    @Scheduled(fixedRate = 5 * 1000)   //每5秒执行一次, 发现数据5秒未更新则移除数据并认为数据接收超时
@@ -92,23 +101,30 @@
        Calendar calendarBefore30S = Calendar.getInstance();
        calendarBefore30S.setTime(new Date());
        calendarBefore30S.set(Calendar.SECOND, calendarBefore30S.get(Calendar.SECOND) - 30);
        for (String key : keys) {
            CatalogData catalogData = data.get(key);
        for (String deviceId : keys) {
            CatalogData catalogData = data.get(deviceId);
            if (catalogData.getLastTime().before(calendarBefore5S.getTime())) { // 超过五秒收不到消息任务超时, 只更新这一部分数据
                if (catalogData.getStatus().equals(CatalogData.CatalogDataStatus.runIng)) {
                storager.resetChannels(catalogData.getDevice().getDeviceId(), catalogData.getChannelList());
                    if (catalogData.getTotal() != catalogData.getChannelList().size()) {
                String errorMsg = "更新成功,共" + catalogData.getTotal() + "条,已更新" + catalogData.getChannelList().size() + "条";
                catalogData.setStatus(CatalogData.CatalogDataStatus.end);
                catalogData.setErrorMsg(errorMsg);
            }
            if (catalogData.getLastTime().before(calendarBefore30S.getTime())) { // 超过三十秒,如果标记为end则删除
                data.remove(key);
                }else if (catalogData.getStatus().equals(CatalogData.CatalogDataStatus.ready)) {
                    String errorMsg = "同步失败,等待回复超时";
                    catalogData.setErrorMsg(errorMsg);
                }
                catalogData.setStatus(CatalogData.CatalogDataStatus.end);
            }
            if (catalogData.getStatus().equals(CatalogData.CatalogDataStatus.end) && catalogData.getLastTime().before(calendarBefore30S.getTime())) { // 超过三十秒,如果标记为end则删除
                data.remove(deviceId);
            }
        }
    }
    public void setChannelSyncEnd(String key, String errorMsg) {
        CatalogData catalogData = data.get(key);
    public void setChannelSyncEnd(String deviceId, String errorMsg) {
        CatalogData catalogData = data.get(deviceId);
        if (catalogData == null)return;
        catalogData.setStatus(CatalogData.CatalogDataStatus.end);
        catalogData.setErrorMsg(errorMsg);
src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/CatalogSubscribeTask.java
@@ -10,6 +10,8 @@
import javax.sip.Dialog;
import javax.sip.DialogState;
import javax.sip.ResponseEvent;
import java.util.Timer;
import java.util.TimerTask;
/**
 * 目录订阅任务
@@ -20,6 +22,8 @@
    private final ISIPCommander sipCommander;
    private Dialog dialog;
    private Timer timer ;
    public CatalogSubscribeTask(Device device, ISIPCommander sipCommander) {
        this.device = device;
        this.sipCommander = sipCommander;
@@ -27,6 +31,10 @@
    @Override
    public void run() {
        if (timer != null ) {
            timer.cancel();
            timer = null;
        }
        sipCommander.catalogSubscribe(device, dialog, eventResult -> {
            if (eventResult.dialog != null || eventResult.dialog.getState().equals(DialogState.CONFIRMED)) {
                dialog = eventResult.dialog;
@@ -43,6 +51,13 @@
            dialog = null;
            // 失败
            logger.warn("[目录订阅]失败,信令发送失败: {}-{} ", device.getDeviceId(), eventResult.msg);
            timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    CatalogSubscribeTask.this.run();
                }
            }, 2000);
        });
    }
@@ -56,9 +71,13 @@
         * TERMINATED-> Terminated Dialog状态-终止
         */
        logger.info("取消目录订阅时dialog状态为{}", DialogState.CONFIRMED);
        if (timer != null ) {
            timer.cancel();
            timer = null;
        }
        if (dialog != null && dialog.getState().equals(DialogState.CONFIRMED)) {
            device.setSubscribeCycleForCatalog(0);
            sipCommander.mobilePositionSubscribe(device, dialog, eventResult -> {
            sipCommander.catalogSubscribe(device, dialog, eventResult -> {
                ResponseEvent event = (ResponseEvent) eventResult.event;
                if (event.getResponse().getRawContent() != null) {
                    // 成功
src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeHandlerTask.java
@@ -29,7 +29,6 @@
    private String key;
    public MobilePositionSubscribeHandlerTask(IRedisCatchStorage redisCatchStorage, ISIPCommanderForPlatform sipCommanderForPlatform, IVideoManagerStorage storager, String platformId, String sn, String key, SubscribeHolder subscribeInfo) {
        System.out.println("MobilePositionSubscribeHandlerTask 初始化");
        this.redisCatchStorage = redisCatchStorage;
        this.storager = storager;
        this.platform = storager.queryParentPlatByServerGBId(platformId);
@@ -42,7 +41,6 @@
    @Override
    public void run() {
        logger.info("执行MobilePositionSubscribeHandlerTask");
        if (platform == null) return;
        SubscribeInfo subscribe = subscribeHolder.getMobilePositionSubscribe(platform.getServerGBId());
        if (subscribe != null) {
@@ -71,7 +69,6 @@
                }
            }
        }
        logger.info("结束执行MobilePositionSubscribeHandlerTask");
    }
    @Override
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
@@ -250,7 +250,7 @@
     * 
     * @param device 视频设备
     */
    boolean catalogQuery(Device device, SipSubscribe.Event errorEvent);
    boolean catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent);
    
    /**
     * 查询录像信息
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -1208,14 +1208,14 @@
     * @param device 视频设备
     */ 
    @Override
    public boolean catalogQuery(Device device, SipSubscribe.Event errorEvent) {
    public boolean catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent) {
        try {
            StringBuffer catalogXml = new StringBuffer(200);
            String charset = device.getCharset();
            catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
            catalogXml.append("<Query>\r\n");
            catalogXml.append("<CmdType>Catalog</CmdType>\r\n");
            catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
            catalogXml.append("<SN>" + sn + "</SN>\r\n");
            catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
            catalogXml.append("</Query>\r\n");
            
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
@@ -32,6 +32,7 @@
import javax.sip.message.Request;
import java.lang.reflect.Field;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.UUID;
@@ -215,7 +216,11 @@
            return false;
        }
        try {
            String catalogXml = getCatalogXml(channel, sn, parentPlatform, size);
            List<DeviceChannel> channels = new ArrayList<>();
            if (channel != null) {
                channels.add(channel);
            }
            String catalogXml = getCatalogXml(channels, sn, parentPlatform, size);
            // callid
            CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
@@ -239,7 +244,7 @@
        sendCatalogResponse(channels, parentPlatform, sn, fromTag, 0);
        return true;
    }
    private String getCatalogXml(DeviceChannel channel, String sn, ParentPlatform parentPlatform, int size) {
    private String getCatalogXml(List<DeviceChannel> channels, String sn, ParentPlatform parentPlatform, int size) {
        String characterSet = parentPlatform.getCharacterSet();
        StringBuffer catalogXml = new StringBuffer(600);
        catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet +"\"?>\r\n");
@@ -248,23 +253,25 @@
        catalogXml.append("<SN>" +sn + "</SN>\r\n");
        catalogXml.append("<DeviceID>" + parentPlatform.getDeviceGBId() + "</DeviceID>\r\n");
        catalogXml.append("<SumNum>" + size + "</SumNum>\r\n");
        catalogXml.append("<DeviceList Num=\"1\">\r\n");
        catalogXml.append("<DeviceList Num=\"" + channels.size() +"\">\r\n");
        if (channels.size() > 0) {
            for (DeviceChannel channel : channels) {
        catalogXml.append("<Item>\r\n");
        if (channel != null) {
            catalogXml.append("<DeviceID>" + channel.getChannelId() + "</DeviceID>\r\n");
            catalogXml.append("<Name>" + channel.getName() + "</Name>\r\n");
            catalogXml.append("<Manufacturer>" + channel.getManufacture() + "</Manufacturer>\r\n");
            catalogXml.append("<Model>" + channel.getModel() + "</Model>\r\n");
            catalogXml.append("<Owner>" + channel.getOwner() + "</Owner>\r\n");
            catalogXml.append("<CivilCode>" + channel.getCivilCode() + "</CivilCode>\r\n");
            catalogXml.append("<Address>" + channel.getAddress() + "</Address>\r\n");
            catalogXml.append("<Parental>" + channel.getParental() + "</Parental>\r\n");
            if (channel.getParentId() != null) {
                catalogXml.append("<ParentID>" + channel.getParentId() + "</ParentID>\r\n");
            }
            catalogXml.append("<Secrecy>" + channel.getSecrecy() + "</Secrecy>\r\n");
            catalogXml.append("<RegisterWay>" + channel.getRegisterWay() + "</RegisterWay>\r\n");
            catalogXml.append("<Status>" + (channel.getStatus() == 0?"OFF":"ON") + "</Status>\r\n");
                catalogXml.append("<Secrecy>" + channel.getSecrecy() + "</Secrecy>\r\n");
                if (channel.getChannelType() != 2) { // 业务分组/虚拟组织/行政区划 不设置以下字段
                    catalogXml.append("<Model>" + channel.getModel() + "</Model>\r\n");
                    catalogXml.append("<Owner>" + channel.getOwner() + "</Owner>\r\n");
                    catalogXml.append("<CivilCode>" + channel.getCivilCode() + "</CivilCode>\r\n");
                    catalogXml.append("<Address>" + channel.getAddress() + "</Address>\r\n");
            catalogXml.append("<Longitude>" + channel.getLongitude() + "</Longitude>\r\n");
            catalogXml.append("<Latitude>" + channel.getLatitude() + "</Latitude>\r\n");
            catalogXml.append("<IPAddress>" + channel.getIpAddress() + "</IPAddress>\r\n");
@@ -274,8 +281,10 @@
            catalogXml.append("</Info>\r\n");
        }
        catalogXml.append("</Item>\r\n");
            }
        }
        catalogXml.append("</DeviceList>\r\n");
        catalogXml.append("</Response>\r\n");
        return catalogXml.toString();
@@ -286,15 +295,20 @@
            return;
        }
        try {
            DeviceChannel deviceChannel = channels.get(index);
            String catalogXml = getCatalogXml(deviceChannel, sn, parentPlatform, channels.size());
            List<DeviceChannel> deviceChannels;
            if (index + parentPlatform.getCatalogGroup() < channels.size()) {
                deviceChannels = channels.subList(index, index + parentPlatform.getCatalogGroup());
            }else {
                deviceChannels = channels.subList(index, channels.size());
            }
            String catalogXml = getCatalogXml(deviceChannels, sn, parentPlatform, channels.size());
            // callid
            CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
                    : udpSipProvider.getNewCallId();
            Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, catalogXml, fromTag, callIdHeader);
            transmitRequest(parentPlatform, request, null, eventResult -> {
                int indexNext = index + 1;
                int indexNext = index + parentPlatform.getCatalogGroup();
                sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext);
            });
        } catch (SipException | ParseException | InvalidArgumentException e) {
@@ -432,13 +446,21 @@
        if (index >= deviceChannels.size()) {
            return true;
        }
        List<DeviceChannel> channels;
        if (index + parentPlatform.getCatalogGroup() < deviceChannels.size()) {
            channels = deviceChannels.subList(index, index + parentPlatform.getCatalogGroup());
        }else {
            channels = deviceChannels.subList(index, deviceChannels.size());
        }
        try {
            Integer finalIndex = index;
            String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, deviceChannels.get(index ), deviceChannels.size(), type, subscribeInfo);
            String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, channels,
                    deviceChannels.size(), type, subscribeInfo);
            sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> {
                logger.error("发送NOTIFY通知消息失败。错误:{} {}", eventResult.statusCode, eventResult.msg);
            }, (eventResult -> {
                sendNotifyForCatalogAddOrUpdate(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex + 1);
                sendNotifyForCatalogAddOrUpdate(type, parentPlatform, deviceChannels, subscribeInfo,
                        finalIndex + parentPlatform.getCatalogGroup());
            }));
        } catch (SipException | ParseException e) {
            e.printStackTrace();
@@ -500,11 +522,9 @@
    }
    private  String getCatalogXmlContentForCatalogAddOrUpdate(ParentPlatform parentPlatform, DeviceChannel channel, int sumNum, String type, SubscribeInfo subscribeInfo) {
    private  String getCatalogXmlContentForCatalogAddOrUpdate(ParentPlatform parentPlatform, List<DeviceChannel> channels, int sumNum, String type, SubscribeInfo subscribeInfo) {
        StringBuffer catalogXml = new StringBuffer(600);
        if (parentPlatform.getServerGBId().equals(channel.getParentId())) {
            channel.setParentId(parentPlatform.getDeviceGBId());
        }
        String characterSet = parentPlatform.getCharacterSet();
        catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
        catalogXml.append("<Notify>\r\n");
@@ -512,15 +532,16 @@
        catalogXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n");
        catalogXml.append("<DeviceID>" + parentPlatform.getDeviceGBId() + "</DeviceID>\r\n");
        catalogXml.append("<SumNum>1</SumNum>\r\n");
        catalogXml.append("<DeviceList Num=\"1\">\r\n");
        catalogXml.append("<DeviceList Num=\"" + channels.size() + "\">\r\n");
        if (channels.size() > 0) {
            for (DeviceChannel channel : channels) {
                if (parentPlatform.getServerGBId().equals(channel.getParentId())) {
                    channel.setParentId(parentPlatform.getDeviceGBId());
                }
        catalogXml.append("<Item>\r\n");
        catalogXml.append("<DeviceID>" + channel.getChannelId() + "</DeviceID>\r\n");
        catalogXml.append("<Name>" + channel.getName() + "</Name>\r\n");
        catalogXml.append("<Manufacturer>" + channel.getManufacture() + "</Manufacturer>\r\n");
        catalogXml.append("<Model>" + channel.getModel() + "</Model>\r\n");
        catalogXml.append("<Owner>0</Owner>\r\n");
        catalogXml.append("<CivilCode>CivilCode</CivilCode>\r\n");
        catalogXml.append("<Address>" + channel.getAddress() + "</Address>\r\n");
        catalogXml.append("<Parental>" + channel.getParental() + "</Parental>\r\n");
        if (channel.getParentId() != null) {
            catalogXml.append("<ParentID>" + channel.getParentId() + "</ParentID>\r\n");
@@ -528,10 +549,18 @@
        catalogXml.append("<Secrecy>" + channel.getSecrecy() + "</Secrecy>\r\n");
        catalogXml.append("<RegisterWay>" + channel.getRegisterWay() + "</RegisterWay>\r\n");
        catalogXml.append("<Status>" + (channel.getStatus() == 0 ? "OFF" : "ON") + "</Status>\r\n");
                if (channel.getChannelType() == 2) {  // 业务分组/虚拟组织/行政区划 不设置以下属性
                    catalogXml.append("<Model>" + channel.getModel() + "</Model>\r\n");
                    catalogXml.append("<Owner>0</Owner>\r\n");
                    catalogXml.append("<CivilCode>CivilCode</CivilCode>\r\n");
                    catalogXml.append("<Address>" + channel.getAddress() + "</Address>\r\n");
                }
        if (!"presence".equals(subscribeInfo.getEventType())) {
            catalogXml.append("<Event>" + type + "</Event>\r\n");
        }
        catalogXml.append("</Item>\r\n");
            }
        }
        catalogXml.append("</DeviceList>\r\n");
        catalogXml.append("</Notify>\r\n");
        return catalogXml.toString();
@@ -553,13 +582,20 @@
        if (index >= deviceChannels.size()) {
            return true;
        }
        List<DeviceChannel> channels;
        if (index + parentPlatform.getCatalogGroup() < deviceChannels.size()) {
            channels = deviceChannels.subList(index, index + parentPlatform.getCatalogGroup());
        }else {
            channels = deviceChannels.subList(index, deviceChannels.size());
        }
        try {
            Integer finalIndex = index;
            String catalogXmlContent = getCatalogXmlContentForCatalogOther(parentPlatform, deviceChannels.get(index), type);
            String catalogXmlContent = getCatalogXmlContentForCatalogOther(parentPlatform, channels, type);
            sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> {
                logger.error("发送NOTIFY通知消息失败。错误:{} {}", eventResult.statusCode, eventResult.msg);
            }, (eventResult -> {
                sendNotifyForCatalogOther(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex + 1);
                sendNotifyForCatalogOther(type, parentPlatform, deviceChannels, subscribeInfo,
                        finalIndex + parentPlatform.getCatalogGroup());
            }));
        } catch (SipException e) {
            e.printStackTrace();
@@ -574,10 +610,8 @@
        return true;
    }
    private String getCatalogXmlContentForCatalogOther(ParentPlatform parentPlatform, DeviceChannel channel, String type) {
        if (parentPlatform.getServerGBId().equals(channel.getParentId())) {
            channel.setParentId(parentPlatform.getDeviceGBId());
        }
    private String getCatalogXmlContentForCatalogOther(ParentPlatform parentPlatform, List<DeviceChannel> channels, String type) {
        String characterSet = parentPlatform.getCharacterSet();
        StringBuffer catalogXml = new StringBuffer(600);
        catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
@@ -586,11 +620,18 @@
        catalogXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n");
        catalogXml.append("<DeviceID>" + parentPlatform.getDeviceGBId() + "</DeviceID>\r\n");
        catalogXml.append("<SumNum>1</SumNum>\r\n");
        catalogXml.append("<DeviceList Num=\"1\">\r\n");
        catalogXml.append("<DeviceList Num=\" " + channels.size() + " \">\r\n");
        if (channels.size() > 0) {
            for (DeviceChannel channel : channels) {
                if (parentPlatform.getServerGBId().equals(channel.getParentId())) {
                    channel.setParentId(parentPlatform.getDeviceGBId());
                }
        catalogXml.append("<Item>\r\n");
        catalogXml.append("<DeviceID>" + channel.getChannelId() + "</DeviceID>\r\n");
        catalogXml.append("<Event>" + type + "</Event>\r\n");
        catalogXml.append("</Item>\r\n");
            }
        }
        catalogXml.append("</DeviceList>\r\n");
        catalogXml.append("</Notify>\r\n");
        return catalogXml.toString();
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -397,6 +397,10 @@
                            logger.info("[ app={}, stream={} ]通道离线,启用流后开始推流",gbStream.getApp(), gbStream.getStream());
                            responseAck(evt, Response.BAD_REQUEST, "channel [" + gbStream.getGbId() + "] offline");
                        }else if ("push".equals(gbStream.getStreamType())) {
                            if (!platform.isStartOfflinePush()) {
                                responseAck(evt, Response.TEMPORARILY_UNAVAILABLE, "channel unavailable");
                                return;
                            }
                            // 发送redis消息以使设备上线
                            logger.info("[ app={}, stream={} ]通道离线,发送redis信息控制设备开始推流",gbStream.getApp(), gbStream.getStream());
                            MessageForPushChannel messageForPushChannel = new MessageForPushChannel();
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
@@ -3,7 +3,6 @@
import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.gb28181.auth.DigestServerAuthenticationHelper;
import com.genersoft.iot.vmp.gb28181.auth.RegisterLogicHandler;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.WvpSipDate;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
@@ -42,15 +41,12 @@
@Component
public class RegisterRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor {
    private Logger logger = LoggerFactory.getLogger(RegisterRequestProcessor.class);
    private final Logger logger = LoggerFactory.getLogger(RegisterRequestProcessor.class);
    public String method = "REGISTER";
    @Autowired
    private SipConfig sipConfig;
    @Autowired
    private RegisterLogicHandler handler;
    @Autowired
    private IRedisCatchStorage redisCatchStorage;
@@ -72,6 +68,7 @@
    /**
     * 收到注册请求 处理
     *
      * @param evt
     */
    @Override
@@ -90,35 +87,36 @@
            AddressImpl address = (AddressImpl) fromHeader.getAddress();
            SipUri uri = (SipUri) address.getURI();
            String deviceId = uri.getUser();
            AuthorizationHeader authHead = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME);
            if (authHead == null) {
                logger.info("[{}] 未携带授权头 回复401", requestAddress);
                response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request);
                new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain());
                sendResponse(evt, response);
                return;
            }
            // 校验密码是否正确
            passwordCorrect = StringUtils.isEmpty(sipConfig.getPassword()) ||
                    new DigestServerAuthenticationHelper().doAuthenticatePlainTextPassword(request, sipConfig.getPassword());
            // 未携带授权头或者密码错误 回复401
            if (!passwordCorrect) {
                // 注册失败
                response = getMessageFactory().createResponse(Response.FORBIDDEN, request);
                response.setReasonPhrase("wrong password");
                logger.info("[{}] 密码/SIP服务器ID错误, 回复403", requestAddress);
                sendResponse(evt, response);
                return;
            }
            Device deviceInRedis = redisCatchStorage.getDevice(deviceId);
            Device device = storager.queryVideoDevice(deviceId);
            if (deviceInRedis != null && device == null) {
                // redis 存在脏数据
                redisCatchStorage.clearCatchByDeviceId(deviceId);
            }
            AuthorizationHeader authorhead = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME);
            // 校验密码是否正确
            if (authorhead != null) {
                passwordCorrect = new DigestServerAuthenticationHelper().doAuthenticatePlainTextPassword(request,
                        sipConfig.getPassword());
            }
            if (StringUtils.isEmpty(sipConfig.getPassword())){
                passwordCorrect = true;
            }
            // 未携带授权头或者密码错误 回复401
            if (authorhead == null ) {
                logger.info("[{}] 未携带授权头 回复401", requestAddress);
                response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request);
                new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain());
            }else {
                if (!passwordCorrect){
                    // 注册失败
                    response = getMessageFactory().createResponse(Response.FORBIDDEN, request);
                    response.setReasonPhrase("wrong password");
                    logger.info("[{}] 密码/SIP服务器ID错误, 回复403", requestAddress);
                }else {
                    // 携带授权头并且密码正确
                    response = getMessageFactory().createResponse(Response.OK, request);
                    // 添加date头
@@ -127,7 +125,6 @@
                    WvpSipDate wvpSipDate = new WvpSipDate(Calendar.getInstance(Locale.ENGLISH).getTimeInMillis());
                    dateHeader.setDate(wvpSipDate);
                    response.addHeader(dateHeader);
                    if (expiresHeader == null) {
                        response = getMessageFactory().createResponse(Response.BAD_REQUEST, request);
@@ -150,8 +147,6 @@
                        received = viaHeader.getHost();
                        rPort = viaHeader.getPort();
                    }
                    //
                    if (device == null) {
                        device = new Device();
                        device.setStreamMode("UDP");
@@ -159,44 +154,33 @@
                        device.setDeviceId(deviceId);
                        device.setFirsRegister(true);
                    }else {
                        if (device.getOnline() == 0) {
                            device.setFirsRegister(true);
                        }
                device.setFirsRegister(device.getOnline() == 0);
                    }
                    device.setIp(received);
                    device.setPort(rPort);
                    device.setHostAddress(received.concat(":").concat(String.valueOf(rPort)));
                    // 注销成功
                    if (expiresHeader.getExpires() == 0) {
                // 注销成功
                        registerFlag = 2;
                    }
            } else {
                    // 注册成功
                    else {
                        device.setExpires(expiresHeader.getExpires());
                        registerFlag = 1;
                        // 判断TCP还是UDP
                        boolean isTcp = false;
                        ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME);
                        String transport = reqViaHeader.getTransport();
                        if (transport.equals("TCP")) {
                            isTcp = true;
                        }
                        device.setTransport(isTcp ? "TCP" : "UDP");
                    }
                }
                device.setTransport("TCP".equals(transport) ? "TCP" : "UDP");
            }
            ServerTransaction serverTransaction = getServerTransaction(evt);
            serverTransaction.sendResponse(response);
            if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
            sendResponse(evt, response);
            // 注册成功
            // 保存到redis
            if (registerFlag == 1 ) {
                logger.info("[{}] 注册成功! deviceId:" + device.getDeviceId(), requestAddress);
                logger.info("[{}] 注册成功! deviceId:" + deviceId, requestAddress);
                publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_REGISTER, expiresHeader.getExpires());
            } else if (registerFlag == 2) {
                logger.info("[{}] 注销成功! deviceId:" + device.getDeviceId(), requestAddress);
                publisher.outlineEventPublish(device.getDeviceId(), VideoManagerConstants.EVENT_OUTLINE_UNREGISTER);
                logger.info("[{}] 注销成功! deviceId:" + deviceId, requestAddress);
                publisher.outlineEventPublish(deviceId, VideoManagerConstants.EVENT_OUTLINE_UNREGISTER);
            }
        } catch (SipException | InvalidArgumentException | NoSuchAlgorithmException | ParseException e) {
            e.printStackTrace();
@@ -204,4 +188,10 @@
        
    }
    private void sendResponse(RequestEvent evt, Response response) throws InvalidArgumentException, SipException {
        ServerTransaction serverTransaction = getServerTransaction(evt);
        serverTransaction.sendResponse(response);
        if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
    }
}
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java
@@ -79,7 +79,7 @@
                    deviceChannel.setParental(1);
                    deviceChannel.setParentId(catalog.getParentId());
                    deviceChannel.setRegisterWay(1);
                    deviceChannel.setCivilCode(parentPlatform.getDeviceGBId().substring(0,6));
                    deviceChannel.setCivilCode(parentPlatform.getAdministrativeDivision());
                    deviceChannel.setModel("live");
                    deviceChannel.setOwner("wvp-pro");
                    deviceChannel.setSecrecy("0");
@@ -116,7 +116,7 @@
                    deviceChannel.setStatus(1);
                    deviceChannel.setParentId(gbStream.getCatalogId());
                    deviceChannel.setRegisterWay(1);
                    deviceChannel.setCivilCode(parentPlatform.getDeviceGBId().substring(0,6));
                    deviceChannel.setCivilCode(parentPlatform.getAdministrativeDivision());
                    deviceChannel.setModel("live");
                    deviceChannel.setOwner("wvp-pro");
                    deviceChannel.setParental(0);
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java
@@ -83,20 +83,17 @@
                        catalog.setParentId(parentPlatform.getDeviceGBId());
                    }
                    DeviceChannel deviceChannel = new DeviceChannel();
                    // 通道的类型,0->国标通道 1->直播流通道 2->业务分组/虚拟组织/行政区划
                    deviceChannel.setChannelType(2);
                    deviceChannel.setChannelId(catalog.getId());
                    deviceChannel.setName(catalog.getName());
                    deviceChannel.setLongitude(0.0);
                    deviceChannel.setLatitude(0.0);
                    deviceChannel.setDeviceId(parentPlatform.getDeviceGBId());
                    deviceChannel.setManufacture("wvp-pro");
                    deviceChannel.setStatus(1);
                    deviceChannel.setParental(1);
                    deviceChannel.setParentId(catalog.getParentId());
                    deviceChannel.setRegisterWay(1);
                    deviceChannel.setCivilCode(parentPlatform.getDeviceGBId().substring(0,6));
                    deviceChannel.setModel("live");
                    deviceChannel.setOwner("wvp-pro");
                    deviceChannel.setSecrecy("0");
                    deviceChannel.setCivilCode(parentPlatform.getAdministrativeDivision());
                    allChannels.add(deviceChannel);
                }
            }
@@ -107,6 +104,8 @@
                        channel.setCatalogId(parentPlatform.getDeviceGBId());
                    }
                    DeviceChannel deviceChannel = storage.queryChannel(channel.getDeviceId(), channel.getChannelId());
                    // 通道的类型,0->国标通道 1->直播流通道 2->业务分组/虚拟组织/行政区划
                    deviceChannel.setChannelType(0);
                    deviceChannel.setParental(0);
                    deviceChannel.setParentId(channel.getCatalogId());
                    deviceChannel.setCivilCode(parentPlatform.getDeviceGBId().substring(0, 6));
@@ -120,6 +119,8 @@
                        gbStream.setCatalogId(null);
                    }
                    DeviceChannel deviceChannel = new DeviceChannel();
                    // 通道的类型,0->国标通道 1->直播流通道 2->业务分组/虚拟组织/行政区划
                    deviceChannel.setChannelType(1);
                    deviceChannel.setChannelId(gbStream.getGbId());
                    deviceChannel.setName(gbStream.getName());
                    deviceChannel.setLongitude(gbStream.getLongitude());
@@ -130,7 +131,7 @@
                    deviceChannel.setStatus(1);
                    deviceChannel.setParentId(gbStream.getCatalogId());
                    deviceChannel.setRegisterWay(1);
                    deviceChannel.setCivilCode(parentPlatform.getDeviceGBId().substring(0,6));
                    deviceChannel.setCivilCode(parentPlatform.getAdministrativeDivision());
                    deviceChannel.setModel("live");
                    deviceChannel.setOwner("wvp-pro");
                    deviceChannel.setParental(0);
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java
@@ -87,23 +87,17 @@
            rootElement = getRootElement(evt, device.getCharset());
            Element deviceListElement = rootElement.element("DeviceList");
            Element sumNumElement = rootElement.element("SumNum");
            if (sumNumElement == null || deviceListElement == null) {
            Element snElement = rootElement.element("SN");
            if (snElement == null || sumNumElement == null || deviceListElement == null) {
                responseAck(evt, Response.BAD_REQUEST, "xml error");
                return;
            }
            int sumNum = Integer.parseInt(sumNumElement.getText());
            if (sumNum == 0) {
                // 数据已经完整接收
                storager.cleanChannelsForDevice(device.getDeviceId());
                RequestMessage msg = new RequestMessage();
                msg.setKey(key);
                WVPResult<Object> result = new WVPResult<>();
                result.setCode(0);
                result.setData(device);
                msg.setData(result);
                result.setMsg("更新成功,共0条");
                deferredResultHolder.invokeAllResult(msg);
                catalogDataCatch.del(key);
                catalogDataCatch.setChannelSyncEnd(device.getDeviceId(), null);
            }else {
                Iterator<Element> deviceListIterator = deviceListElement.elementIterator();
                if (deviceListIterator != null) {
@@ -124,24 +118,18 @@
                        channelList.add(deviceChannel);
                    }
                    logger.info("收到来自设备【{}】的通道: {}个,{}/{}", device.getDeviceId(), channelList.size(), catalogDataCatch.get(key) == null ? 0 :catalogDataCatch.get(key).size(), sumNum);
                    catalogDataCatch.put(key, sumNum, device, channelList);
                    if (catalogDataCatch.get(key).size() == sumNum) {
                    int sn = Integer.parseInt(snElement.getText());
                    catalogDataCatch.put(device.getDeviceId(), sn, sumNum, device, channelList);
                    logger.info("收到来自设备【{}】的通道: {}个,{}/{}", device.getDeviceId(), channelList.size(), catalogDataCatch.get(device.getDeviceId()) == null ? 0 :catalogDataCatch.get(device.getDeviceId()).size(), sumNum);
                    if (catalogDataCatch.get(device.getDeviceId()).size() == sumNum) {
                        // 数据已经完整接收
                        boolean resetChannelsResult = storager.resetChannels(device.getDeviceId(), catalogDataCatch.get(key));
                        RequestMessage msg = new RequestMessage();
                        msg.setKey(key);
                        WVPResult<Object> result = new WVPResult<>();
                        result.setCode(0);
                        result.setData(device);
                        if (resetChannelsResult || sumNum ==0) {
                            result.setMsg("更新成功,共" + sumNum + "条,已更新" + catalogDataCatch.get(key).size() + "条");
                        boolean resetChannelsResult = storager.resetChannels(device.getDeviceId(), catalogDataCatch.get(device.getDeviceId()));
                        if (!resetChannelsResult) {
                            String errorMsg = "接收成功,写入失败,共" + sumNum + "条,已接收" + catalogDataCatch.get(device.getDeviceId()).size() + "条";
                            catalogDataCatch.setChannelSyncEnd(device.getDeviceId(), errorMsg);
                        }else {
                            result.setMsg("接收成功,写入失败,共" + sumNum + "条,已接收" + catalogDataCatch.get(key).size() + "条");
                            catalogDataCatch.setChannelSyncEnd(device.getDeviceId(), null);
                        }
                        msg.setData(result);
                        deferredResultHolder.invokeAllResult(msg);
                        catalogDataCatch.del(key);
                    }
                }
                // 回复200 OK
@@ -229,21 +217,26 @@
    }
    public SyncStatus getChannelSyncProgress(String deviceId) {
        String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;
        if (catalogDataCatch.get(key) == null) {
        if (catalogDataCatch.get(deviceId) == null) {
            return null;
        }else {
            return catalogDataCatch.getSyncStatus(key);
            return catalogDataCatch.getSyncStatus(deviceId);
        }
    }
    public void setChannelSyncReady(String deviceId) {
        String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;
        catalogDataCatch.addReady(key);
    public boolean isSyncRunning(String deviceId) {
        if (catalogDataCatch.get(deviceId) == null) {
            return false;
        }else {
            return catalogDataCatch.isSyncRunning(deviceId);
        }
    }
    public void setChannelSyncReady(Device device, int sn) {
        catalogDataCatch.addReady(device, sn);
    }
    public void setChannelSyncEnd(String deviceId, String errorMsg) {
        String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;
        catalogDataCatch.setChannelSyncEnd(key, errorMsg);
        catalogDataCatch.setChannelSyncEnd(deviceId, errorMsg);
    }
}
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
@@ -81,7 +81,7 @@
        return result;
    }
    public int createRTPServer(MediaServerItem mediaServerItem, String streamId) {
    public int createRTPServer(MediaServerItem mediaServerItem, String streamId, int ssrc) {
        int result = -1;
        // 查询此rtp server 是否已经存在
        JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaServerItem, streamId);
@@ -94,6 +94,7 @@
        param.put("enable_tcp", 1);
        param.put("stream_id", streamId);
        param.put("port", 0);
        param.put("ssrc", ssrc);
        JSONObject openRtpServerResultJson = zlmresTfulUtils.openRtpServer(mediaServerItem, param);
        if (openRtpServerResultJson != null) {
src/main/java/com/genersoft/iot/vmp/service/IDeviceService.java
@@ -44,15 +44,15 @@
    SyncStatus getChannelSyncStatus(String deviceId);
    /**
     * 设置通道同步状态
     * 查看是否仍在同步
     * @param deviceId 设备ID
     * @return
     */
    void setChannelSyncReady(String deviceId);
    Boolean isSyncRunning(String deviceId);
    /**
     * 设置同步结束
     * @param deviceId 设备ID
     * @param errorMsg 错误信息
     * 通道同步
     * @param device
     */
    void setChannelSyncEnd(String deviceId, String errorMsg);
    void sync(Device device);
}
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
@@ -44,9 +44,9 @@
    void updateVmServer(List<MediaServerItem>  mediaServerItemList);
    SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId);
    SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean ssrcCheck);
    SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean isPlayback);
    SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean ssrcCheck, boolean isPlayback);
    void closeRTPServer(String deviceId, String channelId, String ssrc);
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
@@ -41,10 +41,6 @@
        if (device == null || device.getSubscribeCycleForCatalog() < 0) {
            return false;
        }
        CatalogSubscribeTask task = (CatalogSubscribeTask)dynamicTask.get(device.getDeviceId() + "catalog");
        if (task != null && task.getDialogState() != null && task.getDialogState().equals(DialogState.CONFIRMED)) { // 已存在不需要再次添加
            return true;
        }
        logger.info("[添加目录订阅] 设备{}", device.getDeviceId());
        // 添加目录订阅
        CatalogSubscribeTask catalogSubscribeTask = new CatalogSubscribeTask(device, sipCommander);
@@ -71,10 +67,6 @@
            return false;
        }
        logger.info("[添加移动位置订阅] 设备{}", device.getDeviceId());
        MobilePositionSubscribeTask task = (MobilePositionSubscribeTask)dynamicTask.get(device.getDeviceId() + "mobile_position");
        if (task != null &&  task.getDialogState() != null && task.getDialogState().equals(DialogState.CONFIRMED)) { // 已存在不需要再次添加
            return true;
        }
        // 添加目录订阅
        MobilePositionSubscribeTask mobilePositionSubscribeTask = new MobilePositionSubscribeTask(device, sipCommander);
        // 提前开始刷新订阅
@@ -100,12 +92,21 @@
    }
    @Override
    public void setChannelSyncReady(String deviceId) {
        catalogResponseMessageHandler.setChannelSyncReady(deviceId);
    public Boolean isSyncRunning(String deviceId) {
        return catalogResponseMessageHandler.isSyncRunning(deviceId);
    }
    @Override
    public void setChannelSyncEnd(String deviceId, String errorMsg) {
        catalogResponseMessageHandler.setChannelSyncEnd(deviceId, errorMsg);
    public void sync(Device device) {
        if (catalogResponseMessageHandler.isSyncRunning(device.getDeviceId())) {
            logger.info("开启同步时发现同步已经存在");
            return;
        }
        int sn = (int)((Math.random()*9+1)*100000);
        catalogResponseMessageHandler.setChannelSyncReady(device, sn);
        sipCommander.catalogQuery(device, sn, event -> {
            String errorMsg = String.format("同步通道失败,错误码: %s, %s", event.statusCode, event.msg);
            catalogResponseMessageHandler.setChannelSyncEnd(device.getDeviceId(), errorMsg);
        });
    }
}
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -117,12 +117,12 @@
    }
    @Override
    public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId) {
        return openRTPServer(mediaServerItem, streamId, false);
    public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean ssrcCheck) {
        return openRTPServer(mediaServerItem, streamId, ssrcCheck,false);
    }
    @Override
    public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean isPlayback) {
    public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean ssrcCheck, boolean isPlayback) {
        if (mediaServerItem == null || mediaServerItem.getId() == null) {
            return null;
        }
@@ -146,7 +146,7 @@
            }
            int rtpServerPort = mediaServerItem.getRtpProxyPort();
            if (mediaServerItem.isRtpEnable()) {
                rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId);
                rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId, ssrcCheck?Integer.parseInt(ssrc):0);
            }
            redisUtil.set(key, mediaServerItem);
            return new SSRCInfo(rtpServerPort, ssrc, streamId);
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -188,7 +188,7 @@
            if (mediaServerItem.isRtpEnable()) {
                streamId = String.format("%s_%s", device.getDeviceId(), channelId);
            }
            SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId);
            SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, device.isSsrcCheck());
            play(mediaServerItem, ssrcInfo, device, channelId, (mediaServerItemInUse, response)->{
                if (hookEvent != null) {
                    hookEvent.response(mediaServerItem, response);
@@ -232,7 +232,7 @@
            streamId = String.format("%s_%s", device.getDeviceId(), channelId);
        }
        if (ssrcInfo == null) {
            ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId);
            ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, device.isSsrcCheck());
        }
        // 超时处理
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
@@ -420,9 +420,6 @@
                                continue;
                            }
                            streamPushItemForPlatform.setPlatformId(platFormInfoArray[0]);
                            if (platFormInfoArray[0].equals("34020000002110000001")) {
                                System.out.println(111);
                            }
                            List<GbStream> gbStreamList = platformForEvent.get(platFormInfoArray[0]);
                            if (gbStreamList == null) {
                                gbStreamList = new ArrayList<>();
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
@@ -37,6 +37,7 @@
                "subscribeCycleForMobilePosition," +
                "mobilePositionSubmissionInterval," +
                "subscribeCycleForAlarm," +
                "ssrcCheck," +
                "online" +
            ") VALUES (" +
                "#{deviceId}," +
@@ -59,6 +60,7 @@
                "#{subscribeCycleForMobilePosition}," +
                "#{mobilePositionSubmissionInterval}," +
                "#{subscribeCycleForAlarm}," +
                "#{ssrcCheck}," +
                "#{online}" +
            ")")
    int add(Device device);
@@ -84,6 +86,7 @@
                "<if test=\"subscribeCycleForMobilePosition != null\">, subscribeCycleForMobilePosition=${subscribeCycleForMobilePosition}</if>" +
                "<if test=\"mobilePositionSubmissionInterval != null\">, mobilePositionSubmissionInterval=${mobilePositionSubmissionInterval}</if>" +
                "<if test=\"subscribeCycleForAlarm != null\">, subscribeCycleForAlarm=${subscribeCycleForAlarm}</if>" +
                "<if test=\"ssrcCheck != null\">, ssrcCheck=${ssrcCheck}</if>" +
                "WHERE deviceId='${deviceId}'"+
            " </script>"})
    int update(Device device);
src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java
@@ -16,10 +16,10 @@
    @Insert("INSERT INTO parent_platform (enable, name, serverGBId, serverGBDomain, serverIP, serverPort, deviceGBId, deviceIp,  " +
            "            devicePort, username, password, expires, keepTimeout, transport, characterSet, ptz, rtcp, " +
            "            status, shareAllLiveStream, catalogId) " +
            "            status, shareAllLiveStream, startOfflinePush, catalogId, administrativeDivision, catalogGroup) " +
            "            VALUES (${enable}, '${name}', '${serverGBId}', '${serverGBDomain}', '${serverIP}', ${serverPort}, '${deviceGBId}', '${deviceIp}', " +
            "            '${devicePort}', '${username}', '${password}', '${expires}', '${keepTimeout}', '${transport}', '${characterSet}', ${ptz}, ${rtcp}, " +
            "            ${status}, ${shareAllLiveStream}, #{catalogId})")
            "            ${status}, ${shareAllLiveStream},  ${startOfflinePush}, #{catalogId}, #{administrativeDivision}, #{catalogGroup})")
    int addParentPlatform(ParentPlatform parentPlatform);
    @Update("UPDATE parent_platform " +
@@ -42,6 +42,9 @@
            "rtcp=#{rtcp}, " +
            "status=#{status}, " +
            "shareAllLiveStream=#{shareAllLiveStream}, " +
            "startOfflinePush=${startOfflinePush}, " +
            "catalogGroup=#{catalogGroup}, " +
            "administrativeDivision=#{administrativeDivision}, " +
            "catalogId=#{catalogId} " +
            "WHERE id=#{id}")
    int updateParentPlatform(ParentPlatform parentPlatform);
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java
@@ -238,12 +238,15 @@
    @Override
    public boolean resetChannels(String deviceId, List<DeviceChannel> deviceChannelList) {
        if (deviceChannelList == null) {
            return false;
        }
        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
        // 数据去重
        List<DeviceChannel> channels = new ArrayList<>();
        StringBuilder stringBuilder = new StringBuilder();
        Map<String, Integer> subContMap = new HashMap<>();
        if (deviceChannelList.size() > 1) {
        if (deviceChannelList != null && deviceChannelList.size() > 1) {
            // 数据去重
            Set<String> gbIdSet = new HashSet<>();
            for (DeviceChannel deviceChannel : deviceChannelList) {
@@ -300,6 +303,7 @@
            dataSourceTransactionManager.commit(transactionStatus);     //手动提交
            return true;
        }catch (Exception e) {
            e.printStackTrace();
            dataSourceTransactionManager.rollback(transactionStatus);
            return false;
        }
@@ -415,10 +419,9 @@
        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
        boolean result = false;
        try {
            if (platformChannelMapper.delChannelForDeviceId(deviceId) <0  // 删除与国标平台的关联
                    || deviceChannelMapper.cleanChannelsByDeviceId(deviceId) < 0 // 删除他的通道
                    || deviceMapper.del(deviceId) < 0 // 移除设备信息
            ) {
            platformChannelMapper.delChannelForDeviceId(deviceId);
            deviceChannelMapper.cleanChannelsByDeviceId(deviceId);
            if ( deviceMapper.del(deviceId) < 0 ) {
                //事务回滚
                dataSourceTransactionManager.rollback(transactionStatus);
            }
@@ -517,6 +520,12 @@
    @Override
    public boolean updateParentPlatform(ParentPlatform parentPlatform) {
        int result = 0;
        if (parentPlatform.getCatalogGroup() == 0) {
            parentPlatform.setCatalogGroup(1);
        }
        if (parentPlatform.getAdministrativeDivision() == null) {
            parentPlatform.setAdministrativeDivision(parentPlatform.getAdministrativeDivision());
        }
        ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getServerGBId()); // .getDeviceGBId());
        if (parentPlatform.getId() == null ) {
            if (parentPlatform.getCatalogId() == null) {
@@ -536,6 +545,7 @@
                parentPlatformCatch.setId(parentPlatform.getServerGBId());
                redisCatchStorage.delPlatformCatchInfo(parentPlatById.getServerGBId());
            }
            result = platformMapper.updateParentPlatform(parentPlatform);
        }
        // 更新缓存
@@ -1071,7 +1081,7 @@
        deviceChannel.setParentId(catalog.getParentId());
        deviceChannel.setRegisterWay(1);
        // 行政区划应该是Domain的前八位
        deviceChannel.setCivilCode(parentPlatByServerGBId.getDeviceGBId().substring(0,6));
        deviceChannel.setCivilCode(parentPlatByServerGBId.getAdministrativeDivision());
        deviceChannel.setModel("live");
        deviceChannel.setOwner("wvp-pro");
        deviceChannel.setSecrecy("0");
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
@@ -164,20 +164,17 @@
            logger.debug("设备通道信息同步API调用,deviceId:" + deviceId);
        }
        Device device = storager.queryVideoDevice(deviceId);
        SyncStatus syncStatus = deviceService.getChannelSyncStatus(deviceId);
        boolean status = deviceService.isSyncRunning(deviceId);
        // 已存在则返回进度
        if (syncStatus != null && syncStatus.getErrorMsg() == null) {
        if (status) {
            WVPResult<SyncStatus> wvpResult = new WVPResult<>();
            wvpResult.setCode(0);
            wvpResult.setData(syncStatus);
            SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId);
            wvpResult.setData(channelSyncStatus);
            return wvpResult;
        }
        SyncStatus syncStatusReady = new SyncStatus();
        deviceService.setChannelSyncReady(deviceId);
        cmder.catalogQuery(device, event -> {
            String errorMsg = String.format("同步通道失败,错误码: %s, %s", event.statusCode, event.msg);
            deviceService.setChannelSyncEnd(deviceId, errorMsg);
        });
        deviceService.sync(device);
        WVPResult<SyncStatus> wvpResult = new WVPResult<>();
        wvpResult.setCode(0);
        wvpResult.setMsg("开始同步");
web_src/src/components/dialog/SyncChannelProgress.vue
@@ -61,14 +61,23 @@
          if (!this.syncFlag) {
            this.syncFlag = true;
          }
          if (res.data.data == null) {
          if (res.data.data != null) {
            if (res.data.data.total == 0) {
              if (res.data.data.errorMsg !== null ){
                this.msg = res.data.data.errorMsg;
                this.syncStatus = "exception"
              }else {
                this.msg = `等待同步中`;
                this.timmer = setTimeout(this.getProgress, 300)
              }
            }else  {
              if (res.data.data.total == res.data.data.current) {
            this.syncStatus = "success"
            this.percentage = 100;
            this.msg = '同步成功';
          }else if (res.data.data.total == 0){
            this.msg = `等待同步中`;
            this.timmer = setTimeout(this.getProgress, 300)
          }else if (res.data.data.errorMsg !== null ){
              }else {
                if (res.data.data.errorMsg !== null ){
            this.msg = res.data.data.errorMsg;
            this.syncStatus = "exception"
          }else {
@@ -78,6 +87,10 @@
            this.msg = `同步中...[${res.data.data.current}/${res.data.data.total}]`;
            this.timmer = setTimeout(this.getProgress, 300)
          }
              }
            }
          }
        }else {
          if (this.syncFlag) {
            this.syncStatus = "success"
web_src/src/components/dialog/catalogEdit.vue
@@ -13,11 +13,24 @@
      <div id="shared" style="margin-top: 1rem;margin-right: 100px;">
        <el-form ref="form" :rules="rules" :model="form" label-width="140px" >
          <el-form-item label="节点编号" prop="id" >
            <el-tooltip class="item" effect="dark" content="" placement="top-start">
              <div slot="content">
                建议的类型:
                <br/>
                &emsp;&emsp;行政区划(可选2位/4位/6位/8位/10位数字,例如:130432,表示河北省邯郸市广平县)
                <br/>
                &emsp;&emsp;业务分组(第11、12、13位215,例如:34020000002150000001)
                <br/>
                &emsp;&emsp;虚拟组织(第11、12、13位216,例如:34020000002160000001)
              </div>
            <el-input v-model="form.id" :disabled="isEdit"></el-input>
            </el-tooltip>
          </el-form-item>
          <el-form-item label="节点名称" prop="name">
            <el-input v-model="form.name" clearable></el-input>
          </el-form-item>
          <el-form-item>
            <div style="float: right;">
              <el-button type="primary" @click="onSubmit" >确认</el-button>
web_src/src/components/dialog/deviceEdit.vue
@@ -45,6 +45,9 @@
          <el-form-item v-if="form.subscribeCycleForMobilePosition > 0" label="移动位置报送间隔" prop="subscribeCycleForCatalog" >
            <el-input v-model="form.mobilePositionSubmissionInterval" clearable ></el-input>
          </el-form-item>
          <el-form-item label="其他选项">
            <el-checkbox label="SSRC校验" v-model="form.ssrcCheck" style="float: left"></el-checkbox>
          </el-form-item>
          <el-form-item>
            <div style="float: right;">
              <el-button type="primary" @click="onSubmit" >确认</el-button>
web_src/src/components/dialog/platformEdit.vue
@@ -44,6 +44,9 @@
              <el-form-item label="SIP认证用户名" prop="username">
                <el-input v-model="platform.username"></el-input>
              </el-form-item>
              <el-form-item label="行政区划" prop="administrativeDivision">
                <el-input v-model="platform.administrativeDivision" clearable></el-input>
              </el-form-item>
              <el-form-item label="SIP认证密码" prop="password">
                <el-input v-model="platform.password" ></el-input>
              </el-form-item>
@@ -63,6 +66,18 @@
                  <el-option label="TCP" value="TCP"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="目录分组" prop="catalogGroup">
                <el-select
                  v-model="platform.catalogGroup"
                  style="width: 100%"
                  placeholder="请选择目录分组"
                >
                  <el-option label="1" value="1"></el-option>
                  <el-option label="2" value="2"></el-option>
                  <el-option label="4" value="4"></el-option>
                  <el-option label="8" value="8"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="字符集" prop="characterSet">
                <el-select
                  v-model="platform.characterSet"
@@ -77,6 +92,7 @@
                <el-checkbox label="启用" v-model="platform.enable" @change="checkExpires"></el-checkbox>
                <el-checkbox label="云台控制" v-model="platform.ptz"></el-checkbox>
                <el-checkbox label="共享所有直播流" v-model="platform.shareAllLiveStream"></el-checkbox>
                <el-checkbox label="拉起离线推流" v-model="platform.startOfflinePush"></el-checkbox>
              </el-form-item>
              <el-form-item>
                <el-button type="primary" @click="onSubmit">{{
@@ -138,6 +154,9 @@
        transport: "UDP",
        characterSet: "GB2312",
        shareAllLiveStream: false,
        startOfflinePush: false,
        catalogGroup: 1,
        administrativeDivision: null,
      },
      rules: {
        name: [{ required: true, message: "请输入平台名称", trigger: "blur" }],
@@ -175,6 +194,7 @@
          that.platform.devicePort = res.data.devicePort;
          that.platform.username = res.data.username;
          that.platform.password = res.data.password;
          that.platform.administrativeDivision = res.data.username.substr(0, 6);
        }).catch(function (error) {
          console.log(error);
        });
@@ -199,6 +219,9 @@
        this.platform.characterSet = platform.characterSet;
        this.platform.shareAllLiveStream = platform.shareAllLiveStream;
        this.platform.catalogId = platform.catalogId;
        this.platform.startOfflinePush = platform.startOfflinePush;
        this.platform.catalogGroup = platform.catalogGroup;
        this.platform.administrativeDivision = platform.administrativeDivision;
        this.onSubmit_text = "保存";
        this.saveUrl = "/api/platform/save";
      }
@@ -213,6 +236,10 @@
    deviceGBIdChange: function () {
      this.platform.username = this.platform.deviceGBId ;
      if (this.platform.administrativeDivision == null) {
        this.platform.administrativeDivision = this.platform.deviceGBId.substr(0, 6);
      }
    },
    onSubmit: function () {
      var that = this;
@@ -253,6 +280,7 @@
        rtcp: false,
        name: null,
        serverGBId: null,
        administrativeDivision: null,
        serverGBDomain: null,
        serverIP: null,
        serverPort: null,
@@ -266,6 +294,8 @@
        transport: "UDP",
        characterSet: "GB2312",
        shareAllLiveStream: false,
        startOfflinePush: false,
        catalogGroup: 1,
      }
    },
    deviceGBIdExit: async function (deviceGbId) {