diff --git a/.gitignore b/.gitignore
index 51ebf9e9..776ebe10 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,7 +3,7 @@
# Log file
*.log
-
+logs/*
# BlueJ files
*.ctxt
@@ -27,3 +27,4 @@ hs_err_pid*
/target/
/src/main/resources/static/
+certificates
diff --git a/DOCKERFILE b/DOCKERFILE
index 96bc29bf..f2a2ffa0 100644
--- a/DOCKERFILE
+++ b/DOCKERFILE
@@ -1,3 +1,6 @@
+#很久没维护了,已经与定前版本不匹配
+
+
FROM ubuntu:20.04 AS build
ARG DEBIAN_FRONTEND=noninteractive
@@ -84,8 +87,8 @@ RUN echo '#!/bin/bash' > run.sh && \
echo 'nohup java -jar *.jar --userSettings.record=/opt/media/www/record/ &' >> run.sh && \
echo 'nohup /opt/media/MediaServer -d -m 3 &' >> run.sh && \
echo 'cd /opt/wvp' >> run.sh && \
- echo 'if [${WVP_CONFIG}]; then' >> run.sh && \
- echo ' java -jar *.jar --spring.confi g.location=/opt/wvp/config/application.yml --media.record-assist-port=18081 ${WVP_CONFIG}' >> run.sh && \
+ echo 'if [-n "${WVP_CONFIG}"]; then' >> run.sh && \
+ echo ' java -jar *.jar --spring.config.location=/opt/wvp/config/application.yml --media.record-assist-port=18081 ${WVP_CONFIG}' >> run.sh && \
echo 'else' >> run.sh && \
echo ' java -jar *.jar --spring.config.location=/opt/wvp/config/application.yml --media.record-assist-port=18081 --media.ip=127.0.0.1 --media.sdp-ip=${WVP_IP} --sip.ip=${WVP_IP} --media.stream-ip=${WVP_IP}' >> run.sh && \
echo 'fi' >> run.sh
diff --git a/README.md b/README.md
index e7645c60..b2eaf748 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
-# 开箱即用的的28181协议视频平台
+
+# 开箱即用的28181协议视频平台
[](https://travis-ci.org/xia-chu/ZLMediaKit)
[](https://github.com/xia-chu/ZLMediaKit/blob/master/LICENSE)
@@ -8,16 +8,16 @@
[](https://github.com/xia-chu/ZLMediaKit/pulls)
-WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的开箱即用的网络视频平台,负责实现核心信令与设备管理后台部分,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联,支持rtsp/rtmp等视频流转发到国标平台,支持rtsp/rtmp等推流转发到国标平台。
+WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的开箱即用的网络视频平台,负责实现核心信令与设备管理后台部分,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR接入。支持国标级联,支持将不带国标功能的摄像机/直播流/直播推流转发到其他国标平台。
-流媒体服务基于ZLMediaKit-https://github.com/xiongziliang/ZLMediaKit
-
-前端页面基于MediaServerUI进行修改.
+流媒体服务基于@夏楚 ZLMediaKit [https://github.com/ZLMediaKit/ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit)
+播放器使用@dexter jessibuca [https://github.com/langhuihui/jessibuca/tree/v3](https://github.com/langhuihui/jessibuca/tree/v3)
+前端页面基于@Kyle MediaServerUI [https://gitee.com/kkkkk5G/MediaServerUI](https://gitee.com/kkkkk5G/MediaServerUI) 进行修改.
# 应用场景:
支持浏览器无插件播放摄像头视频。
支持摄像机、平台、NVR等设备接入。
-支持国标级联。
+支持国标级联。多平台级联。跨网视频预览。
支持rtsp/rtmp等视频流转发到国标平台。
支持rtsp/rtmp等推流转发到国标平台。
@@ -25,66 +25,55 @@ WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的开箱即用的网
旨在打造一个易配置,易使用,便于维护的28181国标信令系统, 依托优秀的开源流媒体服务框架ZLMediaKit, 实现一个完整易用GB28181平台.
# 部署文档
-[https://github.com/648540858/wvp-GB28181-pro/wiki](https://github.com/648540858/wvp-GB28181-pro/wiki)
+[doc.wvp-pro.cn](https://doc.wvp-pro.cn)
# gitee同步仓库
https://gitee.com/pan648540858/wvp-GB28181-pro.git
# 截图
-
-
-
-
-
+
+
+
+
+
+
+
-# 1.0 基础特性
-1. 视频预览;
-2. 云台控制(方向、缩放控制);
-3. 视频设备信息同步;
-4. 离在线监控;
-5. 录像查询与回放(基于NVR\DVR,暂不支持快进、seek操作);
-6. 无人观看自动断流;
-7. 支持UDP和TCP两种国标信令传输模式;
-8. 集成web界面, 不需要单独部署前端服务, 直接利用wvp内置文件服务部署, 随wvp一起部署;
-9. 支持平台接入, 针对大平台大量设备的情况进行优化;
-10. 支持检索,通道筛选;
-11. 支持自动配置ZLM媒体服务, 减少因配置问题所出现的问题;
-12. 支持启用udp多端口模式, 提高udp模式下媒体传输性能;
-13. 支持通道是否含有音频的设置;
-14. 支持通道子目录查询;
-15. 支持udp/tcp国标流传输模式;
-16. 支持直接输出RTSP、RTMP、HTTP-FLV、Websocket-FLV、HLS多种协议流地址
-17. 支持国标网络校时
-18. 支持公网部署, 支持wvp与zlm分开部署
-19. 支持播放h265, g.711格式的流(需要将closeWaitRTPInfo设为false)
-20. 报警信息处理,支持向前端推送报警信息
-
-# 1.0 新支持特性
-1. 集成web界面, 不需要单独部署前端服务, 直接利用wvp内置文件服务部署, 随wvp一起部署;
-2. 支持平台接入, 针对大平台大量设备的情况进行优化;
-3. 支持检索,通道筛选;
-4. 支持自动配置ZLM媒体服务, 减少因配置问题所出现的问题;
-5. 支持启用udp多端口模式, 提高udp模式下媒体传输性能;
-6. 支持通道是否含有音频的设置;
-7. 支持通道子目录查询;
-8. 支持udp/tcp国标流传输模式;
-9. 支持直接输出RTSP、RTMP、HTTP-FLV、Websocket-FLV、HLS多种协议流地址
-10. 支持国标网络校时
-11. 支持公网部署, 支持wvp与zlm分开部署
-12. 支持播放h265, g.711格式的流
-13. 支持固定流地址和自动点播,同时支持未点播时直接播放流地址,代码自动发起点播. ( [查看WIKI](https://github.com/648540858/wvp-GB28181-pro/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%9B%BA%E5%AE%9A%E6%92%AD%E6%94%BE%E5%9C%B0%E5%9D%80%E4%B8%8E%E8%87%AA%E5%8A%A8%E7%82%B9%E6%92%AD))
-14. 报警信息处理,支持向前端推送报警信息
-15. 支持订阅与通知方法
- - [X] 移动位置订阅
- - [X] 移动位置通知处理
- - [X] 报警事件订阅
- - [X] 报警事件通知处理
- - [ ] 设备目录订阅
- - [X] 设备目录通知处理
-16. 移动位置查询和显示,可通过配置文件设置移动位置历史是否存储
-
-# 2.0 支持特性
-- [X] 国标通道向上级联
+# 功能特性
+- [X] 集成web界面
+- [X] 兼容性良好
+- [X] 支持电子地图,支持接入WGS84和GCJ02两种坐标系,并且自动转化为合适的坐标系进行展示和分发
+- [X] 接入设备
+ - [X] 视频预览
+ - [X] 无限制接入路数,能接入多少设备只取决于你的服务器性能
+ - [X] 云台控制,控制设备转向,拉近,拉远
+ - [X] 预置位查询,使用与设置
+ - [X] 查询NVR/IPC上的录像与播放,支持指定时间播放与下载
+ - [X] 无人观看自动断流,节省流量
+ - [X] 视频设备信息同步
+ - [X] 离在线监控
+ - [X] 支持直接输出RTSP、RTMP、HTTP-FLV、Websocket-FLV、HLS多种协议流地址
+ - [X] 支持通过一个流地址直接观看摄像头,无需登录以及调用任何接口
+ - [X] 支持UDP和TCP两种国标信令传输模式
+ - [X] 支持UDP和TCP两种国标流传输模式
+ - [X] 支持检索,通道筛选
+ - [X] 支持通道子目录查询
+ - [X] 支持过滤音频,防止杂音影响观看
+ - [X] 支持国标网络校时
+ - [X] 支持播放H264和H265
+ - [X] 报警信息处理,支持向前端推送报警信息
+ - [X] 支持订阅与通知方法
+ - [X] 移动位置订阅
+ - [X] 移动位置通知处理
+ - [X] 报警事件订阅
+ - [X] 报警事件通知处理
+ - [X] 设备目录订阅
+ - [X] 设备目录通知处理
+ - [X] 移动位置查询和显示
+ - [X] 支持手动添加设备和给设备设置单独的密码
+- [X] 支持平台对接接入
+- [X] 支持国标级联
+ - [X] 国标通道向上级联
- [X] WEB添加上级平台
- [X] 注册
- [X] 心跳保活
@@ -95,33 +84,47 @@ https://gitee.com/pan648540858/wvp-GB28181-pro.git
- [X] 平台状态查询
- [X] 平台信息查询
- [X] 平台远程启动
-- [X] 添加RTSP视频
-- [X] 添加接口鉴权
-- [ ] 添加ONVIF探测局域网内的设备
-- [X] 添加RTMP视频
-- [X] 云端录像(需要部署单独服务配合使用)
+ - [X] 每个级联平台可自定义的虚拟目录
+ - [X] 目录订阅与通知
+ - [X] 录像查看与播放
+ - [X] GPS订阅与通知(直播推流)
+- [X] 支持自动配置ZLM媒体服务, 减少因配置问题所出现的问题;
- [X] 多流媒体节点,自动选择负载最低的节点使用。
-- [X] 支持使用mysql作为数据库,默认sqlite3,开箱即用。
-- [ ] 添加系统配置
-- [ ] 添加用户管理
-- [X] WEB端支持播放H264与H265,音频支持G.711A/G.711U/AAC,覆盖国标常用编码格式。
+- [X] 支持启用udp多端口模式, 提高udp模式下媒体传输性能;
+- [X] 支持公网部署;
+- [X] 支持wvp与zlm分开部署,提升平台并发能力
+- [X] 支持拉流RTSP/RTMP,分发为各种流格式,或者推送到其他国标平台
+- [X] 支持推流RTSP/RTMP,分发为各种流格式,或者推送到其他国标平台
+- [X] 支持推流鉴权
+- [X] 支持接口鉴权
+- [X] 云端录像,推流/代理/国标视频均可以录制在云端服务器,支持预览和下载
+
-# docker快速体验
-```shell
-docker pull 648540858/wvp_pro
-
-docker run --env WVP_IP="你的IP" -it -p 18080:18080 -p 30000-30500:30000-30500/udp -p 30000-30500:30000-30500/tcp -p 80:80 -p 5060:5060 -p 5060:5060/udp 648540858/wvp_pro
-```
-docker使用详情查看:[https://hub.docker.com/r/648540858/wvp_pro](https://hub.docker.com/r/648540858/wvp_pro)
-
-# gitee同步仓库
-https://gitee.com/pan648540858/wvp-GB28181-pro.git
+# 遇到问题如何解决
+国标最麻烦的地方在于设备的兼容性,所以需要大量的设备来测试,目前作者手里的设备有限,再加上作者水平有限,所以遇到问题在所难免;
+1. 查看wiki,仔细的阅读可以帮你避免几乎所有的问题
+2. 搜索issues,这里有大部分的答案
+3. 加QQ群(901799015),这里有大量热心的小伙伴,但是前提新希望你已经仔细阅读了wiki和搜索了issues。
+4. 你可以请作者为你解答,但是我不是免费的。
+5. 你可以把遇到问题的设备寄给我,可以更容易的复现问题。
# 使用帮助
-QQ群: 901799015, 690854210(ZLM大群)
+QQ群: 901799015, ZLM使用文档[https://github.com/ZLMediaKit/ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit)
QQ私信一般不回, 精力有限.欢迎大家在群里讨论.觉得项目对你有帮助,欢迎star和提交pr。
+# 授权协议
+本项目自有代码使用宽松的MIT协议,在保留版权信息的情况下可以自由应用于各自商用、非商业的项目。 但是本项目也零碎的使用了一些其他的开源代码,在商用的情况下请自行替代或剔除; 由于使用本项目而产生的商业纠纷或侵权行为一概与本项目及开发者无关,请自行承担法律风险。 在使用本项目代码时,也应该在授权协议中同时表明本项目依赖的第三方库的协议
# 致谢
-感谢作者[夏楚](https://github.com/xia-chu) 提供这么棒的开源流媒体服务框架
+感谢作者[夏楚](https://github.com/xia-chu) 提供这么棒的开源流媒体服务框架,并在开发过程中给予支持与帮助。
+感谢作者[dexter langhuihui](https://github.com/langhuihui) 开源这么好用的WEB播放器。
+感谢作者[Kyle](https://gitee.com/kkkkk5G) 开源了好用的前端页面
+感谢各位大佬的赞助以及对项目的指正与帮助。包括但不限于代码贡献、问题反馈、资金捐赠等各种方式的支持!以下排名不分先后:
+[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) [Albertzhu666](https://github.com/Albertzhu666)
+[mk1990](https://github.com/mk1990) [SaltFish001](https://github.com/SaltFish001)
+
+ps: 刚增加了这个名单,肯定遗漏了一些大佬,欢迎大佬联系我添加。
diff --git a/bootstrap.sh b/bootstrap.sh
new file mode 100644
index 00000000..0f3c4c97
--- /dev/null
+++ b/bootstrap.sh
@@ -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
+
diff --git a/doc/README.md b/doc/README.md
new file mode 100644
index 00000000..0fb5b86d
--- /dev/null
+++ b/doc/README.md
@@ -0,0 +1,102 @@
+# 介绍
+
+> 开箱即用的28181协议视频平台
+
+# 概述
+- WVP-PRO基于GB/T 28181-2016标准实现的流媒体平台,依托优秀的开源流媒体服务[ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit),提供完善丰富的功能。
+- GB/T 28181-2016 中文标准名称是《公共安全视频监控联网系统信息传输、交换、控制技术要求》是监控领域的国家标准。大量应用于政府视频平台。
+- 通过28181协议你可以将IPC摄像头接入平台,可以观看也可以使用28181/rtsp/rtmp/flv等协议将视频流分发到其他平台。
+
+# 特性
+- 实现标准的28181信令,兼容常见的品牌设备,比如海康、大华、宇视等品牌的IPC、NVR以及平台。
+- 支持将国标设备级联到其他国标平台,也支持将不支持国标的设备的图像或者直播推送到其他国标平台
+- 前端完善,自带完整前端页面,无需二次开发可直接部署使用。
+- 完全开源,且使用MIT许可协议。保留版权的情况下可以用于商业项目。
+- 支持多流媒体节点负载均衡。
+
+# 我们实现了哪些国标功能
+**作为上级平台**
+- [X] 注册
+- [X] 注销
+- [X] 实时视音频点播
+- [X] 设备控制
+ - [X] 云台控制
+ - [X] 远程启动
+ - [X] 录像控制
+ - [X] 报警布防/撤防
+ - [X] 报警复位
+ - [X] 强制关键帧
+ - [X] 拉框放大
+ - [X] 拉框缩小
+ - [X] 看守位控制
+ - [X] 设备配置
+- [X] 报警事件通知和分发
+- [X] 设备目录订阅
+- [X] 网络设备信息查询
+ - [X] 设备目录查询
+ - [X] 设备状态查询
+ - [X] 设备配置查询
+ - [X] 设备预置位查询
+- [X] 状态信息报送
+- [X] 设备视音频文件检索
+- [X] 历史视音频的回放
+ - [X] 播放
+ - [X] 暂停
+ - [X] 进/退
+ - [X] 停止
+- [X] 视音频文件下载
+- [X] 校时
+- [X] 订阅和通知
+ - [X] 事件订阅
+ - [X] 移动设备位置订阅
+ - [X] 报警订阅
+ - [X] 目录订阅
+- [ ] 语音广播
+- [ ] 语音对讲
+
+**作为下级平台**
+- [X] 注册
+- [X] 注销
+- [X] 实时视音频点播
+- [ ] 设备控制
+ - [ ] 云台控制
+ - [ ] 远程启动
+ - [ ] 录像控制
+ - [ ] 报警布防/撤防
+ - [ ] 报警复位
+ - [ ] 强制关键帧
+ - [ ] 拉框放大
+ - [ ] 拉框缩小
+ - [ ] 看守位控制
+ - [ ] 设备配置
+- [ ] 报警事件通知和分发
+- [X] 设备目录订阅
+- [X] 网络设备信息查询
+ - [X] 设备目录查询
+ - [X] 设备状态查询
+ - [ ] 设备配置查询
+ - [ ] 设备预置位查询
+- [X] 状态信息报送
+- [X] 设备视音频文件检索
+- [X] 历史视音频的回放
+ - [X] 播放
+ - [x] 暂停
+ - [x] 进/退
+ - [x] 停止
+- [ ] 视音频文件下载
+- [ ] ~~校时~~
+- [X] 订阅和通知
+ - [X] 事件订阅
+ - [X] 移动设备位置订阅
+ - [ ] 报警订阅
+ - [X] 目录订阅
+- [ ] 语音广播
+- [ ] 语音对讲
+
+
+
+
+# 社区
+代码目前托管在GitHub和Gitee,Gitee目前作为加速仓库使用,不接受issue。
+GitHub: [https://github.com/648540858/wvp-GB28181-pro](https://github.com/648540858/wvp-GB28181-pro)
+Gitee: [https://gitee.com/pan648540858/wvp-GB28181-pro](https://gitee.com/pan648540858/wvp-GB28181-pro)
\ No newline at end of file
diff --git a/doc/_content/ability/_media/cascade1.png b/doc/_content/ability/_media/cascade1.png
new file mode 100644
index 00000000..9ba8280b
Binary files /dev/null and b/doc/_content/ability/_media/cascade1.png differ
diff --git a/doc/_content/ability/_media/cascade2.png b/doc/_content/ability/_media/cascade2.png
new file mode 100644
index 00000000..4dd62cf2
Binary files /dev/null and b/doc/_content/ability/_media/cascade2.png differ
diff --git a/doc/_content/ability/_media/cascade3.png b/doc/_content/ability/_media/cascade3.png
new file mode 100644
index 00000000..f95f5d5a
Binary files /dev/null and b/doc/_content/ability/_media/cascade3.png differ
diff --git a/doc/_content/ability/_media/cascade4.png b/doc/_content/ability/_media/cascade4.png
new file mode 100644
index 00000000..9db85b55
Binary files /dev/null and b/doc/_content/ability/_media/cascade4.png differ
diff --git a/doc/_content/ability/_media/img.png b/doc/_content/ability/_media/img.png
new file mode 100644
index 00000000..6a0c550d
Binary files /dev/null and b/doc/_content/ability/_media/img.png differ
diff --git a/doc/_content/ability/_media/img_1.png b/doc/_content/ability/_media/img_1.png
new file mode 100644
index 00000000..31995c3c
Binary files /dev/null and b/doc/_content/ability/_media/img_1.png differ
diff --git a/doc/_content/ability/_media/img_10.png b/doc/_content/ability/_media/img_10.png
new file mode 100644
index 00000000..030502d0
Binary files /dev/null and b/doc/_content/ability/_media/img_10.png differ
diff --git a/doc/_content/ability/_media/img_11.png b/doc/_content/ability/_media/img_11.png
new file mode 100644
index 00000000..cb0f3d51
Binary files /dev/null and b/doc/_content/ability/_media/img_11.png differ
diff --git a/doc/_content/ability/_media/img_12.png b/doc/_content/ability/_media/img_12.png
new file mode 100644
index 00000000..d6fe8777
Binary files /dev/null and b/doc/_content/ability/_media/img_12.png differ
diff --git a/doc/_content/ability/_media/img_13.png b/doc/_content/ability/_media/img_13.png
new file mode 100644
index 00000000..6be1128f
Binary files /dev/null and b/doc/_content/ability/_media/img_13.png differ
diff --git a/doc/_content/ability/_media/img_14.png b/doc/_content/ability/_media/img_14.png
new file mode 100644
index 00000000..24712045
Binary files /dev/null and b/doc/_content/ability/_media/img_14.png differ
diff --git a/doc/_content/ability/_media/img_15.png b/doc/_content/ability/_media/img_15.png
new file mode 100644
index 00000000..f167811d
Binary files /dev/null and b/doc/_content/ability/_media/img_15.png differ
diff --git a/doc/_content/ability/_media/img_16.png b/doc/_content/ability/_media/img_16.png
new file mode 100644
index 00000000..f7ce9e7a
Binary files /dev/null and b/doc/_content/ability/_media/img_16.png differ
diff --git a/doc/_content/ability/_media/img_17.png b/doc/_content/ability/_media/img_17.png
new file mode 100644
index 00000000..02b303e3
Binary files /dev/null and b/doc/_content/ability/_media/img_17.png differ
diff --git a/doc/_content/ability/_media/img_18.png b/doc/_content/ability/_media/img_18.png
new file mode 100644
index 00000000..5ca4faf9
Binary files /dev/null and b/doc/_content/ability/_media/img_18.png differ
diff --git a/doc/_content/ability/_media/img_2.png b/doc/_content/ability/_media/img_2.png
new file mode 100644
index 00000000..f9f2f55f
Binary files /dev/null and b/doc/_content/ability/_media/img_2.png differ
diff --git a/doc/_content/ability/_media/img_3.png b/doc/_content/ability/_media/img_3.png
new file mode 100644
index 00000000..efe688cf
Binary files /dev/null and b/doc/_content/ability/_media/img_3.png differ
diff --git a/doc/_content/ability/_media/img_4.png b/doc/_content/ability/_media/img_4.png
new file mode 100644
index 00000000..f548cec7
Binary files /dev/null and b/doc/_content/ability/_media/img_4.png differ
diff --git a/doc/_content/ability/_media/img_5.png b/doc/_content/ability/_media/img_5.png
new file mode 100644
index 00000000..6959c780
Binary files /dev/null and b/doc/_content/ability/_media/img_5.png differ
diff --git a/doc/_content/ability/_media/img_6.png b/doc/_content/ability/_media/img_6.png
new file mode 100644
index 00000000..04c42bc1
Binary files /dev/null and b/doc/_content/ability/_media/img_6.png differ
diff --git a/doc/_content/ability/_media/img_7.png b/doc/_content/ability/_media/img_7.png
new file mode 100644
index 00000000..1a8edbf0
Binary files /dev/null and b/doc/_content/ability/_media/img_7.png differ
diff --git a/doc/_content/ability/_media/img_8.png b/doc/_content/ability/_media/img_8.png
new file mode 100644
index 00000000..02fa66f1
Binary files /dev/null and b/doc/_content/ability/_media/img_8.png differ
diff --git a/doc/_content/ability/_media/img_9.png b/doc/_content/ability/_media/img_9.png
new file mode 100644
index 00000000..708e901a
Binary files /dev/null and b/doc/_content/ability/_media/img_9.png differ
diff --git a/doc/_content/ability/auto_play.md b/doc/_content/ability/auto_play.md
new file mode 100644
index 00000000..5259e0b5
--- /dev/null
+++ b/doc/_content/ability/auto_play.md
@@ -0,0 +1,2 @@
+
+# 自动点播
diff --git a/doc/_content/ability/cascade.md b/doc/_content/ability/cascade.md
new file mode 100644
index 00000000..7942bda4
--- /dev/null
+++ b/doc/_content/ability/cascade.md
@@ -0,0 +1,34 @@
+
+# 国标级联的使用
+国标28181不同平台之间支持两种连接方式,平级和上下级,WVP目前支持向上级级联。
+## 1 接入平台
+### 1.1 wvp-pro
+#### 1.1.1 wvp-pro管理页面点击添加
+ 
+#### 1.1.2 填入wvp-pro上级平台信息
+ 
+ 
+#### 1.1.3 编辑wvp-pro上级设备信息,开启订阅
+ 
+### 1.2 大华平台
+### 1.3 海康平台
+### 1.4 liveGBS
+#### 1.4.1. wvp-pro管理页面点击添加
+ 
+#### 1.4.2. 填入liveGBS平台信息
+ 
+ 
+#### 1.4.3. 编辑liveGBS设备信息,开启目录订阅
+ 
+#### 1.4.4. 编辑liveGBS设备信息,开启GPS订阅
+ 
+
+## 2 添加目录与通道
+1. 级联平台添加目录信息
+ 
+2. 为目录添加通道
+ 
+3. 设置默认流目录
+如果需要后续自动生成的流信息都在某一个节点下,可以在对应节点右键设置为默认
+ 
+
diff --git a/doc/_content/ability/cascade2.md b/doc/_content/ability/cascade2.md
new file mode 100644
index 00000000..7bd6c792
--- /dev/null
+++ b/doc/_content/ability/cascade2.md
@@ -0,0 +1,18 @@
+
+# 国标级联的使用
+国标28181不同平台之间支持两种连接方式,平级和上下级,WVP目前支持向上级级联。
+## 添加上级平台
+在国标级联页面点击“添加”按钮,以推送到上级WVP为例子,参看[接入设备](./_content/ability/device.md)
+
+点击保存可以在上级的国标通道列表看到新增加的设备;
+国标级联列表出现了级联的这个平台;同时状态显示为在线,如果状态为离线那么可能是你的服务信息配置有误或者网络不通。
+订阅信息列有三个图标,表示上级开启订阅,从左到右依次是:报警订阅,目录订阅,移动位置订阅。
+## 推送通道
+点击你要推送的平台的“选择通道”按钮。
+
+- **页面结构**
+ - 左侧为目录结构
+ 选择未分配,则右侧显示待分配的通道,可以点击“添加按钮”,在弹窗中选择要放置的位置,保存后即可添加通道成功
+ 选择其他的目录可以看到已经分配在这个目录下的通道,可以对其进行删除后重新在未分配中去分配。
+ - 右侧为数据展示以及操作
+ 国标通道栏内为来自其他国标设备/平台的通道;直播流通道为来自推流/拉流代理的通道。
\ No newline at end of file
diff --git a/doc/_content/ability/cloud_record.md b/doc/_content/ability/cloud_record.md
new file mode 100644
index 00000000..4ac4f8f1
--- /dev/null
+++ b/doc/_content/ability/cloud_record.md
@@ -0,0 +1,8 @@
+
+# 云端录像
+云端录像是对录制在zlm服务下的录像文件的管理,录像的文件路径默认在ZLM/www/record下,使用云端录像功能必须部署wvp-pro-assist,主要通过调用wvp-pro-assist的接口完成各种功能。
+如果你需要24小时的录像,目前有一个这种方案,可以参考[7*24不间断录像](./_content/ability/continuous_recording.md)。
+1. 云段录像支持录像文件的查看,播放(可能因为编码的原因导致无法播放);
+2. 支持录像的下载;
+3. 支持录像的合并下载;
+功能没有太多特殊的地方就不一一介绍了,大家自行体验吧。
diff --git a/doc/_content/ability/continuous_recording.md b/doc/_content/ability/continuous_recording.md
new file mode 100644
index 00000000..516830fd
--- /dev/null
+++ b/doc/_content/ability/continuous_recording.md
@@ -0,0 +1,14 @@
+
+# 7*24不间断录像
+
+目前如果要实现不间断录像如果只是关闭无人观看停止推流是不够的,设备可能经历断网,重启,都会导致录像的中断,目前给大家提供一种可用的临时方案。
+
+**原理:** wvp支持使用流地址自动点播,即你拿到一个流地址直接去播放,即使设备处于未点播状态,wvp会自动帮你点播;ZLM
+的拉流代理成功后会无限重试,只要流一恢复就可以拉起来,基于这两个原理。
+**方案如下:**
+1. wvp的配置中user-settings->auto-apply-play设置为团true,开启自动点播;
+2. 点击你要录像的通道,点击播放页面左下角的“更多地址”,点击rtsp,此时复制了rtsp地址到剪贴板;
+3. 在拉流代理中添加一路流,地址填写你复制的地址,启用成功即可。
+**前提:**
+1. wvp使用多端口收流,不然你无法得到一个固定的流地址,也就无法实现自动点播。
+
diff --git a/doc/_content/ability/device.md b/doc/_content/ability/device.md
new file mode 100644
index 00000000..ceed545e
--- /dev/null
+++ b/doc/_content/ability/device.md
@@ -0,0 +1,36 @@
+
+# 接入设备
+设备接入主要是需要在设备上配置28181上级也就是WVP-PRO的信息,只有信息一致的情况才可以注册成功。设备注册成功后打开WVP->国标设备,可以看到新增加的设备;[设备使用](./_content/ability/device_use.md),
+主要有以下字段需要配置:
+
+- sip->ip
+本机IP,不要使用127.0.0.1/0.0.0.0, 除非你对项目及其熟悉
+
+- sip->port
+28181服务监听的端口
+
+- sip->domain
+domain宜采用ID统一编码的前十位编码。
+
+- sip->id
+28181服务ID
+
+- sip->password
+28181服务密码
+
+- 配置信息在如下位置
+
+
+***
+## 大华摄像头
+
+## 大华NVR
+
+## 艾科威视摄像头
+
+## 水星摄像头
+
+## 海康摄像头
+
+
+[设备使用](_content/ability/device_use.md)
diff --git a/doc/_content/ability/device_use.md b/doc/_content/ability/device_use.md
new file mode 100644
index 00000000..c406b3bb
--- /dev/null
+++ b/doc/_content/ability/device_use.md
@@ -0,0 +1,35 @@
+
+# 设备使用
+### 更新设备通道
+ 点击列表末尾的“刷新”按钮,可以看到一个圆形进度条,等进度结束提示成功后即可更新完成,如果通道数量有变化你可以看点击左上角的即可看到通道数量的变化;如果通道数量仍未0,那么可能时对方尚未推送通道给你。
+### 查看设备通道
+ 点击列表末尾的“通道”按钮,
+### 查看设备定位
+ 点击列表末尾的“定位”按钮,即可跳转到地图页面看到设备的位置
+### 编辑设备在WVP中一些功能
+点击列表末尾的“编辑”按钮,即可在打开的弹窗中对设备功能进行修改
+- 设备名称
+ 如何未能从设备里读取到设备名称或者需要自己重命名,那么可以修改此选项。
+- 字符集
+ 修改读取设备数据时使用的字符集,默认为GB2312,但是GB2312收录的汉字不全,所以有时候回遇到乱码,可以修改为UTF-8来解决。
+- 地理坐标系
+ 展示此设备定位信息时使用的设用什么坐标系来解析经纬度,一般不用修改,如果遇到定位不准,可以修改尝试修改此选项解决。
+- 目录结构
+ 展示设备的通道信息时,使用设备作为树形结构的依据,国标28181定义了两种树形结构,详情查看[国标28181的树形结构](./_content/theory/channel_tree.md);
+- 目录订阅
+ 填写订阅周期即可对设备开启目录订阅,设备如果支持目录订阅那么设备在通道信息发生变化时就会通知WVP哪些通道发生了那些变化,包括通道增加/删除/更新/上线/下线/视频丢失/故障。0为取消订阅。
+ 一般NVR和平台对接可以开启此选项,直接接摄像机开启此选项意义不大。
+- 移动位置订阅
+ 对设备开启移动位置订阅,设备如果支持目录订阅那么设备位置发生变化时会通知到WVP,一般执法记录仪可以开启此选项,对固定位置的设备意义不大。
+- SSRC校验
+ 为了解决部分设备出现的串流问题,可以打开此选项。ZLM会严格按照给定的ssrc处理视频流。部分设备流信息不标准,开启可能导致无法点播。
+### 删除设备
+ 可以删除WVP中的设备信息,如果设备28181配置未更改,那么设备在下一次注册后仍然会注册上来。
+### 点播视频
+ 进入通道列表后,点击列表末尾的“播放”按钮,稍等即可弹出播放页面
+### 设备录像
+ 进入通道列表后,点击列表末尾的“设备录像”按钮,也可以在播放页面点击录像查询进入录像查看页面,选择要查看的日期即可对录像进行播放和下载。
+### 云台控制
+ 可以对支持云台功能的设备进行上下左右的转动以及拉近拉远的操作。
+### 获取视频的播放器地址
+ 视频点播成功后在实时视频页面,点击“更多地址”可以看到所有的播放地址,地址是否可以播放与你是否完整编译启用zlm功能有关,更与网络有关。
\ No newline at end of file
diff --git a/doc/_content/ability/gis.md b/doc/_content/ability/gis.md
new file mode 100644
index 00000000..8796dba0
--- /dev/null
+++ b/doc/_content/ability/gis.md
@@ -0,0 +1,37 @@
+
+# 电子地图
+WVP提供了简单的电子地图用于设备的定位以及移动设备的轨迹信息,电子地图基于开源的地图引擎openlayers开发。
+### 查看设备定位
+1. 可以在设备列表点击“定位”按钮,自动跳转到电子地图页面;
+2. 在电子地图页面在设备上右键点击“定位”获取设备/平台下的所有通道位置。
+3. 单击通道信息可以定位到具体的通道
+
+
+### 查询设备轨迹
+查询轨迹需要提前配置save-position-history选项开启轨迹信息的保存,目前WVP此处未支持分库分表,对于大数据量的轨迹信息无法胜任,有需求请自行二次开发或者定制开发。
+在电子地图页面在设备上右键点击“查询轨迹”获取设备轨迹信息。
+
+PS: 目前的底图仅用用作演示和学习,商用情况请自行购买授权使用。
+
+### 更换底图以及底图配置
+目前WVP支持使用了更换底图,配置文件在web_src/static/js/mapConfig.js,请修改后重新编译前端文件。
+```javascript
+window.mapParam = {
+ // 开启/关闭地图功能
+ enable: true,
+ // 坐标系 GCJ-02 WGS-84,
+ coordinateSystem: "GCJ-02",
+ // 地图瓦片地址
+ tilesUrl: "http://webrd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8",
+ // 瓦片大小
+ tileSize: 256,
+ // 默认层级
+ zoom:10,
+ // 默认地图中心点
+ center:[116.41020, 39.915119],
+ // 地图最大层级
+ maxZoom:18,
+ // 地图最小层级
+ minZoom: 3
+}
+```
diff --git a/doc/_content/ability/node_manger.md b/doc/_content/ability/node_manger.md
new file mode 100644
index 00000000..1b4aef32
--- /dev/null
+++ b/doc/_content/ability/node_manger.md
@@ -0,0 +1,9 @@
+
+# 节点管理
+WVP支持单个WVP多个ZLM的方案来扩展WVP的视频并发能力,并发点播是因为带宽和性能的原因,单个ZLM节点能支持的路数有限,所以WVP增加了ZLM集群来扩展并发并且保证ZLM的高可用。
+## 默认节点
+WVP中为了保证功能的完整性,ZLM节点至少要有一个默认节点,这个节点不是在管理页面添加的,而是在WVP的配置文件中配置的,这个节点不可在页面删除。每次启动会自动从配置文件中读取配置写入数据库备用。
+## 新增节点
+启动你要添加的zlm节点,然后点击“添加节点”按钮输入zlm的ip, http端口,SECRET。点击测试测试完成则开始对节点进行详细的设置,如果你的zlm是使用docker启动的,可能存在zlm使用的端口与宿主机端口不一致的情况,需要在这里一一配置。
+## wvp使用多个节点的原理
+wvp会把连接的节点统一记录在redis中,并记录zlm的负载情况,当新的请求到来时,会取出负载最低的那个zlm进行使用。以此保证节点负载均衡。
diff --git a/doc/_content/ability/online_doc.md b/doc/_content/ability/online_doc.md
new file mode 100644
index 00000000..55ecb268
--- /dev/null
+++ b/doc/_content/ability/online_doc.md
@@ -0,0 +1,2 @@
+
+# 在线文档
diff --git a/doc/_content/ability/proxy.md b/doc/_content/ability/proxy.md
new file mode 100644
index 00000000..74e632d8
--- /dev/null
+++ b/doc/_content/ability/proxy.md
@@ -0,0 +1,24 @@
+
+# 拉流代理
+不是所有的摄像机都支持国标或者推流的,但是这些设备可以得到一个视频播放地址,通常为rtsp协议,
+以大华为例:
+```text
+rtsp://{user}:{passwd}@{ipc_ip}:{rtsp_port}/cam/realmonitor?channel=1&subtype=0
+```
+可以得到这样一个流地址,可以直接用vlc进行播放,此时我们可以通过拉流代理功能将这个设备推送给其他国标平台了。
+流程如下:
+```plantuml
+@startuml
+"摄像机" <- "ZLMediaKit": 1. 流去流信息到ZLM
+"ZLMediaKit" -> "WVP-PRO": 2. 收到hook通知得到流信息
+"上级国标平台" -> "WVP-PRO": 3. 点播这路视频
+"WVP-PRO" -> "ZLMediaKit": 4. 通知推流到上级国标平台
+@enduml
+```
+## 添加代理
+拉流代理支持两种方式:
+1. ZLM中直接代理流,支持RTSP/RTMP,不支持转码;
+2. 借助ffmpeg完成拉转,可以通过修改ffmpeg拉转参数完成转码。
+点击页面的“添加代理”,安装提示操作即可,保存并启用成功后,可以在国标级联中[添加通道推送给上级平台](./_content/ability/cascade?id=_2-%e6%b7%bb%e5%8a%a0%e7%9b%ae%e5%bd%95%e4%b8%8e%e9%80%9a%e9%81%93)
+
+PS: ffmpeg默认模板不需修改,需要修改参数自行去ZLM配置文件中添加一个即可。
diff --git a/doc/_content/ability/push.md b/doc/_content/ability/push.md
new file mode 100644
index 00000000..ef501826
--- /dev/null
+++ b/doc/_content/ability/push.md
@@ -0,0 +1,41 @@
+
+# 推流列表
+## 功能说明
+
+WVP支持三种图像输入方式,直播,[拉流代理](_content/ability/proxy.md),[国标](_content/ability/device.md),直播设备接入流程如下
+```plantuml
+@startuml
+"直播设备" -> "ZLMediaKit": 1. 发起推流
+"ZLMediaKit" -> "WVP-PRO": 2. 收到hook通知得到流信息
+"上级国标平台" -> "WVP-PRO": 3. 点播这路视频
+"WVP-PRO" -> "ZLMediaKit": 4. 通知推流到上级国标平台
+@enduml
+```
+1. 默认情况下WVP收到推流信息后,列表中出现这条推流信息,此时你可以点击“加入国标”按钮为此路推流配置名称以及国标编号,只有有国标编号的推流才可以添加到级联平台,保存成功后可以在国标级联中[添加通道推送给上级平台](_content/ability/cascade?id=_2-%e6%b7%bb%e5%8a%a0%e7%9b%ae%e5%bd%95%e4%b8%8e%e9%80%9a%e9%81%93)
+2. WVP也支持推流前导入大量通道直接推送给上级,点击“下载模板”按钮,根据示例修改模板后,点击“通道导入”按钮导入通道数据,保存成功后可以在国标级联中[添加通道推送给上级平台](_content/ability/cascade?id=_2-%e6%b7%bb%e5%8a%a0%e7%9b%ae%e5%bd%95%e4%b8%8e%e9%80%9a%e9%81%93)
+
+## 推拉流鉴权规则
+为了保护服务器的WVP默认开启推流鉴权(目前不支持关闭此功能)
+
+### 推流规则
+推流时需要携带推流鉴权的签名sign,sign=md5(pushKey),pushKey来自用户表,每个用户会有一个不同的pushKey.
+例如app=test,stream=live,pushKey=1000,ip=192.168.1.4, port=10554 那么推流地址为:
+```
+rtsp://192.168.1.4:10554/test/live?sign=a9b7ba70783b617e9998dc4dd82eb3c5
+```
+支持推流时自定义播放鉴权Id,参数名为callId,此时sign=md5(callId_pushKey)
+例如app=test,stream=live,pushKey=1000,callId=12345678, ip=192.168.1.4, port=10554 那么推流地址为:
+```
+rtsp://192.168.1.4:10554/test/live?callId=12345678&sign=c8e6e01dde2d60c66dcea8d2498ffef1
+```
+### 播放规则
+默认情况播放不需要鉴权,但是如果推流时携带了callId,那么播放时必须携带callId
+例如app=test,stream=live,无callId, ip=192.168.1.4, port=10554 那么播放地址为:
+```
+rtsp://192.168.1.4:10554/test/live
+```
+例如app=test,stream=live,callId=12345678, ip=192.168.1.4, port=10554 那么播放地址为:
+```
+rtsp://192.168.1.4:10554/test/live?callId=12345678
+```
+
diff --git a/doc/_content/ability/user.md b/doc/_content/ability/user.md
new file mode 100644
index 00000000..0c472386
--- /dev/null
+++ b/doc/_content/ability/user.md
@@ -0,0 +1,2 @@
+
+# 用户管理
diff --git a/doc/_content/about_doc.md b/doc/_content/about_doc.md
new file mode 100644
index 00000000..f727264e
--- /dev/null
+++ b/doc/_content/about_doc.md
@@ -0,0 +1,5 @@
+
+
+# 关于本文档
+本文档开源在gitee上,[https://gitee.com/pan648540858/wvp-pro-doc.git](https://gitee.com/pan648540858/wvp-pro-doc.git),如果文档出现任何错误或者不易理解的语句,请大家提ISSUE帮助我及时更正。欢迎大家提交PR一起维护这份文档,让更多的人可以使用到这个开源的视频平台。
+
diff --git a/doc/_content/disclaimers.md b/doc/_content/disclaimers.md
new file mode 100644
index 00000000..94412ecd
--- /dev/null
+++ b/doc/_content/disclaimers.md
@@ -0,0 +1,2 @@
+# 免责声明
+WVP-PRO自有代码使用宽松的MIT协议,在保留版权信息的情况下可以自由应用于各自商用、非商业的项目。 但是本项目也零碎的使用了一些其他的开源代码,在商用的情况下请自行替代或剔除; 由于使用本项目而产生的商业纠纷或侵权行为一概与本项目及开发者无关,请自行承担法律风险。 在使用本项目代码时,也应该在授权协议中同时表明本项目依赖的第三方库的协议
\ No newline at end of file
diff --git a/doc/_content/introduction/_media/img.png b/doc/_content/introduction/_media/img.png
new file mode 100644
index 00000000..48f8d8e4
Binary files /dev/null and b/doc/_content/introduction/_media/img.png differ
diff --git a/doc/_content/introduction/_media/img_1.png b/doc/_content/introduction/_media/img_1.png
new file mode 100644
index 00000000..aad1859d
Binary files /dev/null and b/doc/_content/introduction/_media/img_1.png differ
diff --git a/doc/_content/introduction/_media/img_2.png b/doc/_content/introduction/_media/img_2.png
new file mode 100644
index 00000000..e7869000
Binary files /dev/null and b/doc/_content/introduction/_media/img_2.png differ
diff --git a/doc/_content/introduction/compile.md b/doc/_content/introduction/compile.md
new file mode 100644
index 00000000..b208685b
--- /dev/null
+++ b/doc/_content/introduction/compile.md
@@ -0,0 +1,95 @@
+
+# 编译
+WVP-PRO不只是实现了国标28181的协议,本身也是一个完整的视频平台。所以对于新手来说,你可能需要一些耐心来完成。遇到问题不要焦躁,你可以
+1. 百度
+2. 如果身边有熟悉java的朋友,可以咨询下朋友;
+3. 来群里(901799015)咨询群友;
+4. 向作者发送邮件648540858@qq.com;
+5. 作者远程支持(有偿)。
+ 如果这些仍不能解决你的问题,那么你可能需要与作者我一起合作完成这个项目,解决你遇到的问题。
+
+
+WVP-PRO使用Spring boot开发,maven管理依赖。对于熟悉spring开发的朋友是很容易进行编译部署以及运行的。
+下面将提供一种通用方法方便大家运行项目。
+## 1 服务介绍
+| 服务 | 作用 | 是否必须 |
+|----------------|------------------------------------------|-------------------------|
+| WVP-PRO | 实现国标28181的信令以及视频平台相关的功能 | 是 |
+| ZLMediaKit | 为WVP-PRO提供国标28181的媒体部分的实现,以及各种视频流格式的分发支持 | 是 |
+| wvp-pro-assist | wvp的辅助录像程序,也可单独跟zlm一起使用,提供录像控制,录像合并下载接口 | 否(不安装只是影响云端录像功能和国标录像下载) |
+
+## 2 安装依赖
+| 依赖 | 版本 | 用途 | 开发环境需要 | 生产环境需要 |
+|--------|------------|-------------|--------|--------|
+| jdk | >=1.8 | 运行与编译java代码 | 是 | 是 |
+| maven | >=3.3 | 管理java代码依赖 | 否 | 否 |
+| git || 下载/更新/提交代码 | 否 | 否 |
+| nodejs || 编译于运行前端文件 | 否 | 否 |
+| npm || 管理前端文件依赖 | 否 | 否 |
+
+如果你是一个新手,建议你使用linux或者macOS平台。windows不推荐。
+
+ubuntu环境,以ubuntu 18为例:
+``` bash
+apt-get install -y openjdk-11-jre git maven nodejs npm
+```
+centos环境,以centos 8为例:
+```bash
+yum install -y java-1.8.0-openjdk.x86_64 git maven nodejs npm
+```
+window环境,以windows10为例:
+```bash
+这里不细说了,百度或者谷歌一搜一大把,基本都是下一步下一步,然后配置环境变量。
+```
+## 3 安装mysql以及redis
+这里依然是参考网上教程,自行安装吧。
+
+## 4 编译ZLMediaKit
+参考ZLMediaKit[WIKI](https://github.com/ZLMediaKit/ZLMediaKit/wiki),截取一下关键步骤:
+```bash
+# 国内用户推荐从同步镜像网站gitee下载
+git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
+cd ZLMediaKit
+# 千万不要忘记执行这句命令
+git submodule update --init
+```
+## 5 编译WVP-PRO
+### 5.1 可以通过git克隆,也可以在项目下载点击下载
+
+
+从gitee克隆
+```bash
+git clone https://gitee.com/pan648540858/wvp-GB28181-pro.git
+```
+从github克隆
+```bash
+git clone https://github.com/648540858/wvp-GB28181-pro.git
+```
+
+### 5.2 编译前端页面
+```shell script
+cd wvp-GB28181-pro/web_src/
+npm --registry=https://registry.npm.taobao.org install
+npm run build
+```
+编译如果报错, 一般都是网络问题, 导致的依赖包下载失败
+编译完成后在src/main/resources下出现static目录
+**编译完成一般是这个样子,中间没有报红的错误信息**
+
+
+### 5.3 打包项目, 生成可执行jar
+```bash
+cd wvp-GB28181-pro
+mvn package
+```
+编译如果报错, 一般都是网络问题, 导致的依赖包下载失败
+编译完成后在target目录下出现wvp-pro-***.jar。
+接下来[配置服务](./_content/introduction/config.md)
+
+
+
+
+
+
+
+
diff --git a/doc/_content/introduction/config.md b/doc/_content/introduction/config.md
new file mode 100644
index 00000000..ba8d564e
--- /dev/null
+++ b/doc/_content/introduction/config.md
@@ -0,0 +1,120 @@
+
+# 配置
+对于首次测试或者新手同学,我建议在局域网测试,并且关闭服务器与客户机的防火墙测试。建议部署在linux进行测试。
+
+```plantuml
+@startuml
+"WVP-PRO" -> "ZLMediaKit": RESTful 接口
+"WVP-PRO" <-- "ZLMediaKit": Web Hook 接口
+@enduml
+```
+WVP-PRO通过调用ZLMediaKit的RESTful接口实现对ZLMediaKit行为的控制; ZLMediaKit通过Web Hook 接口把消息通知WVP-PRO。通过这种方式,实现了两者的互通。
+对于最简单的配置,你不需要修改ZLMediaKit的任何默认配置。你只需要在WVP-PRO中配置的ZLMediaKit信息即可
+## 1 WVP配置文件位置
+基于spring boot的开发方式,配置文件的加载是很灵活的。默认在src/main/resources/application.yml,部分配置项是可选,你不需要全部配置在配置文件中,
+完全的配置说明可以参看all-application.yml。
+### 1.1 默认加载配置文件方式
+使用maven打包后的jar包里,已经存在了配置文件,但是每次打开jar包修改配置文件或者修改后再打包都是比较麻烦的,所以大家可通过指定配置文件路径来加载指定位置的配置文件。
+```shell
+cd wvp-GB28181-pro/target
+java -jar wvp-pro-*.jar --spring.config.location=../src/main/resources/application.yml
+```
+### 1.2 迁移配置文件以方便启动
+由于配置文件的命令比较长,所以为了启动方便通常我会把配置文件放到jar包的同级目录,类似这样,
+移除jar包内/BOOT-INF/classes/下所有以application开头的文件,使用解压缩工具打开jar即可,不需要解压出来。
+```shell
+cd wvp-GB28181-pro/target
+mv ../src/main/resources/application-dev.yml application.yml
+java -jar wvp-pro-*.jar
+```
+这也是我自己最常用的方式。
+## 2 配置WVP-PRO
+### 2.1 Mysql数据库配置
+首先你需要创建一个名为wvp(也可使用其他名字)的数据库,并使用sql/mysql.sql导入数据库,初始化数据库结构。
+(这里注意,取决于版本,新版的sql文件夹下有update.sql,补丁包,一定要注意运行导入)
+在application-dev.yml中配置(使用1.2方式的是在jar包的同级目录的application.yml)配置数据库连接,包括数据库连接信息,密码。
+### 2.2 Redis数据库配置
+配置wvp中的redis连接信息,建议wvp自己单独使用一个db。
+### 2.3 配置服务启动端口(可直接使用默认配置)
+```yaml
+# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口
+server:
+ port: 18080
+```
+### 2.4 配置28181相关信息(可直接使用默认配置)
+```yaml
+# 作为28181服务器的配置
+sip:
+ # [必须修改] 本机的IP
+ ip: 192.168.1.3
+ # [可选] 28181服务监听的端口
+ port: 5060
+ # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)
+ # 后两位为行业编码,定义参照附录D.3
+ # 3701020049标识山东济南历下区 信息行业接入
+ # [可选]
+ domain: 3402000000
+ # [可选]
+ id: 34020000002000000001
+ # [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验
+ password: 12345678
+```
+### 2.5 配置ZLMediaKit连接信息
+```yaml
+#zlm 默认服务器配置
+media:
+ # ZLMediaKit的服务ID,必须配置
+ id: FQ3TF8yT83wh5Wvz
+ # [必须修改] zlm服务器的内网IP,sdp-ip与stream-ip使用默认值的情况下,这里不要使用127.0.0.1/0.0.0.0
+ ip: 192.168.1.3
+ # [必须修改] zlm服务器的http.port
+ http-port: 6080
+ # [可选] zlm服务器的hook.admin_params=secret
+ secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc
+ # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试
+ rtp:
+ # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输
+ enable: true
+ # [可选] 在此范围内选择端口用于媒体流传输,
+ port-range: 30000,30500 # 端口范围
+ # [可选] 国标级联在此范围内选择端口发送媒体流,
+ send-port-range: 30000,30500 # 端口范围
+ # 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用
+ record-assist-port: 18081
+```
+### 2.4 个性化定制信息配置
+```yaml
+# [根据业务需求配置]
+user-settings:
+ # [可选] 服务ID,不写则为000000
+ server-id:
+ # [可选] 自动点播, 使用固定流地址进行播放时,如果未点播则自动进行点播, 需要rtp.enable=true
+ auto-apply-play: false
+ # [可选] 部分设备需要扩展SDP,需要打开此设置
+ senior-sdp: false
+ # 保存移动位置历史轨迹:true:保留历史数据,false:仅保留最后的位置(默认)
+ save-position-history: false
+ # 点播等待超时时间,单位:毫秒
+ play-timeout: 3000
+ # 等待音视频编码信息再返回, true: 可以根据编码选择合适的播放器,false: 可以更快点播
+ wait-track: false
+ # 是否开启接口鉴权
+ interface-authentication: true
+ # 自动配置redis 可以过期事件
+ redis-config: true
+ # 接口鉴权例外的接口, 即不进行接口鉴权的接口,尽量详细书写,尽量不用/**,至少两级目录
+ interface-authentication-excludes:
+ - /api/v1/**
+ # 推流直播是否录制
+ record-push-live: true
+ # 国标是否录制
+ record-sip: true
+ # 是否将日志存储进数据库
+ logInDatebase: true
+ # 第三方匹配,用于从stream钟获取有效信息
+ thirdPartyGBIdReg: [\s\S]*
+```
+
+
+如果配置信息无误,你可以启动zlm,再启动wvp来测试了,启动成功的话,你可以在wvp的日志下看到zlm已连接的提示。
+接下来[部署到服务器](./_content/introduction/deployment.md), 如何你只是本地运行直接再本地运行即可。
diff --git a/doc/_content/introduction/deployment.md b/doc/_content/introduction/deployment.md
new file mode 100644
index 00000000..388fd357
--- /dev/null
+++ b/doc/_content/introduction/deployment.md
@@ -0,0 +1,36 @@
+
+
+# 部署
+**请仔细阅读以下内容**
+1. WVP-PRO与ZLM支持分开部署,但是wvp-pro-assist必须与zlm部署在同一台主机;
+2. 需要开放的端口
+| 服务 | 端口 | 类型 | 必选 |
+|-----|:-------------------------|-------------|-------|
+| wvp | server.port | tcp | 是 |
+| wvp | sip.port | udp and tcp | 是 |
+| zlm | http.port | tcp | 是 |
+| zlm | http.sslport | tcp | 否 |
+| zlm | rtmp.port | tcp | 否 |
+| zlm | rtmp.sslport | tcp | 否 |
+| zlm | rtsp.port | udp and tcp | 否 |
+| zlm | rtsp.sslport | udp and tcp | 否 |
+| zlm | rtp_proxy.port | udp and tcp | 单端口开放 |
+| zlm | rtp.port-range(在wvp中配置) | udp and tcp | 多端口开放 |
+
+3. 测试环境部署建议所有服务部署在一台主机,关闭防火墙,减少因网络出现问题的可能;
+4. WVP-PRO与ZLM支持分开部署,但是wvp-pro-assist必须与zlm部署在同一台主机;
+5. 生产环境按需开放端口,但是建议修改默认端口,尤其是5060端口,易受到攻击;
+6. zlm使用docker部署的情况,要求端口映射一致,比如映射5060,应将外部端口也映射为5060端口;
+7. 启动服务,以linux为例
+**启动WVP-PRO**
+```shell
+nohup java -jar wvp-pro-*.jar &
+```
+
+**启动ZLM**
+```shell
+nohup ./MediaServer -d -m 3 &
+```
+
+[接入设备](./_content/ability/device.md)
+
diff --git a/doc/_content/qa/_media/img.png b/doc/_content/qa/_media/img.png
new file mode 100644
index 00000000..d6c29d71
Binary files /dev/null and b/doc/_content/qa/_media/img.png differ
diff --git a/doc/_content/qa/_media/img_1.png b/doc/_content/qa/_media/img_1.png
new file mode 100644
index 00000000..5b74d95b
Binary files /dev/null and b/doc/_content/qa/_media/img_1.png differ
diff --git a/doc/_content/qa/_media/img_2.png b/doc/_content/qa/_media/img_2.png
new file mode 100644
index 00000000..4aaa7fed
Binary files /dev/null and b/doc/_content/qa/_media/img_2.png differ
diff --git a/doc/_content/qa/_media/img_3.png b/doc/_content/qa/_media/img_3.png
new file mode 100644
index 00000000..27f8a96a
Binary files /dev/null and b/doc/_content/qa/_media/img_3.png differ
diff --git a/doc/_content/qa/_media/img_4.png b/doc/_content/qa/_media/img_4.png
new file mode 100644
index 00000000..aa3b88ee
Binary files /dev/null and b/doc/_content/qa/_media/img_4.png differ
diff --git a/doc/_content/qa/_media/img_5.png b/doc/_content/qa/_media/img_5.png
new file mode 100644
index 00000000..76e6fafd
Binary files /dev/null and b/doc/_content/qa/_media/img_5.png differ
diff --git a/doc/_content/qa/bug.md b/doc/_content/qa/bug.md
new file mode 100644
index 00000000..f452161a
--- /dev/null
+++ b/doc/_content/qa/bug.md
@@ -0,0 +1,19 @@
+
+# 反馈bug
+代码是在不断的完善的,不断修改会修复旧的问题也有可能引入新的问题,所以遇到BUG是很正常的一件事。所以遇到问题不要烦燥,咱们就事论事就好了。
+## 如何反馈
+1. 更新代码,很可能你遇到问题别人已经更早的遇到了,或者是作者自己发现了,已经解决了,所以你可以更新代码再次进行测试;
+2. 可以在github提ISSUE,我几乎每天都会去看issue,你的问题我会尽快给予答复;
+3. 你可以来我的QQ群里,询问群友看看是否遇到了同样的问题;
+4. 你可以私聊我的QQ,如果我有时间我会给你答复,但是除非你有明确的复现步骤或者修复方案,否则你可能等不到我的答复。
+
+## 如何快速解决BUG
+目前解决BUG有三种方式:
+1. 作者验证以及修复;
+2. 热心开发者提来的PR;
+3. 使用运维手段屏蔽BUG的影响。
+
+- 对于第一种:详细的复现步骤,完整的抓包文件,有条理的错误分析都可以帮助作者复现问题,进而解决问题。解决问题往往不是最难的,复现才是。
+- 对于第二种:如果你是开发者,你已经发现了造成BUG的原因以及知道如何正确的修复,那么我很希望你PR,SRS的大佬经常说的,开源不是一个人的事。所以你的参与就是最大的鼓励。
+- 对于第三种:如果你有一个有经验的运维伙伴,那么部分问题是可以通过运维的手段暂时屏蔽的,在等待修复的这段时间了以保证项目的运行。
+
diff --git a/doc/_content/qa/development.md b/doc/_content/qa/development.md
new file mode 100644
index 00000000..fec7b70c
--- /dev/null
+++ b/doc/_content/qa/development.md
@@ -0,0 +1,15 @@
+
+# 参与到开发中来
+非常欢迎有兴趣的小伙伴一起来维护这个项目
+## 与开发有关的信息
+- 开发语言:后端java + 前端vue;
+- jdk版本: 1.8;
+- 作者自用开发ide: jetbrains intellij idea;
+- nodejs/npm版本:v10.19.0/6.14.4;
+- 后端使用Spring boot框架开发;
+- 项目大量使用了异步操作;
+- 跟代码学流程需要参考28181文档,只看代码你会很懵的;
+- 必须学会[抓包](_content/skill/tcpdump.md),这是必须的
+
+## 提交代码
+大家可以通过fork项目的方式提交自己的代码,然后提交PR,我来合并到主线。提交代码的过程中我们需要遵循“**阿里编码规约**”,现有代码也有很多代码没有做到,但是我们在朝这个方向努力。
\ No newline at end of file
diff --git a/doc/_content/qa/img.png b/doc/_content/qa/img.png
new file mode 100644
index 00000000..d6c29d71
Binary files /dev/null and b/doc/_content/qa/img.png differ
diff --git a/doc/_content/qa/play_error.md b/doc/_content/qa/play_error.md
new file mode 100644
index 00000000..c8e9c02b
--- /dev/null
+++ b/doc/_content/qa/play_error.md
@@ -0,0 +1,57 @@
+
+# 点播错误
+排查点播错误你首先要清楚[点播的基本流程](_content/theory/play.md),一般的流程如下:
+```plantuml
+@startuml
+"WEB用户" -> "WVP-PRO": 1. 发起点播请求
+"设备" <- "WVP-PRO": 2. Invite(携带SDP消息体)
+"设备" --> "WVP-PRO": 3. 200OK(携带SDP消息体)
+"设备" <-- "WVP-PRO": 4. Ack
+"设备" -> "ZLMediaKit": 5. 发送实时流
+"WVP-PRO" <- "ZLMediaKit": 6. 流改变事件
+"WEB用户" <-- "WVP-PRO": 7. 回复流播放地址(携带流地址)
+"WVP-PRO" <- "ZLMediaKit": 8. 无人观看事件
+"设备" <- "WVP-PRO": 9 Bye消息
+"设备" --> "WVP-PRO": 10 200OK
+@enduml
+```
+针对几种常见的错误,我们来分析一下,也方便大家对号入座解决常见的问题
+## 点播收到错误码
+这个错误一般表现为点击"播放"按钮后很快得到一个错误。
+1. **400错误码**
+出现400错误玛时一般是这样的流程是这样的
+```plantuml
+@startuml
+"WEB用户" -> "WVP-PRO": 1. 发起点播请求
+"设备" <- "WVP-PRO": 2. Invite(携带SDP消息体)
+"设备" --> "WVP-PRO": 3. 400错误
+@enduml
+```
+此时通常是设备认为WVP发送了错误的消息给它,它认为消息不全或者错误所以直接返回400错误,此时我们需要[抓包](_content/skill/tcpdump.md)来分析是否缺失了内容,也可以直接联系对方询问为什么返回了400。
+WVP不能保证兼容所有的设备,有些实现不规范的设备可能在对接时就会出现上述问题,你可以联系作者帮忙对接。
+2. **500错误码**
+500或者大于500小于600的错误码一般多是设备内部出了问题,解决方式有两个,第一种直接联系设备/平台客服寻求解决;第二种,如果你有确定可以对接这个设备的平台那么可以把对接这个平台的抓包和对接wvp的抓包同时发送给我,我来尝试解决。
+
+
+## 点播超时
+点播超时的情况大致分为两种:点播超时和收流超时
+1. **点播超时**
+点播超时错误一般为信令的超时,比如长时间为收到对方的回复,可能出现在流程中 “3. 200OK(携带SDP消息体)”这个位置,即我们发送点播消息,但是设备没有回复,可能的原因:
+> 1. 设备内部错误,未能回复消息
+> 2. 网络原因消息未到到达设备
+
+大部分时候是原因2,所以遇到这个错误我们首先要排查我们我的网路,如果你是公网部署,那么也可能时心跳周期太长,导致的路由NAT失效,WVP的消息无法通道原来的IP端口号发送给设备。
+
+2. **收流超时**
+收流超时可能发生在流程中的5和6,可能的原因有:
+> 1. 设备发送了流但是发送到了错误的ip和端口上,而这个信息是在invite消息的sdp中指定的,就是流程2Invite(携带SDP消息体)中,而这个错误很可能来自你的配置错误,比如你设置了127.0.0.1导致设备网127.0.0.1上发流,或者是你WVP在公网,但是你给设备了一个内网ip,导致设备无法把流发送过来;
+> 2. 设备内部错误未发送流;
+> 2. 设备发送了流,但是流无法识别,可能存在于流不规范和网络很差的情况下;
+> 3. 设备发送了流,zlm也收到了,但是zlm无法通过hook通知到wvp,此时原因是你可以检查zlm的配置文件中的hook配置,看看是否无法从zlm连接到wvp;
+> 4. 设备发送了流,但是开启SSRC校验,设备的流不够规范采用错误的ssrc,导致zlm选择丢弃;
+
+针对这些可能的错误原因我建议的排查顺序:
+- 关闭ssrc校验;
+- 查看zlm配置的hook是否可以连接到zlm;
+- 查看zlm日志是否有流注册;
+- 抓包查看流的信息,看看流是否正常发送,甚至可以导出发送原始流,用vlc播放,看看是否可以播放。
diff --git a/doc/_content/qa/regiser_error.md b/doc/_content/qa/regiser_error.md
new file mode 100644
index 00000000..d18459c5
--- /dev/null
+++ b/doc/_content/qa/regiser_error.md
@@ -0,0 +1,8 @@
+
+# 设备注册不上来的解决办法
+一般的原因有两个
+1. 信息填写错误,比如密码错误;
+2. 网络不通导致注册消息无法发送到WVP;
+
+
+遇到问题首先仔细校验填写信息,例如海康可能需要勾选鉴权才可以输入密码。网络问题请自行测试。
\ No newline at end of file
diff --git a/doc/_content/qa/start_error.md b/doc/_content/qa/start_error.md
new file mode 100644
index 00000000..1dd533f2
--- /dev/null
+++ b/doc/_content/qa/start_error.md
@@ -0,0 +1,24 @@
+
+# 启动时报错
+启动时的报错大部分时候是因为你的配置有问题,比如mysql没连接上,redis没连接上,18080/15060端口占用了,这些都会导致启动是报错,修改配置配置之后都可以解决;
+下面我整理的一些常见的错误,大家可以先对号入座的简单排查下。
+> **常见错误**
+
+
+**错误原因:** redis配置错误,可能原因: redis未启动/ip错误/端口错误/网络不通
+---
+
+**错误原因:** redis配置错误,可能原因: 密码错误
+---
+
+**错误原因:** mysql配置错误,可能原因: mysql未启动/ip错误/端口错误/网络不通
+---
+
+**错误原因:** mysql配置错误,可能原因: 用户名/密码错误
+---
+
+**错误原因:** SIP配置错误,可能原因: SIP端口被占用
+---
+
+**错误原因:** WVP Tomcat端口配置错误,可能原因: server.port端口被占用
+---
\ No newline at end of file
diff --git a/doc/_content/skill/_media/img.png b/doc/_content/skill/_media/img.png
new file mode 100644
index 00000000..a9bc95fc
Binary files /dev/null and b/doc/_content/skill/_media/img.png differ
diff --git a/doc/_content/skill/_media/img_1.png b/doc/_content/skill/_media/img_1.png
new file mode 100644
index 00000000..e08e4e1e
Binary files /dev/null and b/doc/_content/skill/_media/img_1.png differ
diff --git a/doc/_content/skill/_media/img_2.png b/doc/_content/skill/_media/img_2.png
new file mode 100644
index 00000000..2af0ecc6
Binary files /dev/null and b/doc/_content/skill/_media/img_2.png differ
diff --git a/doc/_content/skill/tcpdump.md b/doc/_content/skill/tcpdump.md
new file mode 100644
index 00000000..7dd270de
--- /dev/null
+++ b/doc/_content/skill/tcpdump.md
@@ -0,0 +1,62 @@
+
+# 抓包
+如果说对于网络编程,有什么工具是必会的,我觉得抓包肯定是其中之一了。作为GB/T 28181调试过程中最重要的手段,我觉得如果你真对他有兴趣,或者系统遇到问题可以最快的得到解决,那么抓包你就一定要学会了。
+
+## 抓包工具的选择
+### 1. Wireshark
+在具备图形界面的系统上,比如windows,linux发行版ubuntu,opensuse等,我一般直接使用Wireshark直接进行抓包,也方便进行内容的查看。
+### 2. Tcpdump
+在使用命令行的系统,比如linux服务器,我一般使用Tcpdump进行抓包,无需额外安装,系统一般自带,抓包的到的文件,可以使用Wireshark打开,在图形界面下方便查看内容。
+
+## 工具安装
+Wireshark的安装很简单,根据提示一步步点击就好了,在linux需要解决权限的问题,如果和我一样使用图形界面的linux发行版的话,可以参看如下步骤; windows的小伙伴直接略过即可
+```shell
+# 1. 添加wireshark用户组
+sudo groupadd wireshark
+# 2. 将dumpcap更改为wireshark用户组
+sudo chgrp wireshark /usr/bin/dumpcap
+# 3. 让wireshark用户组有root权限使用dumpcap
+sudo chmod 4755 /usr/bin/dumpcap
+# 4. 将需要使用的用户名加入wireshark用户组
+sudo gpasswd -a $USER wireshark
+```
+tcpdump一般linux都是自带,无需安装,可以这样验证;显示版本信息即是已安装
+```shell
+tcpdump --version
+```
+## 开始抓包
+### 使用Wireshark
+在28181中我一般只关注sip包和rtp包,所以我一般是直接过滤sip和rtp,可以输入框输入 `sip or rtp`这样即可,如果设备来源比较多还可以加上ip和端口号的过滤`(sip or rtp )and ip.addr==192.168.1.3 and udp.port==5060`
+详细的过滤规则可以自行百度,我可以提供一些常用的给大家参考
+
+**只过滤SIP:**
+```shell
+sip
+```
+**只获取rtp数据:**
+```shell
+rtp
+```
+**默认方式:**
+```shell
+sip or rtp
+```
+**过滤IP:**
+```shell
+ sip and ip.addr==192.168.1.3
+```
+**过滤端口:**
+```shell
+ sip and udp.port==5060
+```
+输入命令开启抓包后,此时可以进行操作,比如点播,录像回访等,操作完成回到Wireshark点击红色的停止即可,需要保存文件可以点击`文件->导出特定分组`导出过滤后的数据,也可以直接`文件->另存为`保存未过滤的数据。
+### 使用tcpdump
+对于服务器抓包,为了得到足够完整的数据,我一般会要求直接抓取网卡数据而不过滤,如下:
+抓取网卡首先需要获取网卡名,在linux我一般使用`ip addr`获取网卡信息,如下所示:
+
+```shell
+sudo tcpdump -i wlp3s0 -w demo.pcap
+```
+
+命令行会停留在这个位置,此时可以进行操作,比如点播,录像回放等,操作完成回到命令行使用`Ctrl+C`结束命令行,在当前目录下得到demo.pcap,将这个文件下载到图形界面操作系统里,即可使用Wireshark查看了
+更多的操作可以参考: [https://www.cnblogs.com/jiujuan/p/9017495.html](https://www.cnblogs.com/jiujuan/p/9017495.html)
diff --git a/doc/_content/theory/_media/img.png b/doc/_content/theory/_media/img.png
new file mode 100644
index 00000000..ecf62e9f
Binary files /dev/null and b/doc/_content/theory/_media/img.png differ
diff --git a/doc/_content/theory/_media/img_1.png b/doc/_content/theory/_media/img_1.png
new file mode 100644
index 00000000..2dc8cc8a
Binary files /dev/null and b/doc/_content/theory/_media/img_1.png differ
diff --git a/doc/_content/theory/_media/img_2.png b/doc/_content/theory/_media/img_2.png
new file mode 100644
index 00000000..7e2ddde4
Binary files /dev/null and b/doc/_content/theory/_media/img_2.png differ
diff --git a/doc/_content/theory/_media/img_3.png b/doc/_content/theory/_media/img_3.png
new file mode 100644
index 00000000..5fc5ef41
Binary files /dev/null and b/doc/_content/theory/_media/img_3.png differ
diff --git a/doc/_content/theory/_media/img_4.png b/doc/_content/theory/_media/img_4.png
new file mode 100644
index 00000000..d5df7ceb
Binary files /dev/null and b/doc/_content/theory/_media/img_4.png differ
diff --git a/doc/_content/theory/_media/img_5.png b/doc/_content/theory/_media/img_5.png
new file mode 100644
index 00000000..47daffcd
Binary files /dev/null and b/doc/_content/theory/_media/img_5.png differ
diff --git a/doc/_content/theory/_media/img_6.png b/doc/_content/theory/_media/img_6.png
new file mode 100644
index 00000000..6c67ef47
Binary files /dev/null and b/doc/_content/theory/_media/img_6.png differ
diff --git a/doc/_content/theory/_media/img_7.png b/doc/_content/theory/_media/img_7.png
new file mode 100644
index 00000000..fc204aaa
Binary files /dev/null and b/doc/_content/theory/_media/img_7.png differ
diff --git a/doc/_content/theory/_media/img_8.png b/doc/_content/theory/_media/img_8.png
new file mode 100644
index 00000000..9b436417
Binary files /dev/null and b/doc/_content/theory/_media/img_8.png differ
diff --git a/doc/_content/theory/_media/img_9.png b/doc/_content/theory/_media/img_9.png
new file mode 100644
index 00000000..c3aa1ff6
Binary files /dev/null and b/doc/_content/theory/_media/img_9.png differ
diff --git a/doc/_content/theory/channel_tree.md b/doc/_content/theory/channel_tree.md
new file mode 100644
index 00000000..c4c1b09e
--- /dev/null
+++ b/doc/_content/theory/channel_tree.md
@@ -0,0 +1,14 @@
+
+
+# 通道的树形结构
+
+国标28181规定了两种组织设备树的方式
+1. **行政区划**
+ 行政区划模式下主要是以行政区划作为目录节点例如:河北省->邯郸市->广平县
+ 
+2. **业务分组**
+ 业务分组主要自定义的目录树的一种组织形式,但是对定义的目录的国标编号有一定的要求。
+ 第一级别需要是业务分组类型,即国标编码中的11、12、13是215,例如:65010200002150000001;
+ 业务分组下是虚拟组织,即国标编码中的11、12、13是216,例如:65010200002160000002。
+ 虚拟组织下不可是业务分组,虚拟组织下可以继续添加虚拟组织。
+ 
diff --git a/doc/_content/theory/code.md b/doc/_content/theory/code.md
new file mode 100644
index 00000000..d5a892e2
--- /dev/null
+++ b/doc/_content/theory/code.md
@@ -0,0 +1,25 @@
+
+
+# 统一编码规则
+## D.1 编码规则 A
+> 编码规则 A 由中心编码(8位)、行业编码(2位)、类型编码(3位)和序号(7位)四个码段共20位十
+>进制数字字符构成,即系统编码 =中心编码 + 行业编码 + 类型编码 + 序号。
+> 编码规则 A 的详细说明见表 D.1。其中,中心编码指用户或设备所归属的监控中心的编码,按照监控中心所在地的行政区划代码确定,
+> 当不是基层单位时空余位为0。行政区划代码采用 GB/T2260— 2007规定的行政区划代码表示。行业编码是指用户或设备所归属的行业,行业编码对照表见 D.3。
+> 类型编码指定了设备或用户的具体类型,其中的前端设备包含公安系统和非公安系统的前端设备,终端用 户包含公安系统和非公安系统的终端用户。
+
+
+
+
+
+## D.2 编码规则 B
+> 编码规则 B由中心编码(8位)、行业编码(2位)、序号(4位)和类型编码(2位)四个码段构成,即系
+>统编码 =中心编码 + 行业编码 +序号+类型编码。编码规则 B的详细说明见表 D.2。
+
+
+
+
+## D.3 行业编码对照表
+> 行业编码对照表见表 D.3。
+
+
\ No newline at end of file
diff --git a/doc/_content/theory/img.png b/doc/_content/theory/img.png
new file mode 100644
index 00000000..9b436417
Binary files /dev/null and b/doc/_content/theory/img.png differ
diff --git a/doc/_content/theory/play.md b/doc/_content/theory/play.md
new file mode 100644
index 00000000..fbfdcc66
--- /dev/null
+++ b/doc/_content/theory/play.md
@@ -0,0 +1,33 @@
+
+
+# 点播流程
+> 以下为WVP-PRO点播流程。点播成功前的任何一个环节出现问题都可能出现点播超时,这也是排查点播超时的依据。
+
+```plantuml
+@startuml
+"WEB用户" -> "WVP-PRO": 1. 发起点播请求
+"设备" <- "WVP-PRO": 2. Invite(携带SDP消息体)
+"设备" --> "WVP-PRO": 3. 200OK(携带SDP消息体)
+"设备" <-- "WVP-PRO": 4. Ack
+"设备" -> "ZLMediaKit": 5. 发送实时流
+"WVP-PRO" <- "ZLMediaKit": 6. 流改变事件
+"WEB用户" <-- "WVP-PRO": 7. 回复流播放地址(携带流地址)
+"WVP-PRO" <- "ZLMediaKit": 8. 无人观看事件
+"设备" <- "WVP-PRO": 9 Bye消息
+"设备" --> "WVP-PRO": 10 200OK
+@enduml
+```
+
+
+## 注册流程描述如下:
+1. 用户从网页或调用接口发起点播请求;
+2. WVP-PRO向摄像机发送Invite消息,消息头域中携带 Subject字段,表明点播的视频源ID、发送方媒体流序列号、ZLMediaKit接收流使用的IP、端口号、
+ 接收端媒体流序列号等参数,SDP消息体中 s字段为“Play”代表实时点播,y字段描述SSRC值,f字段描述媒体参数。
+3. 摄像机向WVP-PRO回复200OK,消息体中描述了媒体流发送者发送媒体流的IP、端口、媒体格式、SSRC字段等内容。
+4. WVP-PRO向设备回复Ack, 会话建立成功。
+5. 设备向ZLMediaKit发送实时流。
+6. ZLMediaKit向WVP-PRO发送流改变事件。
+7. WVP-PRO向WEB用户回复播放地址。
+8. ZLMediaKit向WVP发送流无人观看事件。
+9. WVP-PRO向设备回复Bye, 结束会话。
+10. 设备回复200OK,会话结束成功。
diff --git a/doc/_content/theory/register.md b/doc/_content/theory/register.md
new file mode 100644
index 00000000..fad9589f
--- /dev/null
+++ b/doc/_content/theory/register.md
@@ -0,0 +1,21 @@
+
+
+# 注册流程
+WVP-PRO目前仅支持国标中描述的基本注册流程,也是最常用的,
+> 基本注册即采用IETFRFC3261规定的基于数字摘要的挑战应答式安全技术进行注册.
+
+```plantuml
+@startuml
+"设备" -> "WVP-PRO": 1. Register
+"设备" <-- "WVP-PRO": 2. 401 Unauthorized
+"设备" -> "WVP-PRO": 3. Register
+"设备" <-- "WVP-PRO": 4. 200 OK
+@enduml
+```
+
+
+> 注册流程描述如下:
+> 1. 摄像机向WVP-PRO服务器发送 Register请求;
+> 2. WVP-PRO向摄像机发送响应401,并在响应的消息头 WWW_Authenticate字段中给出适合摄像机的认证体制和参数;
+> 3. 摄像机重新向WVP-PRO发送 Register请求,在请求的 Authorization字段给出信任书, 包含认证信息;
+> 4. WVP-PRO对请求进行验证,如果检查出 摄像机身份合法,向摄像机发送成功响应 200OK,如果身份不合法则发送拒绝服务应答。
diff --git a/doc/_coverpage.md b/doc/_coverpage.md
new file mode 100644
index 00000000..eb3524f9
--- /dev/null
+++ b/doc/_coverpage.md
@@ -0,0 +1,17 @@
+
+
+
+# WVP-PRO 2.0
+
+> 开箱即用的28181协议视频平台。
+
+- 基于GB/T28181-2016标准信令实现,兼容GB/T28181-2011。
+- 自带完整前端页面,开箱即用。
+- 完全开源,且使用MIT许可协议。可以在保留版权信息的基础上商用。
+
+[GitHub](https://github.com/648540858/wvp-GB28181-pro)
+[Gitee](https://gitee.com/pan648540858/wvp-GB28181-pro)
+
+
+
+[//]: # ([comment]: <> ())
diff --git a/doc/_media/2.png b/doc/_media/2.png
new file mode 100644
index 00000000..dd982e1e
Binary files /dev/null and b/doc/_media/2.png differ
diff --git a/doc/_media/3-1.png b/doc/_media/3-1.png
new file mode 100644
index 00000000..a52620f2
Binary files /dev/null and b/doc/_media/3-1.png differ
diff --git a/doc/_media/3-2.png b/doc/_media/3-2.png
new file mode 100644
index 00000000..bef780eb
Binary files /dev/null and b/doc/_media/3-2.png differ
diff --git a/doc/_media/3-3.png b/doc/_media/3-3.png
new file mode 100644
index 00000000..3943a527
Binary files /dev/null and b/doc/_media/3-3.png differ
diff --git a/doc/_media/3.png b/doc/_media/3.png
new file mode 100644
index 00000000..913d2949
Binary files /dev/null and b/doc/_media/3.png differ
diff --git a/doc/_media/favicon.ico b/doc/_media/favicon.ico
new file mode 100644
index 00000000..bc5f8e66
Binary files /dev/null and b/doc/_media/favicon.ico differ
diff --git a/doc/_media/index.png b/doc/_media/index.png
new file mode 100644
index 00000000..15200e69
Binary files /dev/null and b/doc/_media/index.png differ
diff --git a/doc/_media/logo-mini.png b/doc/_media/logo-mini.png
new file mode 100644
index 00000000..cc8078db
Binary files /dev/null and b/doc/_media/logo-mini.png differ
diff --git a/doc/_media/logo.png b/doc/_media/logo.png
new file mode 100644
index 00000000..c5da2d4b
Binary files /dev/null and b/doc/_media/logo.png differ
diff --git a/doc/_media/weixin.jpg b/doc/_media/weixin.jpg
new file mode 100644
index 00000000..eda1260e
Binary files /dev/null and b/doc/_media/weixin.jpg differ
diff --git a/doc/_media/zhifubao.jpg b/doc/_media/zhifubao.jpg
new file mode 100644
index 00000000..973996b7
Binary files /dev/null and b/doc/_media/zhifubao.jpg differ
diff --git a/doc/_navbar.md b/doc/_navbar.md
new file mode 100644
index 00000000..22ac93ae
--- /dev/null
+++ b/doc/_navbar.md
@@ -0,0 +1 @@
+
diff --git a/doc/_sidebar.md b/doc/_sidebar.md
new file mode 100644
index 00000000..3b10bae8
--- /dev/null
+++ b/doc/_sidebar.md
@@ -0,0 +1,32 @@
+
+
+* **编译与部署**
+ * [编译](_content/introduction/compile.md)
+ * [配置](_content/introduction/config.md)
+ * [部署](_content/introduction/deployment.md)
+* **功能与使用**
+ * [接入设备](_content/ability/device.md)
+ * [设备使用](_content/ability/device_use.md)
+ * [国标级联](_content/ability/cascade2.md)
+ * [推流列表](_content/ability/push.md)
+ * [拉流代理](_content/ability/proxy.md)
+ * [电子地图](_content/ability/gis.md)
+ * [节点管理](_content/ability/node_manger.md)
+ * [云端录像](_content/ability/cloud_record.md)
+ * [不间断录像](_content/ability/continuous_recording.md)
+* **流程与原理**
+ * [统一编码规则](_content/theory/code.md)
+ * [树形结构](_content/theory/channel_tree.md)
+ * [注册流程](_content/theory/register.md)
+ * [点播流程](_content/theory/play.md)
+* **必备技巧**
+ * [抓包](_content/skill/tcpdump.md)
+
+* **常见问答**
+ - [如何反馈BUG](_content/qa/bug.md)
+ - [如何参与开发](_content/qa/development.md)
+ - [启动报错的解决办法](_content/qa/start_error.md)
+ - [设备注册不上来的解决办法](_content/qa/regiser_error.md)
+ - [点播超时/报错的解决办法](_content/qa/play_error.md)
+* [**免责声明**](_content/disclaimers.md)
+* [**关于本文档**](_content/about_doc.md)
diff --git a/doc/index.html b/doc/index.html
new file mode 100644
index 00000000..1048d929
--- /dev/null
+++ b/doc/index.html
@@ -0,0 +1,59 @@
+
+
+
+
+ WVP-PRO文档
+
+
+
+
+
+
+
+
+
+ 加载中
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index 364e6b9e..c0c99004 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,12 +6,12 @@
org.springframework.boot
spring-boot-starter-parent
- 2.3.5.RELEASE
+ 2.7.2
com.genersoft
wvp-pro
- 2.0
+ 2.6.7
web video platform
国标28181视频平台
@@ -47,7 +47,6 @@
UTF-8
MMddHHmm
3.1.1
- 3.1.0
${project.build.directory}/generated-snippets
@@ -74,60 +73,52 @@
org.mybatis.spring.boot
mybatis-spring-boot-starter
- 2.1.4
+ 2.2.2
+
+
+ com.zaxxer
+ HikariCP
+
+
org.springframework.boot
spring-boot-starter-security
-
- redis.clients
- jedis
- ${jedis-version}
-
-
com.alibaba
- druid
- 1.2.3
+ druid-spring-boot-starter
+ 1.2.11
mysql
mysql-connector-java
- 8.0.22
-
-
-
-
- org.xerial
- sqlite-jdbc
- 3.32.3.2
+ 8.0.30
com.github.pagehelper
pagehelper-spring-boot-starter
- 1.4.1
+ 1.4.3
-
- io.springfox
- springfox-boot-starter
- 3.0.0
-
-
- com.github.xiaoymin
- knife4j-spring-boot-starter
- 3.0.2
+ org.springdoc
+ springdoc-openapi-ui
+ 1.6.10
+
+ com.github.xiaoymin
+ knife4j-springdoc-ui
+ 3.0.3
+
@@ -148,10 +139,11 @@
1.3.0-91
+
- log4j
- log4j
- 1.2.17
+ org.slf4j
+ log4j-over-slf4j
+ 1.7.36
@@ -161,32 +153,39 @@
2.1.3
-
+
- com.alibaba
- fastjson
- 1.2.73
+ com.alibaba.fastjson2
+ fastjson2
+ 2.0.17
-
-
- com.google.guava
- guava
- 30.0-jre
+ com.alibaba.fastjson2
+ fastjson2-extension
+ 2.0.17
com.squareup.okhttp3
okhttp
- 4.9.0
+ 4.10.0
+
+
+ com.squareup.okhttp3
+ logging-interceptor
+ 4.10.0
+
+
+
+
- com.burgstaller
+ io.github.rburgst
okhttp-digest
- 2.1
+ 2.7
@@ -200,7 +199,21 @@
org.mitre.dsmiley.httpproxy
smiley-http-proxy-servlet
- 1.12
+ 1.12.1
+
+
+
+
+ com.alibaba
+ easyexcel
+ 3.1.1
+
+
+
+
+ com.github.oshi
+ oshi-core
+ 6.2.2
@@ -216,6 +229,14 @@
+
+
+ com.google.guava
+ guava
+ 31.1-jre
+
+
+
org.springframework.boot
spring-boot-starter-test
@@ -224,13 +245,14 @@
-
+
${project.artifactId}-${project.version}-${maven.build.timestamp}
org.springframework.boot
spring-boot-maven-plugin
+ 2.3.5.RELEASE
true
@@ -238,6 +260,7 @@
org.apache.maven.plugins
maven-compiler-plugin
+ 3.8.1
1.8
1.8
@@ -247,16 +270,34 @@
pl.project13.maven
git-commit-id-plugin
+ 3.0.1
+
+ true
+ false
+ yyyyMMdd
+
org.apache.maven.plugins
maven-surefire-plugin
+ 2.22.2
true
+
+
+ src/main/resources
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
diff --git a/sql/clean.sql b/sql/clean.sql
new file mode 100644
index 00000000..b8343912
--- /dev/null
+++ b/sql/clean.sql
@@ -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;
\ No newline at end of file
diff --git a/sql/mysql.sql b/sql/mysql.sql
index 50b70bc6..7a15f905 100644
--- a/sql/mysql.sql
+++ b/sql/mysql.sql
@@ -1,256 +1,577 @@
--- auto-generated definition
+-- MySQL dump 10.13 Distrib 8.0.31, for Linux (x86_64)
+--
+-- Host: 127.0.0.1 Database: wvp
+-- ------------------------------------------------------
+-- Server version 8.0.30
+/*!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 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-CREATE DATABASE `wvp` /*!40100 DEFAULT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin */;
+--
+-- Table structure for table `device`
+--
-use wvp;
+DROP TABLE IF EXISTS `device`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+CREATE TABLE `device` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `manufacturer` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `model` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `firmware` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `transport` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `streamMode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `online` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `registerTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `keepaliveTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `port` int DEFAULT NULL,
+ `expires` int DEFAULT NULL,
+ `keepaliveIntervalTime` int DEFAULT NULL,
+ `subscribeCycleForCatalog` int DEFAULT NULL,
+ `hostAddress` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `charset` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `subscribeCycleForMobilePosition` int DEFAULT NULL,
+ `mobilePositionSubmissionInterval` int DEFAULT '5',
+ `subscribeCycleForAlarm` int DEFAULT NULL,
+ `ssrcCheck` int DEFAULT '0',
+ `geoCoordSys` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `treeType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `custom_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `sdpIp` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `localIp` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `device_deviceId_uindex` (`deviceId`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
-create table device
-(
- deviceId varchar(50) not null
- primary key,
- name varchar(255) null,
- manufacturer varchar(255) null,
- model varchar(255) null,
- firmware varchar(255) null,
- transport varchar(50) null,
- streamMode varchar(50) null,
- online varchar(50) null,
- registerTime varchar(50) null,
- keepaliveTime varchar(50) null,
- ip varchar(50) not null,
- createTime varchar(50) not null,
- updateTime varchar(50) not null,
- port int not null,
- expires int not null,
- subscribeCycleForCatalog int not null,
- hostAddress varchar(50) not null,
- charset varchar(50) not null
-);
+--
+-- Dumping data for table `device`
+--
-create table device_channel
-(
- channelId varchar(50) not null,
- name varchar(255) null,
- manufacture varchar(50) null,
- model varchar(50) null,
- owner varchar(50) null,
- civilCode varchar(50) null,
- block varchar(50) null,
- address varchar(50) null,
- parentId varchar(50) null,
- safetyWay int null,
- registerWay int null,
- certNum varchar(50) null,
- certifiable int null,
- errCode int null,
- endTime varchar(50) null,
- secrecy varchar(50) null,
- ipAddress varchar(50) null,
- port int null,
- password varchar(255) null,
- PTZType int null,
- status int null,
- longitude double null,
- latitude double null,
- streamId varchar(50) null,
- deviceId varchar(50) not null,
- parental varchar(50) null,
- hasAudio bit null,
- createTime varchar(50) not null,
- updateTime varchar(50) not null,
- primary key (channelId, deviceId)
-);
+LOCK TABLES `device` WRITE;
+/*!40000 ALTER TABLE `device` DISABLE KEYS */;
+/*!40000 ALTER TABLE `device` ENABLE KEYS */;
+UNLOCK TABLES;
-create table device_alarm
-(
- id int auto_increment
- primary key,
- deviceId varchar(50) not null,
- channelId varchar(50) not null,
- alarmPriority varchar(50) not null,
- alarmMethod varchar(50),
- alarmTime varchar(50) not null,
- alarmDescription varchar(255),
- longitude double null,
- latitude double null,
- alarmType varchar(50)
-);
+--
+-- Table structure for table `device_alarm`
+--
-create table log
-(
- id int auto_increment
- primary key,
- 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 not null,
- username varchar(50) not null,
- createTime varchar(50) not null
-);
+DROP TABLE IF EXISTS `device_alarm`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+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,
+ `longitude` double DEFAULT NULL,
+ `latitude` double DEFAULT NULL,
+ `alarmType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+/*!40101 SET character_set_client = @saved_cs_client */;
-create table device_mobile_position
-(
- deviceId varchar(50) not null,
- channelId varchar(50) not null,
- deviceName varchar(255) null,
- time varchar(50) not null,
- longitude double not null,
- latitude double not null,
- altitude double null,
- speed double null,
- direction double null,
- reportSource varchar(50) null,
- geodeticSystem varchar(50) null,
- cnLng varchar(50) null,
- cnLat varchar(50) null,
- primary key (deviceId, time)
-);
+--
+-- Dumping data for table `device_alarm`
+--
-create table gb_stream
-(
- app varchar(255) not null,
- stream varchar(255) not null,
- gbId varchar(50) not null,
- name varchar(255) null,
- longitude double null,
- latitude double null,
- streamType varchar(50) null,
- mediaServerId varchar(50) null,
- status int null,
- primary key (app, stream, gbId)
-);
+LOCK TABLES `device_alarm` WRITE;
+/*!40000 ALTER TABLE `device_alarm` DISABLE KEYS */;
+/*!40000 ALTER TABLE `device_alarm` ENABLE KEYS */;
+UNLOCK TABLES;
-create table media_server
-(
- id varchar(255) not null
- primary key,
- ip varchar(50) not null,
- hookIp varchar(50) not null,
- sdpIp varchar(50) not null,
- streamIp varchar(50) 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) not null,
- streamNoneReaderDelayMS int not null,
- rtpEnable int not null,
- rtpPortRange varchar(50) not null,
- sendRtpPortRange varchar(50) not null,
- recordAssistPort int not null,
- defaultServer int not null,
- createTime varchar(50) not null,
- updateTime varchar(50) not null,
- hookAliveInterval int not null,
- constraint media_server_i
- unique (ip, httpPort)
-);
+--
+-- Table structure for table `device_channel`
+--
-create table parent_platform
-(
- id int auto_increment,
- enable int null,
- name varchar(255) null,
- serverGBId varchar(50) not null,
- serverGBDomain varchar(50) null,
- serverIP varchar(50) null,
- serverPort int null,
- deviceGBId varchar(50) not null,
- deviceIp varchar(50) null,
- devicePort varchar(50) null,
- username varchar(255) null,
- password varchar(50) null,
- expires varchar(50) null,
- keepTimeout varchar(50) null,
- transport varchar(50) null,
- characterSet varchar(50) null,
- ptz int null,
- rtcp int null,
- status bit null,
- shareAllLiveStream int null,
- primary key (id, serverGBId)
-);
+DROP TABLE IF EXISTS `device_channel`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+CREATE TABLE `device_channel` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `channelId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `manufacture` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `owner` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `civilCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `block` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `parentId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `safetyWay` int DEFAULT NULL,
+ `registerWay` int DEFAULT NULL,
+ `certNum` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `certifiable` int DEFAULT NULL,
+ `errCode` int DEFAULT NULL,
+ `endTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `secrecy` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `ipAddress` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `port` int DEFAULT NULL,
+ `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `PTZType` int DEFAULT NULL,
+ `status` int DEFAULT NULL,
+ `longitude` double DEFAULT NULL,
+ `latitude` double DEFAULT NULL,
+ `streamId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `parental` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `hasAudio` bit(1) DEFAULT NULL,
+ `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `subCount` int DEFAULT '0',
+ `longitudeGcj02` double DEFAULT NULL,
+ `latitudeGcj02` double DEFAULT NULL,
+ `longitudeWgs84` double DEFAULT NULL,
+ `latitudeWgs84` double DEFAULT NULL,
+ `businessGroupId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `gpsTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `device_channel_id_uindex` (`id`),
+ UNIQUE KEY `device_channel_pk` (`channelId`,`deviceId`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
-create table platform_gb_channel
-(
- channelId varchar(50) not null,
- deviceId varchar(50) not null,
- platformId varchar(50) not null,
- deviceAndChannelId varchar(50) not null,
- primary key (deviceAndChannelId, platformId)
-);
+--
+-- Dumping data for table `device_channel`
+--
-create table platform_gb_stream
-(
- platformId varchar(50) not null,
- app varchar(255) not null,
- stream varchar(255) not null,
- primary key (platformId, app, stream)
-);
+LOCK TABLES `device_channel` WRITE;
+/*!40000 ALTER TABLE `device_channel` DISABLE KEYS */;
+/*!40000 ALTER TABLE `device_channel` ENABLE KEYS */;
+UNLOCK TABLES;
-create table stream_proxy
-(
- type varchar(50) not null,
- app varchar(255) not null,
- stream varchar(255) not null,
- url varchar(255) null,
- src_url varchar(255) null,
- dst_url varchar(255) null,
- timeout_ms int null,
- ffmpeg_cmd_key varchar(255) null,
- rtp_type varchar(50) null,
- mediaServerId varchar(50) null,
- enable_hls bit null,
- enable_mp4 bit null,
- enable bit not null,
- enable_remove_none_reader bit not null,
- createTime varchar(50) not null,
- primary key (app, stream)
-);
+--
+-- Table structure for table `device_mobile_position`
+--
-create table stream_push
-(
- app varchar(255) not null,
- stream varchar(255) not null,
- totalReaderCount varchar(50) null,
- originType int null,
- originTypeStr varchar(50) null,
- createStamp int null,
- aliveSecond int null,
- mediaServerId varchar(50) null,
- primary key (app, stream)
-);
+DROP TABLE IF EXISTS `device_mobile_position`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+CREATE TABLE `device_mobile_position` (
+ `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,
+ `deviceName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci 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) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `longitudeGcj02` double DEFAULT NULL,
+ `latitudeGcj02` double DEFAULT NULL,
+ `longitudeWgs84` double DEFAULT NULL,
+ `latitudeWgs84` double DEFAULT NULL,
+ `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
-create table user
-(
- id int auto_increment
- primary key,
- username varchar(255) not null,
- password varchar(255) not null,
- roleId int not null,
- createTime varchar(50) not null,
- updateTime varchar(50) not null
-);
+--
+-- Dumping data for table `device_mobile_position`
+--
-create unique index user_username_uindex
- on user (username);
+LOCK TABLES `device_mobile_position` WRITE;
+/*!40000 ALTER TABLE `device_mobile_position` DISABLE KEYS */;
+/*!40000 ALTER TABLE `device_mobile_position` ENABLE KEYS */;
+UNLOCK TABLES;
-insert into user (username, password, roleId, createTime, updateTime) values ('admin', '21232f297a57a5a743894a0e4a801fc3', '1', '2021-04-13 14:14:57', '2021-04-13 14:14:57');
+--
+-- Table structure for table `gb_stream`
+--
-create table role (
- id int auto_increment
- primary key,
- name TEXT NOT NULL,
- authority TEXT NOT NULL,
- createTime varchar(50) not null,
- updateTime varchar(50) not null
-);
-insert into role (id, name, authority, createTime, updateTime) values ('1', 'admin', '0', '2021-04-13 14:14:57', '2021-04-13 14:14:57');
+DROP TABLE IF EXISTS `gb_stream`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+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,
+ `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,
+ `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ PRIMARY KEY (`gbStreamId`) USING BTREE,
+ UNIQUE KEY `app` (`app`,`stream`) USING BTREE,
+ UNIQUE KEY `gbId` (`gbId`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+/*!40101 SET character_set_client = @saved_cs_client */;
+--
+-- Dumping data for table `gb_stream`
+--
+
+LOCK TABLES `gb_stream` WRITE;
+/*!40000 ALTER TABLE `gb_stream` DISABLE KEYS */;
+/*!40000 ALTER TABLE `gb_stream` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `log`
+--
+
+DROP TABLE IF EXISTS `log`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+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,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `log`
+--
+
+LOCK TABLES `log` WRITE;
+/*!40000 ALTER TABLE `log` DISABLE KEYS */;
+/*!40000 ALTER TABLE `log` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `media_server`
+--
+
+DROP TABLE IF EXISTS `media_server`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+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,
+ `rtpEnable` int NOT NULL,
+ `rtpPortRange` 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,
+ 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;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `media_server`
+--
+
+LOCK TABLES `media_server` WRITE;
+/*!40000 ALTER TABLE `media_server` DISABLE KEYS */;
+/*!40000 ALTER TABLE `media_server` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `parent_platform`
+--
+
+DROP TABLE IF EXISTS `parent_platform`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+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,
+ `status` bit(1) DEFAULT NULL,
+ `startOfflinePush` int DEFAULT '0',
+ `administrativeDivision` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `catalogGroup` int DEFAULT '1',
+ `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `treeType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `parent_platform_id_uindex` (`id`),
+ UNIQUE KEY `parent_platform_pk` (`serverGBId`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `parent_platform`
+--
+
+LOCK TABLES `parent_platform` WRITE;
+/*!40000 ALTER TABLE `parent_platform` DISABLE KEYS */;
+/*!40000 ALTER TABLE `parent_platform` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `platform_catalog`
+--
+
+DROP TABLE IF EXISTS `platform_catalog`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+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,
+ `civilCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `businessGroupId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `platform_catalog`
+--
+
+LOCK TABLES `platform_catalog` WRITE;
+/*!40000 ALTER TABLE `platform_catalog` DISABLE KEYS */;
+/*!40000 ALTER TABLE `platform_catalog` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `platform_gb_channel`
+--
+
+DROP TABLE IF EXISTS `platform_gb_channel`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+CREATE TABLE `platform_gb_channel` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `platformId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `deviceChannelId` int NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `platform_gb_channel`
+--
+
+LOCK TABLES `platform_gb_channel` WRITE;
+/*!40000 ALTER TABLE `platform_gb_channel` DISABLE KEYS */;
+/*!40000 ALTER TABLE `platform_gb_channel` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `platform_gb_stream`
+--
+
+DROP TABLE IF EXISTS `platform_gb_stream`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+CREATE TABLE `platform_gb_stream` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `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,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `platform_gb_stream_pk` (`platformId`,`catalogId`,`gbStreamId`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `platform_gb_stream`
+--
+
+LOCK TABLES `platform_gb_stream` WRITE;
+/*!40000 ALTER TABLE `platform_gb_stream` DISABLE KEYS */;
+/*!40000 ALTER TABLE `platform_gb_stream` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `stream_proxy`
+--
+
+DROP TABLE IF EXISTS `stream_proxy`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+CREATE TABLE `stream_proxy` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `app` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `stream` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `src_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `dst_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `timeout_ms` int DEFAULT NULL,
+ `ffmpeg_cmd_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `rtp_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `mediaServerId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `enable_audio` 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) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `enable_disable_none_reader` bit(1) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `stream_proxy_pk` (`app`,`stream`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `stream_proxy`
+--
+
+LOCK TABLES `stream_proxy` WRITE;
+/*!40000 ALTER TABLE `stream_proxy` DISABLE KEYS */;
+/*!40000 ALTER TABLE `stream_proxy` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `stream_push`
+--
+
+DROP TABLE IF EXISTS `stream_push`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+CREATE TABLE `stream_push` (
+ `id` 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,
+ `totalReaderCount` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `originType` int DEFAULT NULL,
+ `originTypeStr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `aliveSecond` int DEFAULT NULL,
+ `mediaServerId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `serverId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `pushTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `status` int DEFAULT NULL,
+ `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ `pushIng` int DEFAULT NULL,
+ `self` int DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `stream_push_pk` (`app`,`stream`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `stream_push`
+--
+
+LOCK TABLES `stream_push` WRITE;
+/*!40000 ALTER TABLE `stream_push` DISABLE KEYS */;
+/*!40000 ALTER TABLE `stream_push` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `user`
+--
+
+DROP TABLE IF EXISTS `user`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+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,
+ `pushKey` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `user_username_uindex` (`username`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `user`
+--
+
+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','3e80d1762a324d5b0ff636e0bd16f1e3');
+/*!40000 ALTER TABLE `user` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `user_role`
+--
+
+DROP TABLE IF EXISTS `user_role`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+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,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `user_role`
+--
+
+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');
+/*!40000 ALTER TABLE `user_role` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+-- Dump completed on 2022-11-29 11:47:46
\ No newline at end of file
diff --git a/sql/update.sql b/sql/update.sql
new file mode 100644
index 00000000..2e5d5691
--- /dev/null
+++ b/sql/update.sql
@@ -0,0 +1,3 @@
+-- 2.6.6->2.6.7
+alter table device
+ add keepaliveIntervalTime int default null;
\ No newline at end of file
diff --git a/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java b/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
index bfe58419..af3340dd 100644
--- a/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
+++ b/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
@@ -2,27 +2,39 @@ package com.genersoft.iot.vmp;
import java.util.logging.LogManager;
+import com.genersoft.iot.vmp.conf.druid.EnableDruidSupport;
+import com.genersoft.iot.vmp.storager.impl.RedisCatchStorageImpl;
+import com.genersoft.iot.vmp.utils.GitUtil;
+import com.genersoft.iot.vmp.utils.SpringBeanFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
-import springfox.documentation.oas.annotations.EnableOpenApi;
/**
- *
+ * 启动类
*/
@ServletComponentScan("com.genersoft.iot.vmp.conf")
@SpringBootApplication
@EnableScheduling
-@EnableOpenApi
+@EnableDruidSupport
public class VManageBootstrap extends LogManager {
+
+ private final static Logger logger = LoggerFactory.getLogger(VManageBootstrap.class);
+
private static String[] args;
private static ConfigurableApplicationContext context;
public static void main(String[] args) {
VManageBootstrap.args = args;
VManageBootstrap.context = SpringApplication.run(VManageBootstrap.class, args);
+ GitUtil gitUtil1 = SpringBeanFactory.getBean("gitUtil");
+ logger.info("构建版本: {}", gitUtil1.getBuildVersion());
+ logger.info("构建时间: {}", gitUtil1.getBuildDate());
+ logger.info("GIT最后提交时间: {}", gitUtil1.getCommitTime());
}
// 项目重启
public static void restart() {
diff --git a/src/main/java/com/genersoft/iot/vmp/common/ApiSaveConstant.java b/src/main/java/com/genersoft/iot/vmp/common/ApiSaveConstant.java
index ec2a7252..ed1c2b9b 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/ApiSaveConstant.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/ApiSaveConstant.java
@@ -1,5 +1,9 @@
package com.genersoft.iot.vmp.common;
+/**
+ * 为API重命名, 方便向数据库记录数据的时候展示
+ * @author lin
+ */
public class ApiSaveConstant {
public static String getVal(String key) {
@@ -35,35 +39,47 @@ public class ApiSaveConstant {
return "[设备控制] 强制关键帧";
case "home_position":
return "[设备控制] 看守位控制";
+ default:
+ return "";
}
- break;
case "query":
- if (keyItemArray.length <= 5) return null;
+ if (keyItemArray.length <= 5) {
+ return null;
+ }
switch (keyItemArray[4]) {
case "devices":
- if (keyItemArray.length < 7) return null;
+ if (keyItemArray.length < 7) {
+ return null;
+ }
switch (keyItemArray[6]) {
case "sync":
return "[设备查询] 同步设备通道";
case "delete":
return "[设备查询] 移除设备";
+ default:
+ return "";
}
- break;
case "channel":
return "[设备查询] 更新通道信息";
case "transport":
return "[设备查询] 修改数据流传输模式";
+ default:
+ return "";
}
- break;
+ default:
+ return "";
}
+
+ break;
case "gbStream":
switch (keyItemArray[3]) {
case "del":
return "移除通道与国标的关联";
case "add":
return "添加通道与国标的关联";
+ default:
+ return "";
}
- break;
case "media":
break;
case "position":
@@ -81,8 +97,9 @@ public class ApiSaveConstant {
return "向上级平台添加国标通道";
case "del_channel_for_gb":
return "从上级平台移除国标通道";
+ default:
+ return "";
}
- break;
case "platform_gb_stream":
break;
case "play":
@@ -97,32 +114,36 @@ public class ApiSaveConstant {
return "结束转码";
case "broadcast":
return "语音广播";
+ default:
+ return "";
}
- break;
case "download":
switch (keyItemArray[3]) {
case "start":
return "开始历史媒体下载";
case "stop":
return "停止历史媒体下载";
+ default:
+ return "";
}
- break;
case "playback":
switch (keyItemArray[3]) {
case "start":
return "开始视频回放";
case "stop":
return "停止视频回放";
+ default:
+ return "";
}
- break;
case "ptz":
switch (keyItemArray[3]) {
case "control":
return "云台控制";
case "front_end_command":
return "通用前端控制命令";
+ default:
+ return "";
}
- break;
case "gb_record":
break;
case "onvif":
@@ -142,16 +163,18 @@ public class ApiSaveConstant {
return "启用代理";
case "stop":
return "停用代理";
+ default:
+ return "";
}
- break;
case "push":
switch (keyItemArray[3]) {
case "save_to_gb":
return "将推流添加到国标";
case "remove_form_gb":
return "将推流移出到国标";
+ default:
+ return "";
}
- break;
case "user":
switch (keyItemArray[3]) {
case "login":
@@ -162,8 +185,11 @@ public class ApiSaveConstant {
return "添加用户";
case "delete":
return "删除用户";
+ default:
+ return "";
}
- break;
+ default:
+ return "";
}
}
return null;
diff --git a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
index e16c1add..8311745c 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
@@ -1,36 +1,317 @@
package com.genersoft.iot.vmp.common;
-import com.alibaba.fastjson.JSONArray;
+import io.swagger.v3.oas.annotations.media.Schema;
-public class StreamInfo {
+import java.io.Serializable;
+@Schema(description = "流信息")
+public class StreamInfo implements Serializable, Cloneable{
+
+ @Schema(description = "应用名")
private String app;
- private String streamId;
+ @Schema(description = "流ID")
+ private String stream;
+ @Schema(description = "设备编号")
private String deviceID;
+ @Schema(description = "通道编号")
private String channelId;
- private String flv;
- private String https_flv;
- private String ws_flv;
- private String wss_flv;
- private String fmp4;
- private String https_fmp4;
- private String ws_fmp4;
- private String wss_fmp4;
- private String hls;
- private String https_hls;
- private String ws_hls;
- private String wss_hls;
- private String ts;
- private String https_ts;
- private String ws_ts;
- private String wss_ts;
- private String rtmp;
- private String rtmps;
- private String rtsp;
- private String rtsps;
- private String rtc;
+
+ @Schema(description = "IP")
+ private String ip;
+
+ @Schema(description = "HTTP-FLV流地址")
+ private StreamURL flv;
+
+ @Schema(description = "HTTPS-FLV流地址")
+ private StreamURL https_flv;
+ @Schema(description = "Websocket-FLV流地址")
+ private StreamURL ws_flv;
+ @Schema(description = "Websockets-FLV流地址")
+ private StreamURL wss_flv;
+ @Schema(description = "HTTP-FMP4流地址")
+ private StreamURL fmp4;
+ @Schema(description = "HTTPS-FMP4流地址")
+ private StreamURL https_fmp4;
+ @Schema(description = "Websocket-FMP4流地址")
+ private StreamURL ws_fmp4;
+ @Schema(description = "Websockets-FMP4流地址")
+ private StreamURL wss_fmp4;
+ @Schema(description = "HLS流地址")
+ private StreamURL hls;
+ @Schema(description = "HTTPS-HLS流地址")
+ private StreamURL https_hls;
+ @Schema(description = "Websocket-HLS流地址")
+ private StreamURL ws_hls;
+ @Schema(description = "Websockets-HLS流地址")
+ private StreamURL wss_hls;
+ @Schema(description = "HTTP-TS流地址")
+ private StreamURL ts;
+ @Schema(description = "HTTPS-TS流地址")
+ private StreamURL https_ts;
+ @Schema(description = "Websocket-TS流地址")
+ private StreamURL ws_ts;
+ @Schema(description = "Websockets-TS流地址")
+ private StreamURL wss_ts;
+ @Schema(description = "RTMP流地址")
+ private StreamURL rtmp;
+ @Schema(description = "RTMPS流地址")
+ private StreamURL rtmps;
+ @Schema(description = "RTSP流地址")
+ private StreamURL rtsp;
+ @Schema(description = "RTSPS流地址")
+ private StreamURL rtsps;
+ @Schema(description = "RTC流地址")
+ private StreamURL rtc;
+
+ @Schema(description = "RTCS流地址")
+ private StreamURL rtcs;
+ @Schema(description = "流媒体ID")
private String mediaServerId;
+ @Schema(description = "流编码信息")
private Object tracks;
+ @Schema(description = "开始时间")
+ private String startTime;
+ @Schema(description = "结束时间")
+ private String endTime;
+ @Schema(description = "进度(录像下载使用)")
+ private double progress;
+
+ @Schema(description = "是否暂停(录像回放使用)")
+ private boolean pause;
+
+ public void setFlv(StreamURL flv) {
+ this.flv = flv;
+ }
+
+ public void setHttps_flv(StreamURL https_flv) {
+ this.https_flv = https_flv;
+ }
+
+ public void setWs_flv(StreamURL ws_flv) {
+ this.ws_flv = ws_flv;
+ }
+
+ public void setWss_flv(StreamURL wss_flv) {
+ this.wss_flv = wss_flv;
+ }
+
+ public void setFmp4(StreamURL fmp4) {
+ this.fmp4 = fmp4;
+ }
+
+ public void setHttps_fmp4(StreamURL https_fmp4) {
+ this.https_fmp4 = https_fmp4;
+ }
+
+ public void setWs_fmp4(StreamURL ws_fmp4) {
+ this.ws_fmp4 = ws_fmp4;
+ }
+
+ public void setWss_fmp4(StreamURL wss_fmp4) {
+ this.wss_fmp4 = wss_fmp4;
+ }
+
+ public void setHls(StreamURL hls) {
+ this.hls = hls;
+ }
+
+ public void setHttps_hls(StreamURL https_hls) {
+ this.https_hls = https_hls;
+ }
+
+ public void setWs_hls(StreamURL ws_hls) {
+ this.ws_hls = ws_hls;
+ }
+
+ public void setWss_hls(StreamURL wss_hls) {
+ this.wss_hls = wss_hls;
+ }
+
+ public void setTs(StreamURL ts) {
+ this.ts = ts;
+ }
+
+ public void setHttps_ts(StreamURL https_ts) {
+ this.https_ts = https_ts;
+ }
+
+ public void setWs_ts(StreamURL ws_ts) {
+ this.ws_ts = ws_ts;
+ }
+
+ public void setWss_ts(StreamURL wss_ts) {
+ this.wss_ts = wss_ts;
+ }
+
+ public void setRtmp(StreamURL rtmp) {
+ this.rtmp = rtmp;
+ }
+
+ public void setRtmps(StreamURL rtmps) {
+ this.rtmps = rtmps;
+ }
+
+ public void setRtsp(StreamURL rtsp) {
+ this.rtsp = rtsp;
+ }
+
+ public void setRtsps(StreamURL rtsps) {
+ this.rtsps = rtsps;
+ }
+
+ public void setRtc(StreamURL rtc) {
+ this.rtc = rtc;
+ }
+
+ public void setRtcs(StreamURL rtcs) {
+ this.rtcs = rtcs;
+ }
+
+ public void setRtmp(String host, int port, int sslPort, String app, String stream, String callIdParam) {
+ String file = String.format("%s/%s/%s", app, stream, callIdParam);
+ if (port > 0) {
+ this.rtmp = new StreamURL("rtmp", host, port, file);
+ }
+ if (sslPort > 0) {
+ this.rtmps = new StreamURL("rtmps", host, sslPort, file);
+ }
+ }
+
+ public void setRtsp(String host, int port, int sslPort, String app, String stream, String callIdParam) {
+ String file = String.format("%s/%s/%s", app, stream, callIdParam);
+ if (port > 0) {
+ this.rtsp = new StreamURL("rtsp", host, port, file);
+ }
+ if (sslPort > 0) {
+ this.rtsps = new StreamURL("rtsps", host, sslPort, file);
+ }
+ }
+
+ public void setFlv(String host, int port, int sslPort, String app, String stream, String callIdParam) {
+ String file = String.format("%s/%s.live.flv%s", app, stream, callIdParam);
+ if (port > 0) {
+ this.flv = new StreamURL("http", host, port, file);
+ }
+ this.ws_flv = new StreamURL("ws", host, port, file);
+ if (sslPort > 0) {
+ this.https_flv = new StreamURL("https", host, sslPort, file);
+ this.wss_flv = new StreamURL("wss", host, sslPort, file);
+ }
+ }
+
+ public void setFmp4(String host, int port, int sslPort, String app, String stream, String callIdParam) {
+ String file = String.format("%s/%s.live.mp4%s", app, stream, callIdParam);
+ if (port > 0) {
+ this.fmp4 = new StreamURL("http", host, port, file);
+ this.ws_fmp4 = new StreamURL("ws", host, port, file);
+ }
+ if (sslPort > 0) {
+ this.https_fmp4 = new StreamURL("https", host, sslPort, file);
+ this.wss_fmp4 = new StreamURL("wss", host, sslPort, file);
+ }
+ }
+
+ public void setHls(String host, int port, int sslPort, String app, String stream, String callIdParam) {
+ String file = String.format("%s/%s/hls.m3u8%s", app, stream, callIdParam);
+ if (port > 0) {
+ this.hls = new StreamURL("http", host, port, file);
+ this.ws_hls = new StreamURL("ws", host, port, file);
+ }
+ if (sslPort > 0) {
+ this.https_hls = new StreamURL("https", host, sslPort, file);
+ this.wss_hls = new StreamURL("wss", host, sslPort, file);
+ }
+ }
+
+ public void setTs(String host, int port, int sslPort, String app, String stream, String callIdParam) {
+ String file = String.format("%s/%s.live.ts%s", app, stream, callIdParam);
+
+ if (port > 0) {
+ this.ts = new StreamURL("http", host, port, file);
+ this.ws_ts = new StreamURL("ws", host, port, file);
+ }
+ if (sslPort > 0) {
+ this.https_ts = new StreamURL("https", host, sslPort, file);
+ this.wss_ts = new StreamURL("wss", host, sslPort, file);
+ }
+ }
+
+ public void setRtc(String host, int port, int sslPort, String app, String stream, String callIdParam) {
+ String file = String.format("index/api/webrtc?app=%s&stream=%s&type=play%s", app, stream, callIdParam);
+ if (port > 0) {
+ this.rtc = new StreamURL("http", host, port, file);
+ }
+ if (sslPort > 0) {
+ this.rtcs = new StreamURL("https", host, sslPort, file);
+ }
+ }
+
+ public void channgeStreamIp(String localAddr) {
+ if (this.flv != null) {
+ this.flv.setHost(localAddr);
+ }
+ if (this.ws_flv != null ){
+ this.ws_flv.setHost(localAddr);
+ }
+ if (this.hls != null ) {
+ this.hls.setHost(localAddr);
+ }
+ if (this.ws_hls != null ) {
+ this.ws_hls.setHost(localAddr);
+ }
+ if (this.ts != null ) {
+ this.ts.setHost(localAddr);
+ }
+ if (this.ws_ts != null ) {
+ this.ws_ts.setHost(localAddr);
+ }
+ if (this.fmp4 != null ) {
+ this.fmp4.setHost(localAddr);
+ }
+ if (this.ws_fmp4 != null ) {
+ this.ws_fmp4.setHost(localAddr);
+ }
+ if (this.rtc != null ) {
+ this.rtc.setHost(localAddr);
+ }
+ if (this.https_flv != null) {
+ this.https_flv.setHost(localAddr);
+ }
+ if (this.wss_flv != null) {
+ this.wss_flv.setHost(localAddr);
+ }
+ if (this.https_hls != null) {
+ this.https_hls.setHost(localAddr);
+ }
+ if (this.wss_hls != null) {
+ this.wss_hls.setHost(localAddr);
+ }
+ if (this.wss_ts != null) {
+ this.wss_ts.setHost(localAddr);
+ }
+ if (this.https_fmp4 != null) {
+ this.https_fmp4.setHost(localAddr);
+ }
+ if (this.wss_fmp4 != null) {
+ this.wss_fmp4.setHost(localAddr);
+ }
+ if (this.rtcs != null) {
+ this.rtcs.setHost(localAddr);
+ }
+ if (this.rtsp != null) {
+ this.rtsp.setHost(localAddr);
+ }
+ if (this.rtsps != null) {
+ this.rtsps.setHost(localAddr);
+ }
+ if (this.rtmp != null) {
+ this.rtmp.setHost(localAddr);
+ }
+ if (this.rtmps != null) {
+ this.rtmps.setHost(localAddr);
+ }
+ }
+
public static class TransactionInfo{
public String callId;
@@ -65,116 +346,116 @@ public class StreamInfo {
this.channelId = channelId;
}
- public String getFlv() {
+ public String getStream() {
+ return stream;
+ }
+
+ public void setStream(String stream) {
+ this.stream = stream;
+ }
+
+ public String getIp() {
+ return ip;
+ }
+
+ public void setIp(String ip) {
+ this.ip = ip;
+ }
+
+ public StreamURL getFlv() {
return flv;
}
- public void setFlv(String flv) {
- this.flv = flv;
+ public StreamURL getHttps_flv() {
+ return https_flv;
}
- public String getWs_flv() {
+ public StreamURL getWs_flv() {
return ws_flv;
}
- public void setWs_flv(String ws_flv) {
- this.ws_flv = ws_flv;
+
+ public StreamURL getWss_flv() {
+ return wss_flv;
}
- public String getRtmp() {
- return rtmp;
- }
-
- public void setRtmp(String rtmp) {
- this.rtmp = rtmp;
- }
-
- public String getHls() {
- return hls;
- }
-
- public void setHls(String hls) {
- this.hls = hls;
- }
-
- public String getRtsp() {
- return rtsp;
- }
-
- public void setRtsp(String rtsp) {
- this.rtsp = rtsp;
- }
-
- public Object getTracks() {
- return tracks;
- }
-
- public void setTracks(Object tracks) {
- this.tracks = tracks;
- }
-
- public String getFmp4() {
+ public StreamURL getFmp4() {
return fmp4;
}
- public void setFmp4(String fmp4) {
- this.fmp4 = fmp4;
+
+
+ public StreamURL getHttps_fmp4() {
+ return https_fmp4;
}
- public String getWs_fmp4() {
+ public StreamURL getWs_fmp4() {
return ws_fmp4;
}
- public void setWs_fmp4(String ws_fmp4) {
- this.ws_fmp4 = ws_fmp4;
+ public StreamURL getWss_fmp4() {
+ return wss_fmp4;
}
- public String getWs_hls() {
+ public StreamURL getHls() {
+ return hls;
+ }
+
+
+ public StreamURL getHttps_hls() {
+ return https_hls;
+ }
+
+ public StreamURL getWs_hls() {
return ws_hls;
}
- public void setWs_hls(String ws_hls) {
- this.ws_hls = ws_hls;
+ public StreamURL getWss_hls() {
+ return wss_hls;
}
- public String getTs() {
+ public StreamURL getTs() {
return ts;
}
- public void setTs(String ts) {
- this.ts = ts;
+
+ public StreamURL getHttps_ts() {
+ return https_ts;
}
- public String getWs_ts() {
+
+ public StreamURL getWs_ts() {
return ws_ts;
}
- public void setWs_ts(String ws_ts) {
- this.ws_ts = ws_ts;
+
+ public StreamURL getWss_ts() {
+ return wss_ts;
}
- public String getStreamId() {
- return streamId;
+
+ public StreamURL getRtmp() {
+ return rtmp;
}
- public void setStreamId(String streamId) {
- this.streamId = streamId;
+ public StreamURL getRtmps() {
+ return rtmps;
}
- public String getRtc() {
+ public StreamURL getRtsp() {
+ return rtsp;
+ }
+
+ public StreamURL getRtsps() {
+ return rtsps;
+ }
+
+ public StreamURL getRtc() {
return rtc;
}
- public void setRtc(String rtc) {
- this.rtc = rtc;
- }
-
- public TransactionInfo getTransactionInfo() {
- return transactionInfo;
- }
-
- public void setTransactionInfo(TransactionInfo transactionInfo) {
- this.transactionInfo = transactionInfo;
+ public StreamURL getRtcs() {
+ return rtcs;
}
public String getMediaServerId() {
@@ -185,83 +466,62 @@ public class StreamInfo {
this.mediaServerId = mediaServerId;
}
- public String getHttps_flv() {
- return https_flv;
+ public Object getTracks() {
+ return tracks;
}
- public void setHttps_flv(String https_flv) {
- this.https_flv = https_flv;
+ public void setTracks(Object tracks) {
+ this.tracks = tracks;
}
- public String getWss_flv() {
- return wss_flv;
+ public String getStartTime() {
+ return startTime;
}
- public void setWss_flv(String wss_flv) {
- this.wss_flv = wss_flv;
+ public void setStartTime(String startTime) {
+ this.startTime = startTime;
}
- public String getWss_fmp4() {
- return wss_fmp4;
+ public String getEndTime() {
+ return endTime;
}
- public void setWss_fmp4(String wss_fmp4) {
- this.wss_fmp4 = wss_fmp4;
+ public void setEndTime(String endTime) {
+ this.endTime = endTime;
}
- public String getWss_hls() {
- return wss_hls;
+ public double getProgress() {
+ return progress;
}
- public void setWss_hls(String wss_hls) {
- this.wss_hls = wss_hls;
+ public void setProgress(double progress) {
+ this.progress = progress;
}
- public String getWss_ts() {
- return wss_ts;
+ public boolean isPause() {
+ return pause;
}
- public void setWss_ts(String wss_ts) {
- this.wss_ts = wss_ts;
+ public void setPause(boolean pause) {
+ this.pause = pause;
}
- public String getRtmps() {
- return rtmps;
+ public TransactionInfo getTransactionInfo() {
+ return transactionInfo;
}
- public void setRtmps(String rtmps) {
- this.rtmps = rtmps;
+ public void setTransactionInfo(TransactionInfo transactionInfo) {
+ this.transactionInfo = transactionInfo;
}
- public String getRtsps() {
- return rtsps;
- }
-
- public void setRtsps(String rtsps) {
- this.rtsps = rtsps;
- }
-
- public String getHttps_hls() {
- return https_hls;
- }
-
- public void setHttps_hls(String https_hls) {
- this.https_hls = https_hls;
- }
-
- public String getHttps_fmp4() {
- return https_fmp4;
- }
-
- public void setHttps_fmp4(String https_fmp4) {
- this.https_fmp4 = https_fmp4;
- }
-
- public String getHttps_ts() {
- return https_ts;
- }
-
- public void setHttps_ts(String https_ts) {
- this.https_ts = https_ts;
+ @Override
+ public StreamInfo clone() {
+ StreamInfo instance = null;
+ try{
+ instance = (StreamInfo)super.clone();
+ }catch(CloneNotSupportedException e) {
+ e.printStackTrace();
+ }
+ return instance;
}
}
diff --git a/src/main/java/com/genersoft/iot/vmp/common/StreamURL.java b/src/main/java/com/genersoft/iot/vmp/common/StreamURL.java
new file mode 100644
index 00000000..eecf469f
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/common/StreamURL.java
@@ -0,0 +1,80 @@
+package com.genersoft.iot.vmp.common;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import java.io.Serializable;
+
+
+@Schema(description = "流地址信息")
+public class StreamURL implements Serializable {
+
+ @Schema(description = "协议")
+ private String protocol;
+
+ @Schema(description = "主机地址")
+ private String host;
+
+ @Schema(description = "端口")
+ private int port = -1;
+
+ @Schema(description = "定位位置")
+ private String file;
+
+ @Schema(description = "拼接后的地址")
+ private String url;
+
+ public StreamURL() {
+ }
+
+ public StreamURL(String protocol, String host, int port, String file) {
+ this.protocol = protocol;
+ this.host = host;
+ this.port = port;
+ this.file = file;
+ }
+
+ public String getProtocol() {
+ return protocol;
+ }
+
+ public void setProtocol(String protocol) {
+ this.protocol = protocol;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public String getFile() {
+ return file;
+ }
+
+ public void setFile(String file) {
+ this.file = file;
+ }
+
+ public String getUrl() {
+ return this.toString();
+ }
+
+ @Override
+ public String toString() {
+ if (protocol != null && host != null && port != -1 ) {
+ return String.format("%s://%s:%s/%s", protocol, host, port, file);
+ }else {
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/common/SystemAllInfo.java b/src/main/java/com/genersoft/iot/vmp/common/SystemAllInfo.java
new file mode 100644
index 00000000..48485da8
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/common/SystemAllInfo.java
@@ -0,0 +1,54 @@
+package com.genersoft.iot.vmp.common;
+
+import java.util.List;
+
+public class SystemAllInfo {
+
+ private List