Compare commits

..

1921 Commits

Author SHA1 Message Date
zxb
49989b414c 暂时取消 回放流id 附带 ssrc 2023-10-12 10:12:54 +08:00
zxb
628b851b77 回放流id 附带 ssrc 2023-10-10 14:38:20 +08:00
zxb
7b78e719bf 回放流id 附带 ssrc 2023-10-10 14:32:29 +08:00
zxb
23f2e48ba1 Merge remote-tracking branch 'sk/dev-2.6.9_整理' into dev-2.6.9_整理 2023-09-27 09:46:58 +08:00
zxb
52cad8672b 调大zlm超时时间 防止某些情况下误判 2023-09-27 09:46:12 +08:00
zxb
16be1040f8 修复 deleteWithoutGBId sql 语句 2023-09-27 09:43:08 +08:00
zxb
aeeca07a79 修改设备离线逻辑 收不到心跳包时 不要乱踢进行中的视频流 2023-09-22 22:59:38 +08:00
zxb
ec2a33d52c downloadSpeed 兼容 浮点类型 并 转为 int 类型 2023-09-22 11:38:33 +08:00
zxb
87e8cfb321 downloadSpeed 兼容 浮点类型 并 转为 int 类型 2023-09-22 11:36:41 +08:00
zxb
0e92c640aa 调试 2023-09-22 02:33:11 +08:00
zxb
b092035af1 国标级联 修复 多级级联时找不到 级联的 设备 和 通道 问题 2023-09-21 23:01:49 +08:00
zxb
279d789c12 Merge remote-tracking branch 'origin/dev-2.6.9_整理' into dev-2.6.9_整理 2023-09-05 11:49:04 +08:00
zxb
eaccb1630b 国标级联 续订失败不要主动断开 2023-09-05 11:47:19 +08:00
zxb
1f07304e80 兼容 不标准的 recordInfo 协议 2023-08-29 17:25:56 +08:00
zxb
8c559a8de1 兼容 不标准的 recordInfo 协议 2023-08-29 17:18:58 +08:00
zxb
17278523d9 修复历史文件拉取异常 2023-08-21 16:55:00 +08:00
zxb
19f7dc21a1 支持配置 assistant 的ip 2023-08-17 13:25:02 +08:00
zxb
869cb772d9 ssrc 码流类型调整 2023-08-16 15:49:56 +08:00
zxb
c8a6ad283c SipRequest fromHeader 为 channelId 时无法正常查询
DeviceChannelMapper getDeviceByChannelId 查询语句错误修复
2023-08-15 14:46:41 +08:00
zxb
4bfe6fc17d 心跳过于频繁 添加判断 2023-08-14 17:26:32 +08:00
zxb
5222f89bee 测试 2023-08-11 10:49:31 +08:00
3e2910d7ea Merge remote-tracking branch 'github/wvp-28181-2.0' into dev-2.6.9_整理 2023-08-11 09:23:21 +08:00
648540858
6291af7d83 Merge branch '2.6.8' into wvp-28181-2.0 2023-08-08 16:06:39 +08:00
648540858
8bb660fa86 解决使用redis集群时获取发送端口失败的问题 2023-08-08 16:06:02 +08:00
zxb
df46dbd653 wvp_device_channel stream_id 长度过短导致国标级联上级点播历史录像出错
其他奇奇怪怪的bug 调试/修复
2023-08-08 11:26:51 +08:00
648540858
66fa075a1a 支持对接第三方PS流 2023-08-08 10:01:51 +08:00
648540858
e9b3e659a8 Merge branch '2.6.8' into wvp-28181-2.0 2023-08-08 09:50:31 +08:00
648540858
8830a6046a 支持与第三方对接PS流 2023-08-08 09:49:27 +08:00
zxb
f0cba184fe 国标录像无法查询下级平台录像问题排查:
初步定位 因 RecordEndEventListener.handlerMap
时间触发完成时 handlerMap.get 时 null 导致
待后续排查/解决
2023-08-07 17:19:51 +08:00
648540858
6b169b208c Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-08-07 17:04:11 +08:00
648540858
8b3ea68191 支持全局固定流地址 2023-08-07 17:00:01 +08:00
zxb
15641114ef maven 人大金仓 依赖调整 2023-08-07 15:44:32 +08:00
zxb
9e0e8878ca 调整 2023-08-07 15:44:07 +08:00
zxb
6709c951ed 添加拦截器 便于测试 2023-08-07 15:43:56 +08:00
zxb
ab6192a106 更新测试配置 2023-08-07 12:35:28 +08:00
zxb
a27be660fe 添加 拦截器方便调试 2023-08-07 12:35:13 +08:00
zxb
64a613cea6 ZLMHttpHookListener mediaInfo 空指针异常修复 2023-08-07 12:34:31 +08:00
648540858
ba4de716a5 Merge pull request #989 from dodu2014/wvp-28181-2.0-1
Update config.md
2023-08-07 10:05:13 +08:00
dodu2014
1e16b1a51c Update config.md
修复文档错别字
2023-08-07 09:55:19 +08:00
648540858
97800b2610 invite消息缓存字符间隔改为使用:代替_,避免scan查询失败 2023-08-04 17:53:12 +08:00
zxb
be75aa7a68 Merge remote-tracking branch 'github/wvp-28181-2.0' into dev-2.6.9_整理
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
2023-08-04 17:07:54 +08:00
648540858
d099daeb31 录像下载不使用固定地址 2023-08-04 16:41:29 +08:00
zxb
25321e3a7d 调整 2023-08-04 16:40:37 +08:00
648540858
16564481c4 重构点播,回放,下载时ssrc不一致以及TCP主动播放的逻辑 2023-08-04 15:47:56 +08:00
zxb
8b72d7db64 修复设备不能正常删除的bug 2023-08-04 15:04:25 +08:00
zxb
60b67c3892 修复设备不能正常删除的bug 2023-08-04 14:44:19 +08:00
zxb
5a9354639e 添加 lombok 和 mapstruct 支持
添加测试启动类及配置
2023-08-04 11:16:08 +08:00
648540858
626959d015 默认关闭ssrc check 2023-08-03 16:08:22 +08:00
648540858
86b87ba55e 修复tcp主动录像回放时ssrc不一致时点播失败的问题 2023-08-03 15:50:15 +08:00
648540858
a251014ed3 优化点播超时的处理,修复tcp主动点播时ssrc不一致时点播失败的问题 2023-08-03 15:36:59 +08:00
648540858
2858444ffe 修复gps位置更新时时间格式错误的问题 #971 2023-08-01 10:37:00 +08:00
648540858
27d77f77e9 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-08-01 10:29:20 +08:00
648540858
dcbf0bfe7e Merge branch '2.6.8' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerFactory.java
#	src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
2023-08-01 10:28:41 +08:00
648540858
4a58530498 Merge pull request #978 from dodu2014/wvp-28181-2.0
docs: 修正日志管理控制器mapping的错误描述
2023-08-01 09:47:14 +08:00
tnt group
87a23ff3d7 docs: 修正日志管理控制器mapping的错误描述 2023-08-01 08:27:47 +08:00
648540858
8749ff5148 Merge pull request #976 from dodu2014/wvp-28181-2.0
fix: 修复请求截图api生成文件名称的异常 #975
2023-07-31 17:01:10 +08:00
648540858
d93e4e0204 优化发流逻辑 2023-07-31 16:42:12 +08:00
648540858
2c5c957f9d 移除无用代码 2023-07-31 12:26:42 +08:00
tnt group
2d16661827 fix: 修复请求截图api生成文件名称的异常 2023-07-30 13:25:38 +08:00
648540858
2b5738cc3e 支持录像回放使用固定流地址以及自动点播录像回放 2023-07-25 11:14:43 +08:00
648540858
aad7228578 Merge pull request #965 from wanghui0961/wvp-28181-2.0
feat:支持级联tcp主动
2023-07-25 10:14:06 +08:00
648540858
bd94c1e539 Merge pull request #964 from DavidSche/wvp-28181-2.0
修复在国标级联选择通道时,如果添加通道到跟平台根目录(即平台本身),无法触发目录变更事件问题.详见 https://github.com/
2023-07-25 10:13:24 +08:00
wanghui
08da3511d9 feat:支持级联tcp主动 2023-07-24 15:57:11 +08:00
che_shuai
e3d7996865 修复在国标级联选择通道时,如果添加通道到跟平台根目录(即平台本身),无法触发目录变更事件问题.详见 https://github.com/648540858/wvp-GB28181-pro/issues/958 2023-07-24 14:10:46 +08:00
648540858
ec93a616f3 修复端口分配的并发问题 2023-07-24 09:06:49 +08:00
648540858
3e5e7f5477 修复端口分配的并发问题 2023-07-24 09:04:47 +08:00
648540858
a92775ec49 优化sip协议栈调用 2023-07-21 20:01:01 +08:00
648540858
c68611cad6 优化sip协议栈调用 2023-07-21 19:57:49 +08:00
648540858
cd68a402c5 更新readme 2023-07-21 15:55:49 +08:00
648540858
f17aac9021 修复空指针异常 2023-07-21 15:13:20 +08:00
648540858
f9264b585a 合并分支新内容 2023-07-20 17:56:04 +08:00
648540858
605969b60a Merge branch '2.6.8' into wvp-28181-2.0
# Conflicts:
#	sql/初始化.sql
#	src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
#	src/main/resources/all-application.yml
2023-07-20 17:51:16 +08:00
648540858
d84b987f70 添加配置 2023-07-20 17:29:36 +08:00
648540858
5eeb77faad 扩展兼容接口,支持HTTPS接口 2023-07-20 17:18:11 +08:00
648540858
7b33a790a8 Merge pull request #957 from orcfnjmlns908/wvp-28181-2.0
优化拉流代理保存
2023-07-20 13:00:02 +08:00
648540858
f8908474b3 修复civilCode判断错误导致civilCode丢失 2023-07-19 20:48:15 +08:00
648540858
a0a4fdb032 修复国标级联时添加目录不同平台无法使用同一个目录的问题 2023-07-19 15:33:21 +08:00
tonyjianhua
99221a34c3 优化拉流代理保存 2023-07-19 13:33:53 +08:00
648540858
631179d0c1 添加缺少的sql字段 2023-07-17 17:33:19 +08:00
648540858
1d5320836f 合并分支功能 2023-07-17 17:28:49 +08:00
648540858
84ea0d313f Merge branch '2.6.8' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
2023-07-17 16:56:58 +08:00
648540858
0d1abf5580 优化发流端口分配 2023-07-17 16:55:41 +08:00
648540858
02bc1c393d 优化日志 2023-07-17 16:54:00 +08:00
648540858
28af94d18c Merge pull request #956 from xiaoQQya/develop
perf(config): 补全 all-application.yml 配置文件
2023-07-17 16:42:16 +08:00
xiaoQQya
f707dee47d perf(config): 补全 all-application.yml 配置文件 2023-07-17 15:51:09 +08:00
648540858
6fddd1d34a Merge pull request #939 from xiaoQQya/wvp-28181-2.0
修复设备通道列表按通道类型筛选不准确等问题
2023-07-17 15:44:10 +08:00
648540858
12d3e26ecc Merge pull request #955 from nikmu/wvp-28181-2.0
修复上级平台点播过程中本平台生成的ssrc并没有在openRtp中使用导致会新生成ssrc和之前的冲突
2023-07-17 14:30:55 +08:00
朱俊杰
5ee2d26ed1 修复上级平台点播过程中本平台生成的ssrc并没有在openRtp中使用导致会新生成ssrc和之前的冲突 2023-07-17 10:54:34 +08:00
648540858
a9bd11b9d4 优化拉流代理的添加 2023-07-14 19:46:41 +08:00
648540858
60007bb552 推流默认开启音频 2023-07-14 11:27:58 +08:00
648540858
c5ebd79093 修复因为心跳重发导致的心跳间隔异常 2023-07-14 09:10:59 +08:00
648540858
77cebecd45 修复数据存储 2023-07-14 08:34:15 +08:00
648540858
f7d6ec1332 修复合并错误 2023-07-13 14:57:30 +08:00
648540858
e6d9d65e51 Merge branch '2.6.8' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
#	src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
#	src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerFactory.java
#	src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/HookResultForOnPublish.java
#	src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
#	src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java
#	src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java
2023-07-13 14:47:24 +08:00
648540858
c6cc5209c0 增加发流音视频分开发送 2023-07-13 14:30:41 +08:00
648540858
561591b8bb Merge pull request #948 from DavidSche/wvp-28181-2.0
修复多级级联平台平台时,上级平台无法获取设备录像列表问题。问题详见  https://github.com/648540858/wvp-G
2023-07-13 14:07:58 +08:00
che_shuai
e94ffbdd5f 修复多级级联平台平台时,上级平台无法获取设备录像列表问题。问题详见 https://github.com/648540858/wvp-GB28181-pro/issues/914 2023-07-13 10:22:42 +08:00
648540858
f167a9c9e8 修复发流复盖的为问题 2023-07-12 15:13:53 +08:00
648540858
d10d7ab89c 合并主线的发流端口管理逻辑 2023-07-10 14:30:59 +08:00
xiaoQQya
44680ebe63 fix(play): 修复作为上级平台点播截取快照问题 2023-07-09 20:22:40 +08:00
648540858
4946c83675 优化第三方对接接口 2023-07-07 18:17:24 +08:00
648540858
70933aef8c 优化海康发送的Message消息设置的消息体长度为0,导致无法解析的问题 #920 2023-07-07 14:51:41 +08:00
648540858
ee1a823cb6 优化海康发送长度与实际长度不一致的情况,导致无法识别消息内容的问题 2023-07-06 18:01:16 +08:00
648540858
29f2abb3a4 修复BUG #928 2023-07-06 15:55:58 +08:00
648540858
400a71b18e 修复数据错误导致无法转成JSON返回 #919 2023-07-06 15:35:59 +08:00
648540858
47221e73a5 兼容海康平台在address字段使用错误的<或>破坏xml结构的情况, #903 2023-07-06 15:18:10 +08:00
648540858
5d83a431bd Merge branch '2.6.8' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java
2023-07-06 15:07:43 +08:00
648540858
0ced2a8b2d 修复非必传参数 2023-07-06 15:07:16 +08:00
648540858
b5133f66c5 添加兼容目录同步兼容性 2023-07-05 17:20:20 +08:00
648540858
08372e5ede 修复拉流代理无人观看自动停用失败 2023-07-04 11:10:17 +08:00
648540858
36c2e23ef4 修复单端口点播 2023-07-03 17:55:34 +08:00
648540858
663858a9d1 Merge branch '2.6.8' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
#	src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java
2023-07-03 16:54:09 +08:00
648540858
090d5b8b62 增加与第三方对接的接口 2023-07-03 16:53:03 +08:00
648540858
1bd68d1373 优化字段名称 2023-07-03 10:36:02 +08:00
648540858
b5ff247a82 增加备用字段 2023-07-02 12:40:41 +08:00
648540858
cb3c221b69 增加备用字段 2023-07-02 00:03:21 +08:00
648540858
bb87550cdc Merge pull request #908 from cnless/wvp-28181-2.0
fix:修复ResponseBody未关闭以及点播超时报错AsyncRequestTimeoutException
2023-07-01 23:04:39 +08:00
648540858
d10ea890fa 修复添加拉流代理提交错误 2023-07-01 22:50:24 +08:00
648540858
780fd24c9c 修复打开分享页需要登陆的BUG 2023-07-01 22:14:53 +08:00
648540858
e9c019a28c 优化发流逻辑 2023-07-01 18:10:33 +08:00
648540858
fe1f73a1c1 优化更新通道中父结点的判断 2023-06-30 10:34:02 +08:00
648540858
dc957d3104 优化更新通道中父结点的判断 2023-06-30 10:01:21 +08:00
648540858
bb4d5b895b 优化更新通道的civicode判断 2023-06-29 17:10:14 +08:00
648540858
d2c4050454 修复使用推流状态作为推流通道状态为false仍然发送通知 2023-06-29 11:22:32 +08:00
648540858
a3af529d04 修复未验证通过的表单被应该提交 2023-06-29 11:09:41 +08:00
648540858
916b274958 合并268优化内容 2023-06-29 10:37:20 +08:00
648540858
de2452833d Merge branch '2.6.8' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/conf/redis/RedisMsgListenConfig.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/bean/Gb28181Sdp.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java
#	src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
#	src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
#	src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
2023-06-29 09:52:05 +08:00
648540858
ee59539530 优化树形列表通道查询 2023-06-29 09:36:13 +08:00
648540858
f96973501c 增加流关闭时的处理 2023-06-28 20:32:48 +08:00
648540858
2b795b1d19 增加上级推流和停止推流的通知 2023-06-28 16:52:27 +08:00
648540858
74c79a12db 修复树形列表通道查询 2023-06-28 15:02:59 +08:00
648540858
1cb62ba3fc 优化端口预占用,防止占用无法释放 2023-06-28 14:50:46 +08:00
648540858
a302a185f1 添加关闭收流发流的接口 2023-06-28 10:47:33 +08:00
648540858
fd4964a118 doc去除cdn依赖 2023-06-28 09:15:07 +08:00
648540858
25fa219be0 增加redis通道 2023-06-27 15:34:38 +08:00
648540858
b23d4b984e 修复上级点播时如果推流信息中mediaServerID错误的情况 2023-06-26 19:06:14 +08:00
648540858
f2001904f8 优化国标信令 2023-06-25 22:40:26 +08:00
dsk
31515d2f7b 新增接口超时时间配置,修复点播超时的情况下报错org.springframework.web.context.request.async.AsyncRequestTimeoutException 2023-06-25 16:16:40 +08:00
dsk
0d7789f2a6 修复请求报错404等情况下导致ResponseBody未关闭的问题 2023-06-25 16:00:37 +08:00
648540858
b9db7c15a6 优化自动获取stream ip 2023-06-25 13:49:07 +08:00
648540858
3691d6ff97 优化子码流切换逻辑,去除主子多开逻辑。优化单端口模式ssrc变化导致的无法移出点播缓存 #895 2023-06-22 22:35:35 +08:00
648540858
312775fb27 修复表名错误 #904 2023-06-21 15:53:26 +08:00
648540858
4fd26db2a1 优化国标级联的端口保持 2023-06-21 14:03:31 +08:00
648540858
94ace01c42 添加文档依赖,去除cdn依赖 2023-06-20 15:25:56 +08:00
648540858
b0094a5755 添加sql字段 2023-06-20 14:25:01 +08:00
648540858
0325efd84c 恢复默认值 2023-06-20 14:17:44 +08:00
648540858
2546748867 Merge pull request #893 from sxh-netizen/wvp-28181-2.0
新增设备主子码流开关选择,默认为不开启
2023-06-20 14:16:46 +08:00
648540858
eef26ec736 Merge branch 'wvp-28181-2.0' into wvp-28181-2.0 2023-06-20 14:15:27 +08:00
648540858
f3b44a97f5 修复删除的设备无法重新注册的问题 2023-06-20 13:02:18 +08:00
648540858
f96f575d65 修复通道刷新 2023-06-20 12:51:06 +08:00
648540858
5c631d8039 去除多余字段 2023-06-20 09:57:28 +08:00
648540858
3e45526474 优化国标级联注册机制 2023-06-20 09:29:12 +08:00
648540858
16256537fb Merge branch '2.6.8' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
#	src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
#	src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
#	src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java
#	src/main/resources/all-application.yml
#	web_src/package-lock.json
2023-06-19 20:19:31 +08:00
648540858
c64fb0d3db 优化国标级联注册机制 2023-06-19 20:09:16 +08:00
648540858
eeb345fa93 优化国标级联的目录创建以及推送规则,优化接收目录规则,更加规范 2023-06-19 18:42:36 +08:00
‘sxh’
5d6b8c1804 同步主线的代码,保持一致性 2023-06-15 11:20:43 +08:00
‘sxh’
ed6aaa25b9 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
#	src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
#	src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
2023-06-15 11:10:20 +08:00
‘sxh’
08e8469998 新增设备主子码流选择(mysql语句) 2023-06-15 11:04:04 +08:00
‘sxh’
7e70ad4849 新增设备主子码流选择,默认为不开启 2023-06-15 11:00:29 +08:00
648540858
d9506b9e59 优化移动位置的时间 2023-06-14 20:39:10 +08:00
648540858
ef5440a97f Merge pull request #876 from criver31/wvp-28181-2.0
移动设备实时位置兼容ISO8601格式
2023-06-14 20:14:31 +08:00
648540858
b4f0d17f9f 修复前端空指针异常 #831 2023-06-14 18:14:40 +08:00
648540858
db1d503c55 修复移动位置获取接口超时 #857 2023-06-14 17:04:41 +08:00
648540858
7f22b5e504 修复级联录像查询sql错误 2023-06-14 16:26:29 +08:00
648540858
dcde54d8cd 去除多余日志 2023-06-13 23:11:56 +08:00
648540858
1fcb946700 Merge branch '2.6.8' into wvp-28181-2.0 2023-06-13 23:11:00 +08:00
648540858
5f2d4393c3 修复zlm上线时过期任务设置错误 2023-06-13 23:06:35 +08:00
648540858
97bd082a40 修复sdp解析错误 2023-06-12 22:54:40 +08:00
648540858
415c13cf72 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-06-10 00:33:00 +08:00
648540858
4ed7cb49be 优化sdp解析,兼容带有f=的设备 2023-06-10 00:32:42 +08:00
648540858
0a538ca23d Merge pull request #887 from bigbeef/wvp-28181-2.0
fix:修复拉流代理配置展示问题:音频、录制、无人观看
2023-06-09 23:18:15 +08:00
winfed
45ad19b712 feat:删除拉流代理时,提示是否确认删除,防止误删 2023-06-09 15:50:33 +08:00
winfed
9f50dd8fcb fix:修复拉流代理配置展示问题:音频、录制、无人观看 2023-06-09 15:19:18 +08:00
648540858
4815af8ca0 修复stream-on-demand配置失效的BUG 2023-06-08 22:46:07 +08:00
648540858
4d8cf32fbc Merge branch '2.6.8' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
2023-06-08 10:41:36 +08:00
648540858
508b3aa44f 优化ffmpeg拉流代理 2023-06-08 10:40:16 +08:00
648540858
0b8584243f 优化via的branch生成规则 2023-06-07 21:45:15 +08:00
648540858
3d2f34e736 增加收到notify增加或移除通道时发送redis消息 2023-06-07 21:11:39 +08:00
648540858
3a2468eef5 支持redis消息强制关闭流 2023-06-07 20:58:35 +08:00
648540858
e196e012de 合并分支 2023-06-07 20:27:57 +08:00
648540858
96f8bded6e Merge branch '2.6.8' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/gb28181/session/SSRCFactory.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
#	src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
#	src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
2023-06-07 20:21:10 +08:00
648540858
e7402c9488 修复录像下载,优化拉流代理接口 2023-06-07 20:15:08 +08:00
648540858
730779ba86 优化截图获取接口 2023-06-05 11:10:15 +08:00
648540858
8e014cce07 修复拉流代理的ffmpeg代理方式 2023-06-05 10:28:11 +08:00
648540858
3c1528b168 修复添加目录SQL错误 #881 2023-06-05 09:39:59 +08:00
648540858
6a24603fd3 优化日志 2023-06-02 16:40:19 +08:00
648540858
75bb0ec40a 优化点播流程中ssrc的释放 2023-06-02 15:46:07 +08:00
648540858
b840b94bd2 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-06-01 15:58:33 +08:00
648540858
8903f64532 Merge pull request #872 from xu-bin-bin/wvp-28181-2.0
删除2.6.8升级2.6.9.sql文件中给表gb_stream添加主键sql,保证升级脚本能正常执行。
2023-06-01 15:58:19 +08:00
648540858
0ddaa93bbf Merge pull request #878 from callinglove/wvp-28181-2.0
修复 启用代理失败: ->缺少必要参数:"src_url","dst_url","timeout_ms"
2023-06-01 14:55:14 +08:00
yanggs
5acd9af03d 修复 启用代理失败: ->缺少必要参数:"src_url","dst_url","timeout_ms" 2023-06-01 13:30:48 +08:00
fine
9a6bedf576 Update MobilePositionResponseMessageHandler.java 2023-05-31 09:35:08 +08:00
xubinbin
7a9ce766a7 删除2.6.8升级2.6.9.sql文件中给表gb_stream添加主键sql,保证升级脚本能正常执行。 2023-05-30 13:24:46 +08:00
648540858
0333d83b6c 去除多余配置 2023-05-30 11:20:22 +08:00
648540858
406d9a6227 修复级联点播的空指针异常 #864 2023-05-30 11:00:11 +08:00
648540858
7d1cf85fb9 修复web端管理节点负载不显示国标收流 #871 2023-05-30 10:54:09 +08:00
648540858
7e818d0c07 移除手动配置mybatis下划线转驼峰 2023-05-30 10:32:08 +08:00
648540858
db51c6ae88 添加获取截图接口 2023-05-29 23:28:06 +08:00
648540858
3649f1d89a 修复引入的错误Order 2023-05-29 20:18:42 +08:00
648540858
c2f40e6adc 修复设备列表状态显示 2023-05-29 15:24:18 +08:00
648540858
f500c17eeb 修复地图页面云台状态显示以及状态显示 2023-05-29 15:16:44 +08:00
648540858
0400f66e85 添加文档 2023-05-29 09:40:36 +08:00
648540858
47a87cf98e Merge branch 'postgresql' into wvp-28181-2.0 2023-05-29 09:25:45 +08:00
648540858
8c411a7d93 修复升级sql 2023-05-29 09:23:21 +08:00
648540858
f0ac6fb35e Merge pull request #869 from shanyuanzz/wvp-28181-2.0
优化低倍速下云台控制的zoom缩放速率变化问题。
2023-05-29 09:14:56 +08:00
shanyuanzz
0e0c50ac44 优化低倍速下zoom变倍速率
1.优化zoom缩放在1-FH低倍速下的变倍速率。
避免变倍速率过大或者某些相机无法变倍的问题。
2023-05-28 14:01:51 +08:00
shanyuanzz
e09bcc0d66 优化zoom低倍速下的变倍速率
优化zoom低倍速下的变倍速率
2023-05-28 13:48:55 +08:00
shanyuanzz
27bc043028 Update SIPCommander.java
Add by 白米粥
1.修正云台控制的zoom的speedbug。
解决当zoom时speed为1-FH时速度变化为1-FH,而10H~FFH以上时是以首位速度进行变化,变化速率过于不一致。
修改后1-FH的速度均以1的速率进行缩放变倍。
2023-05-28 13:39:16 +08:00
648540858
ac2af3d3a0 去除多余注释 2023-05-23 14:35:40 +08:00
648540858
4c1b5dd464 修复推流鉴权 2023-05-23 10:34:00 +08:00
648540858
c9d69f0ac0 修复字段名错误 2023-05-22 11:23:48 +08:00
648540858
e52e2b634f 本地集成人大金仓连接jar 2023-05-17 10:29:45 +08:00
648540858
5d4e49e1eb 本地集成人大金仓连接jar 2023-05-16 17:17:24 +08:00
648540858
d4e08632cd 兼容人大金仓对online作为保留字段的要求 2023-05-16 15:13:38 +08:00
648540858
9744e86ad0 Merge pull request #852 from kairlec/wvp-28181-2.0
fix response `content-type` is not set if access without access token
2023-05-15 16:30:21 +08:00
Kairlec
d7bbc6203c fix response content-type is not set if access without access token 2023-05-15 16:26:37 +08:00
648540858
2bf76b55b8 优化部分sql实现 2023-05-15 16:08:31 +08:00
648540858
19e11268db 优化部分sql实现 2023-05-15 15:29:39 +08:00
648540858
a24a7a84c0 Merge pull request #847 from xu-bin-bin/wvp-28181-2.0
"@schedule"是Spring框架提供的一种定时任务执行机制,默认情况下它是单线程执行,将其修改为支持多线程。
2023-05-12 14:03:41 +08:00
648540858
a237046df0 更新文档 2023-05-12 12:40:22 +08:00
648540858
a32a7957b8 更新文档 2023-05-12 12:36:38 +08:00
648540858
f9c7b1c4d0 重构以适配postgresql 2023-05-12 10:37:03 +08:00
xubinbin
73c3d22d5d "@schedule"是Spring框架提供的一种定时任务执行机制,默认情况下它是单线程执行,项目中多次使用fixedRate按指定频率执行任务(不管前面任务是否已经完成),在同时执行多个定时任务时可能会出现阻塞和性能问题,为了解决这种单线程瓶颈问题,将定时任务的执行机制改为支持多线程 2023-05-10 15:38:22 +08:00
648540858
de2d243fcb Merge pull request #845 from 648540858/wvp-28181-2.0-test
Wvp 28181 2.0 test
2023-05-09 17:56:29 +08:00
648540858
5de16bb416 优化录像下载页面 2023-05-09 17:54:36 +08:00
648540858
d5dfe39c7a 支持级联国标录像下载 2023-05-09 17:31:58 +08:00
648540858
1aaab22d6e Merge pull request #844 from xiaoQQya/wvp-28181-2.0
修复前后端分离部署后通道快照不显示的问题
2023-05-08 17:56:56 +08:00
648540858
e344445ed9 修复hook订阅移除失败的问题 2023-05-08 17:55:07 +08:00
648540858
f124aebb30 修复国标视频点播三种级联并发点播和录像下载的问题 2023-05-08 17:18:08 +08:00
xiaoQQya
7626b4a6f2 fix(通道快照): 修复前后端分离部署后通道快照不显示的问题 2023-05-08 16:15:50 +08:00
648540858
3d51317f62 修复国标视频点播三种点播方式(自动点播,上级点播,接口点播)并发情况下失败的问题 2023-05-06 17:59:12 +08:00
648540858
a4bf9ffe7a 修复国标视频点播三种点播方式(自动点播,上级点播,接口点播)并发情况下失败的问题 2023-05-06 17:40:57 +08:00
648540858
41d2656cee Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-05-04 17:03:32 +08:00
648540858
2672d6655f 修复国标点播下级平台,ssrc更新的时单端口错误更新rtpserver的问题 2023-05-04 16:04:44 +08:00
648540858
37a455017d 优化国标点播下级平台,ssrc更新的时因为旧的端口释放慢导致点播失败的问题,使用新的接口直接更新ssrc 2023-05-04 15:36:04 +08:00
648540858
c9757ca645 优化国标规范,参考国标文档中-点播外域设备媒体流SSRC处理方式,上级点播时自定义ssrc,不适用上级携带的ssrc,也避免上级兼容性差,不携带ssrc的问题,可通过配置关闭此特性 2023-05-04 14:21:58 +08:00
648540858
1035cd72b0 Merge pull request #837 from keDaYao/featur-jt1078
新增1078信令,修复BUG
2023-04-28 14:59:44 +08:00
QingObject
c8221e4013 1、新增视频回放、视频回放控制Template
2、修复直播控制指令BUG
2023-04-28 14:39:50 +08:00
648540858
2283986dd1 Merge pull request #836 from keDaYao/featur-jt1078
新增JT1078 Template支持
2023-04-28 10:28:08 +08:00
QingObject
19df27aca6 新增JT1078 Template支持 2023-04-28 10:10:06 +08:00
648540858
f08cc1d3c3 Merge pull request #833 from yeqingli-KO/wvp-28181-2.0-wjy
创建回调函数时,不可带上括号,否则会在调用此语句时,立即执行一次回调函数
2023-04-28 09:34:34 +08:00
wangjunyi
9bb710438d 解决国标设备-通道-设备录像处的视频下载问题 2023-04-27 17:39:45 +08:00
wangjunyi
05d5ca707f 创建回调函数时,不可带上括号,否则会在调用此语句时,立即执行一次回调函数 2023-04-27 16:26:29 +08:00
648540858
d3c8b7035d 修复redis数据写入时超时时间设置错误的问题 2023-04-27 09:23:00 +08:00
648540858
1d5e419680 Merge pull request #829 from kairlec/wvp-28181-2.0
fix `Notification is not defined` on some device
2023-04-23 17:35:00 +08:00
648540858
d772e20179 优化Sip.ip的注释 2023-04-23 17:33:28 +08:00
Kairlec
d07cbc636d fix Notification is not defined on Android Webview or under ios16.4
如果没有这一行import,那么使用的会是Notification Web API,这在部分场景下是不支持的,具体见[Notification浏览器兼容性](https://developer.mozilla.org/zh-CN/docs/Web/API/Notification#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%85%BC%E5%AE%B9%E6%80%A7)
比如在一些使用Android Webview的浏览器或部分ios系统上会导致报错而白屏
在此处应该为使用`element-ui`的Notification组件(下面有用到注册为element-ui的Notification全局属性$notify)
2023-04-23 17:08:53 +08:00
648540858
11726a0e45 支持推流和拉流代理通道状态变化发送通知 2023-04-23 15:54:34 +08:00
648540858
9847ed4dae 修身目录刷新,优化公网下远程IP端口的获取 2023-04-23 14:36:13 +08:00
648540858
79ffb6af17 补充上一个修复的内容 2023-04-21 14:42:23 +08:00
648540858
63cb73b35e 修复消息发送失败导致后续次通道无法点播的bug 2023-04-21 14:18:52 +08:00
648540858
5bc4037543 更新readme 2023-04-20 16:42:44 +08:00
648540858
6d9d30b5b9 更新readme 2023-04-20 14:38:22 +08:00
648540858
c73f6d6287 支持设备/通道状态变化时发送redis通知 2023-04-20 10:26:42 +08:00
648540858
4615b13f1a Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-04-19 17:01:24 +08:00
648540858
455c13bed1 收流时设置re_use_port参数解决端口关闭快速打开造成的端口未释放问题, 支持点播的tcp主动 2023-04-19 16:21:28 +08:00
648540858
7c946bd415 修复流注销想上级发送bye后未清理缓存的问题 2023-04-19 14:53:06 +08:00
648540858
12aea2853d 优化notify性能,增加notify超出处理能力时直接回复错误码,不做处理。 2023-04-19 11:09:26 +08:00
648540858
4cf60e45d6 Update and rename -------.md to new.md 2023-04-15 09:38:03 +08:00
648540858
f0179aec49 Rename --bug---.md to bug.md 2023-04-15 09:36:12 +08:00
648540858
1a71c52bd0 Update --bug---.md 2023-04-15 09:35:36 +08:00
648540858
062d9c1f84 Create solve.md 2023-04-15 09:33:35 +08:00
648540858
4fa5c6533e Update --bug---.md 2023-04-15 09:16:21 +08:00
648540858
f5feab1b1c 修复使用jwt后导致的用户管理功能异常 2023-04-15 09:03:41 +08:00
648540858
bf71a932d6 优化下级平台自定义ssrc的情况,优化国标录像下载流程 2023-04-14 14:59:22 +08:00
648540858
6ee855d4d6 pr #817 2023-04-13 20:08:25 +08:00
648540858
83b88d53b3 Merge pull request #817 from xu-bin-bin/wvp-28181-2.0
处理上级平台发送的invite请求不携带“y=”sdp信息时,并且设备已经在当前平台中点播了。给上级平台回复的ssrc使用默认“y=000…
2023-04-13 20:07:32 +08:00
648540858
94593bd291 更新readme 2023-04-13 17:50:33 +08:00
648540858
e4d67a6c20 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-04-13 17:29:17 +08:00
648540858
254a8ee972 增加知识星球 2023-04-13 17:28:54 +08:00
648540858
e5996c993b redis优化 2023-04-13 17:14:04 +08:00
xubinbin
427d41878b 处理上级平台发送的invite请求不携带“y=”sdp信息时,并且设备已经在当前平台中点播了。给上级平台回复的ssrc使用默认“y=0000000000”,上级平台无法播放视频的问题 2023-04-13 10:22:28 +08:00
648540858
18f22135c5 修复空指针异常 #813 2023-04-11 11:23:36 +08:00
648540858
131eda3e72 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-04-08 15:37:22 +08:00
648540858
222f1d5eea 合并优化ssrc存储结构 2023-04-08 15:36:59 +08:00
648540858
bb1dadf9e1 Merge branch '2.6.7' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/conf/redis/RedisConfig.java
#	src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
#	src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
2023-04-08 15:29:15 +08:00
648540858
0c6dac0c15 优化ssrc存储结构,避免因为大量ssrc存在MediaServer中导致redis读取超时 2023-04-08 15:22:18 +08:00
648540858
c850fd39bd Merge pull request #810 from canghai908/wvp-28181-2.0
开发及Docker配置文件数据源更新
2023-04-05 15:53:01 +08:00
canghai809
2d209b59e2 开发及Docker配置文件数据源更新 2023-04-04 18:52:13 +08:00
648540858
6a5d999fee 去除flyway配置 2023-04-04 11:14:08 +08:00
648540858
ba2591aeea 优化移动位置notify消息处理 2023-04-03 15:06:08 +08:00
648540858
696399c9c2 修复关闭接口鉴权时,处于忽略地址中的接口不可用的问题 2023-04-03 10:53:54 +08:00
648540858
160e97a13a 去除redis工具类直接使用RedisTemplate存取数据 2023-04-03 10:26:55 +08:00
648540858
e1eb5274f7 修复 设备注册时报错 #799 2023-03-31 09:10:16 +08:00
648540858
6b40dd1320 去除测试代码 2023-03-31 09:03:14 +08:00
648540858
d2ed9e73f9 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-03-31 09:00:36 +08:00
648540858
6f5dc4e590 处理警告 2023-03-31 09:00:04 +08:00
648540858
8a74c6bfb4 修复SQL错误 #802 2023-03-31 08:59:03 +08:00
648540858
cf0ff7ed44 支持修改页面展示的sip ip 2023-03-31 08:56:54 +08:00
648540858
5cd98d51eb Merge pull request #800 from yjkhtddx/wvp-28181-2.0
优先使用SIP认证用户名
2023-03-30 09:01:36 +08:00
刘跃龙
2ca1fabb35 优先使用SIP认证用户名 2023-03-29 09:59:47 +08:00
648540858
da6a8b6db2 去除druid数据库连接池,使用spring支持的hikari 2023-03-29 09:44:45 +08:00
648540858
74556d4430 添加兼容接口预置位添加调用删除,列表查询 2023-03-28 17:56:43 +08:00
648540858
6616746ffd 优化设备注册,支持到期续订,优化国标级联到期续订。 2023-03-28 14:09:41 +08:00
648540858
8310400ce8 修复云端录像界面 2023-03-27 15:47:04 +08:00
648540858
80a8c25d65 优化录像配置。不再使用zlm默认的http服务器 2023-03-25 18:40:29 +08:00
648540858
df91f59860 优化国标级联的更新 2023-03-25 10:04:57 +08:00
648540858
03ad4e711c 优化对assist接口的代理 2023-03-23 20:52:05 +08:00
648540858
21d550b425 修复关闭接口鉴权后跨域设置失效的问题 2023-03-23 08:52:35 +08:00
648540858
afa3dc2a62 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-03-22 15:21:58 +08:00
648540858
299a965240 优化国标级联中的通道全部导入 2023-03-22 15:21:22 +08:00
xiaoQQya
29d74eca46 fix(snap): 修复 rtsp 端口为空时使用 mp4 协议截图失败的问题 2023-03-22 15:21:22 +08:00
648540858
7caf353770 修复设备点播时指定流媒体 2023-03-22 15:21:22 +08:00
648540858
a2daeb513f 优化点播后截图以及截图的展示 2023-03-22 15:21:22 +08:00
xiaoQQya
1123547e94 perf(streamInfo): 优化点播接口返回流信息中的 RTMP/RTSP/RTC 链接 2023-03-22 15:21:22 +08:00
xiaoQQya
4bbb654f07 perf(snap): 优化点播成功后截图使用 rtsp 流, 新增对 H265 编码视频截图的支持 2023-03-22 15:21:22 +08:00
xiaoQQya
db685a1f42 fix(国标设备): 修复设备列表云台类型不显示的问题 2023-03-22 15:21:22 +08:00
xiaoQQya
82fd43e9dd perf(jessibuca): 优化 videoInfo 重复 log 的问题 2023-03-22 15:21:22 +08:00
逐浪人
28a7ed3b8a Update UserController.java
修复修改密码报错,传递id参数为0的bug
2023-03-22 15:21:22 +08:00
648540858
687eedbd14 修复添加zlm节点使用默认值的问题 #781 2023-03-22 15:21:22 +08:00
648540858
67e3d82bad 修复可空时间参数的校验 #784 2023-03-22 15:21:22 +08:00
648540858
805221a281 优化国标级联中的通道全部导入 2023-03-22 15:20:48 +08:00
648540858
3d4a88c3e9 Merge pull request #787 from xiaoQQya/wvp-28181-2.0
修复 RTSP 端口为空时使用 MP4 协议截图失败的问题
2023-03-22 10:45:36 +08:00
xiaoQQya
ec6de7dca2 fix(snap): 修复 rtsp 端口为空时使用 mp4 协议截图失败的问题 2023-03-22 10:36:06 +08:00
648540858
0808ac2add 修复设备点播时指定流媒体 2023-03-22 10:31:45 +08:00
648540858
e2a765ee6d 优化点播后截图以及截图的展示 2023-03-22 09:52:23 +08:00
648540858
e953d9e35d Merge pull request #785 from xiaoQQya/wvp-28181-2.0
新增对 H265 编码视频截图的支持
2023-03-22 09:27:17 +08:00
648540858
f395eedf9f Merge pull request #786 from zhulangren/wvp-28181-2.0
Update UserController.java
2023-03-22 09:15:51 +08:00
逐浪人
7dfb7d5968 Update UserController.java
修复修改密码报错,传递id参数为0的bug
2023-03-21 19:39:54 +08:00
648540858
9814412409 修复添加zlm节点使用默认值的问题 #781 2023-03-21 17:55:44 +08:00
648540858
bde945238c 修复可空时间参数的校验 #784 2023-03-21 17:43:33 +08:00
648540858
bcc372643e Merge pull request #783 from StreamLuna/wvp-28181-2.0
fix: 根据国标设备编号查询设备没有返回通道数
2023-03-21 17:23:38 +08:00
xiaoQQya
3b1a19de03 perf(streamInfo): 优化点播接口返回流信息中的 RTMP/RTSP/RTC 链接 2023-03-20 14:56:46 +08:00
xiaoQQya
da764df7f1 perf(snap): 优化点播成功后截图使用 rtsp 流, 新增对 H265 编码视频截图的支持 2023-03-20 14:54:17 +08:00
xiaoQQya
c41ab2c306 fix(国标设备): 修复设备列表云台类型不显示的问题 2023-03-20 13:22:01 +08:00
xiaoQQya
287cda7df7 perf(jessibuca): 优化 videoInfo 重复 log 的问题 2023-03-20 13:21:22 +08:00
StreamLuna
224c6b8af7 fix: 根据国标设备编号查询设备没有返回通道数 2023-03-20 10:58:44 +08:00
648540858
7e01babe80 优化对海康平台的兼容性 2023-03-17 17:08:37 +08:00
648540858
01870fbe59 优化消息通道 2023-03-17 15:14:00 +08:00
648540858
f7f603c9a1 优化异常处理 2023-03-17 14:02:16 +08:00
648540858
bdc57e559e 优化异常处理以及级联设备状态查询 2023-03-17 13:22:05 +08:00
648540858
3d65e79015 优化消息通道 2023-03-16 20:32:22 +08:00
648540858
8903d0de6f 优化端口保持 2023-03-16 20:19:00 +08:00
648540858
7d3e97eb04 更新前后端分离部署文档 2023-03-16 09:34:20 +08:00
648540858
e76c3fca48 更新前后端分离部署文档 2023-03-16 09:32:21 +08:00
648540858
fd8f51f3a0 更新前后端分离部署文档 2023-03-16 09:18:27 +08:00
648540858
f640bccb9d 国标级联回复目录数据中添加云台类型 2023-03-15 23:28:22 +08:00
648540858
4f3d660b0d Merge branch 'wvp-28181-2.0' into wvp-jwt-token
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
#	src/main/resources/all-application.yml
2023-03-15 22:58:28 +08:00
648540858
0eccc6e0ac Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-03-15 22:57:20 +08:00
648540858
264e0a10fd 支持登录返回值中携带token 2023-03-15 22:56:47 +08:00
648540858
6bf6a045b5 支持不同域的前后端分离部署 2023-03-15 19:05:56 +08:00
648540858
9811ef9bde 修复拉流代理 下线时状态未更改为下线 #770 2023-03-14 18:46:01 +08:00
648540858
dde33106a7 Merge pull request #771 from mrjackwang/wvp-28181-2.0
修复历史录像下载问题,查询历史录像问题
2023-03-14 16:56:13 +08:00
648540858
e2fe65eb37 Merge branch 'wvp-28181-2.0' into wvp-28181-2.0 2023-03-14 16:56:05 +08:00
648540858
238e319928 Merge pull request #778 from xiaoQQya/wvp-28181-2.0
升级 jessibuca 版本,优化 jessibuca 播放配置
2023-03-14 16:49:54 +08:00
648540858
0b8a0d2f8f 增加消息通道配置,可以通道redis在wvp上下级之间发送消息 2023-03-14 14:02:33 +08:00
xiaoQQya
dcc98ebbf2 perf(jessibuca): 升级 jessibuca 2023-03-8 v3.1.28 版本, 修改 jessibuca 参数使用硬解码优化播放黑屏问题, https 环境下使用 WCS 硬解码, http 环境下使用 MSE 硬解码, H265 视频自动使用 wasm 软解码 2023-03-13 17:53:50 +08:00
xiaoQQya
d9422998a4 fix(jessibuca): 修复 jessibuca 组件截图报错的问题 2023-03-13 17:42:39 +08:00
648540858
6afed2f243 Merge pull request #774 from gaoxun1937/wvp-28181-2.0
防止查询录像回放记录为空时的空指针错误
2023-03-13 17:30:33 +08:00
648540858
40bdafcd77 初步实现登录返回token 2023-03-13 09:45:00 +08:00
gaoxun250@sina.com
69c6240235 防止回放空时报空指针 2023-03-10 10:33:48 +08:00
wangyimeng
0bbc589795 优化历史录像下载,目前已测试大华国标级联下载 2023-03-09 10:22:49 +08:00
648540858
fd4fa255e6 添加设备离线原因 2023-03-08 16:57:07 +08:00
648540858
7a651ed327 优化报警时间 2023-03-08 15:50:11 +08:00
648540858
ea6709f539 优化兼容接口 2023-03-08 14:46:18 +08:00
648540858
150c2ca522 优化兼容接口 2023-03-08 13:28:54 +08:00
648540858
9eab521d56 优化报警时间 2023-03-08 11:42:28 +08:00
648540858
4c8b69c600 优化跨域配置,支持同域的前后端分离部署 2023-03-05 09:53:26 +08:00
mrjackwang
8b2e9f676a Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2023-03-04 21:37:39 +08:00
wangyimeng
7b7a19e1e8 修复查询历史录像无记录时报错问题 2023-03-04 20:55:48 +08:00
wangyimeng
74a6ae4bb7 请求历史媒体下载增加回复事件处理ssrc与下级不一致情况 2023-03-04 20:47:48 +08:00
648540858
013b7dee2e Merge pull request #753 from lovemen/wvp-28181-2.0
解决上级平台点播proxy代理流时未携带SSRC信息,gbStream采用默认0000000000作为SSRC无法播放问题。以及上级平台点…
2023-03-04 14:47:47 +08:00
wangyimeng
b62244c69d 修复查询历史录像无记录时报错问题 2023-03-03 21:01:43 +08:00
wangyimeng
3c70db95ea 修复查询设备通道目录时查询报错的问题 2023-03-03 20:59:56 +08:00
wangyimeng
60984c27cd 请求历史媒体下载增加回复事件处理ssrc与下级不一致情况 2023-03-03 20:59:10 +08:00
lovemen
8db432d078 解决上级平台点播proxy代理流时未携带SSRC信息,gbStream采用默认0000000000作为SSRC无法播放问题。以及上级平台点播proxy代理流时回复的SDP本地端口号为0不兼容问题。 2023-02-23 15:35:42 +08:00
648540858
6f057b422c 优化各个配置启动顺序 2023-02-22 18:01:30 +08:00
648540858
497c1a5882 修复通道导入bug 2023-02-20 15:21:41 +08:00
648540858
4b72d10f5c Merge pull request #744 from gaofuwang/wvp-28181-2.0
优化WVP作为下级平台查询设备录像列表上报缓慢问题
2023-02-20 09:57:21 +08:00
648540858
37ead38f4c Merge pull request #751 from yjkhtddx/wvp-28181-2.0
RTP推流地址应使用SDP中Connection中的IP地址
2023-02-20 09:51:51 +08:00
648540858
ca458789c4 Merge pull request #752 from stayorigin/wvp-28181-2.0
替换前端编译npm源地址
2023-02-20 09:50:14 +08:00
hujian
e79d38f32d 替换前端编译npm源地址为https://registry.npmmirror.com 2023-02-16 23:08:34 +08:00
hujian
a175a3b7f0 替换前端编译npm源地址 2023-02-16 23:04:33 +08:00
刘跃龙
82d842fb3b RTP推流地址应使用SDP中Connection中的IP地址,原来使用Origin中的IP地址,在流媒体服务和信令服务不在同一台设备上时,媒体流数据将发给信令服务器,导致无法播放BUG。 2023-02-16 18:18:10 +08:00
648540858
f3c835bfde 修复级联推送通道时缺少的信息 2023-02-16 16:25:47 +08:00
648540858
98d1484023 修复更新通道是更新各个坐标系的位置信息 2023-02-16 14:01:09 +08:00
648540858
b61eb5dd06 修复更新通道是更新各个坐标系德位置信息 2023-02-15 18:30:35 +08:00
648540858
1be17679f4 修复缺少的属性 2023-02-15 15:38:49 +08:00
648540858
80cabaf06c 启动时清理无效的设备缓存数据,避免设备无法注册 2023-02-14 15:12:53 +08:00
648540858
bb0de47cc4 Merge pull request #743 from zhulangren/patch-1
Update CloudRecordDetail.vue
2023-02-14 14:47:07 +08:00
648540858
471e5e6450 优化日志打印,去除数据库打印,优化控制台打印效果 2023-02-13 18:19:34 +08:00
gaofw189
a40f1153ed 优化WVP作为下级平台查询设备录像列表上报缓慢问题 2023-02-13 10:37:00 +08:00
逐浪人
260900bbe6 Update CloudRecordDetail.vue
修复 download.html 找不到 的问题,它被 assist放在www目录不是 recored目录
2023-02-11 22:08:51 +08:00
648540858
2c7f42a832 更新文档 2023-02-09 14:36:04 +08:00
648540858
55d6074e58 恢复默认判断 2023-02-09 14:22:12 +08:00
648540858
4ee7daf0dd Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-02-09 14:13:57 +08:00
648540858
b21ecfd8bc Merge pull request #741 from gaofuwang/wvp-28181-2.0
修复WVP作为下级平台接收上级平台DeviceControl、RecordInfo信令处理问题和Alarm信令上报上级平台问题
2023-02-09 14:13:44 +08:00
gaofw189
99598f1654 去除lombok依赖-后续考虑引入 2023-02-09 09:20:46 +08:00
648540858
b8bfa84d9d 同时支持打包为Jar和War 2023-02-07 20:59:33 +08:00
gaofw189
c43404cb35 修复WVP作为下级平台接受recordinfo指令上报上级平台的问题 2023-02-07 09:28:55 +08:00
gaofw189
f47d4fab2d 修复WVP作为下级平台接受devicecontrol命令处理-调试修改逻辑 2023-02-07 09:26:08 +08:00
648540858
c1d9bb6f23 支持同时打war包和jar包 2023-02-06 17:34:47 +08:00
lin
547e364243 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-02-06 16:43:04 +08:00
648540858
ff376c214e 去除数据库自动更新,自动更新会导致wvp在arm架构服务上无法启动 2023-02-06 10:46:23 +08:00
gaofw189
7948394f41 修复WVP作为下级平台接受deviceControl指令的问题-修复指令响应 2023-02-06 10:35:32 +08:00
648540858
1ef6b25906 Merge pull request #739 from xiaoQQya/wvp-28181-2.0
序列化问题修复与代码优化
2023-02-06 10:35:16 +08:00
xiaoQQya
9fa38fb600 fix(JsonUtil): 修复 Redis 中 Object 序列化与反序列化不一致导致报错的问题 2023-02-04 18:13:47 +08:00
xiaoQQya
7b63e933cf perf(ZLMRESTfulUtils): 修改OkHttpClient 读取超时时间,解决点播时截图快照获取超时的问题 2023-02-04 18:12:25 +08:00
648540858
f42b45d5f2 Merge pull request #738 from gaoxun1937/wvp-28181-2.0
解决截图被占用无法打开问题
2023-02-03 17:51:47 +08:00
gaofw189
c3bb3eb3ea 修复WVP作为下级平台接收设备告警消息后上报上级平台的问题 2023-02-03 14:35:44 +08:00
gaoxun250@sina.com
701f70ba82 解决截图被占用无法打开问题 2023-02-03 14:19:10 +08:00
gaofw189
6cc0126b43 修复WVP作为下级平台接收上级平台DeviceControl信令不做处理的问题。-修改日志备注 2023-02-02 18:24:32 +08:00
gaofw189
ad5db3fb09 修复WVP作为下级平台接收上级平台DeviceControl信令不做处理的问题。 2023-02-02 18:21:25 +08:00
648540858
8288d45eea Merge pull request #736 from kunlong-luo/fix-null-point-and-cast-exception
fix: 修复一些问题
2023-02-02 16:24:02 +08:00
kunlong-luo
98c9aa920b fix: 修复一些问题
1. 修复空指针异常
2. 修复类型转换异常
3. 封装 JsonUtil 工具类支持类型转换
2023-02-02 16:19:02 +08:00
648540858
93cce1a79e Merge pull request #735 from kunlong-luo/fix-host-bug
fix: 修复空指针和类型转换问题
2023-02-02 15:11:33 +08:00
kunlong-luo
a7fa24005f fix: 修复空指针和类型转换问题 2023-02-02 14:36:19 +08:00
648540858
81de91d9da 增加数据库自动更新开关 2023-02-01 15:54:03 +08:00
648540858
3e633321e0 优化数据库自动更新功能 2023-02-01 15:37:19 +08:00
648540858
33213ab72b Merge pull request #730 from shijinting0321/wvp-28181-2.0
数据库脚本版本管理,便于表结构更新维护
2023-02-01 15:25:49 +08:00
648540858
3f9c2e3c11 Merge pull request #276 from brokge/fix-269
录像文件文件问题的优化
2023-02-01 10:57:02 +08:00
648540858
682ccc1dee Merge branch 'wvp-28181-2.0' into fix-269 2023-02-01 10:56:40 +08:00
lin
868de3225f 国标回放超时时间使用点播超时一样的字段 2023-02-01 10:09:01 +08:00
648540858
37a513a0ad Merge pull request #729 from gaofuwang/wvp-28181-2.0
修复WVP作为下级平台接收DeviceInfo指令固定响应的问题
2023-02-01 09:48:05 +08:00
648540858
cb0bf1a548 Merge branch 'wvp-28181-2.0' into wvp-28181-2.0 2023-02-01 09:47:58 +08:00
lin
2d1bfe6c72 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-02-01 09:32:52 +08:00
lin
5275b5020b 补充sql 2023-01-31 22:05:11 +08:00
648540858
e824d90566 Merge pull request #731 from zl2fxy/patch-1
Update config.md
2023-01-31 14:16:47 +08:00
zl2fxy
c77c4d6d61 Update config.md
新版补丁包注明在文档里
2023-01-31 10:05:46 +08:00
648540858
9b29382d23 优化目录推送 2023-01-30 14:25:25 +08:00
sjt
1377d16dcb 数据库脚本版本管理,便于表结构更新维护 2023-01-18 15:27:24 +08:00
gaofw189
d8a4e2f5ed 修复WVP作为下级平台接收DeviceInfo指令固定响应的问题 2023-01-17 17:22:38 +08:00
648540858
526e31cfb8 优化目录更新,更新失败时只更新收到的内容不重置所有通道和自动拉流 2023-01-15 15:27:47 +08:00
648540858
80786de468 修复推流鉴权 2023-01-13 11:19:30 +08:00
648540858
189e6671aa 更新README 2023-01-12 18:05:29 +08:00
648540858
fec869d0e3 Merge pull request #724 from gaofuwang/wvp-28181-2.0
修复WVP作为下级平台接收DeviceStatus指令固定响应的问题
2023-01-12 15:53:24 +08:00
648540858
b46f2624f2 修复redis查询 2023-01-11 11:33:01 +08:00
648540858
f3d72e9d0a 修复国标录像查询ui 2023-01-11 10:43:56 +08:00
648540858
6ae02da593 更新README 2023-01-10 17:05:20 +08:00
648540858
0a19b205a3 更新README 2023-01-10 16:26:52 +08:00
gaofw189
9a67d748d6 修复WVP作为下级平台接收DeviceStatus指令固定响应的问题 2023-01-10 15:55:56 +08:00
648540858
8fed463f79 优化国标录像UI 2023-01-10 14:01:03 +08:00
648540858
df68b04cac 优化国标录像下载错误提示 2023-01-10 11:36:54 +08:00
648540858
38ba636eab 修复录像下载 2023-01-09 18:12:41 +08:00
648540858
caeb9b9f73 国标录像UI重构 2023-01-09 16:31:51 +08:00
648540858
75230e249e 修复国标录像回放以及录像下载 2023-01-06 11:43:27 +08:00
648540858
936cd6fd0e Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2023-01-05 17:49:50 +08:00
648540858
9685bc1641 修复布防撤防 #717 2023-01-05 17:49:34 +08:00
648540858
aadb07a160 Merge pull request #713 from xu-bin-bin/wvp-28181-2.0
使用#替代$,防止SQL注入的风险(主要防止模糊查询sql部分的注入)。
2023-01-05 09:38:19 +08:00
648540858
b465c09123 Merge branch 'wvp-28181-2.0' into wvp-28181-2.0 2023-01-05 09:38:11 +08:00
648540858
a8a09b12f1 Merge remote-tracking branch 'gitee.com/wvp-28181-2.0' into wvp-28181-2.0 2023-01-04 10:41:17 +08:00
648540858
12faee32c2 优化设备状态保持,自动记录心跳间隔,三次心跳失败则设备离线,不在使用设备有效期字段作为唯一判断标准,提高容错能力和稳定性。 2023-01-04 10:39:40 +08:00
xubinbin
fee5392220 使用#替代$,防止SQL注入的风险(主要防止模糊查询sql部分的注入)。 2022-12-28 13:26:33 +08:00
jiang
a83ee95e10 优化兼容接口 2022-12-28 10:58:48 +08:00
648540858
522c8a08da Merge pull request #706 from xu-bin-bin/wvp-28181-2.0
处理”强迫症更新,将数据表ID字段新增值重置为1“提交的内容在初始化数据时报错问题以及修改用户表的创建时间和更新时间格式
2022-12-27 09:45:28 +08:00
648540858
0917059219 Merge pull request #711 from Lyon1994/patch-1
[ fix bug ] 修复分屏播放无效的问题,这是一个json解析错误
2022-12-27 09:44:35 +08:00
Lyon1994
4cecf6ec76 [ fix bug ] 修复分屏播放无效的问题,这是一个json解析错误 2022-12-26 11:36:31 +08:00
648540858
92c1ab035f 优化接口 2022-12-23 16:52:30 +08:00
xubinbin
fecde062ab 1、处理”强迫症更新,将数据表ID字段新增值重置为1“提交的内容在初始化数据时报错问题;2、修改用户表的创建时间和更新时间格式 2022-12-16 16:42:25 +08:00
648540858
11e343a24f 优化级联注册,以及sip日志 2022-12-12 10:28:36 +08:00
648540858
8677479486 回滚via获取地址的方式 2022-12-06 17:12:12 +08:00
648540858
51bec02fe1 默认仍使用via ip 做为回复的ip 2022-12-06 16:35:14 +08:00
648540858
11907b7ae7 接口使用旧的stream信息,支持使用远程ip端口做为回复的地址而不是使用sip中的地址 2022-12-06 10:33:43 +08:00
648540858
fc11eca3ee Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-12-02 15:15:50 +08:00
648540858
45d6ae6df5 更新接口 2022-12-02 15:12:56 +08:00
648540858
723b253e3a Merge pull request #691 from xiaoQQya/wvp-28181-2.0
修复视频播放页地址显示错误与截图模糊问题
2022-12-01 10:41:27 +08:00
648540858
2ff1145731 Merge pull request #689 from AlphaWu/Zafu-Dev-1129
强迫症更新,将数据表ID字段新增值重置为1。
2022-12-01 10:40:49 +08:00
xiaoQQya
9578cc2f99 perf(PlayService): 修改截图请求使用 FLV 地址,解决 RTSP 地址截图出现图像丢包模糊的问题 2022-11-30 16:32:28 +08:00
xiaoQQya
a70b64aa09 fix(devicePlayer): 修复设备视频播放页 RTCS 地址显示错误的问题 2022-11-30 16:29:30 +08:00
WuPeng
dd506d6cfb 强迫症更新,将数据表ID字段新增值重置为1。 2022-11-29 21:41:55 +08:00
648540858
60d84728a8 Merge pull request #685 from AlphaWu/Zafu-Dev-1127
弃用废弃方法toJavaObject,改用to方法,消除编译警告。
2022-11-29 15:19:04 +08:00
648540858
ddb2e3ea71 Merge branch 'wvp-28181-2.0' into Zafu-Dev-1127 2022-11-29 15:18:56 +08:00
648540858
a2cb2a4f02 更新配置说明文件 2022-11-29 12:13:54 +08:00
648540858
cedb6fc928 更新全量数据库 2022-11-29 11:50:21 +08:00
648540858
7667b527cf 优化队列处理逻辑 2022-11-29 11:42:09 +08:00
WuPeng
2b7a21529f 弃用废弃方法toJavaObject,改用to方法,消除编译警告。 2022-11-27 10:28:42 +08:00
648540858
707d942dd4 修复单端口模式下ssrc的释放 #667 2022-11-25 14:38:46 +08:00
648540858
57f1f599d4 优化注释 2022-11-25 12:12:35 +08:00
648540858
8368b84a3b 优化okhttp并发参数 2022-11-25 11:57:46 +08:00
648540858
6d60595aa9 清空级联录像记录 #672 2022-11-25 11:17:48 +08:00
648540858
6c1397a01e 修复协议端口配置不全导致前端播放页面无法弹出的问题 2022-11-25 10:50:16 +08:00
648540858
9a2cdbba14 优化拉流代理注释 2022-11-22 17:30:49 +08:00
648540858
b0581e2bf5 优化拉流代理表单以及逻辑 2022-11-22 17:17:35 +08:00
648540858
e7952f1e12 支持配置设备上线时自动更新查询通道,修复通道刷新进度展示 2022-11-22 15:02:25 +08:00
648540858
c43fbab56f 国标级联->选择通道支持移除目前下所有以及全部添加到目录下 2022-11-22 12:55:29 +08:00
648540858
1e7ce98967 修复使用来源IP作为流ip配置 2022-11-21 10:07:27 +08:00
648540858
a62b61c991 移除重复方法 2022-11-18 17:29:22 +08:00
648540858
d3acb6ab11 更新文档 2022-11-18 17:26:58 +08:00
648540858
c545d6b6dc 添加远程启动信令 2022-11-18 17:17:01 +08:00
648540858
5e4434aee8 Merge pull request #673 from 648540858/wvp-28181-2.0-multi-network
Wvp 28181 2.0 multi network
2022-11-17 18:22:24 +08:00
648540858
93de57c83f 清理过期的推流鉴权信息 2022-11-17 18:21:45 +08:00
648540858
36d0be9698 优化级联注册稳定性 2022-11-17 18:09:28 +08:00
648540858
42f48ca008 优化多网卡下的localIp获取 2022-11-17 17:01:54 +08:00
648540858
6c0a609134 Merge branch 'wvp-28181-2.0' into wvp-28181-2.0-multi-network
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
#	src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
2022-11-17 11:31:30 +08:00
648540858
ed41962d9c 注释与日志优化 2022-11-17 10:04:05 +08:00
648540858
5057c16f14 优化国标级联发流并发能力 2022-11-16 09:39:27 +08:00
648540858
a60c8939ae 去除发送流端口范围 2022-11-10 16:48:17 +08:00
648540858
d84fbe5ad9 优化使用来源ip作为流ip 2022-11-10 09:40:01 +08:00
648540858
dca588ffcc 添加缺少的导入 2022-11-09 10:18:42 +08:00
648540858
f210b0b736 Merge branch 'wvp-28181-2.0' into wvp-28181-2.0-multi-network
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
#	src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
#	web_src/src/components/dialog/devicePlayer.vue
#	web_src/src/components/live.vue
2022-11-08 20:43:25 +08:00
648540858
e4105a958b 优化线程休眠异常日志 2022-11-08 20:40:03 +08:00
648540858
5699c7d0e4 支持配置是否开去推流鉴权 2022-11-08 20:29:27 +08:00
648540858
7a82f02415 Merge pull request #660 from shawn-tangsc/wvp-28181-2.0
前端首页控制台设备在线数显示bug修复
2022-11-08 20:04:30 +08:00
648540858
4fcc14fba4 Merge branch 'wvp-28181-2.0' into wvp-28181-2.0 2022-11-08 20:04:23 +08:00
648540858
53934e3fca Merge pull request #661 from xiaoQQya/wvp-28181-2.0
修复分屏监控与视频播放页在 HTTPS 环境下无法播放的问题
2022-11-08 20:03:01 +08:00
648540858
971b73b341 优化hook处理速度 2022-11-08 19:58:36 +08:00
648540858
8c0e5dbdd3 Merge pull request #662 from AlphaWu/Zafu-Dev-1105
升级Fastjson到Fastjson2
2022-11-08 19:48:36 +08:00
WuPeng
4cc0c04b41 升级Fastjson到Fastjson2 2022-11-05 20:49:56 +08:00
xiaoQQya
8896b18273 fix(live): 修复分屏监控 HTTPS 环境下无法播放的问题 2022-11-05 12:50:26 +08:00
xiaoQQya
0ce0a954ea fix(devicePlayer): 修复设备视频播放页 HTTPS 环境下 WebRTC 无法播放的问题 2022-11-05 11:46:39 +08:00
xiaoQQya
dad55c3e08 perf(rtcPlayer): 修改控制台 log 级别 2022-11-05 11:35:01 +08:00
唐嗣成
09768a19e8 my 2022-11-04 17:35:43 +08:00
648540858
a83b0f1931 Merge pull request #658 from itouxin/patch-2
Update play_error.md
2022-11-03 20:39:30 +08:00
TouXin
39a9c35712 Update play_error.md
修复描述文字错误
2022-11-03 10:21:08 +08:00
648540858
ad7d975908 Merge pull request #655 from L120820/wvp-28181-2.0
【同步设备通道】第一次收到同步通道数据应该将通道数据放入 不然会造成通道数量不一致 同步时也会漏掉第一个通道
2022-11-01 20:43:58 +08:00
ljm
d2826a164e 【同步设备通道】第一次收到同步请求应该将通道放入 不然会造成通道数量不一致 同步时也会漏掉第一个通道 2022-11-01 17:25:47 +08:00
648540858
4d3b5853f9 优化多网卡 2022-10-28 16:40:12 +08:00
648540858
6f2badd6a4 支持多网卡 2022-10-26 17:15:29 +08:00
648540858
a6b465ac05 Merge pull request #647 from L120820/wvp-28181-2.0
【zlm心跳hook】重复查询redis了
2022-10-25 14:43:12 +08:00
648540858
f5aec105ce 修复设备信息后同步redis 2022-10-25 10:27:32 +08:00
648540858
9ea33381cc 设备编辑增加收流IP 2022-10-25 10:17:59 +08:00
648540858
0b18018da2 首页改造完成,添加系统信息 2022-10-24 18:14:31 +08:00
648540858
439d94f004 首页改造完成,待添加系统信息 2022-10-24 15:20:35 +08:00
ljm
eabe06346f 【zlm心跳hook】重复查询redis了
变量也不需要多次定义
数据库有的话应该恢复zlm
缓存没有的话需要重新加载缓存
2022-10-22 09:48:45 +08:00
648540858
f0f6be9238 首页改造,完成cpu,内存,网络图 2022-10-20 18:03:40 +08:00
ljm
86fb187da7 【zlm心跳hook】重复查询redis了
变量也不需要多次定义
数据库有的话应该恢复zlm
2022-10-20 16:04:47 +08:00
648540858
53f243a87e 增加启动时清理redis中错误zlm数据 2022-10-19 16:25:38 +08:00
648540858
ee446beedd 兼容设备通道信息中自己为自己父节点的情况 2022-10-19 11:20:23 +08:00
648540858
1265c7dd7e 国标级联支持拉流代理自动拉起 2022-10-19 11:17:08 +08:00
648540858
86f3f80d00 隐藏liveplayer 2022-10-19 10:28:51 +08:00
648540858
049dda7209 隐藏liveplayer 2022-10-19 10:07:47 +08:00
648540858
8d8bb223aa Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0
# Conflicts:
#	sql/mysql.sql
2022-10-19 10:04:04 +08:00
648540858
5e6332f98f 增加日志 2022-10-18 23:04:44 +08:00
648540858
d5e6432c57 增加设备通道数为0时自动发起更新通道 2022-10-18 23:03:33 +08:00
648540858
4269bdfc09 更新readme 2022-10-18 22:40:43 +08:00
648540858
c027b2849d Merge pull request #645 from IKangXu/wvp-28181-2.0
优化 国标设备中通道内查看的逻辑,保证与分屏与电子地图中树结构的数据一致
2022-10-18 22:18:49 +08:00
648540858
cfae3ba47d Merge pull request #646 from XiaoQiTong/wvp-28181-2.0
修改云端录像选择节点流媒体path不修改的bug
2022-10-18 22:17:58 +08:00
XiaoQiTong
553868cb28 修改云端录像选择节点流媒体path不修改的bug
device表增加的mediaServerId字段丢失,重新添加
2022-10-18 20:18:51 +08:00
648540858
2b02224506 修复录像回放ssrc不一致无法播放的问题 2022-10-18 17:35:45 +08:00
648540858
7b490baaeb 更新readme 2022-10-18 17:35:45 +08:00
648540858
82d74c06ea 支持手动添加,为设备设置单独的密码 2022-10-18 17:35:44 +08:00
648540858
d439ab7202 去除多余引入 2022-10-18 17:35:42 +08:00
648540858
dd986dcbdd 去除国标级联中ServerTransaction的使用 2022-10-18 17:35:42 +08:00
648540858
dbaf0fdbf4 优化sip消息构建,去除ServerTransaction的使用 2022-10-18 17:35:42 +08:00
648540858
f7c14c16c9 支持锁定编辑后的设备名 #642 2022-10-18 17:35:40 +08:00
韩浩然XiaoQiTong
abc929dae7 Update update.sql 2022-10-18 17:35:32 +08:00
648540858
c8c1779bab 优化按需拉流配置,拉流代理支持按需拉流 2022-10-18 17:35:32 +08:00
648540858
ca922a9afc 修复开始点播功能接口调用返回参数与定义的不符 #635 2022-10-18 17:35:32 +08:00
648540858
6c8ad46952 修复用户删除失败,#636 2022-10-18 17:35:32 +08:00
648540858
b9bf3a8d30 优化消息处理中存在可能异常的处理流程 2022-10-18 17:35:32 +08:00
648540858
4aa290e6f2 修复录像回放ssrc不一致无法播放的问题 2022-10-18 17:32:08 +08:00
648540858
7259ca4a26 更新readme 2022-10-18 17:06:37 +08:00
648540858
af317662a5 支持手动添加,为设备设置单独的密码 2022-10-18 17:02:05 +08:00
648540858
f6311b6d26 去除多余引入 2022-10-18 14:37:33 +08:00
648540858
9dbf1fe690 去除国标级联中ServerTransaction的使用 2022-10-18 14:30:39 +08:00
648540858
438d6c7955 优化sip消息构建,去除ServerTransaction的使用 2022-10-18 13:07:38 +08:00
IKangXu
c2940ac55b 优化 分屏设备与电子地图中树结构展示信息
优化 国标设备中通道内查看的逻辑,保证与分屏与电子地图中树结构的数据一致
2022-10-18 09:27:12 +08:00
648540858
e5fb2a07b8 Merge pull request #643 from XiaoQiTong/wvp-28181-2.0
修改update.sql 增加mediaServerId字段
2022-10-17 17:23:46 +08:00
648540858
9052a6cf0d Merge branch 'wvp-28181-2.0' into wvp-28181-2.0 2022-10-17 17:23:38 +08:00
648540858
489fbbbb70 支持锁定编辑后的设备名 #642 2022-10-17 17:16:59 +08:00
韩浩然XiaoQiTong
6ee4b3538d Update update.sql 2022-10-17 17:10:37 +08:00
648540858
6eb98d7b80 优化按需拉流配置,拉流代理支持按需拉流 2022-10-17 16:38:28 +08:00
648540858
44213d3993 修复开始点播功能接口调用返回参数与定义的不符 #635 2022-10-17 14:33:25 +08:00
648540858
0e94ac7f21 修复用户删除失败,#636 2022-10-17 14:08:44 +08:00
648540858
423e76f2af 优化消息处理中存在可能异常的处理流程 2022-10-17 12:39:58 +08:00
648540858
9a147ef84a 增加liveplayer播放器 2022-10-17 10:30:44 +08:00
648540858
43a7bb6702 优化代码空字符串判断 2022-10-17 09:39:21 +08:00
648540858
47927f5ac4 Merge pull request #641 from XiaoQiTong/wvp-28181-2.0
增加指定流媒体收流功能
2022-10-17 09:20:22 +08:00
XiaoQiTong
153385cd66 增加指定流媒体收流功能 2022-10-15 20:57:24 +08:00
648540858
8cfe27dd8b 去除ffmpeg模板配置 2022-10-14 23:11:47 +08:00
648540858
848edb8099 还原#640点播开始后的截图任务,判断启用https后使用https_fmp4流地址 2022-10-13 22:25:46 +08:00
648540858
d1f6708d60 Merge pull request #640 from duzeng/wvp-28181-2.0
feat: 点播开始后的截图任务,判断启用https后使用https_fmp4流地址
2022-10-13 22:18:06 +08:00
duzeng
6699953ef2 feat: 点播开始后的截图任务,判断启用https后使用https_fmp4流地址
Signed-off-by: duzeng <duzengrass@163.com>
2022-10-13 20:42:35 +08:00
648540858
f981fcf60f Merge pull request #632 from jshqhxm/wvp-28181-2.0
去除 com.sun.javafx 无引用包,会导致在linux环境下编译不通过
2022-10-09 23:48:53 +08:00
jshqhxm
3ca3e21a04 去除 com.sun.javafx 无引用包,会导致在linux环境下编译不通过 2022-10-09 16:20:39 +08:00
648540858
82ff1cddc0 修复回看控制失效 #619 2022-09-30 17:54:58 +08:00
648540858
c734168858 修复点播时viatag不规范的问题 2022-09-26 15:38:55 +08:00
648540858
df13b369cf 修复空指针 2022-09-26 14:01:22 +08:00
648540858
79f857abe5 Merge pull request #627 from 648540858/wvp-dialog
修复兼通api错误
2022-09-26 10:41:04 +08:00
648540858
4967e774d6 修复兼通api错误 2022-09-26 10:40:20 +08:00
648540858
dc0f4711c8 Merge pull request #626 from 648540858/wvp-dialog
合并bug修复
2022-09-26 10:38:48 +08:00
648540858
43f129e4d5 修复通道更新 2022-09-26 10:14:31 +08:00
648540858
aaa1194484 添加缺失的打印信息 2022-09-26 10:02:26 +08:00
648540858
a93e96217c Merge pull request #620 from xu-bin-bin/wvp-28181-2.0
处理上级平台发送的invite请求不携带“y=”sdp信息时,使用默认“y=0000000000”视频无法播放的问题。
2022-09-23 23:18:06 +08:00
648540858
00c5af610e Merge pull request #625 from 648540858/wvp-dialog
强化对与不通设备的兼容能力
2022-09-23 23:17:39 +08:00
648540858
3e4ac348df Merge remote-tracking branch 'origin/wvp-dialog' into wvp-dialog 2022-09-23 23:15:57 +08:00
648540858
f767ec4664 异常情况打印信息优化 2022-09-23 23:15:44 +08:00
648540858
d8596d3657 dialog去除以及异常情况处理优化 2022-09-23 23:15:39 +08:00
648540858
c3fb04dc25 异常情况打印信息优化 2022-09-23 23:08:58 +08:00
648540858
af14f1f1f2 dialog去除以及异常情况处理优化 2022-09-23 22:45:23 +08:00
xubinbin
1b78cd6d02 处理上级平台发送的invite请求不携带“y=”sdp信息时,使用默认“y=0000000000”视频无法播放的问题。 2022-09-23 10:55:42 +08:00
648540858
17261d806d 修复使用队列导致的问题 2022-09-22 16:56:20 +08:00
648540858
67c3025d5a 修复流注销时移除流认证信息 2022-09-22 14:10:26 +08:00
648540858
a615fdfeea 修复点播后bye信息的发送 2022-09-22 11:32:01 +08:00
648540858
5a7b10caa8 添加队列处理redis消息和sip消息,支持使用推流状态作为通道在线状态 2022-09-22 11:22:08 +08:00
648540858
4f4bf33670 优化sip消息,去除自动dialog创建 2022-09-21 18:18:37 +08:00
648540858
da6fb8e71b Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-09-16 18:04:13 +08:00
648540858
c7f478892b 优化点播时RtpServer为正常关闭的问题 2022-09-16 18:02:56 +08:00
648540858
3cba62ad86 Merge pull request #608 from wenyanjun/wvp-28181-2.0
修复下载录像失败问题
2022-09-15 10:49:31 +08:00
648540858
6e9d5cd287 优化点播结束后关闭RTPServer 2022-09-14 16:11:18 +08:00
wenyanjun
4a96fd8468 修复下载录像失败问题 2022-09-14 14:32:22 +08:00
648540858
a8b89fc014 优化目录发送 2022-09-13 14:53:41 +08:00
648540858
162395d227 为User-Agent添加必要的版本信息 2022-09-09 23:19:19 +08:00
648540858
5c211a66e9 优化sip消息 2022-09-09 17:06:19 +08:00
648540858
508176289e 修复发送目录信息是状态错误 2022-09-08 21:22:49 +08:00
648540858
d8d2ec1f54 获取实际内容长度,不使用header中的长度信息 2022-09-08 20:20:43 +08:00
648540858
5eaf45f249 修复添加业务分组失败 2022-09-08 17:51:12 +08:00
648540858
673d6a05d1 修复目录订阅的状态异常 2022-09-08 16:42:46 +08:00
648540858
75987dd8fe 修复cseq序号回退 2022-09-08 15:27:47 +08:00
648540858
ce40fd9a88 重启服务时上级平台直接注销再注册 2022-09-08 10:50:44 +08:00
648540858
ac5db7eb2c 修复推流列表状态过滤 2022-09-08 09:21:11 +08:00
648540858
6b10eb7beb Merge pull request #590 from ixingqiao/wvp-28181-2.0
1.解决轮询内存增长过快问题
2022-09-08 09:19:57 +08:00
648540858
c8512b32bc Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-09-07 16:18:52 +08:00
648540858
9e2482b973 修复并发点播时可能出现的rtpServer开启但是还未收到流的情况,编码类型136,137,138默认开启音频通道 2022-09-07 16:18:35 +08:00
jiang
0fb8f26fea 1.根据redis消息更新推流列表时同时更新在线状态
2.推流列表的模板增加在线状态
2022-09-07 15:56:48 +08:00
648540858
727ad56ddb 修复选择通道时默认节点显示错误的问题 2022-09-06 16:31:28 +08:00
648540858
561542aa42 添加对海康平台录像回放的兼容,修复录像信息发送失败, 级联平台支持开启rtcp保活 2022-09-05 17:10:21 +08:00
648540858
a370e5ea6f 优化推流列表查询 2022-09-02 17:00:41 +08:00
648540858
373bfdc44c 优化级联平台注册的周期时间 2022-09-02 15:49:40 +08:00
648540858
ac9eda4931 使用equalsIgnoreCase代替equals,忽略大小写差异 2022-09-02 10:51:55 +08:00
648540858
8695e85165 测试sip消息预处理 2022-09-01 22:27:18 +08:00
648540858
90aa9be073 优化异常处理 2022-09-01 17:53:00 +08:00
648540858
52fbdb096f 云端录像详情页添加返回按钮 2022-08-31 18:07:53 +08:00
648540858
06dc8da1c4 hook订阅曾增加过期清除功能,防止内存溢出 2022-08-31 13:09:45 +08:00
648540858
e4bd61860d 去除对redis key过期事件的使用;重构国标级联的注册保活 2022-08-31 11:29:13 +08:00
648540858
03c43f84ce 启动时redis未连接导致无法启动 2022-08-29 14:39:18 +08:00
648540858
d79b378f3d 增加zlm心跳超时的判定时间 2022-08-29 14:04:54 +08:00
648540858
e3bbb4a066 去除zlm使用redis过期作为心跳超时的方式 2022-08-29 11:50:36 +08:00
648540858
025b37df2e 升级版本号 2022-08-29 09:55:09 +08:00
648540858
024e61e1c9 修复bug以及日志按照,错误/sip/数据库 分割 2022-08-26 18:03:09 +08:00
xingqiao
1407090463 Merge branch 'wvp-28181-2.0' of https://github.com/ixingqiao/wvp-GB28181-pro into wvp-28181-2.0 2022-08-26 11:53:28 +08:00
xingqiao
e694109748 剔除lettuce 解决轮播场景下的redis读写超时问题 2022-08-26 11:53:11 +08:00
百鸣
f2f37ee785 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-08-26 11:49:43 +08:00
648540858
f110550363 去除文档捐赠 2022-08-26 11:06:50 +08:00
xingqiao
37e4375037 1.解决轮询内存增长过快问题 2022-08-26 11:03:43 +08:00
648540858
42ccd2b7f0 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-08-23 11:00:57 +08:00
648540858
b33d179ee3 优化国标录像的异常判断 2022-08-23 11:00:46 +08:00
648540858
a931d0d5f7 Merge remote-tracking branch 'github/wvp-28181-2.0' into wvp-28181-2.0 2022-08-22 23:01:52 +08:00
648540858
9ef08551b6 修复使用ssl的配置 2022-08-22 23:00:13 +08:00
648540858
26a52d2d16 支持全局异常和统一返回结果 2022-08-22 16:17:28 +08:00
648540858
43bb25d305 支持全局异常和统一返回结果,未完待续 2022-08-22 16:17:28 +08:00
648540858
12de9cce17 Merge pull request #578 from urmyfaith/patch-1
fix PlatformKeepaliveExpireEvent typo
2022-08-22 15:03:18 +08:00
zx
234359e847 fix PlatformKeepaliveExpireEvent typo 2022-08-19 21:55:59 +08:00
648540858
8ef0619d9a 更新在线文档的等新方式 2022-08-19 17:22:08 +08:00
648540858
bc8bb58971 依赖包版本升级 2022-08-19 17:12:03 +08:00
648540858
3e6f161100 依赖包版本升级 2022-08-19 17:11:51 +08:00
jiang
fd79d37fe6 根据redis消息更新推流列表 2022-08-18 16:17:23 +08:00
jiang
36a803f816 实时直播 - 开始直播接口返回值增加WEBRTC字段 2022-08-18 15:32:12 +08:00
648540858
1d2c9f2049 去除连接池中wall配置,此配制影响批量执行sql 2022-08-18 10:15:49 +08:00
648540858
03c0232804 处理获取消息体内容为空时造成的空指针异常 2022-08-17 17:06:33 +08:00
648540858
46317f896b 处理获取消息体内容为空时造成的空指针异常 2022-08-17 16:45:06 +08:00
648540858
aa7ab1e479 优化队列的处理逻辑 2022-08-17 15:38:06 +08:00
648540858
d7865d55e1 修复录像回放中的信令错误 2022-08-15 15:08:51 +08:00
648540858
8f629a15cf 修复文档错误 2022-08-12 10:00:18 +08:00
648540858
35d6d44138 优化使用tcp连接时的超时时间 2022-08-11 16:37:55 +08:00
648540858
dcd772cb4d 去除jedis,方便支持redis集群 2022-08-10 18:14:33 +08:00
648540858
23b8057a28 Merge pull request #570 from TristingChen/optimize--play-complete
优化--直播接口流程结束异步处理截图操作,提高接口响应速度和并发能力
2022-08-09 17:34:36 +08:00
chenjialing
58201f41f2 优化--直播结束异步处理截图操作,提高接口响应速度和并发能力 2022-08-09 17:26:32 +08:00
648540858
5195623cf0 更新文档 2022-08-09 10:58:38 +08:00
648540858
2d10658ec3 更新文档 2022-08-09 10:57:33 +08:00
648540858
d872c56ac7 更新readme 2022-08-09 10:50:02 +08:00
648540858
a587383c8d 添加文档 2022-08-09 09:45:32 +08:00
648540858
762fff4f01 Merge pull request #567 from mrjackwang/wvp-28181-2.0
更新上级级联查看直播视频及代理拉流视频流bug
2022-08-08 09:32:38 +08:00
648540858
245b70f7ce Merge pull request #568 from zouyaoji/wvp-28181-2.0
前端显示媒体服务器配置时报错修复
2022-08-08 09:28:46 +08:00
wym
9c4c1159a7 zlm关闭一段时间后,重启后信令服务不重连zlm 2022-08-08 08:31:12 +08:00
zouyaoji
1c3c757d30 前端显示媒体服务器配置时报错修复 2022-08-06 11:27:02 +08:00
mrjackwang
0cd72f7d7d Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-08-06 09:42:28 +08:00
gushouzheng
f3ff294a8e Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-08-06 09:00:14 +08:00
gushouzheng
b39993cf3d 更新级联查看直播视频及代理拉流视频bug 2022-08-06 08:58:17 +08:00
648540858
2543a9c10c 优化用户表单 2022-08-05 17:27:18 +08:00
648540858
24540b08c4 去除点播界面双loading 2022-08-05 17:20:26 +08:00
648540858
ec61dc7c36 推流列表增加经纬度的添加 2022-08-05 17:10:53 +08:00
648540858
a4c5184706 修复单个添加的推流级联国标的问题 2022-08-05 09:48:13 +08:00
jiang
23361881e4 修改‘修改pushkey’窗口的标题提示文案 2022-08-04 17:01:31 +08:00
648540858
6df800eec1 Merge pull request #353 from mrjackwang/wvp-28181-2.0
拉流添加国标编码上级级联调取视频404
2022-08-02 15:41:07 +08:00
mrjackwang
bc98545fb4 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-08-02 15:32:15 +08:00
648540858
cbab9c9be1 修复二级目录添加失败的问题 2022-08-02 11:34:56 +08:00
648540858
0d2d73117e 修复视频播放点击音量报错 #557,修复编解码信息获取失败 2022-08-01 14:33:51 +08:00
648540858
db929e5da9 修复首页未获取到zlm消息时发送错误消息的bug 2022-08-01 09:32:39 +08:00
mrjackwang
51014f0c8f Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-07-29 15:16:39 +08:00
648540858
f731d83728 修复ssrc变化时端口变化的问题 2022-07-29 11:57:04 +08:00
648540858
3fbe95bd79 Merge pull request #556 from linhuaichuan/wvp-28181-2.0
fix 优化pom依赖,去除几个重复客户端。并改了几个 equals判断不精准的bug
2022-07-28 16:25:00 +08:00
648540858
9e949b2f80 Merge branch 'wvp-28181-2.0' into wvp-28181-2.0 2022-07-28 16:24:51 +08:00
648540858
bb6240f5a4 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-07-28 16:21:09 +08:00
648540858
a4671aebd3 优化hook订阅机制 2022-07-28 16:18:41 +08:00
648540858
6e208d6d98 优化gps信息存入数据库 2022-07-28 11:22:51 +08:00
庄梦蝶殇
fd22fe2f13 fix 优化pom依赖,去除几个重复客户端。并改了几个 equals判断不精准的bug 2022-07-27 18:31:33 +08:00
648540858
e6eac5c792 优化部分hook订阅 2022-07-27 16:16:12 +08:00
648540858
ecd404c776 去除多余内容 2022-07-27 14:53:19 +08:00
648540858
9d48c21d76 去除多余内容 2022-07-27 14:51:49 +08:00
648540858
881fb113e1 修复流地址返回错误 2022-07-27 14:48:21 +08:00
648540858
4f2282f125 bug修复 2022-07-27 11:11:18 +08:00
648540858
14270c619e bug修复 2022-07-26 11:43:56 +08:00
648540858
3d058b506e 修复推流推流状态提示 2022-07-25 11:17:46 +08:00
648540858
d7135965da 修复级联无通道时更新停止在等待更新的问题 2022-07-25 09:44:43 +08:00
648540858
c53622e802 更新mysql.sql 2022-07-22 16:05:23 +08:00
648540858
72f80bb672 增加推流添加功能,修复级联目录推送 2022-07-22 16:02:14 +08:00
648540858
9d025ad4cf Merge pull request #549 from TristingChen/fix-channel_status
优化----设备下线,通道状态也切换至离线状态
2022-07-20 17:54:42 +08:00
chenjialing
9d2872e275 优化----设备下线,通道状态也切换至离线状态 2022-07-20 17:02:55 +08:00
mrjackwang
b0884e92e4 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-07-20 13:51:30 +08:00
jiang
9851e11d91 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-07-19 18:13:42 +08:00
jiang
716f0b95cc 1.修复新增用户没有pushkey的问题
2.将重置pushkey改为修改pushkey
2022-07-19 18:13:19 +08:00
648540858
64f6d596f4 移除共享所有直播流功能 2022-07-19 17:46:16 +08:00
648540858
fe6ca0c571 优化推流列表 2022-07-19 16:37:34 +08:00
648540858
a9fcd4502c 修复推流导入模板 2022-07-19 15:27:33 +08:00
648540858
f69f1bcb5f 修复更新推流状态sql错误 2022-07-19 14:27:30 +08:00
648540858
86deeedf85 修复用户查询sql错误 2022-07-19 11:13:46 +08:00
648540858
75e6b123ee Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-07-19 11:10:50 +08:00
648540858
bf189cb11b 为pushKey增加默认值 2022-07-18 20:38:47 +08:00
648540858
7e1b19e75f MediaItem增加callId 2022-07-18 20:33:47 +08:00
jiang
90cc11e871 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-07-18 17:15:33 +08:00
jiang
9dcc315dbd 增加用户管理功能。管理员可以添加删除用户、修改用户密码、重置pushkey 2022-07-18 17:09:35 +08:00
648540858
11c47b139f 去除无用引用 2022-07-17 23:19:59 +08:00
648540858
0309140f48 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-07-17 23:17:55 +08:00
648540858
1a285ba00f 优化国标级联目录订阅通知以及目录查询回复 2022-07-17 23:17:36 +08:00
jiang
9fec9dc93a 测试提交权限 2022-07-13 11:29:46 +08:00
648540858
24fba85c38 支持从redis消息更新推流设备状态 2022-07-12 17:33:32 +08:00
648540858
86340fa1a2 支持从redis消息更新推流设备状态 2022-07-12 17:33:17 +08:00
648540858
6d8569f340 动态人物管理增加自检机制。防止内存溢出 2022-07-12 10:32:45 +08:00
648540858
0f945910f3 修复获取推流播放地址接口 2022-07-11 17:34:22 +08:00
648540858
56265c2f40 去除失效的配置,增加人物结束时移除人物缓存 2022-07-11 16:41:32 +08:00
648540858
a1d6e96c11 增加推流鉴权。保护服务安全 2022-07-11 16:21:01 +08:00
648540858
3b748f35b6 修复默认用户信息插入 2022-07-11 15:26:25 +08:00
648540858
99ab787468 用户表增加推流鉴权KEY 2022-07-08 11:20:29 +08:00
wangyimeng
401291eba5 Merge branch 'wvp-28181-2.0' of https://github.com/mrjackwang/wvp-GB28181-pro into wvp-28181-2.0 2022-07-06 15:33:43 +08:00
648540858
8fbed2b99d 界面优化 2022-07-06 10:18:56 +08:00
648540858
b1b4a45224 数据库优化 2022-07-06 09:44:37 +08:00
648540858
7be8f3668f 修复轨迹的储存与查询展示 2022-07-04 01:08:26 +08:00
648540858
c4d6f74091 修复通道数据写入数据库 2022-07-03 08:47:47 +08:00
648540858
0fea8cf29a 优化国标树型展示 2022-07-03 07:40:54 +08:00
648540858
7e90968141 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-06-23 10:14:56 +08:00
648540858
20f3e9885b Merge pull request #530 from mk1990/wvp-28181-2.0
fix设备状态查询接口
2022-06-22 17:43:59 +08:00
mk1990
038ca32c56 添加国标级联录像控制功能 2022-06-22 16:47:26 +08:00
mk1990
8a924d10b1 添加国标级联录像控制功能 2022-06-22 16:39:07 +08:00
mk1990
c09c1013c4 添加国标级联录像控制功能 2022-06-22 16:31:58 +08:00
mk1990
b9aca76599 添加国标级联录像控制功能 2022-06-22 16:26:41 +08:00
mk1990
7643c7f18d Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/info/InfoRequestProcessor.java
2022-06-22 14:42:46 +08:00
mk1990
04f6cf77bd 添加国标级联录像控制功能 2022-06-22 14:39:57 +08:00
mk1990
f3102831f6 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-06-22 14:27:33 +08:00
mk1990
615d11145e 添加国标级联录像控制功能 2022-06-22 14:26:46 +08:00
mk1990
4dae6820ee Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-06-22 13:38:25 +08:00
mk1990
341d4040e0 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/info/InfoRequestProcessor.java
#	src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
2022-06-22 13:34:56 +08:00
mk1990
51aad5dda4 添加国标级联录像控制功能 2022-06-22 13:33:55 +08:00
mk1990
e1a4790ed1 fix设备状态查询接口 2022-06-22 13:09:09 +08:00
648540858
e005fbf335 Merge pull request #527 from BradyXs/wvp-28181-2.0
fix(SIP): 修复海康NVR无parentId导致分屏监控没办法展开的问题
2022-06-22 10:02:53 +08:00
mk1990
b52863e685 添加国标级联录像控制功能; 2022-06-22 09:08:28 +08:00
mk1990
e87cd8cd91 fix设备状态查询接口 2022-06-20 15:10:31 +08:00
bradyxu
e5aca57579 fix(SIP): 修复海康NVR无parentId导致分屏监控没办法展开的问题
由于海康NVR通道信息中不带NVR的ID作为parentId。导致通道信息parentId缺失,
在通道信息中判断device信息中的DeviceId如果为NVR的话,将NVR的deviceId设置为通道的parentId
2022-06-18 10:40:24 +08:00
648540858
f0096af3e2 Merge pull request #524 from TristingChen/fixed--processTimeout
fixed--解决ssrc默认开启失败的问题,解决信令超时设备下线的bug
2022-06-17 16:05:35 +08:00
chenjialing
c8b7a182e9 fixed--解决ssrc默认开启失败的问题,解决信令超时设备下线的bug 2022-06-17 16:01:18 +08:00
648540858
e78986b6df 显示效果优化 2022-06-15 16:04:36 +08:00
648540858
642407505b 优化播放中zlm离线判断 2022-06-15 15:06:22 +08:00
648540858
3bf7ee18e0 修复播放中zlm离线导致的bye发送失败 2022-06-15 14:55:33 +08:00
648540858
9aad3b93af Merge pull request #517 from TristingChen/optimize-play-controller
Optimize play controller
2022-06-15 14:19:33 +08:00
chenjialing
85c3786eb2 优化--端口获取失败之时(如zlm连接失败),不进行invite点播消息的发送 2022-06-15 14:14:29 +08:00
chenjialing
5f26e92e77 优化----okhttp连接访问超时设置,访问异常code设置为-2 2022-06-15 14:13:43 +08:00
648540858
0b3c76304f 修复通道列表修改分页大小无效 2022-06-15 11:02:19 +08:00
648540858
ca5f430ca4 优化列表展示效果 2022-06-15 10:40:45 +08:00
648540858
7efc326d01 调整页面样式 2022-06-14 23:16:58 +08:00
648540858
ae68ef976e 优化位置信息展示 2022-06-14 17:46:53 +08:00
648540858
3c75b19c14 更新README 2022-06-14 17:28:56 +08:00
648540858
8b0b208952 设备支持设置地理坐标系,并将级联输出坐标系统一为wgs84 2022-06-14 17:00:24 +08:00
648540858
2c74dca22f 增加版本号 2022-06-14 15:10:52 +08:00
648540858
207af49d76 sql脚本补全 2022-06-14 15:09:06 +08:00
648540858
2a7090acd7 国标级联推送推流 支持多wvp间自动选择与推送 2022-06-14 14:37:34 +08:00
648540858
a84c1bdf85 #510 jessibuca分屏监控异常 2022-06-13 23:02:53 +08:00
648540858
1159cef1ef Merge pull request #473 from AlphaWu/Zafu-Dev
添加on_record_ts事件支持
2022-06-07 11:12:22 +08:00
648540858
89648af1c3 #508 2022-06-05 12:44:30 +08:00
648540858
436102469d 优化wasm播放器内存占用问题 2022-06-04 23:18:01 +08:00
648540858
8e1f032b28 修复订阅超时 2022-06-04 10:18:04 +08:00
648540858
075c6ad7f8 级联回放增加MediaStatus消息 #377 2022-06-04 00:02:39 +08:00
648540858
d6a44a03df 固定时区为Asia/Shanghai 2022-06-03 18:52:40 +08:00
648540858
c29f37caec okhttp-digest的Maven仓库调整 #506 2022-06-03 17:07:19 +08:00
648540858
1941e7bebc 解决设备上线停止线程导致的报错,优化录像的获取以及通道的更新 2022-06-03 16:24:11 +08:00
648540858
691f61258a 更新 DOCKERFILE 2022-06-02 16:01:50 +08:00
648540858
8f9b38e1e7 优化快照的存储与显示 2022-06-02 10:55:41 +08:00
648540858
1a0a05431a Merge pull request #504 from TristingChen/fixed--reset-channel
修复--重设通道多个设备注册下发生的sql错误修复
2022-06-02 09:31:06 +08:00
chenjialing
dcef4809bd 修复--重设通道多个设备注册下发生的sql错误修复 2022-06-01 14:11:06 +08:00
648540858
a287261c5d 修复级联点播时海康使用自定义ssrc的情况 2022-06-01 11:35:53 +08:00
648540858
7620fb951c 修复点播超时的事件设置 2022-05-31 16:20:46 +08:00
648540858
f725fac744 优化大数据下的设备树加载 2022-05-31 15:54:39 +08:00
648540858
94793cc19d #488 2022-05-27 23:14:17 +08:00
648540858
30d959b1ee 换种写法 2022-05-27 18:23:43 +08:00
648540858
1baaa80455 Merge pull request #497 from TristingChen/fixed--getAllSsrc
修复--获取全部ssrc的缓存问题修复
2022-05-27 18:22:23 +08:00
chenjialing
574e852a53 修复--获取全部ssrc的缓存问题修复 2022-05-27 18:15:06 +08:00
648540858
128158dbb5 兼容海康信令问题 #493 2022-05-26 13:45:57 +08:00
648540858
54a69c2f74 兼容不规范的时间格式iso8601格式;升级fastjson版本 2022-05-26 12:10:46 +08:00
648540858
0d1580ff75 Merge pull request #492 from mk1990/wvp-28181-2.0
解决海康设备在实时监控模块中无法获取到通道信息
2022-05-25 14:18:27 +08:00
648540858
f445156f03 Merge pull request #491 from mk1990/wvp-28181-2.0
解决设备第一次注册获取不到设备信息和通道信息的问题
2022-05-25 14:09:43 +08:00
mk1990
f1dd3800ea 解决海康设备在实时监控模块中无法获取到通道信息 2022-05-25 14:09:43 +08:00
mk1990
6319f8f3f4 解决设备第一次注册获取不到设备信息和通道信息的问题 2022-05-25 13:39:34 +08:00
mk1990
59986d11ff Merge branch 'wvp-28181-2.0' of https://github.com/mk1990/wvp-GB28181-pro into wvp-28181-2.0 2022-05-23 13:03:51 +08:00
mk1990
210bfa0b17 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-05-23 13:02:50 +08:00
648540858
0c01ff6397 修复国标录像播放 2022-05-23 10:50:29 +08:00
648540858
0dfd27f323 Merge pull request #487 from hotcoffie/wvp-28181-2.0
fix:之前引入了错误的DigestServerAuthenticationHelper
2022-05-23 10:39:05 +08:00
xiaoxie
bba1e01e1e fix:之前引入了错误的DigestServerAuthenticationHelper 2022-05-23 10:37:38 +08:00
648540858
a74ef4f1e6 优化代码 2022-05-23 10:16:46 +08:00
648540858
f4e80deac2 Merge pull request #486 from hotcoffie/wvp-28181-2.0
一些细节修复
2022-05-23 09:49:37 +08:00
xiaoxie
9caa43c6dc 处理冲突 2022-05-23 09:44:21 +08:00
xiaoxie
524eac68ea 处理冲突 2022-05-23 09:42:32 +08:00
hotcoffie
7edeb6fbe0 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-05-23 09:15:59 +08:00
648540858
e886a09596 修复国标级联录像查询 #485 2022-05-21 21:13:12 +08:00
648540858
998b8323f3 支持sdp ip 配置为域名 2022-05-19 17:00:47 +08:00
mk1990
3aacaaed58 Merge branch 'wvp-28181-2.0' of https://github.com/mk1990/wvp-GB28181-pro into wvp-28181-2.0 2022-05-18 16:58:26 +08:00
mk1990
2a461af8d6 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-05-18 16:57:06 +08:00
648540858
d1c15ad520 优化单端口下的ssrc修复 2022-05-18 16:46:09 +08:00
648540858
05485f57cd 优化收到心跳的信息更新判断 2022-05-18 16:08:52 +08:00
648540858
1986a059f8 兼容海康ssrc问题 2022-05-18 15:47:20 +08:00
648540858
9c7c42245d 更新jessibuca播放器 2022-05-18 15:36:33 +08:00
mk1990
bc8f03ac1d Merge branch 'wvp-28181-2.0' of https://github.com/mk1990/wvp-GB28181-pro into wvp-28181-2.0 2022-05-18 14:40:32 +08:00
mk1990
ffb9174623 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-05-18 14:36:47 +08:00
648540858
688da92808 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-05-18 10:44:39 +08:00
648540858
94ca772ef6 优化播放页面 2022-05-18 10:42:27 +08:00
648540858
10d7f091b5 Merge pull request #478 from wmz46/wvp-28181-2.0
无认证密码时,不校验是否存在授权头
2022-05-18 10:29:17 +08:00
648540858
a55aeb87db 优化播放页面 2022-05-18 10:01:58 +08:00
648540858
49b4ceaf7c 修复播放页面 2022-05-18 09:57:36 +08:00
648540858
eacefd82a3 添加直接支持切换多种开源播放器 2022-05-18 09:49:25 +08:00
hotcoffie
3b48a96da4 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-05-17 11:53:42 +08:00
钢翼
587de1b9e7 无认证密码时,不校验是否存在授权头 2022-05-17 08:18:38 +08:00
648540858
e231eadd7f 播放页面显示所有流地址 2022-05-16 17:49:44 +08:00
mk1990
57febb3b76 Merge branch 'wvp-28181-2.0' of https://github.com/mk1990/wvp-GB28181-pro into wvp-28181-2.0 2022-05-16 10:14:24 +08:00
mk1990
3cb59aa4d1 修改application-dev.yml 2022-05-16 10:10:50 +08:00
mk1990
1b72bdb1af Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-05-16 09:38:06 +08:00
WuPeng
b12729866e 添加on_record_ts事件支持 2022-05-13 22:22:10 +08:00
648540858
7e9e27f562 使用 java.time.Instant代替 java.util.Date 2022-05-13 22:15:31 +08:00
648540858
a14ce86632 优化录像结束发送BYE判断 2022-05-13 21:10:02 +08:00
648540858
fe029b566d 优化海康录像下载 2022-05-13 21:05:33 +08:00
648540858
84a4bc354f 去除过时注释 2022-05-13 15:45:02 +08:00
648540858
91170a292e 优化海康国标录像播放的控制 2022-05-13 15:41:50 +08:00
648540858
37c61c4fb0 支持海康摄像头国标录像查看播放 2022-05-13 15:32:30 +08:00
mk1990
8707f4110d Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-05-13 10:58:33 +08:00
648540858
db4aa30bc6 #470 2022-05-12 18:17:15 +08:00
648540858
9600c25b9a #471 2022-05-12 18:15:35 +08:00
648540858
9c1bb14286 修复缺失的设备时间 2022-05-12 17:48:52 +08:00
mk1990
df3b3965f7 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-05-12 16:16:55 +08:00
648540858
277c6ea039 修复代码 2022-05-12 10:48:50 +08:00
648540858
cf933d7d5e 修复新设备注册 2022-05-12 10:24:08 +08:00
648540858
d91b58de0a 修复设备缺失的数据 2022-05-11 20:22:15 +08:00
648540858
738a0ce036 优化设备在线状态 2022-05-11 18:37:24 +08:00
mk1990
0eb8962db8 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-05-10 18:02:09 +08:00
648540858
b3fe55709b 修复发流接口的调用 2022-05-10 11:01:33 +08:00
648540858
a5f6a0953e 优化级联点播流程 2022-05-10 10:58:26 +08:00
648540858
5548e4287f 优化推流调用 2022-05-10 09:45:09 +08:00
648540858
f4f2126452 优化目录获取并法能力 2022-05-10 09:38:05 +08:00
hotcoffie
26bc0f1afe Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-05-07 17:42:31 +08:00
648540858
d10aabaa5f 修复打包优化pom 2022-05-07 15:13:56 +08:00
648540858
6b74b8b573 更新readme 2022-05-07 14:44:00 +08:00
mk1990
b18abb3ee1 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-05-07 11:25:13 +08:00
648540858
cba8c4ae1d Merge pull request #468 from TristingChen/resetQuery--add
开发----增加预置位查询接口开发
2022-05-07 09:00:22 +08:00
mk1990
80d7a0cae5 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-05-06 17:46:01 +08:00
chenjialing
2a948e0bee 开发----增加预置位查询接口开发 2022-05-06 17:44:56 +08:00
648540858
87d8c8ad97 去除多与引用 2022-05-06 17:29:24 +08:00
648540858
e2dbd1f45b 优化地图功能的开关 2022-05-06 16:01:36 +08:00
648540858
d117122e27 统一userAgent 2022-05-06 15:55:32 +08:00
wangyimeng
11ef2f827e Merge branch 'wvp-28181-2.0' of https://github.com/648540858/wvp-GB28181-pro into wvp-28181-2.0
# Conflicts:
#	bootstrap.sh
#	web_src/package-lock.json
#	web_src/static/js/jessibuca/decoder.wasm
2022-05-06 12:19:44 +08:00
wangyimeng
54fd12a95a 1 2022-05-06 12:05:12 +08:00
wangyimeng
63978c03a7 更新同步wvp 2022-05-06 11:56:29 +08:00
hotcoffie
8bcf3458f3 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-05-06 10:59:33 +08:00
648540858
0dd2267bb1 使用阿里代码规范。规范代码写法 2022-05-06 10:12:34 +08:00
648540858
5b4e6acfd1 使用阿里代码规范。规范代码写法 2022-05-05 17:07:16 +08:00
648540858
b13bb09a81 规范代码写法 2022-05-05 14:36:27 +08:00
648540858
69508b1744 优化收到心跳设置设备上线的逻辑 2022-05-05 14:26:42 +08:00
mk1990
7b6e801890 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-05-05 08:43:10 +08:00
xiaoxie
9b3eea169c 升级shelljs,解决较高版本node打包时的警告 2022-05-01 21:33:56 +08:00
xiaoxie
cffafbca54 替换一个过时的API,解决maven打包警告 2022-05-01 21:32:43 +08:00
648540858
78b8a59837 #453 2022-04-28 18:18:09 +08:00
648540858
1962030748 修复添加/修改节点页面的BUG 2022-04-28 17:58:47 +08:00
648540858
bf2f5e93e7 添加对点播时设备自定义ssrc的支持 2022-04-28 17:28:51 +08:00
mk1990
1f12dd9f8e Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-04-28 16:32:09 +08:00
648540858
25b71e8f56 Merge pull request #462 from hotcoffie/wvp-28181-2.0
多屏界面,切换分屏数时播放器正确调整尺寸
2022-04-28 14:43:07 +08:00
xiaoxie
db1cbe4dbc 多屏界面,切换分屏数时播放器正确调整尺寸 2022-04-28 14:23:17 +08:00
648540858
32a74092a4 Merge pull request #461 from hotcoffie/wvp-28181-2.0
修复多屏播放时播放器样式错位
2022-04-28 14:03:37 +08:00
648540858
78f7f7645c Merge pull request #457 from J1031/bugfix/transaction_is_null
修复ServerTransaction空指针异常
2022-04-28 14:02:18 +08:00
xiaoxie
80908f321c 修复多屏播放时播放器样式错位 2022-04-28 13:40:26 +08:00
648540858
b8e63574a5 优化对Parental字段的判断 2022-04-28 10:05:56 +08:00
648540858
dcaa8e3713 优化对Parental字段的判断 2022-04-28 09:47:46 +08:00
quangz
908e97f62b 修复ServerTransaction空指针异常 2022-04-27 18:51:47 +08:00
648540858
65d081f8c4 判空 2022-04-26 18:46:18 +08:00
648540858
5cabd8ff30 优化级联目录发送 2022-04-26 18:29:47 +08:00
648540858
19b4694d1d 行政区划作为级联数据的处理,修复设备树的显示 2022-04-26 17:24:41 +08:00
648540858
71c44e0785 Merge pull request #451 from itouxin/patch-1
修复docker运行配置WVP_CONFIG后,相关配置未生效的问题
2022-04-26 17:18:57 +08:00
648540858
cfbfb134f6 Merge pull request #452 from hotcoffie/wvp-28181-2.0
优化播放器尺寸调节逻辑:
2022-04-26 17:18:45 +08:00
mk1990
39bddf773c Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-04-26 15:32:23 +08:00
xiaoxie
fd3d2c31dc 优化播放器尺寸调节逻辑:
1.播放器不会大于屏幕高度
2.增加灰色背景色区分播放区域
3.播放器居中
2022-04-26 15:03:44 +08:00
TouXin
6315502dc7 Update DOCKERFILE
修复docker运行配置WVP_CONFIG后,相关配置未生效的问题
2022-04-26 14:32:02 +08:00
648540858
8248c32b4b 多级虚拟组织处理修复 2022-04-25 17:13:22 +08:00
648540858
de58ebeec3 多级虚拟组织处理修复 2022-04-25 17:12:29 +08:00
648540858
6e65006354 对于虚拟目录中出现多级虚拟组织的情况进行处理 2022-04-25 16:55:38 +08:00
648540858
bec3091767 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-04-24 16:34:21 +08:00
648540858
de21837334 增加redis通知方式向设备/平台发送报警消息功能 2022-04-24 16:33:59 +08:00
648540858
4511ad1da3 Merge pull request #449 from hotcoffie/wvp-28181-2.0
修复一处日志打印错误
2022-04-24 14:52:01 +08:00
xiaoxie
5fbece4cd8 修复一处日志打印错误 2022-04-24 09:51:54 +08:00
648540858
31f28cd72b Merge pull request #448 from hotcoffie/wvp-28181-2.0
1.修正了播放地址无法正常播放视频的问题,包含两个错误:
2022-04-24 09:30:16 +08:00
xiaoxie
6c48fb23ca live页面,删除一个不再使用的一些变量和函数 2022-04-24 00:36:18 +08:00
xiaoxie
7ca269ffb7 live页面适配palyer组件的修改 2022-04-24 00:30:31 +08:00
xiaoxie
0d90a8fd3d 在1e2d207aea24b5956d5ece95ed4a9db0f59f34d7这个版本中,作者删除了initData函数,但是忘记删除mounted中的this.mounted() 导致console报错 2022-04-23 23:54:49 +08:00
xiaoxie
9d6b7e8b16 1.修正了播放地址无法正常播放视频的问题,包含两个错误:
1.1修正播放器界面路由(此页面不需要layout边框,之前已经修复但在地图代码合并时又被错误覆盖)
1.2修正播放器id属性,此属性现在不需要父级组件传入(这是之前导致独立播放页面失效的主要原因)
2.调整滚动条美化样式到app.vue中,使其真正全局生效
2022-04-23 23:34:36 +08:00
648540858
24057251e2 Merge pull request #447 from hotcoffie/wvp-28181-2.0
之前播放器窗口缩放时大小很奇怪,还有黑色底色
2022-04-23 14:20:00 +08:00
xiaoxie
62ed50eb26 动态计算播放器尺寸,保持16:9比例,避免出现黑框或固定大小无法缩放 2022-04-23 11:34:43 +08:00
xiaoxie
5eac7642e9 动态计算播放器尺寸,保持16:9比例,避免出现黑框或固定大小无法缩放 2022-04-23 11:20:00 +08:00
648540858
f1c4647ac3 添加注释 2022-04-22 17:00:33 +08:00
648540858
509b1e99f1 Merge pull request #444 from hotcoffie/wvp-28181-2.0
全局布局调整补充:之前路由把两个播放器界面也加入全局样式,现在移出到一级路由
2022-04-22 16:58:42 +08:00
648540858
861c612dbc Merge branch 'wvp-28181-2.0' into wvp-28181-2.0 2022-04-22 16:58:33 +08:00
648540858
cd3c365976 支持关闭地图功能,添加授权声明 2022-04-22 16:55:46 +08:00
648540858
1822922062 Merge pull request #446 from 648540858/map
Map
2022-04-22 16:22:34 +08:00
648540858
b93cc7a254 添加优化后的地图页面,完全一处百度地图相关的api 2022-04-22 16:21:05 +08:00
xiaoxie
b20081ba74 全局布局调整补充:之前路由把两个播放器界面也加入全局样式,现在移出到一级路由 2022-04-21 13:46:16 +08:00
mk1990
c417adbc24 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-04-21 13:34:50 +08:00
648540858
c9909c4bc2 Merge remote-tracking branch 'origin/wvp-28181-2.0' into map
# Conflicts:
#	web_src/src/components/UiHeader.vue
#	web_src/src/components/devicePosition.vue
#	web_src/src/components/live.vue
#	web_src/src/router/index.js
2022-04-21 13:01:02 +08:00
648540858
3207f82308 Merge pull request #443 from hotcoffie/wvp-28181-2.0
前端路由组件化,同时界面样式美化微调
2022-04-21 12:52:36 +08:00
xiaoxie
fd1256acb1 全局样式适配三个隐藏页面 2022-04-21 12:45:27 +08:00
xiaoxie
5d8f68ede7 通道页适配全局样式 2022-04-21 12:39:09 +08:00
xiaoxie
7f62101dd3 1.重构全局页面结构,从之前每个页面独立绘制改为路由嵌套
2.全局页面样式优化,如滚动条、标题栏等
2022-04-21 12:33:10 +08:00
648540858
9cc875a0f8 Merge remote-tracking branch 'origin/wvp-28181-2.0' into map 2022-04-21 10:30:46 +08:00
648540858
aaaf1f89a9 Merge pull request #441 from hotcoffie/wvp-28181-2.0
修复前端一处v-for没有key的警告
2022-04-21 10:29:44 +08:00
xiaoxie
778aa4fb0c 修复实时监控页面,左侧菜单越界显示问题 2022-04-21 10:11:08 +08:00
hotcoffie
a9ba4d79c0 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-04-21 10:04:50 +08:00
xiaoxie
d6c11e5aa6 修复前端一处v-for没有key的警告 2022-04-21 10:03:21 +08:00
648540858
4a7a51cedf 添加公共组件设备树 2022-04-20 18:21:18 +08:00
648540858
702729b3d2 Merge pull request #439 from hotcoffie/wvp-28181-2.0
增强查询录像列表接口兼容性
2022-04-20 14:16:10 +08:00
xiaoxie
0ee1eb4274 修复录像列表:实测部分厂家(TP-Link IPC43AW)录像列表接口,返回的xml报文数据中有多余的空格,导致解析String为Integer失败,增加trim修复这个问题 2022-04-20 13:56:30 +08:00
648540858
57fc99f7de Merge remote-tracking branch 'origin/wvp-28181-2.0' into map 2022-04-20 09:38:09 +08:00
648540858
fbd693faa5 优化国标级联目录推送,支持zlm新特性ssrc校验 2022-04-19 11:52:03 +08:00
648540858
d43050bee9 Merge pull request #437 from hotcoffie/wvp-28181-2.0
优化摄像头注册流程
2022-04-19 10:36:21 +08:00
648540858
1f25cabc83 添加行政区划功能,修复目录发送数量统计的BUG 2022-04-18 17:38:49 +08:00
648540858
4f2c6c9fc1 添加国标级联目录分组分组加快通道传输速度 2022-04-18 16:16:49 +08:00
xiaoxie
f83123f868 优化摄像头注册流程 2022-04-18 15:04:22 +08:00
648540858
2d7a571832 修复更新通道状态回复不准的问题 2022-04-18 12:55:54 +08:00
648540858
15b36e7be6 修复更新通道日志显示 2022-04-18 12:45:19 +08:00
648540858
4e49266020 修复更新通道结束后释放慢的问题 2022-04-18 12:42:58 +08:00
648540858
ab98fd60d9 修复级联编辑页面开关的重置 2022-04-18 11:45:53 +08:00
648540858
b63310c3cf 添加自动拉起未推流设备的控制开关 2022-04-18 10:52:38 +08:00
mk1990
bdba2b8f5a Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-04-18 09:32:20 +08:00
648540858
c0149f7bb4 优化通道同步添加对SN的判断,精简代码 2022-04-17 19:48:05 +08:00
648540858
35b0f46bb4 接收所有notify请求,即使没有订阅 2022-04-15 18:04:19 +08:00
mk1990
7ee33172a5 同步使用临时方案解决更新通道调用百度API问题之前的内容 2022-04-15 17:05:26 +08:00
648540858
7e35b85d91 Merge remote-tracking branch 'origin/wvp-28181-2.0' into map
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/SubscribeListenerForPlatform.java
2022-04-15 09:37:33 +08:00
648540858
8115b025c6 优化级联移动位置订阅位置更新 2022-04-14 16:52:48 +08:00
648540858
a0769da07c 优化级联移动位置订阅位置更新 2022-04-13 17:59:21 +08:00
648540858
7026d76310 异步通道刷新,优化ui效果 2022-04-12 21:06:21 +08:00
648540858
624975bc85 优化通道刷新 2022-04-12 11:04:08 +08:00
648540858
fd8c4146e1 使用临时方案解决更新通道调用百度API问题 2022-04-11 15:30:49 +08:00
648540858
dc1b11895e 默认推流通道始终在线 2022-04-11 14:59:31 +08:00
648540858
2bed57fe02 优化地图-添加地图页面以及设备树 2022-04-08 18:09:23 +08:00
648540858
504e99869a 修复停止推流的参数组织方式 2022-04-08 16:30:39 +08:00
648540858
4acd622933 优化订阅信息的发送与取消订阅 2022-04-08 14:44:49 +08:00
648540858
24b1c28efd 添加日志 2022-04-07 15:41:46 +08:00
648540858
8913b2022b 补充xml缺失的编码信息 2022-04-07 14:22:41 +08:00
648540858
7227e33099 补充xml缺失的编码信息 2022-04-07 14:21:21 +08:00
648540858
897db7c042 补充建表sql 2022-04-06 11:18:35 +08:00
648540858
605aa9c7f9 修复重启服务后拉流代理回复失败的问题 2022-04-06 11:07:42 +08:00
648540858
18447bc941 Merge pull request #419 from nikmu/wvp-28181-2.0
目录订阅推送问题,在线事件发送问题
2022-04-02 18:23:50 +08:00
648540858
2b77f5585b 修复实时监控无法播放问题 #427 2022-04-02 18:19:12 +08:00
648540858
1f8015e8a2 修复启动报错 2022-04-02 17:09:33 +08:00
648540858
db0044ec4c Merge pull request #426 from J1031/bugfix/map_modification_exception
修复ConcurrentModificationException
2022-04-02 14:34:41 +08:00
648540858
68dd698d99 支持级联云台控制 2022-04-02 14:13:32 +08:00
quangz
f23c5eee17 修复ConcurrentModificationException 2022-04-02 08:06:30 +08:00
648540858
f2759841f9 去除无用引用 2022-04-01 17:44:43 +08:00
648540858
53837bf97c 使用getHostAddress代替getHostName避免经过DNS时间过久 2022-04-01 17:13:11 +08:00
648540858
28638c7898 支持国标移动位置订阅,收到新位置发送redis消息;支持通道redis消息拉起第三方推流;云台控制添加ControlPriority字段;处理sql的bug 2022-04-01 16:45:29 +08:00
朱俊杰
fff11e4355 订阅查询错误和空指针 2022-03-31 09:19:45 +08:00
朱俊杰
21e66ab399 2个小bug
1、add update事件调用错误函数
2、在线的还发在线事件,如果别人正在给你推送目录就会不停的update设备表,设备表又没加锁,页面就无法更改设备信息了。。。
2022-03-29 17:31:41 +08:00
648540858
2358985ab5 Merge pull request #413 from mk1990/wvp-28181-2.0
修改前端control.vue和DeviceList.vue控制台错误和警告
2022-03-29 17:15:24 +08:00
648540858
35776e4678 补充缺失的文件 2022-03-29 12:17:54 +08:00
648540858
70acfc7ca7 修复级联的国标通道无经纬度问题 2022-03-29 10:04:28 +08:00
648540858
84d1012d3e 更新README 2022-03-28 17:50:00 +08:00
648540858
178b8d28be 更新README 2022-03-28 15:40:07 +08:00
648540858
4ee71dcc39 更新README 2022-03-28 15:39:58 +08:00
648540858
995978fb0a 更新播放器 2022-03-28 15:26:48 +08:00
mk1990
87f16e594b Merge branch 'wvp-28181-2.0' of https://github.91chi.fun/https://github.com/648540858/wvp-GB28181-pro into wvp-28181-2.0 2022-03-28 14:36:13 +08:00
648540858
1855913d43 修复国标目录发送缺失的问题 2022-03-28 11:03:17 +08:00
mk1990
e6ceb87492 1. 修改control.vue 报Invalid prop: type check failed for prop "column". Expected Number with value 1, got String with value "1".
2. 修改control.vue Error: [vue-clipboards] Invalid value. Please use a valid value.
3. 修改DeviceList.vue 刷新时报
[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "loading"
2022-03-28 10:11:13 +08:00
648540858
d8b7e06c5c 兼容海康 媒体通知 消息from字段不是设备ID的问题 2022-03-25 18:05:05 +08:00
648540858
8b1283be1b 优化国标级联上级要求tcp推流时的回复 2022-03-25 17:22:17 +08:00
648540858
c909fcf379 优化国标录像下载,添加进度条以及自动合并文件下载,需要结合新版assist服务使用。 2022-03-25 16:05:14 +08:00
648540858
348b9cbc65 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-03-25 10:01:12 +08:00
648540858
b14dc301d8 优化目录推送CivilCode值 2022-03-24 15:59:38 +08:00
648540858
b1901f102a Merge pull request #379 from MeBetterMan/wvp-28181-2.0
级联场景,invite消息中获取channelid。以前从invite的第一行读取,现在从subject header读取。
2022-03-22 11:45:11 +08:00
648540858
6daa654f27 修身颠簸与录像回放redis前缀重复的问题 2022-03-21 16:58:42 +08:00
648540858
f59189aebd Merge pull request #403 from brewswang/wvp-28181-2.0
执法记录仪在更新目录数据的时候需要更新位置信息
2022-03-17 14:56:15 +08:00
brewswang
589d26fe9e 执法记录仪在更新目录数据的时候需要更新位置信息 2022-03-17 12:39:59 +08:00
648540858
cb083223f8 统一国标设备与级联平台字符集的使用 2022-03-17 10:29:49 +08:00
648540858
dc328b9eeb #393 2022-03-16 17:46:24 +08:00
648540858
fa122fd68b 修复合并pr带来的bug 2022-03-16 16:55:04 +08:00
648540858
bee18d3a7e #401 2022-03-16 16:46:18 +08:00
648540858
e1f24ef254 Merge pull request #399 from nikmu/wvp-28181-2.0
修复device_channel的Id改变带来的tree查询bug
2022-03-16 16:42:50 +08:00
wangyimeng
65b9240c71 删除重复字段 2022-03-16 15:27:12 +08:00
朱俊杰
3341e8315f 去掉createinfo中的cseq参数 2022-03-16 11:21:39 +08:00
朱俊杰
d7d2776269 修复info请求头中的cseq序列 2022-03-16 11:18:09 +08:00
648540858
ce2e412c69 修复推流关联平台的bug again 2022-03-16 10:12:31 +08:00
mrjackwang
217295d33a Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-03-16 08:54:31 +08:00
648540858
21367a09a6 修复推流关联平台的bug 2022-03-15 17:45:55 +08:00
648540858
36c720cc55 修复推流关联平台的bug 2022-03-15 16:58:50 +08:00
朱俊杰
aaa1c8d6cb 修复device_channel的Id改变带来的tree查询bug 2022-03-15 16:31:06 +08:00
648540858
e1cb286392 必须提前在zlm上配置port_range属性,不然自动配置此属性可能不成功 2022-03-15 15:40:15 +08:00
648540858
8ad6c7dbba 使用zlm原生的rtp随机端口配置 2022-03-15 15:37:22 +08:00
648540858
c9d2c69155 修复多平台同时导入时的bug 2022-03-15 11:44:11 +08:00
648540858
3cb0677fe0 #396 2022-03-15 10:47:07 +08:00
mrjackwang
29585e09bb Merge branch 'wvp-28181-2.0' into wvp-28181-2.0 2022-03-15 10:28:23 +08:00
648540858
c570a88b0f 修复平台编辑的bug 2022-03-15 10:13:19 +08:00
648540858
319e149692 修复使用ffmpeg拉流代理时ffmpeg cmd模板空白的bug 2022-03-15 09:45:11 +08:00
648540858
00b9831fe4 #394 2022-03-14 18:34:25 +08:00
648540858
f2af3bd989 优化点播, 级联点播级联录像。级联列表显示订阅状态 2022-03-14 18:24:30 +08:00
648540858
91eb4a09b8 使用zlm新特性支持对与国标流关闭音频以加快拉流速度 2022-03-14 11:36:01 +08:00
648540858
d1b0f3dcee #390 2022-03-11 11:22:55 +08:00
648540858
ddc0779b4f 移除多余字段 2022-03-11 11:22:47 +08:00
648540858
dd2deaaa3c #376 2022-03-11 09:58:36 +08:00
648540858
3735943594 优化目录订阅时父节点的更新 2022-03-11 09:54:35 +08:00
648540858
613c771c45 Merge pull request #388 from AbnerSC/wvp-28181-2.0
修复关闭按需拉流无效的问题,和几个小问题
2022-03-11 09:49:48 +08:00
648540858
edc98da01b Merge branch 'wvp-28181-2.0' into wvp-28181-2.0 2022-03-11 09:49:38 +08:00
mrjackwang
6a77a7ded7 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-03-10 21:00:42 +08:00
648540858
0932382a36 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-03-10 20:54:14 +08:00
648540858
63fec78d24 优化目录订阅以及国标级联目录订阅回复 2022-03-10 20:53:56 +08:00
dengming
dd7695d7c6 Merge branch 'wvp-28181-2.0' of github.com:AbnerSC/wvp-GB28181-pro into wvp-28181-2.0 2022-03-10 17:52:59 +08:00
sc.dm
e8c244e907 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-03-10 17:42:02 +08:00
dengming
c0139c4230 优化pom配置,解决编译Failed to perform fetch问题 2022-03-10 17:40:45 +08:00
dengming
54b2b1c867 删除重复字段,channelId字段查询了两次 2022-03-10 17:27:07 +08:00
dengming
0c9691ccf5 删除多余依赖包com.google.guava:30.0-jre,项目引用了版本31 2022-03-10 15:24:50 +08:00
dengming
740fedc005 修复关闭按需拉流无效的问题 2022-03-10 15:08:41 +08:00
648540858
b00e099e6f Merge pull request #387 from AbnerSC/wvp-28181-2.0
修复云端录像播放和下载路径错误的问题
2022-03-10 14:59:12 +08:00
dengming
1a1394bf9d 修复云端录像播放和下载路径错误的问题 2022-03-10 11:33:51 +08:00
Fang
339b51d233 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-03-07 14:21:29 +08:00
李防
b9710228dd InviteRequestProcessor类中,channelid从invite消息的header subject获取,不再从第一行request line获取。原因是和第三方平台对接时,发送的invite消息第一行为国标平台编码而不是设备通道编码,导致报错通道不存在,返回404。 2022-03-07 14:20:27 +08:00
648540858
7044cf8c29 修复导入通道时无平台关联时的bug 2022-03-07 10:47:06 +08:00
mrjackwang
d58fd269e8 Merge branch 'wvp-28181-2.0' into wvp-28181-2.0 2022-03-07 09:01:14 +08:00
648540858
1bdb87ae5a 导出sql 2022-03-07 08:27:38 +08:00
648540858
09855e03e8 优化失败的录像点播的ssrc释放逻辑 2022-03-07 01:23:23 +08:00
648540858
13899f771b 优化ssrc释放逻辑,优化级联点播速度,去除等待流格式的配置项 2022-03-07 01:17:45 +08:00
648540858
38d31a97b8 Merge pull request #375 from MeBetterMan/wvp-28181-2.0
修改3个小bug
2022-03-06 00:09:34 +08:00
李防
a1cb002609 修改3个小bug 2022-03-05 17:05:05 +08:00
mrjackwang
f1e5218a6a Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-03-04 20:37:17 +08:00
648540858
a919611214 修复合并分支造成的bug 2022-03-04 15:59:29 +08:00
648540858
9450cb0c40 Merge remote-tracking branch 'gitee.com/wvp-pro-record' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
2022-03-04 15:39:30 +08:00
648540858
bdc704644a Revert "修复回放失败出现脏数据的问题以及添加拉流代理判断错误的问题"
This reverts commit 16e8aa323f.
2022-03-04 15:36:16 +08:00
648540858
922d61c781 Merge remote-tracking branch 'origin/wvp-pro-record' into wvp-28181-2.0
# Conflicts:
#	web_src/src/components/control.vue
2022-03-04 15:29:56 +08:00
648540858
d6d226ef2c Merge branch 'wvp-28181-2.0' into wvp-pro-record
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
2022-03-04 15:27:28 +08:00
648540858
346c90d9d0 修复回放失败出现脏数据的问题以及添加拉流代理判断错误的问题 2022-03-04 11:26:53 +08:00
648540858
c1231f28d8 readme更新 2022-03-04 10:32:28 +08:00
648540858
b48e93e97a 去除lombok,readme更新 2022-03-04 10:30:55 +08:00
mrjackwang
0e4c22f72a Merge branch 'wvp-28181-2.0' into wvp-28181-2.0 2022-03-03 19:52:16 +08:00
648540858
7af0cc437a 优化国标级联录像预览 2022-03-03 18:23:52 +08:00
648540858
42cbec85e8 Merge branch 'wvp-28181-2.0' into wvp-pro-record 2022-03-03 16:55:20 +08:00
648540858
5c69ffce33 参数名错误 2022-03-03 16:54:47 +08:00
648540858
cc7f784198 Merge branch 'wvp-28181-2.0' into wvp-pro-record
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
#	src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java
#	src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
2022-03-03 16:28:32 +08:00
648540858
0c909e0c85 Merge pull request #365 from TristingChen/zlm-node-manage
fixed--多节点管理zlm,wvp重启之后节点中的redis在线状态bug修复
2022-03-03 16:23:03 +08:00
648540858
1527b0e839 国标录像支持多端同时播放 2022-03-03 15:57:28 +08:00
chenjialing
6e147c44e2 节点管理--某个zlm节点删除之后,数据库中仍有数据,导致再次添加该zlm节点 2022-03-03 15:40:12 +08:00
chenjialing
1f9b3271bb fixed--多节点管理zlm,wvp重启之后节点中的redis在线状态bug修复 2022-03-03 15:30:16 +08:00
648540858
ed9e8ef456 修复正则×号是引起的错误 2022-03-02 18:11:43 +08:00
648540858
2e49a48bb1 修复bug 2022-03-02 15:04:24 +08:00
panll
2f06d3152a !6 update web_src/src/components/dialog/changePassword.vue.
Merge pull request !6 from lanss/N/A
2022-03-02 06:27:57 +00:00
panll
479411f406 !11 修改内存泄露
Merge pull request !11 from ydpd/wvp-28181-2.0
2022-03-02 06:26:54 +00:00
panll
d4b8190caa !9 update sql/mysql.sql.
Merge pull request !9 from 随波/N/A
2022-03-02 06:25:19 +00:00
panll
17f2fdc344 !8 update src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java.
Merge pull request !8 from 随波/N/A
2022-03-02 06:24:26 +00:00
panll
698ea11b16 !7 rPort 变更了HostAddres也要变
Merge pull request !7 from ckb_test/N/A
2022-03-02 06:23:31 +00:00
648540858
f61d0c35d7 Merge branch 'wvp-28181-2.0' into wvp-pro-record
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
2022-03-02 12:52:37 +08:00
648540858
78bad59518 优化国标级联的目录订阅 2022-03-02 11:48:20 +08:00
648540858
1da1dd68e5 Merge pull request #360 from TristingChen/alarm-test
告警信息上报过程中,AlarmType存储失败的解决
2022-03-02 09:22:20 +08:00
chenjialing
22fd9e6f8c 告警信息上报过程中,AlarmType存储失败的解决 2022-03-02 09:18:17 +08:00
ydpd
31b1728313 修改内存泄露 2022-03-02 00:24:14 +08:00
ydpd
3525fccd40 修改内存泄露 2022-03-02 00:02:03 +08:00
648540858
6d8ea04fe0 Merge branch 'wvp-28181-2.0' into wvp-pro-record
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformChannelMapper.java
#	web_src/src/components/control.vue
2022-03-01 22:07:01 +08:00
648540858
76397fecf8 优化配置文件与日志 2022-03-01 21:59:31 +08:00
648540858
cf5a8515df Merge branch 'wvp-28181-2.0' of https://github.com/648540858/wvp-GB28181-pro into wvp-28181-2.0 2022-03-01 17:48:21 +08:00
648540858
4c53e56d90 解决对接中遇到的问题 2022-03-01 17:42:22 +08:00
648540858
52622fe991 Merge pull request #346 from TristingChen/log-optimization
Log optimization
2022-03-01 17:37:19 +08:00
648540858
a0876c4172 Merge pull request #356 from SaltFish001/wvp-28181-2.0
注释无用的引入, 修复打jar包失败问题
2022-03-01 17:36:23 +08:00
SaltFish
aabd3ea659 Update StreamPushMapper.java 2022-03-01 14:33:04 +08:00
随波
0a6649afe1 update sql/mysql.sql.
修改拉流代理缺少“名称”字段问题
2022-02-28 15:34:20 +00:00
随波
bffca58385 update src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java.
修改新建拉流代理时不保存“名称”字段问题
2022-02-28 15:31:50 +00:00
648540858
ac56757291 支持删除在线设备 2022-02-28 17:56:27 +08:00
ckb_test
3787640dd1 rPort 变更了HostAddres也要变 2022-02-28 09:07:02 +00:00
648540858
05ca880eb1 修复设备删除 2022-02-28 10:39:51 +08:00
648540858
1bbf270fec 实现国标录像级联播放,优化点播流程,加快点播速度 2022-02-27 20:01:31 +08:00
mrjackwang
fa9073d0f3 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-02-27 18:09:24 +08:00
648540858
354bca84b0 Merge pull request #352 from walkTtalk/wvp-28181-2.0
Fix issue #347: 修改前端启动报错
2022-02-26 15:38:59 +08:00
wangyimeng
aa6ec4b431 增加拉流代理表name字段 2022-02-26 11:16:01 +08:00
wangyimeng
45ca3a6808 增加拉流代理修改功能 2022-02-26 11:14:56 +08:00
wangyimeng
36593f8c3b 增加拉流代理修改功能 2022-02-26 11:07:55 +08:00
walkTtalk
9dcb270efd Fix issue #347: 修改前端启动报错 2022-02-26 00:01:35 +08:00
648540858
1fa0046395 Merge branch 'wvp-28181-2.0' into wvp-pro-record 2022-02-25 20:33:38 +08:00
648540858
bd4f730d79 规范数据库,解决bug 2022-02-25 20:33:02 +08:00
luoshuyue
660d16c695 增加无人观看时关闭zlm拉流 2022-02-25 15:06:51 +08:00
luoshuyue
22d15ee549 增加获取code为null时的条件 2022-02-25 15:05:36 +08:00
luoshuyue
e5a0a9a870 修复了拉流添加国标编码上级级联调取不到视频的bug 2022-02-25 15:04:47 +08:00
chenjialing
9a65c66dfd 日志优化--修改本地配置文件local的mysql连接方式 2022-02-25 09:54:18 +08:00
chenjialing
e2d7a6ce95 添加git的忽略logs 2022-02-25 09:36:05 +08:00
chenjialing
571f50b63c research--local文件 2022-02-25 09:36:05 +08:00
chenjialing
813b2ae203 日志优化--优化本地的日志记录方式,增加druid的sql的日志打印和监控面板,修改druid的配置方式 2022-02-25 09:23:46 +08:00
648540858
8dfb2fc4a2 实现国标的级联录像查询 2022-02-24 21:10:34 +08:00
648540858
fa51af1e84 Merge branch 'wvp-28181-2.0' into wvp-pro-record 2022-02-24 17:18:36 +08:00
648540858
e9d8aa2f13 规范数据库,添加必要约束,优化通道批量导入功能 2022-02-24 16:55:06 +08:00
648540858
48fac476dc 同步主线 2022-02-23 21:55:46 +08:00
648540858
19ef156bda Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-pro-record 2022-02-22 11:55:23 +08:00
648540858
18b92a0d4f Merge remote-tracking branch 'origin/master' into wvp-pro-record
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
2022-02-22 11:55:23 +08:00
648540858
b1ff3773a4 规范数据库,给各个标设置主键ID 2022-02-22 11:44:56 +08:00
648540858
6fb544f9f9 增加配置将国标录像与其他录像分开 2022-02-20 17:33:17 +08:00
648540858
a7157add49 增加配置将国标录像与其他录像分开 2022-02-20 17:29:03 +08:00
648540858
479a07f879 兼容海康不规范的xml,大幅度提高通道分页查询速度,优化节点的保活。 2022-02-20 16:22:43 +08:00
648540858
a86d4180c2 优化级联通道发送速度 2022-02-20 16:18:14 +08:00
648540858
016989d46a 优化级联平台删除 2022-02-17 15:33:25 +08:00
648540858
ceca493999 修复级联通道回复错误 2022-02-16 15:13:16 +08:00
648540858
58f40d5963 添加通道导入实例文件 2022-02-15 17:52:37 +08:00
648540858
84bebc2bd1 优化级联添加通道流程 2022-02-15 17:41:09 +08:00
648540858
ba7a73a13f Merge remote-tracking branch 'github/wvp-28181-2.0' into wvp-28181-2.0 2022-02-15 09:13:16 +08:00
648540858
6bd31ad373 Merge pull request #325 from nikmu/wvp-28181-2.0
新增实时监控功能
2022-02-15 09:13:03 +08:00
朱俊杰
2f599af6d7 mapper改用注释方式 2022-02-14 10:18:00 +08:00
648540858
9aa6932715 Merge remote-tracking branch 'github/wvp-28181-2.0' into wvp-28181-2.0 2022-02-11 18:01:58 +08:00
648540858
d8e8ff0da2 优化列表展示 2022-02-11 16:46:58 +08:00
648540858
4a6eed9459 推流导入支持添加平台信息与目录信息 2022-02-11 16:45:06 +08:00
648540858
4416297298 Merge pull request #324 from SaltFish001/wvp-28181-2.0
更新生成的HTTP(s)/WS(s)-flv的链接地址
2022-02-11 09:47:26 +08:00
朱俊杰
3789e8616f 新增实时监控功能
左边是设备通道树,右边是分屏预览
2022-02-10 14:45:33 +08:00
SaltFish
cf5b23213e Update MediaServiceImpl.java
最新版本zlm更新了flv的链接地址, 同步更新
2022-02-10 10:29:36 +08:00
648540858
8cbbf1470b 为推流列表增加批量移除功能 2022-02-07 18:30:43 +08:00
648540858
d3d42ef9bd 为推流列表增加搜索功能 2022-02-07 14:12:34 +08:00
648540858
15bd9182e6 添加服务器信息获取能力。 2022-02-04 21:46:48 +08:00
648540858
c494a7516b 优化媒体服务器配置展示界面 2022-01-30 16:39:15 +08:00
648540858
f3ab9b0b9c 优化信令配置展示界面 2022-01-30 15:58:15 +08:00
648540858
457bfe6433 #247 2022-01-28 16:45:12 +08:00
648540858
74f4e2f89a 添加对可能空指针的判断 2022-01-28 16:30:10 +08:00
648540858
607b0f710e 添加重启后拉流代理自动恢复 2022-01-27 18:08:19 +08:00
648540858
77dd30ebf1 优化直播推流的CivilCode 2022-01-27 17:40:59 +08:00
648540858
7cf6143f00 2.0.2版本 去除默认的mediaIP 127.0.0.1,避免误导新用户 2022-01-27 14:25:26 +08:00
648540858
bb6e03fdda 解析xml异常时,回复400 2022-01-27 10:39:08 +08:00
648540858
c1c682987d 使用log4j-over-slf4j取代log4j避免log4j漏洞 2022-01-27 10:09:47 +08:00
648540858
3effce0c42 Merge remote-tracking branch 'github/wvp-28181-2.0' into wvp-28181-2.0 2022-01-26 11:00:48 +08:00
648540858
2a368f3008 Merge pull request #317 from nikmu/wvp-28181-2.0
添加lombok,分离注册周期事件
2022-01-26 10:55:36 +08:00
lanss
8eca76a2bc update web_src/src/components/dialog/changePassword.vue. 2022-01-25 13:50:22 +00:00
648540858
cd422ddbe9 优化默认节点的展示 2022-01-25 20:21:36 +08:00
648540858
5288b5d0a7 优化zlm上线与下线过时通道的移除 2022-01-25 19:38:04 +08:00
648540858
e57dc37e50 优化目录移除时默认目录的选择 2022-01-25 17:14:10 +08:00
648540858
16c7f007c6 移除sqlite支持 2022-01-25 16:36:55 +08:00
648540858
c9a3d41325 兼容mysql5低版本 2022-01-25 16:23:29 +08:00
648540858
2afaa89599 优化文件导入判断 2022-01-25 15:43:52 +08:00
朱俊杰
7b398b4fb3 添加lombok,分离注册周期事件
1、添加lombok依赖
2、分离注册周期事件
2022-01-25 15:42:11 +08:00
648540858
950ec81ec3 移除db 导出的sql文件 2022-01-25 14:42:46 +08:00
648540858
44cd605a37 修改sql文件 2022-01-25 12:22:32 +08:00
648540858
b01b5540b5 修复候选通道查询bug 2022-01-25 12:20:52 +08:00
648540858
9e6d6b9cf6 优化通道选择是通道的查询 2022-01-21 18:41:41 +08:00
648540858
963cc1b4b3 优化通道选择是通道的查询 2022-01-21 18:00:15 +08:00
648540858
e1b91ad517 修改mysql脚本 2022-01-21 16:05:02 +08:00
648540858
4a87514e4a 目录默认节点被删除时,重置默认节点为根节点 2022-01-21 14:10:49 +08:00
648540858
63aa34be19 处理服务重启或设备重新上线时的订阅,优化通道导入重复的处理 2022-01-20 16:48:30 +08:00
648540858
0e2deabe96 修改readme 2022-01-19 17:40:03 +08:00
648540858
152b8ff528 添加脚本来源 2022-01-19 15:10:01 +08:00
648540858
485b897dd4 修复推流生成通道未通知上级平台的问题,添加注册时清楚脏数据。 2022-01-19 15:08:13 +08:00
648540858
41cec21a25 修复bug与目录订阅添加最小值60 2022-01-19 10:23:52 +08:00
648540858
30cf36791c 修复bug与修改通道名 2022-01-18 16:37:11 +08:00
648540858
f50663cc59 去除目录通知多余的信息 2022-01-17 17:42:09 +08:00
648540858
6257644c73 优化级联选择通道页面目录Id在各个模块间的传递方式 2022-01-17 17:19:47 +08:00
648540858
194f901847 优化级联选择通道页面添加方式 2022-01-17 16:46:28 +08:00
648540858
7e45f9dc8a 优化级联选择通道逻辑 2022-01-17 15:48:08 +08:00
648540858
22fa5a287f 优化推流列表查询排序 2022-01-17 10:35:51 +08:00
648540858
88580908b1 优化通道选择页面样式和优化拉框放大与缩小的接口路径 2022-01-17 10:16:58 +08:00
648540858
aba2553f4a 优化通道选择页面样式 2022-01-17 09:41:43 +08:00
648540858
601705acb3 Merge pull request #311 from szy833/wvp-28181-2.0
feat(): 增加拉框放大,缩小。接收下级设备控制Message信令后增加200返回,防止下级重复发送Message。
2022-01-17 09:38:26 +08:00
szy833
08cbabcba1 Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 2022-01-16 23:32:51 +08:00
648540858
70c613e509 支持推流通道预导入 2022-01-16 10:40:57 +08:00
szy833
b74e310e98 feat(): 增加拉框放大,缩小。接收下级设备控制信令增加200返回。 2022-01-15 22:29:59 +08:00
648540858
2661f47ca6 支持国标级联的目录订阅功能 2022-01-14 17:04:26 +08:00
panll
a3a191bdb1 !5 优化通道更新逻辑以及添加去重保证数据存入
Merge pull request !5 from panll/temp2
2022-01-13 08:45:45 +00:00
648540858
aeed1d465f 恢复合并的limit值 2022-01-13 16:42:58 +08:00
648540858
0949c2f4cc 合并主分支 2022-01-13 16:39:32 +08:00
648540858
59890314e4 优化通道更新 2022-01-13 16:24:37 +08:00
lin
378c84f558 优化推流结束时流类型的获取 2022-01-08 18:00:31 +08:00
lin
1eed51c0c1 优化级联平台GPS订阅 2022-01-08 17:35:00 +08:00
lin
9166e3ff80 级联平台添加GPS订阅支持 2022-01-08 16:47:20 +08:00
lin
2c3611b436 添加接收redis订阅的GPS消息,为GPS订阅发送到级联平台做准备 2022-01-07 19:37:05 +08:00
648540858
0bfe596889 去除功能的重复实现 2022-01-05 15:25:19 +08:00
648540858
3d04086eb4 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2022-01-05 15:23:37 +08:00
648540858
0c964e9e70 为级联平台增加虚拟目录功能 2022-01-05 15:23:14 +08:00
648540858
61f3720351 修复redis配置功能在redis配置了 notify-keyspace-events时无法强制配置的问题 2022-01-04 19:40:01 +08:00
648540858
0d99e05f56 Merge pull request #294 from lawrencehj/wvp-28181-2.0
界面删除设备后同时删除Redis的对应条目,避免其它设备用同样IP登录时出现信息错误
2021-12-30 18:25:26 +08:00
648540858
18f4958a13 Merge pull request #295 from szy833/wvp-28181-2.0
修复获取设备信息信令Catalog不标准问题 PTZType,级联的Longitude、Latitude、PTZType等
2021-12-30 17:17:29 +08:00
lawrencehj
21c3904a3f 界面删除设备后同时删除Redis的对应条目,避免其它设备用同样IP登录时出现信息错误 2021-12-29 18:08:33 +08:00
shizy@yisa.com
7aa4f7a915 修复获取设备信息信令Catalog不标准问题 PTZType,级联的Longitude、Latitude、PTZType等 2021-12-29 17:53:05 +08:00
648540858
f64016a6c7 优化通道更新逻辑 2021-12-28 18:54:50 +08:00
648540858
6357e1ea3b 修复兼容接口查询通道列表查询 2021-12-28 09:33:25 +08:00
648540858
ac5921122a 修复兼容接口查询通道列表查询 2021-12-27 18:07:21 +08:00
648540858
e5cdd60203 redis 增加配置控制是否调用config命令 2021-12-20 15:14:34 +08:00
648540858
5d88b97a7b 修复zlm离线时误报设备离线 2021-12-20 10:19:05 +08:00
648540858
76c17c6d30 zlm假离线恢复redis心跳信息 2021-12-20 10:01:37 +08:00
648540858
61ec292796 添加心跳到期时验证zlm是否真的离线。 2021-12-20 09:51:51 +08:00
648540858
984d590397 #239 2021-12-17 16:44:11 +08:00
648540858
cbc6edb57e 添加首次设置zlm时重启zlm以保证心跳正常。 2021-12-17 16:06:23 +08:00
648540858
a1af232c21 优化sip回复逻辑 2021-12-17 15:47:14 +08:00
chenlw
816570822b 1.修复录像合并文件下载链接问题;2.时间滑道,endTime超出24小时问题。3.录像文件格式命名 startTime~endTime~duration.mp4 2021-12-16 12:49:12 +08:00
648540858
ff284e98db 优化mysql脚本 2021-12-15 11:46:26 +08:00
648540858
4519efb5e1 优化zlm状态变化事件代码 2021-12-15 11:07:59 +08:00
648540858
928d3fb947 升级invite+subscribe的cseq为递增 2021-12-15 09:27:12 +08:00
648540858
c4de9d674e 优化info消息的cseq计数 2021-12-14 18:41:50 +08:00
648540858
886645ff56 修复录像下载 2021-12-14 08:56:42 +08:00
648540858
663e73173f 修复推流加入国标时未加入开启共享的上级平台 2021-12-13 17:43:20 +08:00
648540858
4175b1735e 将device信息写入redis以提高sip处理速度 2021-12-13 17:20:23 +08:00
648540858
7bfb106e04 修复推流列表大数据量时批量删除的错误,修复推流列表分页查询错误 2021-12-10 18:38:58 +08:00
648540858
8329c0d180 启用失败的流转发如果开启无人观看自动移除则不保存在数据库 2021-12-10 11:28:25 +08:00
648540858
ff66c356ca 优化启动后清理过期信息的逻辑 2021-12-10 11:08:04 +08:00
648540858
41d3a7c240 主动连接zlm事件修改为10分钟 2021-12-09 14:23:18 +08:00
648540858
4d4d274e9b 解决Redis服务出于安全会禁用CONFIG命令后服务不可用的问题 2021-12-08 20:56:07 +08:00
648540858
5c9c112fd2 优化适配zlm的hook保活 2021-12-08 16:45:50 +08:00
648540858
f6adc9a4be 适配zlm的hook保活 2021-12-07 21:13:55 +08:00
648540858
46dd3b1b2a 优化通道录入性能,优化启动后读取配置写入数据库的过程 2021-12-07 17:43:55 +08:00
648540858
a4b5c18db5 修复未结束的推流无法下载 2021-12-07 11:40:17 +08:00
648540858
fc79be7ea8 拉流代理支持国标级联之间共享 2021-12-06 14:04:44 +08:00
648540858
c4c598f65b 修复rtsp端口配置未从zlm获取的问题 2021-12-06 10:47:24 +08:00
648540858
07da765c5b 修复选择直播通道缺失了通道类型的问题 2021-12-06 10:44:33 +08:00
648540858
8489f48f92 添加第三方服务参与的推流直接转发到国标功能 2021-12-04 17:27:23 +08:00
648540858
7d9245b756 修复mediaserverId未存入导致的问题 2021-12-03 17:03:35 +08:00
648540858
1af90cbb4d 优化redis存储,alarm默认关闭处理 2021-12-03 16:13:46 +08:00
648540858
4fdc88cc8f 兼容流注销时流产生类型错误的问题 2021-12-03 10:18:50 +08:00
648540858
657a659d5c Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-12-03 09:16:40 +08:00
648540858
dc0b8d9e78 存储所有流信息到redis 2021-12-02 23:01:06 +08:00
648540858
8265889db1 优化zlm接入 2021-12-02 18:09:38 +08:00
648540858
6c8b96e1b1 简化zlm节点接入逻辑 2021-12-02 17:37:29 +08:00
648540858
2910764047 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-12-02 09:33:20 +08:00
648540858
2e90e1166a Merge pull request #259 from hotcoffie/wvp-28181-2.0
1.适配新的gitee地址
2021-12-02 09:30:57 +08:00
xiaoxie
73ec3234d4 修复一处错误,恢复application.yml media.stream-ip原来的值 2021-12-01 22:58:00 +08:00
xiaoxie
53ebc60590 修复一处错误,application.yml media.stream-ip的值应该等于media.ip而不是之前的sip.ip 2021-12-01 22:49:45 +08:00
xiaoxie
0765874086 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-12-01 22:45:51 +08:00
xiaoxie
b78d665d72 继续优化docker配置:
1.启动命令增加ASSIST_JVM_CONFIG和WVP_JVM_CONFIG两个字段,方便配置JVM参数
2.修复一处错误,application.yml media.stream-ip的值应该等于media.ip而不是之前的sip.ip
2021-12-01 22:45:38 +08:00
hotcoffie
3a20750c2f Merge branch 'wvp-28181-2.0' into wvp-28181-2.0 2021-12-01 20:35:16 +08:00
xiaoxie
8ec9d8a4f5 1.适配新的gitee地址
2.增加docker-compose相关配置
2021-12-01 20:28:13 +08:00
648540858
8525cd839a 修复兼容接口云台控制 2021-11-30 10:40:22 +08:00
648540858
d77382348d 修复兼容接口云台控制 2021-11-30 10:16:09 +08:00
648540858
9d189c97cd Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-11-29 18:09:49 +08:00
648540858
158214dd7e 修复兼容接口 2021-11-29 18:09:19 +08:00
648540858
6517c9534b 修复流变化通知的json格式 2021-11-29 18:08:02 +08:00
648540858
2adef25454 Update issue templates 2021-11-29 17:36:17 +08:00
648540858
ee4b659d31 Update issue templates 2021-11-29 17:34:41 +08:00
648540858
7b07753340 Update issue templates 2021-11-29 17:33:45 +08:00
648540858
e3647b8142 录像回放时不进行录像下载 2021-11-26 23:13:59 +08:00
648540858
94034c3c09 优化录像下载逻辑以及录像查询逻辑 2021-11-26 23:05:36 +08:00
648540858
70fc8f4e3e 优化录像推送开关 2021-11-26 15:15:55 +08:00
648540858
4685943f6b Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-11-25 16:41:14 +08:00
648540858
2b6aea9360 优化录像代理更新 2021-11-25 16:40:51 +08:00
648540858
b5594c6689 优化回放控制界面 2021-11-25 16:28:52 +08:00
648540858
a457c94838 优化多线程参数 2021-11-25 15:33:25 +08:00
648540858
504a886f0c 优化兼容接口 2021-11-25 11:04:03 +08:00
648540858
ba81fec703 Update README.md 2021-11-25 10:45:20 +08:00
648540858
428adc039d 优化录像查询接口 2021-11-24 18:48:02 +08:00
648540858
d42bbfb421 添加回放控制界面,优化录像查询接口 2021-11-24 18:48:02 +08:00
648540858
9edbf220e3 优化拉流代理参数默认值 2021-11-24 15:46:20 +08:00
648540858
c667d8f99b 优化倍速播放参数 2021-11-24 15:10:10 +08:00
648540858
79d938cdd3 拉流代理接口添加无人观看则自动移除参数,拉流代理返回值增加流地址信息 2021-11-24 15:09:43 +08:00
648540858
fb14cd3d68 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-11-24 15:04:27 +08:00
648540858
95d847c24d Merge pull request #243 from chenparty/wvp-28181-2.0
增加回放控制功能(回放暂停、回放恢复、回放拖动播放、回放倍速播放)
2021-11-24 15:04:03 +08:00
648540858
c1f5108ec2 优化streamchannge hook以及对推流的识别 2021-11-24 11:19:52 +08:00
648540858
22e411c17d 保存拉流代理返回结果添加streamInfo 2021-11-24 10:02:47 +08:00
chenparty
65445b06c2 增加回放控制功能(回放暂停、回放恢复、回放拖动播放、回放倍速播放) 2021-11-23 17:09:15 +08:00
648540858
592149d2d5 修改消息通道为大写 2021-11-23 16:43:09 +08:00
648540858
246a197b6e 在redis中添加wvp存活依据,添加推流变化消息 2021-11-23 14:51:37 +08:00
648540858
65dff203ee 移除onvif实现 2021-11-23 11:35:23 +08:00
648540858
64f4da3ca1 优化录像下载,避免wvp代理使用双份流量 2021-11-22 17:30:15 +08:00
648540858
3d8c01ca99 查询流地址时mediaServerId改为可选 2021-11-22 17:29:16 +08:00
648540858
277dd62a10 sip错误时移除会话 2021-11-22 17:28:18 +08:00
648540858
a046513188 修改错别字 2021-11-22 17:27:48 +08:00
648540858
045a5ba852 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-11-22 14:36:14 +08:00
648540858
1d11fad86c 添加docker打包专用配置文件 2021-11-22 14:35:36 +08:00
648540858
72bb4bd325 兼容缺少y=的sdp 2021-11-20 21:03:42 +08:00
648540858
e0fe6caa93 修复DOCKERFILE 2021-11-19 18:08:49 +08:00
648540858
8ac4218784 修改仓库地址 2021-11-19 17:42:45 +08:00
648540858
51a6cba404 修复REDIS_PWD导致的docker镜像无法启动 2021-11-19 17:21:53 +08:00
648540858
ee33044ba2 修复docker镜像hookip 2021-11-19 17:20:17 +08:00
648540858
2975a05878 优化注释 2021-11-18 11:50:56 +08:00
648540858
7cc410c84a 修复设备控制 处理 2021-11-18 11:50:31 +08:00
648540858
87c3d3775f #227 2021-11-18 10:40:24 +08:00
648540858
3af8557ec8 #221 2021-11-17 22:58:41 +08:00
648540858
a456cf0201 修复 #223与去除警告 2021-11-17 18:13:05 +08:00
648540858
675e5ff42b 去除调试日志 2021-11-17 17:55:32 +08:00
648540858
f9e1ca7d56 去除调试日志 2021-11-17 17:53:25 +08:00
648540858
0ffacc3053 使用@Async多线程处理sip消息 2021-11-17 17:03:48 +08:00
648540858
d591ef3248 完善目录订阅 2021-11-17 17:01:59 +08:00
648540858
129023efaf Merge pull request #232 from chenparty/wvp-28181-2.0
fix bug
2021-11-17 16:24:31 +08:00
chenparty
6fda6ace6a fix bug 2021-11-17 15:30:38 +08:00
648540858
a6ffd322f7 添加使用多线程消息处理sip消息 2021-11-17 00:07:34 +08:00
648540858
22bf3c04b4 修复级联注册消息回复的空指针异常 2021-11-16 23:22:57 +08:00
648540858
1981876f5d 添加TODO注释 2021-11-16 18:16:54 +08:00
648540858
12b9f4d3db 修复目录订阅的定时刷新以及信令 2021-11-16 18:15:33 +08:00
648540858
41f3c11e7d 暂时关闭目录订阅的定时刷新,直到此功能完善 2021-11-16 16:56:04 +08:00
648540858
2eb0bdfd25 编辑国标通道UI端口输入框使用数字输入框 2021-11-15 23:02:19 +08:00
648540858
ecc39912cb 解决目录订阅存储bug 2021-11-12 15:42:37 +08:00
648540858
fab8c8d98c 维护目录订阅消息与接口 2021-11-12 14:40:39 +08:00
648540858
980dc1bb2d x修改心跳失效时间从180到255 2021-11-10 17:08:52 +08:00
648540858
4a739edb2c Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-11-10 16:03:38 +08:00
648540858
f5faa71bd4 Merge pull request #212 from chenparty/wvp-28181-2.0
修复command字段接口文档类型
2021-11-10 14:52:57 +08:00
648540858
c4daa3eb51 okhttp返回非200的结果时手动关闭response 2021-11-10 14:52:12 +08:00
648540858
bf93b77fee 添加缺少的注解与重命名 2021-11-10 10:45:03 +08:00
chenparty
ec4e21291c 修复command字段接口文档类型
Change command type from Integer to String
2021-11-09 12:02:06 +08:00
648540858
20b8130802 重构28181信令的message结构 2021-11-09 11:56:21 +08:00
panll
fe043f37e7 !2 新的dockerfile
Merge pull request !2 from hotcoffie/wvp-28181-2.0
2021-11-09 01:55:13 +00:00
xiaoxie
662a1f530e 尝试docker-compose启动 2021-11-05 22:44:10 +08:00
xiaoxie
9be3ce237b 尝试docker-compose启动 2021-11-05 22:37:32 +08:00
xiaoxie
c5446a7d60 尝试docker-compose启动 2021-11-05 20:45:44 +08:00
xiaoxie
f8677714ba 尝试docker-compose启动 2021-11-05 20:42:57 +08:00
xiaoxie
2d5e236f82 尝试docker-compose启动 2021-11-05 20:39:32 +08:00
xiaoxie
aa042ff378 尝试docker-compose启动 2021-11-05 20:25:29 +08:00
xiaoxie
26196da35f 尝试docker-compose启动 2021-11-05 20:02:58 +08:00
648540858
16664d7ac9 添加目录订阅消息与接口 2021-11-05 18:33:53 +08:00
648540858
34f5ac913e 重构28181信令结构,解决循环依赖导致的无法直接注入 2021-11-05 18:27:41 +08:00
xiaoxie
ea11ea62cf 尝试docker-compose启动 2021-11-05 11:37:11 +08:00
648540858
f69d61f78f 添加注释 2021-11-05 10:04:45 +08:00
648540858
77c509b1ad 修复级联的通道查询以及设备信息查询 2021-11-04 15:56:24 +08:00
648540858
8d1fdf8e99 优化设备列表显示效果 2021-11-04 14:04:06 +08:00
648540858
83a0db12d7 优化设备列表显示效果 2021-11-03 16:10:45 +08:00
648540858
b550f6bd10 通道列表添加经纬度信息 2021-11-03 15:40:20 +08:00
648540858
2f62f07892 修改云台控制接口使其更加直观 2021-11-03 14:58:48 +08:00
648540858
2f6352d219 修复订阅清理请示任务的执行时长 2021-11-03 10:30:42 +08:00
648540858
6d181a1656 修复dockerfile 2021-11-03 10:30:02 +08:00
648540858
5a294332f2 修复错误的类型判断导致的过期事件无法监听 2021-11-02 16:59:22 +08:00
648540858
82447a4507 去除查询类api调用的日志 2021-11-02 16:56:24 +08:00
648540858
ecc6df61c0 修复订阅sip消息导致的内存溢出以及录像回放的问题 2021-11-02 16:50:22 +08:00
648540858
4c69a2e77a 修改缩进 2021-11-02 11:00:22 +08:00
648540858
681910aaa1 对需要向设备发起请求的http请求,使用缓存,等待设备请求返回的时候一次性释放所有请求 2021-11-02 10:40:29 +08:00
648540858
ee3e38d549 修复默认配置 2021-11-01 14:05:44 +08:00
648540858
d9f3335285 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-10-29 11:22:22 +08:00
648540858
77b0ac116e Merge pull request #200 from oldR/wvp-28181-2.0
修复无法`重启媒体服务器`,`删除远端通信链路`的问题
2021-10-29 10:26:53 +08:00
renxh
12796b8b57 修复无法重启媒体服务器删除远端通信链路的问题 2021-10-28 17:50:06 +08:00
648540858
46b1885cbd Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-10-27 16:48:51 +08:00
648540858
ac9537137c 修复推流添加国标时未添加流媒体服务器信息 2021-10-27 14:43:44 +08:00
648540858
2f97af2a54 更新readme 2021-10-19 10:20:16 +08:00
648540858
670d18f688 修改错别字 2021-10-18 17:31:28 +08:00
648540858
2f2958ba74 升级Jessibuca播放器组件为最新版本 2021-10-18 15:22:35 +08:00
648540858
862c5faab3 添加录像分段文件直接下载 2021-10-15 18:11:32 +08:00
648540858
005f8c755d 录像下载修复 2021-10-15 17:58:28 +08:00
648540858
7d9d87f055 为级联推流端口补充默认值 2021-10-15 17:51:30 +08:00
648540858
76245d92cc Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-10-15 16:14:16 +08:00
648540858
9090f0834e 优化级联sdp消息 2021-10-15 16:05:31 +08:00
648540858
70982f764f Merge pull request #183 from hotcoffie/wvp-28181-2.0
Update DOCKERFILE
2021-10-15 15:15:37 +08:00
648540858
01c20a9946 修复点播与录像回放sdp信息sdp-ip的取值错误,修复回放信令错误 2021-10-15 15:05:02 +08:00
hotcoffie
8e9d37b4f5 Update DOCKERFILE
删除重复的npm打包语句
2021-10-15 14:36:44 +08:00
648540858
f5e78ff928 添加修改密码失败的提示 2021-10-11 18:19:03 +08:00
648540858
da029c36cf 修复wvp使用https时播放流地址使用wss,以使用ssl播放 2021-09-30 16:46:10 +08:00
648540858
357335179a 修改接口文档作者信息 2021-09-27 16:07:59 +08:00
648540858
2ef79be1d6 处理报警和位置上报时使用fromHeader获取deviceId, xml的deviceId作为channelId使用。 2021-09-27 15:36:41 +08:00
648540858
19e22cc155 依据阿里代码规范,if后必须有大括号。添加导包语句 2021-09-26 15:55:43 +08:00
648540858
aaa1ed344a Merge pull request #175 from chenparty/wvp-28181-2.0
修复快照无法生成的BUG
2021-09-26 15:51:09 +08:00
chenparty
cef67d2d5b 修复快照无法生成的BUG
zlmediakit的快照接口跟原方法不符合,已修改
2021-09-26 15:37:01 +08:00
648540858
ce453cef33 Merge pull request #174 from chenparty/wvp-28181-2.0
修正首次打开页面报请求失败的提示
2021-09-26 15:33:00 +08:00
chenparty
c4e8cf8a34 修正首次打开页面报请求失败的提示
mediaServerChoose获取到之前,执行updateData, 会导致getAllSession函数获取不到mediaServerChoose。
2021-09-26 15:21:54 +08:00
648540858
5d12da031b docker镜像使用自动生成的配置文件,修复#166 2021-09-26 14:32:42 +08:00
648540858
b29aec3447 修复默认media未保存到数据库的bug 2021-09-26 11:45:03 +08:00
648540858
4c4b38d4a1 #164 2021-09-25 22:54:52 +08:00
648540858
79a3d6898e 添加媒体服务器节点管理ui-移除接口 2021-09-25 22:48:03 +08:00
648540858
9d4d968eaa 添加发送媒体流, 添加媒体服务器节点管理ui,修复修改密码 2021-09-25 22:12:15 +08:00
648540858
acd2347bea 添加版本信息展示和wvp配置信息展示 2021-09-13 16:42:22 +08:00
648540858
e2b7ffb4e6 添加utf-8解析设备信息 2021-09-13 16:08:40 +08:00
648540858
3ff7215cab #154 2021-09-10 14:06:01 +08:00
648540858
4eb61bcf5b 修复级联点播 2021-09-10 11:37:54 +08:00
648540858
aa1645ec61 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-09-07 09:20:46 +08:00
648540858
2e4416e70e 更新readme 2021-09-07 09:20:19 +08:00
648540858
bf55fd3c3c Update README.md 2021-09-03 16:18:29 +08:00
648540858
7d8c5598e0 更新readme 2021-09-02 15:47:42 +08:00
648540858
67e600d3a5 更新docker,更新readme 2021-09-02 15:10:47 +08:00
648540858
6f8ed611a8 优化登录体验。修复因为流地址导致的录像服务无法识别 2021-08-31 09:44:19 +08:00
648540858
37d7261291 Update README.md 2021-08-30 16:11:28 +08:00
648540858
5f7a9ba87b 添加logo 2021-08-30 16:06:42 +08:00
648540858
a58819bc70 Merge pull request #151 from lawrencehj/wvp-28181-2.0
修正设备注册认证时验证Response计算的错误
2021-08-27 18:04:05 +08:00
lawrencehj
e946a648cd 修正设备注册认证时验证Response计算的错误 2021-08-26 23:57:38 +08:00
648540858
d105786255 添加角色相关的接口,用户信息添加角色信息 2021-08-10 15:42:15 +08:00
648540858
6ebdd22586 添加版本信息接口 2021-08-09 16:54:36 +08:00
648540858
a470825b79 添加自定义banner 2021-08-09 16:53:41 +08:00
648540858
667fc347a7 修复, #133 2021-08-08 09:21:30 +08:00
648540858
0a34a587c0 修复自动点播 2021-08-08 09:18:45 +08:00
648540858
c44d61929e 修复前端登录 2021-08-08 09:10:58 +08:00
648540858
02a66a8168 添加日志存储与查询功能
登录接口返回用户详细信息
2021-08-07 14:05:42 +08:00
648540858
7d34bfbb47 修复关闭接口文档失效 2021-08-05 16:14:06 +08:00
648540858
0b2165b397 添加用户操作接口 2021-08-05 12:35:54 +08:00
648540858
a6ca6305d2 补充字段 2021-08-05 09:27:12 +08:00
648540858
b1462a711d 添加用户操作
修正报警清理接口
2021-08-05 07:25:12 +08:00
648540858
3fc03369dd 添加sql脚本 2021-08-04 18:12:13 +08:00
648540858
0cfd24826f 优化内存溢出的问题
优化zlm集群默认zlm的存储
添加报警的存储以及相关接口
添加单元测试
2021-08-04 18:00:22 +08:00
648540858
db33e99e55 Merge pull request #136 from lawrencehj/wvp-28181-2.0
解决hook.ip未设置时不能取默认值的问题等
2021-07-28 16:32:42 +08:00
lawrencehj
5ded68fe50 更正打字错误 2021-07-28 16:29:38 +08:00
lawrencehj
d47dda37bb Merge remote-tracking branch 'upstream/wvp-28181-2.0' into wvp-28181-2.0 2021-07-28 09:49:56 +08:00
lawrencehj
4683e590da 去除多余Import 2021-07-28 09:46:08 +08:00
lawrencehj
45d46e4030 解决hook.ip未设置时不能设默认值的问题 2021-07-28 09:41:29 +08:00
64850858
cca484b7e5 更新播放器 2021-07-27 16:05:12 +08:00
64850858
7ccd466324 更新版本信息 2021-07-26 17:53:02 +08:00
64850858
326343f124 添加user-agent,修复deviceINfo查询设备名称 2021-07-26 17:51:02 +08:00
64850858
03b4aca928 修复stream-none-reader-delay-ms为-1时不自动关闭流 2021-07-26 17:22:40 +08:00
64850858
175523b090 重启后对心跳超时的设备设置为离线。 2021-07-26 13:21:03 +08:00
64850858
0d8e5da794 补充sql默认用户 2021-07-26 12:30:58 +08:00
64850858
7218c6fcd3 优化集群方案, 每个zlm一套ssrc;
优化集群下的docker接入逻辑;
更正sql脚本;
支持重启不设置设备离线。重启SIP事务不丢失
2021-07-26 11:40:32 +08:00
648540858
c01432e6f6 Merge pull request #129 from lawrencehj/wvp-28181-2.0
增加历史媒体下载支持、修正部分错误
2021-07-23 17:20:24 +08:00
lawrencehj
d6cbc4e41c Merge remote-tracking branch 'upstream/wvp-28181-2.0' into wvp-28181-2.0 2021-07-23 17:09:44 +08:00
lawrencehj
3e39a27409 修正推流列表播放错误 2021-07-23 17:06:49 +08:00
lawrencehj
182250d723 增加历史媒体下载信令及API支持 2021-07-23 17:01:52 +08:00
lawrencehj
001ecd0d75 修正打字错误 2021-07-23 16:58:11 +08:00
lawrencehj
7a2cc71a5e 解决@value注解无法赋默认值问题 2021-07-23 16:56:32 +08:00
648540858
530e01646f Update README.md 2021-07-21 18:07:26 +08:00
64850858
2312bc83ff 更换云端录像的代理方式 2021-07-19 17:54:01 +08:00
64850858
dfaf80a843 修复云端录像查看 2021-07-19 17:22:54 +08:00
64850858
e1d9cc938d 替换截图图标 2021-07-16 17:11:09 +08:00
64850858
3281fd4bcf 添加zlm集群支持 2021-07-16 16:34:51 +08:00
64850858
2b7f05aef8 修改声音处理逻辑 2021-07-14 16:59:55 +08:00
64850858
847a862fb1 更新readme 2021-07-14 16:06:31 +08:00
64850858
7c03e554cc 更换播放器, 修正和优化sql脚本, 2021-07-14 15:57:39 +08:00
64850858
6c785bdab8 补充swf文件 2021-07-08 14:48:00 +08:00
64850858
25ac4b5b9b 优化鉴权例外, 添加.gitignore 2021-07-08 09:26:12 +08:00
64850858
79753b78ec 修复配置文件赋值失败 2021-07-07 18:03:05 +08:00
64850858
d0f6a3e15a 配置文件sql日志单独设置 2021-07-07 11:13:41 +08:00
64850858
54c4ce2c8a 配置文件示例修正 2021-07-07 10:28:41 +08:00
64850858
00b10f368f 规范配置文件,添加接口鉴权的例外接口配置 2021-07-06 16:38:31 +08:00
64850858
0c90888346 修复级联注册bug 2021-06-28 17:22:08 +08:00
64850858
58639208c3 修复用户更新sql错误,ffmpeg拉流代理超时时间错误 2021-06-28 15:54:50 +08:00
64850858
970d2cfba1 使用MonitorIp代替sip.ip 2021-06-25 21:48:19 +08:00
64850858
98234831f3 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-06-25 16:58:27 +08:00
64850858
b92be0c445 更新readme 2021-06-25 16:57:38 +08:00
648540858
d4313065c1 Merge pull request #115 from lawrencehj/wvp-28181-2.0
修正部分错误,优化参数
2021-06-24 13:19:30 +08:00
lawrencehj
bb7b68e845 改为fmp4截图 2021-06-23 16:21:12 +08:00
lawrencehj
cd345f1a14 去除编译报警 2021-06-23 16:10:37 +08:00
lawrencehj
5310ceeb81 屏蔽测试代码 2021-06-23 16:01:28 +08:00
lawrencehj
032f067837 修正错行及Swagger参数缺少dataTypeClass定义问题 2021-06-23 15:58:43 +08:00
lawrencehj
a24b17ed3c 修正打包jar后截图路径,优化截图Timeout参数 2021-06-23 15:54:43 +08:00
64850858
55d291f528 使用fmp4进行截图,以避免ffmpeg不兼容h265的flv导致的截图失败 2021-06-22 16:22:06 +08:00
648540858
93e6c38c1e Merge pull request #113 from lawrencehj/wvp-28181-2.0
修正SSE、jar路径和API代理部分错误
2021-06-22 13:13:31 +08:00
lawrencehj
a5769b353b 去除多余引用 2021-06-22 12:51:56 +08:00
lawrencehj
2681f2b75e 增加打包为jar的配置说明 2021-06-22 12:51:15 +08:00
lawrencehj
81d4da3002 格式统一 2021-06-22 11:57:46 +08:00
lawrencehj
04f31d53a4 修正用户停止播放后API代理抛错误问题 2021-06-22 11:54:54 +08:00
lawrencehj
a62e5699b5 修正打包jar后snap路径问题,兼容windows路径 2021-06-22 11:51:08 +08:00
lawrencehj
56b701da7c 修正在线文档注释错误 2021-06-22 11:35:05 +08:00
lawrencehj
91e419f009 SSE推送请求应为GET 2021-06-22 11:33:37 +08:00
lawrencehj
6494121278 修改console输出 2021-06-22 11:32:30 +08:00
64850858
7ca8c36651 解决启动设置所有设备离线未删除redis记录 2021-06-18 19:44:55 +08:00
648540858
39303c4183 Merge pull request #110 from hotleave/playback
解决录像播放相关问题
2021-06-18 18:29:58 +08:00
hotleave
c69990036f 解决录像回放无法转码播放问题 2021-06-18 11:51:32 +08:00
hotleave
5a13e79410 解决录像回放无法获取编码信息问题 2021-06-18 11:51:09 +08:00
hotleave
97105c24f4 解决播放录像报错问题 2021-06-18 11:50:21 +08:00
64850858
36849b3172 国标级联兼容大华NVR 2021-06-09 10:22:41 +08:00
64850858
924a1511a1 增加同步通道超时时间,修复hookIP空字符串时的hookIP的默认值赋值 2021-06-09 09:28:29 +08:00
64850858
1b273418e7 提高注册兼容性, 修复sql兼容mysql 2021-06-08 18:44:15 +08:00
64850858
96c646afbe 支持设置级联注册失败时再次注册的时间 2021-06-08 15:49:40 +08:00
64850858
50d73eabec 添加注册失败时回复403避免陷入401循环 2021-06-08 14:43:03 +08:00
64850858
b20d9280a2 添加流IP单独配置 2021-06-08 10:37:29 +08:00
64850858
479fb76e74 关闭接口鉴权与自动一起使用可以完成单网页集成 2021-06-07 18:09:36 +08:00
64850858
5e497c4250 关闭接口鉴权与自动一起使用可以完成单网页集成 2021-06-07 17:23:44 +08:00
64850858
fc6d4579e8 添加创建时间与更新时间 2021-06-07 16:44:48 +08:00
64850858
1cf9360291 修复DeviceChannelMapper的存储错误 2021-06-07 15:51:58 +08:00
64850858
aca3efe66b 取出错误配置 2021-06-07 15:42:01 +08:00
64850858
f0de960b30 设备信息增加最近注册时间和最近心跳时间,心跳超时时间变为可配置 2021-06-07 15:11:53 +08:00
64850858
8d06388a33 修复无参数zlm请求代理失败的问题
添加对无密码直接注册功能的支持
2021-06-07 11:32:07 +08:00
64850858
3034846556 修复 拉流代理的ffmpeg模式 2021-06-04 19:22:47 +08:00
64850858
a4ea5e9d17 修复bug 2021-06-04 17:30:23 +08:00
64850858
356afaa5ac 增加zlm代理的secret自动添加, 增加配置文件的默认值,缺少非关键参数不会无法启动,简化配置文件给新手带来的压力,前端使用wvp代理流。 2021-06-04 16:31:45 +08:00
64850858
ceb3fe2145 修复不使用云端录像功能无法启动服务 2021-06-01 17:42:48 +08:00
64850858
3491da2511 添加云端录像功能 2021-06-01 17:05:07 +08:00
panlinlin
230916e530 解决录像回放未判断是否等待编码导致的回放失败 2021-05-27 09:18:47 +08:00
panlinlin
3ddb6f60a1 添加截图(快照)功能 2021-05-08 17:14:05 +08:00
panlinlin
8690289e3e 优化直播流点播流程, 添加流代理接口添加直接关联国标功能 2021-05-07 17:24:49 +08:00
panlinlin
0817be611b 优化mysql建库脚本 2021-05-07 17:23:14 +08:00
panlinlin
671847f359 更新mysql驱动名 2021-05-06 11:54:23 +08:00
panlinlin
cfb9393e1a 修复分享功能 2021-05-06 10:54:41 +08:00
panlinlin
b3cbb433a7 修复分享功能 2021-05-06 10:44:16 +08:00
panlinlin
a5c8749ef2 添加丢失的导包 2021-05-06 10:00:58 +08:00
648540858
1ef66d46c3 Merge pull request #93 from yu1183688986/wvp-28181-2.0
修复集合遍历删除元素的java.util.ConcurrentModificationException 异常问题
2021-05-06 09:28:22 +08:00
Awen
1fc9ab8499 修复集合遍历删除元素的java.util.ConcurrentModificationException 异常问题 2021-04-30 10:42:59 +08:00
panlinlin
7468a7584e 添加系统设置界面,未完成 2021-04-29 17:30:07 +08:00
panlinlin
910b6600a6 添加系统设置界面,未完成 2021-04-29 17:14:37 +08:00
panlinlin
9553b1140f 修复进入通道页面时导航显示异常 2021-04-28 18:24:00 +08:00
panlinlin
2266eeedf6 优化mysql建库脚本 2021-04-28 17:52:11 +08:00
panlinlin
e5ba7274b3 增加对zlm使用docker容器的支持 2021-04-28 15:10:35 +08:00
panlinlin
3916c9bbd1 优化mysql建库脚本 2021-04-27 15:38:00 +08:00
panlinlin
2046b40acc 添加级联平台自动注册时失败自动重新注册 2021-04-27 15:35:22 +08:00
panlinlin
3546ef7df3 优化级联时的异常处理 2021-04-26 18:38:57 +08:00
panlinlin
f47d2edcf5 打包加入依赖的onvif包 2021-04-26 13:11:09 +08:00
panlinlin
34c47f5252 去除所有的system.print, 优化日志显示 2021-04-26 11:37:54 +08:00
panlinlin
651efa0994 修复注册是数据传输模式被回复默认 2021-04-26 10:48:51 +08:00
panlinlin
ae1343a52d 添加接口鉴权开关 2021-04-26 09:47:21 +08:00
panlinlin
e17751927a 添加部分onvif代码 2021-04-26 09:13:17 +08:00
panlinlin
9d00c93924 优化点播体验, 优化tcp被动的sdp 2021-04-23 14:39:52 +08:00
panlinlin
3f91760b0e 增加对设备录像播放的兼容性 2021-04-22 18:09:46 +08:00
panlinlin
4cb5a15331 增加对设备的兼容性 2021-04-22 17:33:07 +08:00
panlinlin
a65b0e908c 优化宕机后点播中设备发送bye 2021-04-22 15:28:40 +08:00
panlinlin
a44be4105a 优化拉流代理 2021-04-22 10:56:13 +08:00
panlinlin
ff5a727748 添加遗漏的文件 2021-04-22 10:22:15 +08:00
panlinlin
af5f95d8ae 优化播放器以及部分日志 2021-04-21 18:14:45 +08:00
panlinlin
7842e4100b 处理空指针 2021-04-20 17:20:01 +08:00
panlinlin
aa0f15a8de 解决更新通道导致的点播丢失 2021-04-19 14:24:08 +08:00
panlinlin
e11f60fb60 去除部分调试日志以及恢复代码 2021-04-19 11:24:03 +08:00
panlinlin
9117294d0a 增加对https的支持 2021-04-19 11:13:39 +08:00
panlinlin
8af9159ebd 修复打包后静态页面加载异常 2021-04-19 11:04:11 +08:00
panlinlin
edd308919e 配置文件恢复默认 2021-04-16 18:23:53 +08:00
panlinlin
1fe47177f0 修复 流已经关闭后,再次调用关闭流的接口,返回超时 2021-04-16 18:23:13 +08:00
panlinlin
e86cacee05 更新readme 2021-04-16 18:00:26 +08:00
panlinlin
62cc0db5f1 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-04-16 17:57:08 +08:00
648540858
9c202dc7dc Merge pull request #87 from Dectinc/patch-1
fix typo and broken url
2021-04-16 17:57:01 +08:00
panlinlin
7eaf277374 使用设备Id+通道Id作为session的识别标识,解决点播异常时无法释放session的问题 2021-04-16 17:52:30 +08:00
Dectinc Chen
3c3b722ee9 fix typo and broken url 2021-04-16 17:22:44 +08:00
panlinlin
e9f036fd14 添加mysql脚本 2021-04-16 16:04:39 +08:00
panlinlin
893606fbe1 解决国标平台通道数统计的错误 2021-04-16 11:21:50 +08:00
panlinlin
7ba2f3c529 增加移除离线设备的功能 2021-04-16 10:59:26 +08:00
panlinlin
03fd4ba4cc 解决串流,解决编辑上级平台却新建了的问题 2021-04-15 17:48:52 +08:00
648540858
c1fa3e157e Merge pull request #84 from lawrencehj/wvp-28181-2.0
修改用户密码前先验证旧密码,增加安全性
2021-04-15 11:52:14 +08:00
lawrencehj
9243c8a025 修改用户密码前先验证旧密码,增加安全性 2021-04-15 11:42:05 +08:00
648540858
8d133fc96b Update README.md 2021-04-14 20:12:36 +08:00
panlinlin
1ff8c1b9c9 支持接口鉴权,支持修改密码, 2021-04-14 16:33:10 +08:00
panlinlin
f0afe02154 使用数据库用户表代替配置文件 2021-04-13 15:08:09 +08:00
panlinlin
14e4eaa553 优化编码信息信息页面 2021-04-13 11:33:26 +08:00
panlinlin
53de34af68 优化编码信息页面 2021-04-13 10:57:10 +08:00
648540858
4e97313cf8 Merge pull request #80 from lawrencehj/wvp-28181-2.0
修正个别错误,优化代码
2021-04-13 10:22:07 +08:00
panlinlin
20a8a606a5 更新readme 2021-04-13 10:16:02 +08:00
lawrencehj
e6213eaab7 去除多余引用,修正个别错误 2021-04-13 10:13:36 +08:00
panlinlin
334611ea3a 更新readme 2021-04-13 10:13:01 +08:00
lawrencehj
8238608dee 修正播放按钮失效问题 2021-04-13 10:06:36 +08:00
panlinlin
81262aa089 解决级联通道名称中文乱码 2021-04-12 18:33:58 +08:00
panlinlin
cd93716b67 统一axios写法 2021-04-12 16:04:04 +08:00
panlinlin
ea9a8431fa 添加丢失的文件 2021-04-12 11:51:47 +08:00
panlinlin
a4c2de4bc5 恢复默认配置 2021-04-12 09:03:14 +08:00
panlinlin
bcf8042730 规范api 2021-04-11 22:32:28 +08:00
panlinlin
1c71836d22 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-04-11 15:00:52 +08:00
panlinlin
00cc0d1a2c 集成rtc播放器 2021-04-11 14:44:27 +08:00
panlinlin
b6b3aefd01 规范化api, 进行中。。。 2021-04-09 17:59:38 +08:00
panlinlin
912b9cb65e 规范化api, 进行中。。。 2021-04-07 18:35:13 +08:00
panlinlin
e11484aa48 更新readme 2021-04-06 18:18:27 +08:00
panlinlin
b502e2377d 修复添加级联平台是三个布尔字段无效的bug 2021-04-06 18:08:58 +08:00
panlinlin
f244525f17 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-04-06 15:13:40 +08:00
panlinlin
3168b90520 页面销毁时关闭sseSource 2021-04-06 15:13:23 +08:00
panlinlin
690179bfc5 移除推流的国标关联移除未推流的数据 2021-04-03 21:19:08 +08:00
panlinlin
157216a4da 增加推流转发到国标,尚不完善 2021-04-02 19:14:12 +08:00
panlinlin
850a5b2c6b 增加推流转发到国标,尚不完善 2021-04-02 19:04:01 +08:00
panlinlin
8b2b7dc451 更新readme 2021-04-01 18:07:16 +08:00
panlinlin
a3692072a1 添加拉流代理与国标关联, 支持代理rtsp/rtmp/...,转发到国标 2021-04-01 18:06:21 +08:00
panlinlin
22f58d318f 添加推流列表和拉流代理,下一步与国标关联 2021-03-30 18:46:34 +08:00
648540858
7a0c45f691 Merge pull request #74 from lawrencehj/wvp-28181-2.0
实现语音广播信令等(web语音推流开发中)
2021-03-27 13:56:56 +08:00
lawrencehj
9579fa905f 实现语音广播信令(web语音推流开发中) 2021-03-26 20:15:12 +08:00
lawrencehj
fb3187b614 启动时清除先前注册上级平台的缓存 2021-03-26 19:58:46 +08:00
lawrencehj
97eea135da 修正更名deviceList.vue后跳转错误 2021-03-26 19:54:29 +08:00
panlinlin
a2eb45de09 添加获取直播流的api 2021-03-26 18:32:36 +08:00
panlinlin
7be7d8f794 重命名设备管理组件 2021-03-25 17:48:20 +08:00
panlinlin
53053eb794 解决循环依赖导致的打包失败 2021-03-25 16:45:29 +08:00
648540858
3a1002970a Merge pull request #67 from lawrencehj/wvp-28181-2.0
增加上级平台信令功能实现,解决上级点播的一些问题
2021-03-24 15:39:47 +08:00
lawrencehj
b88061544b 增加上级平台云台控制功能 2021-03-16 11:47:45 +08:00
lawrencehj
87de1658ce 完成响应上级远程启动信令执行 2021-03-15 15:24:41 +08:00
lawrencehj
b9d1a5ce28 完善向上级注册/注销过程 2021-03-15 15:22:04 +08:00
lawrencehj
3a432a5c10 修正loggor提示信息 2021-03-15 15:17:55 +08:00
lawrencehj
46016ad435 Merge remote-tracking branch 'upstream/wvp-28181-2.0' into wvp-28181-2.0 2021-03-14 21:33:00 +08:00
lawrencehj
587aaf8ecf 增加上级远程启动TeleBoot功能的支持 2021-03-14 21:25:52 +08:00
lawrencehj
2e403fc527 修正本地平台播放时上级无法点播同一流视频的问题 2021-03-14 21:23:47 +08:00
lawrencehj
b492e78afd 优化代码 2021-03-14 21:21:51 +08:00
lawrencehj
dc6b76b4db 增加上级点播停止后通知设备停止推流功能,并自动与本地播放协同 2021-03-14 21:20:47 +08:00
lawrencehj
bf22ca6dbb 增加上级平台查询DeviceInfo和DeviceStatus的响应功能 2021-03-14 21:13:28 +08:00
lawrencehj
8c5b2ec955 增加上级平台查询DeviceInfo和DeviceStatus的响应功能 2021-03-14 21:03:53 +08:00
lawrencehj
06a510e7f3 修复ssrc释放失败问题、修正branch字段以符合国标 2021-03-14 20:54:51 +08:00
648540858
60b20659c6 Merge pull request #64 from lawrencehj/wvp-28181-2.0
修正一处可能导致死循环的代码
2021-03-10 20:43:29 +08:00
lawrencehj
12eb57f146 增加接收Bye请求后停止向上级推流功能 2021-03-10 14:39:40 +08:00
lawrencehj
2839c5df3f 修正某些branch不符合GB之处 2021-03-10 14:38:31 +08:00
lawrencehj
6d20f7dd9a 修正平台Keepalive错误 2021-03-10 14:37:17 +08:00
lawrencehj
8063172e09 修正一处可能导致死循环的代码 2021-03-10 12:21:05 +08:00
648540858
1100255ec9 Merge pull request #63 from lawrencehj/wvp-28181-2.0
实现级联点播的RTP推送
2021-03-10 09:35:20 +08:00
lawrencehj
66b7d6e1ae 实现级联点播RTP推送 2021-03-09 20:05:37 +08:00
lawrencehj
f83bb3639a 去除冗余代码和死代码 2021-03-09 20:02:56 +08:00
panlinlin
d1d2cf3ed6 修复ssrc释放失败的问题 2021-03-03 10:30:06 +08:00
panlinlin
67a62aae4e 对级联点播信令进行处理 2021-03-02 18:23:06 +08:00
panlinlin
84411c2800 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-03-01 18:13:26 +08:00
panlinlin
4e3e66247c 使用jainsip的方式解析sdp 2021-03-01 18:12:56 +08:00
648540858
047b3f2da7 Merge pull request #58 from lawrencehj/wvp-28181-2.0
同步主线Alarm处理功能
2021-03-01 09:26:32 +08:00
lawrencehj
b870842be8 同步主线Alarm处理功能 2021-02-27 19:25:28 +08:00
panlinlin
ffda27c0a4 同步主线 2021-02-26 11:10:22 +08:00
panlinlin
48c0893de3 Merge remote-tracking branch 'origin/master' into wvp-28181-2.0
# Conflicts:
#	README.md
#	src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/event/alarm/AlarmEvent.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
#	src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
#	src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
#	src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
#	src/main/java/com/genersoft/iot/vmp/vmanager/SseController/SseController.java
#	src/main/java/com/genersoft/iot/vmp/vmanager/service/IPlayService.java
#	src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java
#	src/main/resources/wvp.sqlite
#	web_src/.postcssrc.js
#	web_src/src/components/UiHeader.vue
#	web_src/src/main.js
#	web_src/src/router/index.js
2021-02-25 18:10:02 +08:00
648540858
c0f967eb96 Merge pull request #52 from lawrencehj/master
将录像文件统计改为独立线程进行,实现超时返回已接收结果,优化代码消除编译报警项
2021-02-06 10:54:10 +08:00
lawrencehj
347cac1859 去除冗余代码,修正编译报警项 2021-02-05 15:15:39 +08:00
lawrencehj
bd75cd30a5 将录像文件统计改为独立线程进行,实现超时返回已接收结果 2021-02-05 15:00:47 +08:00
648540858
6070af1fae Merge pull request #47 from lawrencehj/master
增加订阅与通知方法,增加移动位置支持等
2021-02-04 10:35:02 +08:00
lawrencehj
1457621ebb 增加多种信令的API调用接口 2021-02-03 11:08:10 +08:00
lawrencehj
85cf36386e 增强数据格式校验和转换功能 2021-02-03 11:05:27 +08:00
lawrencehj
15c1342cf2 增加多种信令的支持 2021-02-03 11:00:24 +08:00
lawrencehj
e15842c53c 调整界面布局 2021-02-03 10:54:41 +08:00
Lawrence
40020cc5a9 修复各页面按下回车键都会退回Contral页面的问题 2021-01-28 14:26:48 +08:00
Lawrence
a4afadd7d6 修改说明 2021-01-27 16:05:08 +08:00
Lawrence
3b44b038ff 增加SSE跨域支持 2021-01-27 15:54:14 +08:00
Lawrence
4fe62869e0 增加移动位置API接口支持 2021-01-27 15:51:58 +08:00
Lawrence
59c93ae15b 增加对Subscribe(订阅)方法的支持 2021-01-27 15:49:16 +08:00
Lawrence
d60c70e7e4 增加移动位置查询和订阅功能,优化信令Tag的生成 2021-01-27 15:47:27 +08:00
Lawrence
15fb21821c 增加对Notify方法的支持 2021-01-27 15:44:36 +08:00
Lawrence
ae153588e9 支持移动位置和GPS报警信息处理 2021-01-27 15:43:01 +08:00
Lawrence
b0feb18a9d 增加数据格式检验,避免设备返回错误格式造成抛错误 2021-01-27 15:31:31 +08:00
Lawrence
9121ff65a1 增加移动位置处理支持 2021-01-27 15:29:51 +08:00
Lawrence
6ae77e2829 增加配置选项 2021-01-27 15:27:35 +08:00
Lawrence
ba769a0082 支持移动位置存储 2021-01-27 15:26:28 +08:00
Lawrence
5e7c3ed971 增加移动位置显示功能 2021-01-27 15:24:28 +08:00
panlinlin
a865f869f2 国标级联--点播-未完成 2021-01-24 20:46:06 +08:00
Lawrence
5c45808348 修正不支持的method处理错误 2021-01-22 15:36:23 +08:00
648540858
3b3e589229 Merge pull request #46 from lawrencehj/wvp-28181-2.0
修正SSE不能分别发送到同时浏览的前端的问题等
2021-01-22 09:52:11 +08:00
648540858
f3760fa4bf Merge pull request #45 from lawrencehj/master
修正SSE不能分别发送到同时浏览的前端的问题等
2021-01-22 09:51:51 +08:00
Lawrence
237119d9f8 调整格式 2021-01-21 21:02:59 +08:00
Lawrence
cf438d9963 添加浏览器ID,确保SSE可同时推送到不同的前端 2021-01-21 20:58:11 +08:00
Lawrence
4a7959507d 增加页面字体调整选项,增加功能腾出空间 2021-01-21 20:19:14 +08:00
Lawrence
eb04412ae9 增加页面字体大小设置,方便增加功能调整页面 2021-01-21 20:02:33 +08:00
Lawrence
74460e7c95 添加浏览器ID,确保SSE可同时推送到不同的前端 2021-01-21 19:57:57 +08:00
Lawrence
5f379e2610 支持字体大小调整,方便扩展功能 2021-01-21 19:51:23 +08:00
648540858
4c238785ab Merge pull request #43 from lawrencehj/master
添加报警响应、发布和SSE推送功能
2021-01-21 09:24:58 +08:00
648540858
1b3f03fb22 Merge pull request #42 from lawrencehj/wvp-28181-2.0
增加报警事件处理功能等
2021-01-21 09:24:32 +08:00
Lawrence
a6ed1268e3 添加报警响应、发布和SSE推送功能 2021-01-20 23:31:00 +08:00
Lawrence
d7a0468788 修改功能说明 2021-01-20 20:43:40 +08:00
Lawrence
ea787fdcba 增加SSE前端推送支持 2021-01-20 20:42:58 +08:00
Lawrence
1488b50c1d 增加报警信息推送请求和页面通知发布 2021-01-20 20:41:24 +08:00
Lawrence
8e9579f253 增加设备报警事件响应、发布和信息处理 2021-01-20 20:39:57 +08:00
Lawrence
867e937805 增加前端Notify支持 2021-01-20 20:27:25 +08:00
Lawrence
02108af2f4 修正级联通道选择编辑关联错误 2021-01-20 20:25:44 +08:00
panlinlin
41c1127f6c 修复国标校时的时区的错误导致时间差八个小时的一个错别字 2021-01-20 10:04:52 +08:00
panlinlin
9a30a0f23a 修复国标校时的时区的错误导致时间差八个小时 2021-01-20 09:53:25 +08:00
panlinlin
ca3fcef8a3 完成向上级联->点播--002 2021-01-15 18:22:57 +08:00
panlinlin
092f247424 完成向上级联->点播--精简代码 2021-01-15 17:47:58 +08:00
panlinlin
6d0133d27f 完成向上级联->点播--增加了sdp解析
修复修改平台主键带来的bug
2021-01-15 17:21:02 +08:00
panlinlin
4dc4710870 Merge remote-tracking branch 'origin/master' into wvp-28181-2.0 2021-01-15 15:33:24 +08:00
panlinlin
0075ad6a9c 去除pom多余文件 2021-01-15 15:32:41 +08:00
panlinlin
9fb1caca10 通过重写的方式解决与国标时间格式不一致的问题, 不需要修改jar包了。 2021-01-15 15:28:47 +08:00
648540858
49d81b6aa8 Merge pull request #38 from lawrencehj/wvp-28181-2.0
修改不能创建多个上级平台的问题等
2021-01-15 13:22:07 +08:00
Lawrence
a0f00fe8ba 将上级平台标识改为serverGBId 2021-01-15 00:00:45 +08:00
Lawrence
f53b5ddcb6 通道查询排序输出,避免列表杂乱无章 2021-01-14 23:56:01 +08:00
Lawrence
7e238b79d4 通道查询排序输出,避免列表杂乱无章 2021-01-14 23:53:57 +08:00
Lawrence
3b54426439 修改catalog请求还是响应的判断方法 2021-01-14 23:51:59 +08:00
Lawrence
49b14dd70e parent_platform表修改主键为serverGBId 2021-01-14 23:49:34 +08:00
Lawrence
fa5f0082df 修正修改过上级平台信息后再次创建上级平台按钮不会变为'立即创建'的问题 2021-01-14 23:46:09 +08:00
Lawrence
2147e5e094 修正初次打开通道选择列表每页数量不对的问题 2021-01-14 23:41:54 +08:00
panlinlin
d0afd9b914 完成向上级联->通道推送
修复选择通道是查询的bug
2021-01-14 14:49:38 +08:00
panlinlin
9fdc010af7 Merge remote-tracking branch 'origin/master' into wvp-28181-2.0 2021-01-13 18:11:45 +08:00
panlinlin
47047b91ab 回滚修复登陆的bug时不必修改的代码 2021-01-13 18:10:26 +08:00
panlinlin
7c13ec0c42 Merge remote-tracking branch 'origin/master' into wvp-28181-2.0 2021-01-13 17:56:01 +08:00
panlinlin
38799fca56 修复登陆的bug 2021-01-13 17:49:19 +08:00
panlinlin
de56ff7c72 完成向上级联->选择通道-编辑页面密码不隐藏 2021-01-13 17:27:04 +08:00
panlinlin
f92b5ce097 完成向上级联->选择通道-003 2021-01-13 17:08:26 +08:00
panlinlin
c2a8c0630f Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-01-12 14:09:33 +08:00
648540858
12b56d4859 Merge pull request #34 from lawrencehj/wvp-28181-2.0
解决非默认端口无法Send Bye的问题
2021-01-12 14:09:12 +08:00
648540858
bbcaee3732 Merge pull request #35 from lawrencehj/master
解决非默认端口无法Send Bye的问题
2021-01-12 14:08:46 +08:00
Lawrence
c00d51060c 与master分支同步 2021-01-12 13:50:04 +08:00
Lawrence
2cb73e94c5 进一步优化录像列表获取算法 2021-01-12 13:48:42 +08:00
Lawrence
8fb0721c7e 进一步优化录像列表获取算法 2021-01-12 13:08:51 +08:00
Lawrence
308b2ed8eb Merge remote-tracking branch 'upstream/master' 2021-01-12 13:03:14 +08:00
panlinlin
7688a68fc2 Merge remote-tracking branch 'origin/master' into wvp-28181-2.0 2021-01-12 10:48:01 +08:00
panlinlin
28de358c67 关闭播放窗口停止回放
回滚回放代码
2021-01-12 10:46:41 +08:00
panlinlin
f42790f91b Merge remote-tracking branch 'origin/master' into wvp-28181-2.0 2021-01-12 10:37:31 +08:00
panlinlin
a590f694f6 Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0 2021-01-12 09:36:55 +08:00
Lawrence
211874efda 解决非默认端口无法Send Bye的问题 2021-01-11 23:40:43 +08:00
Lawrence
f776624d3f 解决非默认端口无法Send Bye的问题 2021-01-11 23:29:18 +08:00
648540858
341575181e Merge pull request #33 from lawrencehj/wvp-28181-2.0
优化录像列表获取算法等
2021-01-11 21:34:16 +08:00
648540858
90476a6d36 Merge pull request #32 from lawrencehj/master
优化录像列表获取算法等
2021-01-11 21:33:39 +08:00
Lawrence
39912aa9a2 修正页码计算错误 2021-01-11 21:03:23 +08:00
Lawrence
809d650893 与master分支同步 2021-01-11 21:01:59 +08:00
Lawrence
45bc2f60f2 优化录像列表获取算法 2021-01-11 20:56:25 +08:00
Lawrence
a532bd2aa9 平台向上级联,重新启用时自动重设Expires值 2021-01-11 20:54:29 +08:00
Lawrence
bc3c51a773 设备注册时更新设备与通道信息 2021-01-11 20:52:58 +08:00
Lawrence
ac01a6acc4 修正播放回放ssrc 2021-01-11 20:51:58 +08:00
Lawrence
0a9d5a9bf5 格式调整 2021-01-11 20:44:24 +08:00
Lawrence
ee7333cd3e 修正录像回放streamId赋值 2021-01-11 20:42:40 +08:00
Lawrence
10970d0071 设备注册更新设备信息 2021-01-11 20:40:54 +08:00
Lawrence
d4ead3870d 优化录像清单获取算法 2021-01-11 20:39:27 +08:00
panlinlin
2746d8e447 Merge remote-tracking branch 'origin/master' into wvp-28181-2.0 2021-01-11 17:51:44 +08:00
panlinlin
f84b6125c8 通过前端文件修复分页错误 2021-01-11 17:50:29 +08:00
panlinlin
1c8b072268 Merge remote-tracking branch 'origin/master' into wvp-28181-2.0 2021-01-11 17:46:16 +08:00
648540858
34e73875b8 Merge pull request #31 from BradyXuBin/master
修复分页错误和增加配置忽略文件
2021-01-11 17:37:38 +08:00
panlinlin
19da2fb6ed 修复错误的使用stream作为ssrc导致的无法stop问题 2021-01-11 17:35:46 +08:00
BradyXuBin
8265496f60 1.修复分页错误,pageHelper是从1开始,目前是在后端的+1解决。
2.增加忽略自己本身配置文件。
2021-01-11 17:33:43 +08:00
648540858
42d837b70f Merge pull request #29 from lawrencehj/wvp-28181-2.0
Wvp 28181 2.0
2021-01-11 11:24:56 +08:00
648540858
823c09eb6c Merge pull request #30 from lawrencehj/master
与2.0同步修正部分错误
2021-01-11 11:24:34 +08:00
Lawrence
50c0cec22c 离线设备禁用通道查看,避免后续无效操作 2021-01-11 09:35:07 +08:00
Lawrence
32ea365979 修改通道在线/离线描述,避免歧义 2021-01-11 09:27:04 +08:00
Lawrence
62342c6d37 与2.0同步修改 2021-01-11 09:18:00 +08:00
Lawrence
ef51d17dd2 报警响应处理去除catalog查询操作 2021-01-11 09:17:15 +08:00
Lawrence
b1f4810025 修正录像回放错误 2021-01-11 09:16:16 +08:00
Lawrence
6ce6b95b56 修改通道在线/离线描述,避免歧义 2021-01-11 09:14:22 +08:00
Lawrence
b82b61038b 修正个别错误 2021-01-11 09:13:03 +08:00
Lawrence
f0f4537d80 离线设备禁用通道查看,避免后续无效操作 2021-01-11 09:11:56 +08:00
Lawrence
b146f40862 修改本地jar包路径描述,避免marven编译Warning 2021-01-11 09:10:56 +08:00
Lawrence
eec405028f 调整格式 2021-01-10 23:14:58 +08:00
Lawrence
11a04000b6 取消报警响应后查询目录操作 2021-01-10 23:12:30 +08:00
Lawrence
572b1aaba7 修正回放错误,优化sdp排序,提高设备兼容性 2021-01-10 23:11:30 +08:00
Lawrence
d32fc9e801 删除多余注释 2021-01-10 23:08:47 +08:00
Lawrence
d4eefffa51 Merge remote-tracking branch 'upstream/wvp-28181-2.0' into wvp-28181-2.0 2021-01-10 21:38:40 +08:00
panlinlin
a796db6249 国标级联--选择通道003-前端页面 2021-01-10 20:14:11 +08:00
Lawrence
6002969517 修改本地jar库路径描述,避免marven编译Warning 2021-01-09 14:58:08 +08:00
panlinlin
8765ce134b Merge remote-tracking branch 'origin/master' into wvp-28181-2.0 2021-01-09 12:16:16 +08:00
panlinlin
440e070188 去除无用的配置项 2021-01-09 12:12:50 +08:00
panlinlin
15c1edc055 完成向上级联->选择通道-002 2021-01-08 17:35:05 +08:00
panlinlin
37b6afb9b2 Merge remote-tracking branch 'origin/master' into wvp-28181-2.0
# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
2021-01-08 17:31:49 +08:00
panlinlin
82ee2034b1 修复检测字段是否存在带来的停止按钮无法点击
修改错别字
2021-01-08 17:27:13 +08:00
panlinlin
44521509d7 Merge remote-tracking branch 'origin/master' into wvp-28181-2.0 2021-01-08 15:40:46 +08:00
panlinlin
781247e1af 修复更新设备和通道信息时检测字段是否存在 2021-01-08 14:46:55 +08:00
panlinlin
3aeb164c8d 添加对水星云台控制的支持 2021-01-08 13:33:19 +08:00
panlinlin
b4a7cfb563 完成向上级联->选择通道-001 2021-01-08 11:04:29 +08:00
panlinlin
2383f1515f 完成向上级联->选择通道-001 2021-01-08 11:02:53 +08:00
panlinlin
71a1dd8fc6 Merge remote-tracking branch 'origin/master' into wvp-28181-2.0 2021-01-07 16:52:18 +08:00
panlinlin
a3afe9cc34 增加云台控制的速度控制 2021-01-07 16:44:42 +08:00
panlinlin
29c52dbdda Merge remote-tracking branch 'origin/master' into wvp-28181-2.0 2021-01-07 15:31:16 +08:00
panlinlin
370b71939c 修复重启zlm导致的点播失败 2021-01-07 15:29:58 +08:00
panlinlin
4cbf7205e2 完成向上级联->启动时自动注册 2021-01-07 14:56:10 +08:00
panlinlin
56bfa58efd 完成向上级联->保存时注册或注销 2021-01-07 14:09:41 +08:00
panlinlin
4ed02aa69b 完成向上级联->删除的时候注销 2021-01-07 13:15:39 +08:00
panlinlin
a8a36efb93 完成向上级联->保活 2021-01-06 18:35:38 +08:00
panlinlin
80682bbe9d 修改错误的注释 2021-01-06 10:01:28 +08:00
panlinlin
20669ed768 Merge remote-tracking branch 'origin/master' into wvp-28181-2.0
# Conflicts:
#	README.md
#	src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
#	src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHTTPProxyController.java
#	src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
#	src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
#	src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java
#	src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java
#	src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java
#	src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java
#	src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java
#	src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java
#	src/main/resources/application-dev.yml
#	web_src/src/components/gb28181/devicePlayer.vue
2021-01-05 15:56:19 +08:00
panlinlin
3a6fc34a11 优化录像查询,优化注释 2021-01-05 14:35:43 +08:00
panlinlin
59237e9a55 更新application.yml 2021-01-05 14:28:18 +08:00
panlinlin
37957b7407 更新readme 2021-01-05 11:52:31 +08:00
panlinlin
b88ead03f9 存储部分使用sqlite代替redis-4 2021-01-05 11:25:05 +08:00
panlinlin
82c682c512 存储部分使用sqlite代替redis-3 2021-01-04 18:30:44 +08:00
panlinlin
15bee5e37d 存储部分使用sqlite代替redis-2 2020-12-31 13:22:22 +08:00
panlinlin
2ab8b942bd 存储部分使用sqlite代替redis 2020-12-31 13:15:50 +08:00
panlinlin
59f7fb1063 增加对 需要扩展SDP的设备的单独设置 2020-12-28 11:45:40 +08:00
panlinlin
098307cfe8 检查设备是否存在, 不存在则不回复心跳 2020-12-28 11:07:01 +08:00
panlinlin
27c0332052 修复空指针异常 2020-12-27 08:19:34 +08:00
panlinlin
071c2de9b8 兼容水星IPC的录像查询 2020-12-26 20:08:04 +08:00
panlinlin
e4d849304c 增加对水星IPC的兼容
增加对SIP错误的订阅,刷新通道或点播或回放出现sip错误时及时返回给页面
优化UI,增加按钮loading
2020-12-26 16:44:27 +08:00
panlinlin
3dcb759bda 增加对配置文件的校验 2020-12-25 18:11:03 +08:00
panlinlin
64aae8db3b 修复录像查询的VIA头 2020-12-25 15:27:25 +08:00
panlinlin
a2ac3c77dd 修复空指针 2020-12-25 15:05:55 +08:00
648540858
4ee6962fe6 添加maven源, 增加依赖下载速度 2020-12-22 15:04:19 +08:00
648540858
762507def6 替换线程不安全的map 2020-12-22 09:48:51 +08:00
648540858
e9476821e1 恢复配置文件 2020-12-21 17:40:05 +08:00
648540858
c8fd03682a 补充漏掉的文件 2020-12-21 16:01:47 +08:00
648540858
a742be7afe 修复重复调用open rtp server 的bug
增加对rtp server开启释放的统一管理
2020-12-21 15:29:17 +08:00
648540858
f6a59b06e3 修复重复调用open rtp server 2020-12-21 11:35:28 +08:00
648540858
51630f54e8 修复兼容接口 2020-12-21 11:13:27 +08:00
panlinlin
a1d7894bdb update readme 2020-12-19 22:07:54 +08:00
panlinlin
82cceb6a4b 去除ssrc作为流ID传递,ssrc只作为sdp消息使用。动态端口的情况下支持固定流地址,同时支持未点播时直接播放流地址,代码自动发起点播 2020-12-19 21:52:20 +08:00
648540858
7cbe54e233 Merge pull request #15 from lawrencehj/wvp-28181-2.0
修复编译后运行报错“循环依赖”的问题,修复zlm在docker时代理错误
2020-12-18 09:25:41 +08:00
Lawrence
4fe7f7fe2e 上级注册Expires值根据填表值发送 2020-12-18 00:43:17 +08:00
Lawrence
e9360b423e 解决编译为jar后运行报循环依赖错误的问题 2020-12-17 22:37:45 +08:00
Lawrence
54bc9326a2 与主线同步,修复zlm在docker时代理错误 2020-12-17 15:42:29 +08:00
648540858
22cde8d802 Merge pull request #14 from lawrencehj/wvp-28181-2.0
修正上级注册的代码
2020-12-17 14:55:22 +08:00
Lawrence
bf62eb1177 新建上级级联平台时自动填入本级平台参数 2020-12-17 14:50:49 +08:00
Lawrence
e68f4e740c 增加本平台配置查询接口,方便上级级联参数填写 2020-12-17 14:49:34 +08:00
Lawrence
ef242dc164 注册过程中区分不同的CSeq值 2020-12-17 14:47:56 +08:00
Lawrence
0cd769e3da 注册信令包增加Expires头,修改CSeq值 2020-12-17 14:46:38 +08:00
648540858
4ec6c288cd 修复zlm在 docker时代理错误 2020-12-17 14:25:54 +08:00
648540858
94e2631195 Merge pull request #12 from lawrencehj/master
修正转码播放重复回调的错误
2020-12-17 13:10:43 +08:00
648540858
7952b7aaf9 Merge pull request #13 from lawrencehj/wvp-28181-2.0
与master分支同步
2020-12-17 13:10:14 +08:00
Lawrence
4aecbd8197 添加回放SDP信息,兼容海康设备 2020-12-16 20:36:59 +08:00
Lawrence
7b5fe25b96 与master分支同步 2020-12-16 20:29:19 +08:00
Lawrence
a76b464cd4 修正播放窗口关闭时销毁播放器的代码 2020-12-16 12:51:57 +08:00
Lawrence
8c3f97072a Merge remote-tracking branch 'upstream/master' 2020-12-16 12:43:52 +08:00
Lawrence
b9c2a7c888 去掉重复添加的via头 2020-12-16 12:42:36 +08:00
Lawrence
f804dbfa34 修正转码播放停止后重复回调的错误 2020-12-16 12:41:49 +08:00
648540858
b954918fb7 Merge pull request #10 from lawrencehj/master
解决海康设备兼容问题等
2020-12-15 10:41:21 +08:00
Lawrence
2852561e50 临时修改解决内网Ack问题 2020-12-14 22:42:28 +08:00
Lawrence
abb682a044 修改查询录像回放接口,兼容部分设备发出MediaStatus信息时将ChannelId当作DeviceId的问题 2020-12-14 22:41:06 +08:00
Lawrence
685e2073f4 扩展点播SDP协议范围,兼容海康等设备(issue #7) 2020-12-14 22:35:40 +08:00
648540858
fe04126415 使用线程安全的map存储订阅信息
修改点播消息内容,提升兼容性
2020-12-14 16:51:29 +08:00
648540858
d8faf83c9d 精简代码 2020-12-14 15:34:33 +08:00
648540858
2bfef8ab6c 修改错误注释和错误日志 2020-12-14 15:11:48 +08:00
648540858
69f9e9ce22 修改转码接口以使用127.0.0.1, 作为源IP 2020-12-14 10:47:26 +08:00
648540858
726730cbaa 使用异步接口, 更好的并发, 对hook使用订阅机制
替换前段播放器, 支持h265的播放
放弃循环获取编码信息,
2020-12-08 18:11:02 +08:00
648540858
c36482f78f 修复前端页面图标不显示的bug 2020-12-07 14:19:29 +08:00
648540858
8f9783ab22 去除hook 自动识别127.0.0.1 2020-12-07 10:54:52 +08:00
648540858
9e135e58f3 优化配置文件使用方式, 规范前端文件打包路径 2020-12-04 14:29:34 +08:00
648540858
35308dfb68 修正使用默认配置 2020-12-02 15:35:21 +08:00
648540858
5e9e0043dc 增加hookip设置, 是否开启自动配置设置 2020-12-02 15:33:19 +08:00
648540858
9240401b86 使用APPLICATION 替换 Application 2020-11-30 17:02:44 +08:00
648540858
45b2720295 更新注释 2020-11-25 11:49:10 +08:00
648540858
3e041b1bba 增加对部分NVR的兼容性处理 2020-11-25 11:42:51 +08:00
648540858
a96d22701e 完成向上级联->注册 2020-11-24 16:41:00 +08:00
648540858
5d3cf5fd8b 更新readme 2020-11-23 18:18:32 +08:00
648540858
ae786534c6 [UI] 完成国标级联的CURD 2020-11-23 18:17:20 +08:00
648540858
51ff7ae180 添加addParentPlatform, queryParentPlatformList 接口 2020-11-20 18:02:01 +08:00
648540858
d3824ed8e9 更新readme 2020-11-20 16:34:01 +08:00
648540858
62c743bb8a 更新readme 2020-11-20 16:05:40 +08:00
648540858
64afaecd9d 更新readme 2020-11-20 16:03:18 +08:00
648540858
9c5da7f8f5 去除多余空格 2020-11-20 10:40:43 +08:00
648540858
ba5ac5e8c1 添加自动通道刷新 2020-11-19 16:11:13 +08:00
648540858
cb66aa966e 更新readme 2020-11-19 16:02:06 +08:00
648540858
17772daaaf 添加网页自动转码,以支持h265 g.711的播放 2020-11-19 16:00:02 +08:00
648540858
191d2c83b8 配置丢失了一个空格 2020-11-17 17:41:19 +08:00
648540858
f84e8f7c72 配置丢失了一个空格 2020-11-17 17:40:03 +08:00
648540858
8e2adfc948 修复一些日志设置 2020-11-17 15:27:13 +08:00
648540858
73fd076830 修复停止点播后,再次调用停止无法识别 2020-11-16 17:24:20 +08:00
648540858
d9150d547d Merge pull request #2 from lawrencehj/master
改正xml空字段转换为数字的错误
2020-11-16 17:09:48 +08:00
Lawrence
0112db1e1a 改正xml空字段转换为数字的错误 2020-11-16 17:05:22 +08:00
648540858
3c5106df8e Merge pull request #1 from lawrencehj/master
修正处理Catalog信息时遇到空字段的错误
2020-11-16 14:00:58 +08:00
Lawrence
f939c4b7cc 录像回放时同样根据设置决定是否事先取编码信息 2020-11-16 12:39:10 +08:00
Lawrence
fcfd34e00d 修正处理Catalog信息时遇到空字段的错误 2020-11-16 12:37:38 +08:00
648540858
f594229a72 增加强制不查询编码信息配置 2020-11-13 18:12:21 +08:00
648540858
028e656f56 去除无效注解
修复获取sn错误的bug
2020-11-13 09:55:24 +08:00
648540858
8b7e28c8bb Merge pull request #12 from lawrencehj/master
增加录像回放结束后对设备发出的MediaStatus的回应并关流
2020-11-13 09:50:37 +08:00
Lawrence
070490e18a 增加录像回放结束后对设备发出的MediaStatus的回应并关流 2020-11-13 09:28:51 +08:00
648540858
3084c72c5a gitee sync 2020-11-12 17:56:28 +08:00
648540858
5047703364 gitee sync 2020-11-12 17:50:12 +08:00
648540858
5d679c1cb2 升级依赖包版本 2020-11-11 15:36:48 +08:00
648540858
50c7fa74ca 修复录象回放的bug 2020-11-09 19:45:04 +08:00
648540858
e331359025 Merge remote-tracking branch 'origin/master' into master 2020-11-09 19:38:54 +08:00
648540858
4b7bede184 Merge pull request #11 from lawrencehj/master
修正不同终端音频开关设置不同引起播放问题的bug等
2020-11-09 18:57:26 +08:00
Lawrence
e4920aeb20 修正不同终端开关音频设置不同引起播放问题的bug 2020-11-09 18:44:35 +08:00
Lawrence
411eea780a 改为24小时制显示 2020-11-09 18:42:59 +08:00
Lawrence
9a3e79e632 仅在Update Cache时纠正离线在线偏差,无需反复修正 2020-11-09 18:41:51 +08:00
Lawrence
c74e6ba5d6 修正针对部分设备无录像时不返回RecordInfo段而长时间等待的bug 2020-11-09 18:40:13 +08:00
648540858
9832df8695 更新readme 2020-11-09 18:21:52 +08:00
648540858
88967428da 支持公网部署 2020-11-09 13:33:00 +08:00
648540858
e3e2a37be1 增加Subject头 2020-11-09 10:02:49 +08:00
648540858
843dac6881 Merge pull request #10 from lawrencehj/master
优化播放程序,缩短加载时间
2020-11-07 22:15:53 +08:00
Lawrence
962f9422ab 修正设备在线离线判断的错误 2020-11-07 22:02:17 +08:00
Lawrence
a8629e2279 优化打包参数 2020-11-07 17:41:17 +08:00
Lawrence
3569cbcb88 增加dockfile 2020-11-07 17:37:45 +08:00
Lawrence
84611d7c4f 优化播放程序,缩短播放加载时间 2020-11-07 16:54:42 +08:00
Lawrence
67cc6253ad 优化打包的参数 2020-11-07 16:53:49 +08:00
648540858
c4d9c1fe72 增加docker镜像 2020-11-06 20:07:37 +08:00
648540858
2e3662e1db 修改打包方式 2020-11-06 13:34:25 +08:00
648540858
2e43842e36 修改打包方式 2020-11-06 13:02:05 +08:00
648540858
0bd3ff3166 Merge pull request #9 from lawrencehj/master
实现GB28181 A.3前端设备控制协议,支持单一jar打包(包含修改过的jar依赖)
2020-11-06 12:48:54 +08:00
Lawrence
32a7c12f82 完善前端控制信令,实现GB28181 A.3前端设备控制协议 2020-11-06 12:37:08 +08:00
Lawrence
74b80e02f2 编译指向本地依赖库,支持打包成单一jar文件 2020-11-06 12:34:27 +08:00
Lawrence
280d31b455 更改文件名,避免编译时与原版本混淆 2020-11-06 12:32:45 +08:00
648540858
66d6d81d18 解决mvn打包时无法将额外引入的包打入可执行jar的问题 2020-11-05 22:23:32 +08:00
648540858
92994af7a2 Merge pull request #6 from lawrencehj/master
修正Message Resquest处理的错误等
2020-10-29 10:45:23 +08:00
Lawrence
5909578c41 录像查询更换日期后先清空原先的查询列表 2020-10-29 10:23:10 +08:00
Lawrence
d0404a0be6 改正并优化查询RTP流信息的流程 2020-10-29 10:21:40 +08:00
Lawrence
1f0c7001e0 断流后自动清除Redis中的播放条目 2020-10-29 10:20:06 +08:00
Lawrence
65cf6c05ce 修复收到Message Resquest后不回复200 OK的错误 2020-10-29 10:18:29 +08:00
Lawrence
dcfe366252 修正拼写错误 2020-10-29 10:16:39 +08:00
648540858
9570167aa4 Merge pull request #3 from lawrencehj/master
修改jar包编译版本,修正播放获取流编码信息的代码
2020-10-26 17:22:29 +08:00
648540858
ec494c69d8 Merge branch 'master' into master 2020-10-26 17:02:29 +08:00
Lawrence
78401b1281 添加新功能说明 2020-10-26 16:51:31 +08:00
Lawrence
881f593116 获取播放流编码时增加重试之间的延时,避免过度频繁的API查询 2020-10-26 16:50:53 +08:00
Lawrence
e2782b44b2 改为用1.8版本编译,以便与主程序兼容 2020-10-26 16:48:36 +08:00
648540858
da3edabf7c 修复查询设备信息接口返回设备通道数错误的问题 2020-10-26 14:21:40 +08:00
648540858
021ba73002 修复ui录象播放
优化录象查询接口
2020-10-26 11:40:46 +08:00
648540858
f8ce481edb Merge pull request #2 from lawrencehj/master
增加GB网络校时功能
2020-10-26 09:52:23 +08:00
Lawrence
0c6a77fc97 Merge remote-tracking branch 'upstream/master' into master 2020-10-25 00:29:18 +08:00
Lawrence
986a087e21 添加本地依赖包 2020-10-25 00:16:38 +08:00
Lawrence
ca29dcbdee 指向本地jain-sip-ri包 2020-10-24 23:42:14 +08:00
Lawrence
9d4b413a4d 修改jain-sip-ri依赖包,实现国标网络校时 2020-10-24 16:12:07 +08:00
Lawrence
3e419e8c3b 播放等待时间增加到30秒,避免部分设备(NVR)播放超时 2020-10-24 15:26:11 +08:00
Lawrence
16328b99c4 对通道列表查询结果排序,避免设备通道列表乱序的问题 2020-10-24 15:22:48 +08:00
Lawrence
c01acd3175 具有子节点的通道保留播放按钮,避免部分NVR无法查看直播流 2020-10-24 15:18:48 +08:00
Lawrence
b6e99efb55 使音频开关关闭生效 2020-10-24 15:16:10 +08:00
648540858
c2ab3d295f Merge pull request #1 from lawrencehj/master
修正部分错误,简化音频判断逻辑
2020-10-20 09:35:23 +08:00
Lawrence
00503014d9 默认含有音频通道,改为播放时判断音频编码 2020-10-19 23:10:33 +08:00
Lawrence
f991996693 修改RTP端口计算方法,确保分配偶数端口 2020-10-19 20:45:59 +08:00
Lawrence
203888f306 修正音频编码判断代码错误,仅当存在AAC音轨时打开音频 2020-10-19 20:37:02 +08:00
Lawrence
535fbe982c 突出返回按钮 2020-10-19 20:35:01 +08:00
Lawrence
07729662d4 修改标题名称 2020-10-19 20:33:57 +08:00
Lawrence
1cb39a5d20 修正RTP端口上限数值 2020-10-19 20:32:55 +08:00
Lawrence
7868486e37 删除多余行 2020-10-19 20:31:53 +08:00
Lawrence
3362a4bfa4 修正启动提示错误(UDP误为TCP) 2020-10-19 20:30:59 +08:00
Lawrence
2f160e8c65 格式化 2020-10-19 20:29:21 +08:00
648540858
8369c616d2 修复ui开启音频无法播放的bug
修复可能导致录象查看的bug
修复开启openRTPServer时的bug
2020-10-19 14:25:41 +08:00
panll
533f481074 修改默认参数与ZLM统一 2020-10-17 16:41:40 +08:00
648540858
e05a54247a 去除图片 2020-10-16 17:01:11 +08:00
648540858
8e5f3f364b 去除图片 2020-10-16 16:58:39 +08:00
648540858
648853f18a 去除lombok框架
添加流传输模式udp/tcp被动支持
2020-10-16 16:49:41 +08:00
648540858
fd1dafc4a6 去除lombok框架 2020-10-16 14:57:10 +08:00
648540858
77853f9aa0 引入lombok框架
优化redis存储结构
2020-10-16 11:24:36 +08:00
648540858
a26acb06e0 修复编码错误 2020-10-16 09:50:19 +08:00
648540858
95480bd254 更新配置 2020-10-15 17:05:14 +08:00
648540858
a002ae50e6 更新readme 2020-10-15 15:41:27 +08:00
648540858
dec1038f7b 修改bug 2020-10-15 15:23:41 +08:00
648540858
3477db26f3 支持使用udp端口段来启用高性能udp 2020-10-14 16:13:39 +08:00
648540858
67764bedaf 修复点播判断错误导致的15s超长延时
增加默认不关闭推流, 无人观看超时或点击停止按钮关闭流
修复点播其他bug
2020-10-14 14:39:10 +08:00
648540858
cb45d84b94 修复无音频通道开启通道音频后无法播放的bug
修复点播接口真的收到视频后回复
2020-10-13 18:55:42 +08:00
648540858
79ee1e087f 添加通道音频设置
添加media配置
2020-10-13 17:16:38 +08:00
648540858
c7270f9320 离在线状态样式修改
修复未回复200ok导致catalog一直发送的bug
修改点播接口未收到视频后回复
2020-10-13 14:46:47 +08:00
648540858
84bdfd348c 更新readme 2020-10-12 15:27:28 +08:00
648540858
0c07dbc3f6 更新readme 2020-10-12 15:24:27 +08:00
648540858
da9023bb81 添加截图 2020-10-12 15:16:53 +08:00
648540858
7f8a7510a8 添加readme 2020-10-12 14:54:35 +08:00
648540858
636955e503 添加wiki 2020-10-12 14:45:52 +08:00
648540858
d474d9c8f6 添加wiki 2020-10-12 13:14:20 +08:00
648540858
bce4e95482 修复子节点显示错误 2020-10-12 10:11:24 +08:00
648540858
74aeeb3408 更新readme 2020-10-10 17:52:42 +08:00
648540858
eaf8ede8b1 更新readme 2020-10-10 17:52:01 +08:00
648540858
f321337c69 web页面集成 2020-10-10 17:33:29 +08:00
648540858
1d3efd3c49 web页面集成 2020-10-10 17:33:02 +08:00
648540858
320fa66aae 增加分页,搜索,等 2020-09-30 17:59:11 +08:00
648540858
4e593aadd9 添加静态页 2020-09-25 17:55:32 +08:00
648540858
7965d69a11 更新readme 2020-09-25 17:41:02 +08:00
648540858
a555d06ed5 拆分redis中device与channel的存储方式
支持分页
接口直接返回播放地址
2020-09-25 17:22:22 +08:00
swwheihei
1f00a745fd 修复返回值低级错误 2020-07-24 10:29:29 +08:00
swwheihei
efe8da2a1d 解决spring循环注入导致的服务无法启动 2020-07-22 21:06:11 +08:00
swwheihei
cb7499d490 解决无法启动的问题 2020-07-18 11:37:24 +08:00
swwheihei
b738a60037 解决低级编译问题 2020-07-18 11:27:42 +08:00
swwheihei
c5e76ef82e 尝试解决内存溢出,并使用多线程提高性能 2020-07-16 17:31:41 +08:00
swwheihei
9e6f795ecc 改名 2020-07-16 16:10:49 +08:00
swwheihei
49cfc55f46 Merge branch 'master' of https://github.com/swwheihei/wvp.git
Conflicts:
	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/InviteResponseProcessor.java
2020-07-16 16:09:48 +08:00
swwheihei
68ec1fe47e 修改名称 2020-07-16 15:59:57 +08:00
swwhaha
aff7db4e13 Merge pull request #10 from lawrencehj/master
修正Invite后无法发送ack、bye无法找到对话对方IP地址的问题等
2020-06-26 12:05:23 +08:00
Lawrence
773ddbda71 修正设备通道名称为中文无法列出的错误 2020-06-25 15:46:02 +08:00
Lawrence
3bdd8e832d 修改ZLMediaKit Hook路径与其缺省值一致 2020-06-25 15:35:24 +08:00
Lawrence
434e33221f 修正invite后收到部分设备200 OK无法回复ack的问题 2020-06-25 15:33:15 +08:00
Lawrence
447d871f7e 增加错误捕捉处理 2020-06-25 15:30:26 +08:00
Lawrence
89fdfd5db1 修复部分设备invite后bye无法找到设备地址的问题 2020-06-25 15:27:29 +08:00
Lawrence
c49d459801 将设备IP地址填入via Header中,避免部分设备回复200 OK时contact信息缺失导致无法回复ack 2020-06-25 15:22:05 +08:00
Lawrence
79135c6a26 增加对invite其它响应的应对,如101 Dialog Establishement等 2020-06-25 15:16:13 +08:00
swwhaha
a35ede5c53 Create LICENSE 2020-06-23 13:58:09 +08:00
Lawrence
5392604e80 将xml解析编码设定为GB2312,以满足GB28181要求 2020-06-12 10:50:45 +08:00
swwheihei
8e6fce6e48 Merge pull request #9 from lawrencehj/master
增加了PTZ控制指令码的实现
2020-06-11 13:33:38 +08:00
Lawrence
22ead512c1 改进变焦速度计算方式 2020-06-10 14:22:00 +08:00
Lawrence
1a90f42cf9 修正云台指令码变焦速度编码错误 2020-06-10 13:28:27 +08:00
Lawrence
ed0a0cd3ab 修正对invite后trying响应的处理,避免误报错 2020-06-10 13:20:53 +08:00
swwheihei
2c27ee439f Merge pull request #8 from swwheihei/dependabot/maven/org.dom4j-dom4j-2.1.3
Bump dom4j from 2.1.1 to 2.1.3
2020-06-09 22:01:40 +08:00
Lawrence
c06c706641 实现PTZ控制代码 2020-06-09 15:39:51 +08:00
Lawrence
4bed3a497a 替换高清图片 2020-06-07 20:53:06 +08:00
dependabot[bot]
eca62c4115 Bump dom4j from 2.1.1 to 2.1.3
Bumps [dom4j](https://github.com/dom4j/dom4j) from 2.1.1 to 2.1.3.
- [Release notes](https://github.com/dom4j/dom4j/releases)
- [Commits](https://github.com/dom4j/dom4j/compare/version-2.1.1...version-2.1.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-06-06 05:58:06 +00:00
swwheihei
2403a3a11b Update pom.xml 2020-06-02 19:53:20 +08:00
songww
b82ccdba02 增加跨域代码,允许VUE跨域访问 2020-05-21 09:29:58 +08:00
songww
17eb38006d Merge branch 'master' of https://github.com/swwheihei/wvp.git 2020-05-16 14:51:45 +08:00
songww
73e332eddf 删除部分代码 2020-05-16 14:47:28 +08:00
swwheihei
3a4c8533d3 Update README.md 2020-05-14 14:52:59 +08:00
swwheihei
fc5a8e9a78 Update README.md 2020-05-14 14:52:08 +08:00
swwheihei
4fcff561bc Update README.md 2020-05-14 14:46:02 +08:00
songww
56c88e2dd4 规范API格式 2020-05-14 14:41:49 +08:00
songww
42abe9a0da 修复回放、停止预览bug,增加ZLM hook监听,长时间无人观看,停止摄像头推流。需开启ZLM的hook并配置url 2020-05-14 14:19:42 +08:00
songww
c539e08a3f 优化配置 2020-05-14 09:22:30 +08:00
songww
a1c9d3f79a 增加设备删除接口,只允许删除离线设备;增加视频停止播放接口 2020-05-13 20:38:32 +08:00
songww
44790f4b79 尝试修复catalog获取失败。服务重启后设备未注册仍上报keeplive处理 2020-05-13 14:55:06 +08:00
songww
635fa15e0d Merge branch 'master' of https://github.com/swwheihei/wvp.git 2020-05-11 20:24:56 +08:00
songww
962fdcab1a 规范返回格式 2020-05-11 20:24:40 +08:00
swwheihei
a7d39b68c3 Update README.md 2020-05-11 14:38:13 +08:00
songww
e60a8e5f90 Merge branch 'master' of https://github.com/swwheihei/wvp.git 2020-05-10 22:33:57 +08:00
songww
802838a859 完善ssrc符合国标,并完善很多小问题 2020-05-10 22:33:43 +08:00
songww
0853ec60fe 完善ssrc符合国标,并完善很多小问题 2020-05-10 22:33:21 +08:00
swwheihei
d21727491a Update README.md 2020-05-09 09:08:17 +08:00
swwheihei
c0c326b83b Update README.md 2020-05-09 09:07:47 +08:00
swwheihei
37f2c214d2 Update README.md 2020-05-09 09:06:00 +08:00
swwheihei
4ba17eff35 Update README.md 2020-05-09 09:03:10 +08:00
swwheihei
0d28caaf0e Update README.md 2020-05-09 08:43:12 +08:00
songww
03c149f7be Merge branch 'master' of https://github.com/swwheihei/wvp.git 2020-05-09 08:10:52 +08:00
songww
cf91111842 标准化视频预览api 2020-05-09 08:10:38 +08:00
swwheihei
6bc0e50f1a Update README.md 2020-05-08 21:58:50 +08:00
songww
9611ae2937 Merge branch 'master' of https://github.com/swwheihei/wvp.git 2020-05-08 21:57:27 +08:00
songww
daaccbf77c 优化代码结构,提供NVR录像检索接口 2020-05-08 21:57:07 +08:00
swwheihei
dc27de7c9a Update README.md 2020-05-08 09:05:42 +08:00
songww
6dcb314600 Merge branch 'master' of https://github.com/swwheihei/wvp.git 2020-05-07 23:15:22 +08:00
songww
7836e76667 wiki图片 2020-05-07 23:15:01 +08:00
swwheihei
b72f924618 Update README.md 2020-05-07 23:11:28 +08:00
swwheihei
d5f739076f Update README.md 2020-05-07 22:59:16 +08:00
swwheihei
b6f49d3d6c Update README.md 2020-05-07 22:52:03 +08:00
swwheihei
8ad11445e4 Update README.md 2020-05-07 22:48:01 +08:00
swwheihei
426ff2ff8f Update README.md 2020-05-07 22:47:08 +08:00
swwheihei
b01c88def0 Update README.md 2020-05-07 22:46:15 +08:00
swwheihei
de0ca287b6 Create README.md 2020-05-07 22:20:05 +08:00
songww
3de226d228 Merge branch 'master' of https://github.com/swwheihei/wvp.git 2020-05-07 22:04:50 +08:00
swwheihei
1c0f46dff6 Initial commit 2020-05-07 21:51:15 +08:00
426 changed files with 34125 additions and 13099 deletions

2
.gitignore vendored
View File

@ -27,4 +27,6 @@ hs_err_pid*
/target/
/src/main/resources/static/
/web_src/node_modules/
/web_src/build/
certificates

56
app.sh Normal file
View File

@ -0,0 +1,56 @@
#!/bin/bash
cd $(dirname $0)
exe="java -jar wvp-pro-2.6.9.jar"
arg=""
status(){
count=$(ps aux|grep "$exe"|grep -v grep|wc -l)
if [ $count -eq 0 ] ; then
echo "$exe is stopped"
return
fi
echo "$exe is running"
}
start(){
count=$(ps aux|grep "$exe"|grep -v grep|wc -l)
if [ $count -eq 0 ] ; then
echo "staring $exe"
nohup $exe $arg > nohup.out 2>&1 &
sleep 1
status
exit 0
fi
status
}
stop(){
echo "kill process"
nohup pkill -f "$exe" >/dev/null 2>&1 &
sleep 1
status
}
restart(){
stop
sleep 5
start
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status;;
*)
echo "use $0 start|stop|restart|status"
esac

View File

@ -153,7 +153,7 @@ user-settings:
# 国标是否录制
record-sip: true
# 是否将日志存储进数据库
logInDatabase: true
logInDatebase: true
# 第三方匹配用于从stream钟获取有效信息
thirdPartyGBIdReg: [\s\S]*
```

Binary file not shown.

Binary file not shown.

659
pom.xml
View File

@ -1,155 +1,148 @@
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.17</version>
</parent>
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.2</version>
</parent>
<groupId>com.genersoft</groupId>
<artifactId>wvp-pro</artifactId>
<version>2.7.0</version>
<name>web video platform</name>
<description>国标28181视频平台</description>
<packaging>${project.packaging}</packaging>
<groupId>com.genersoft</groupId>
<artifactId>wvp-pro</artifactId>
<version>2.6.9</version>
<name>web video platform</name>
<description>国标28181视频平台</description>
<packaging>${project.packaging}</packaging>
<repositories>
<repository>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<repositories>
<repository>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
<pluginRepositories>
<pluginRepository>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.build.timestamp.format>MMddHHmm</maven.build.timestamp.format>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.build.timestamp.format>MMddHHmm</maven.build.timestamp.format>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<!-- 依赖版本 -->
<snippetsDirectory>${project.build.directory}/generated-snippets</snippetsDirectory>
<asciidoctor.input.directory>${project.basedir}/docs/asciidoc</asciidoctor.input.directory>
<generated.asciidoc.directory>${project.build.directory}/asciidoc</generated.asciidoc.directory>
<asciidoctor.html.output.directory>${project.build.directory}/asciidoc/html</asciidoctor.html.output.directory>
<asciidoctor.pdf.output.directory>${project.build.directory}/asciidoc/pdf</asciidoctor.pdf.output.directory>
<!-- 依赖版本 -->
<snippetsDirectory>${project.build.directory}/generated-snippets</snippetsDirectory>
<asciidoctor.input.directory>${project.basedir}/docs/asciidoc</asciidoctor.input.directory>
<generated.asciidoc.directory>${project.build.directory}/asciidoc</generated.asciidoc.directory>
<asciidoctor.html.output.directory>${project.build.directory}/asciidoc/html</asciidoctor.html.output.directory>
<asciidoctor.pdf.output.directory>${project.build.directory}/asciidoc/pdf</asciidoctor.pdf.output.directory>
<org.mapstruct.version>1.5.3.Final</org.mapstruct.version>
<springboot.version>2.7.2</springboot.version>
</properties>
</properties>
<profiles>
<profile>
<id>jar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<project.packaging>jar</project.packaging>
</properties>
</profile>
<profile>
<id>war</id>
<properties>
<project.packaging>war</project.packaging>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
</profiles>
<profiles>
<profile>
<id>jar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<project.packaging>jar</project.packaging>
</properties>
</profile>
<profile>
<id>war</id>
<properties>
<project.packaging>war</project.packaging>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.8.24</version>
</dependency>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
<exclusions>
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
<exclusions>
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mysql数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!-- mysql数据库 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.2.0</version>
</dependency>
<!--postgresql-->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.5.1</version>
</dependency>
<!--postgresql-->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.5.1</version>
</dependency>
<!-- kingbase人大金仓 -->
<!-- https://mvnrepository.com/artifact/cn.com.kingbase/kingbase8 -->
@ -159,33 +152,13 @@
<version>8.6.0</version>
</dependency>
<!--Mybatis分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
<!--在线文档 -->
<!--在线文档 -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.6.10</version>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-security</artifactId>
<version>1.6.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-spring-boot-starter -->
<!--Mybatis分页插件 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.6.1</version>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
<!--在线文档 -->
<dependency>
<groupId>org.springdoc</groupId>
@ -193,155 +166,132 @@
<version>1.6.10</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-springdoc-ui</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-springdoc-ui</artifactId>
<version>3.0.3</version>
</dependency>
<!--参数校验 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<!--参数校验 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<!-- 日志相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- 日志相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- sip协议栈 -->
<dependency>
<groupId>javax.sip</groupId>
<artifactId>jain-sip-ri</artifactId>
<version>1.3.0-91</version>
</dependency>
<!-- sip协议栈 -->
<dependency>
<groupId>javax.sip</groupId>
<artifactId>jain-sip-ri</artifactId>
<version>1.3.0-91</version>
</dependency>
<!-- 取代log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.36</version>
</dependency>
<!-- 取代log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.36</version>
</dependency>
<!-- xml解析库 -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<!-- xml解析库 -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<!-- json解析库fastjson2 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.17</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2-extension</artifactId>
<version>2.0.17</version>
</dependency>
<!-- json解析库fastjson2 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.17</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2-extension</artifactId>
<version>2.0.17</version>
</dependency>
<!-- okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
<!-- okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
<!-- okhttp 调试日志 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>4.10.0</version>
</dependency>
<!-- okhttp 调试日志 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>4.10.0</version>
</dependency>
<!-- okhttp-digest -->
<dependency>
<groupId>io.github.rburgst</groupId>
<artifactId>okhttp-digest</artifactId>
<version>2.7</version>
</dependency>
<!-- okhttp-digest -->
<dependency>
<groupId>io.github.rburgst</groupId>
<artifactId>okhttp-digest</artifactId>
<version>2.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.sf.kxml/kxml2 -->
<!-- <dependency>-->
<!-- <groupId>net.sf.kxml</groupId>-->
<!-- <artifactId>kxml2</artifactId>-->
<!-- <version>2.3.0</version>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/net.sf.kxml/kxml2 -->
<!-- <dependency>-->
<!-- <groupId>net.sf.kxml</groupId>-->
<!-- <artifactId>kxml2</artifactId>-->
<!-- <version>2.3.0</version>-->
<!-- </dependency>-->
<!-- jwt实现 -->
<dependency>
<groupId>org.bitbucket.b_c</groupId>
<artifactId>jose4j</artifactId>
<version>0.9.3</version>
</dependency>
<!-- jwt实现 -->
<dependency>
<groupId>org.bitbucket.b_c</groupId>
<artifactId>jose4j</artifactId>
<version>0.9.3</version>
</dependency>
<!--反向代理-->
<dependency>
<groupId>org.mitre.dsmiley.httpproxy</groupId>
<artifactId>smiley-http-proxy-servlet</artifactId>
<version>1.12.1</version>
</dependency>
<!--反向代理-->
<dependency>
<groupId>org.mitre.dsmiley.httpproxy</groupId>
<artifactId>smiley-http-proxy-servlet</artifactId>
<version>1.12.1</version>
</dependency>
<!--excel解析库-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.24.0</version>
</dependency>
<!--excel解析库-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
<!-- 获取系统信息 -->
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>6.2.2</version>
</dependency>
<!-- 获取系统信息 -->
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>6.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</dependency>
<!-- 检测文件编码 -->
<!-- https://mvnrepository.com/artifact/cpdetector/cpdetector -->
<!--<dependency>-->
<!-- <groupId>cpdetector</groupId>-->
<!-- <artifactId>cpdetector</artifactId>-->
<!-- <version>1.0.8</version>-->
<!--</dependency>-->
<!-- &lt;!&ndash; 检测文件编码 &ndash;&gt;-->
<!-- &lt;!&ndash; https://mvnrepository.com/artifact/cpdetector/cpdetector &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>cpdetector</groupId>-->
<!-- <artifactId>cpdetector</artifactId>-->
<!-- <version>1.0.8</version>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.3-jre</version>
</dependency>
<dependency>
<groupId>com.github.rholder</groupId>
<artifactId>guava-retrying</artifactId>
<version>2.0.0</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
<dependency>
@ -349,11 +299,31 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--&lt;!&ndash; 开发工具 &ndash;&gt;-->
<!--<dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-devtools</artifactId>-->
<!--</dependency>-->
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--MapStruct-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
@ -369,46 +339,73 @@
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<offline>true</offline>
<failOnNoGitDirectory>false</failOnNoGitDirectory>
<dateFormat>yyyyMMdd</dateFormat>
</configuration>
</plugin>
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<offline>true</offline>
<failOnNoGitDirectory>false</failOnNoGitDirectory>
<dateFormat>yyyyMMdd</dateFormat>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
<path>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${springboot.version}</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>

View File

@ -120,7 +120,7 @@ alter table device_channel
change status status bool default false;
alter table device_channel
change streamId stream_id varchar(255) null;
change streamId stream_id varchar(80) null;
alter table device_channel
change deviceId device_id varchar(50) not null;

2
sql/2.6.9更新.sql Normal file
View File

@ -0,0 +1,2 @@
alter table wvp_device_channel
change stream_id stream_id varying(255)

View File

@ -164,8 +164,6 @@ create table wvp_media_server (
create_time character varying(50),
update_time character varying(50),
hook_alive_interval integer,
record_path character varying(255),
record_day integer default 7,
constraint uk_media_server_unique_ip_http_port unique (ip, http_port)
);
@ -196,7 +194,6 @@ create table wvp_platform (
create_time character varying(50),
update_time character varying(50),
as_message_channel bool default false,
auto_push_channel bool default false,
constraint uk_platform_unique_server_gb_id unique (server_gb_id)
);
@ -246,7 +243,6 @@ create table wvp_stream_proxy (
create_time character varying(50),
name character varying(255),
update_time character varying(50),
stream_key character varying(255),
enable_disable_none_reader bool default false,
constraint uk_stream_proxy_app_stream unique (app, stream)
);
@ -261,7 +257,6 @@ create table wvp_stream_push (
create_time character varying(50),
alive_second integer,
media_server_id character varying(50),
server_id character varying(50),
push_time character varying(50),
status bool default false,
update_time character varying(50),
@ -269,22 +264,6 @@ create table wvp_stream_push (
self bool default false,
constraint uk_stream_push_app_stream unique (app, stream)
);
create table wvp_cloud_record (
id serial primary key,
app character varying(255),
stream character varying(255),
call_id character varying(255),
start_time int8,
end_time int8,
media_server_id character varying(50),
file_name character varying(255),
folder character varying(255),
file_path character varying(255),
collect bool default false,
file_size int8,
time_len int8,
constraint uk_stream_push_app_stream_path unique (app, stream, file_path)
);
create table wvp_user (
id serial primary key,

View File

@ -1,63 +1,63 @@
package com.genersoft.iot.vmp;
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.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.SessionCookieConfig;
import javax.servlet.SessionTrackingMode;
import java.util.Collections;
/**
* 启动类
*/
@ServletComponentScan("com.genersoft.iot.vmp.conf")
@SpringBootApplication
@EnableScheduling
public class VManageBootstrap extends SpringBootServletInitializer {
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() {
context.close();
VManageBootstrap.context = SpringApplication.run(VManageBootstrap.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(VManageBootstrap.class);
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.setSessionTrackingModes(
Collections.singleton(SessionTrackingMode.COOKIE)
);
SessionCookieConfig sessionCookieConfig = servletContext.getSessionCookieConfig();
sessionCookieConfig.setHttpOnly(true);
}
}
package com.genersoft.iot.vmp;
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.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.SessionCookieConfig;
import javax.servlet.SessionTrackingMode;
import java.util.Collections;
/**
* 启动类
*/
@ServletComponentScan("com.genersoft.iot.vmp.conf")
@SpringBootApplication
@EnableScheduling
public class VManageBootstrap extends SpringBootServletInitializer {
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() {
context.close();
VManageBootstrap.context = SpringApplication.run(VManageBootstrap.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(VManageBootstrap.class);
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.setSessionTrackingModes(
Collections.singleton(SessionTrackingMode.COOKIE)
);
SessionCookieConfig sessionCookieConfig = servletContext.getSessionCookieConfig();
sessionCookieConfig.setHttpOnly(true);
}
}

View File

@ -1,6 +1,5 @@
package com.genersoft.iot.vmp.common;
import com.genersoft.iot.vmp.service.bean.DownloadFileInfo;
import io.swagger.v3.oas.annotations.media.Schema;
import java.io.Serializable;
@ -77,8 +76,6 @@ public class StreamInfo implements Serializable, Cloneable{
private String endTime;
@Schema(description = "进度(录像下载使用)")
private double progress;
@Schema(description = "文件下载地址(录像下载使用)")
private DownloadFileInfo downLoadFilePath;
@Schema(description = "是否暂停(录像回放使用)")
private boolean pause;
@ -526,69 +523,6 @@ public class StreamInfo implements Serializable, Cloneable{
StreamInfo instance = null;
try{
instance = (StreamInfo)super.clone();
if (this.flv != null) {
instance.flv=this.flv.clone();
}
if (this.ws_flv != null ){
instance.ws_flv= this.ws_flv.clone();
}
if (this.hls != null ) {
instance.hls= this.hls.clone();
}
if (this.ws_hls != null ) {
instance.ws_hls= this.ws_hls.clone();
}
if (this.ts != null ) {
instance.ts= this.ts.clone();
}
if (this.ws_ts != null ) {
instance.ws_ts= this.ws_ts.clone();
}
if (this.fmp4 != null ) {
instance.fmp4= this.fmp4.clone();
}
if (this.ws_fmp4 != null ) {
instance.ws_fmp4= this.ws_fmp4.clone();
}
if (this.rtc != null ) {
instance.rtc= this.rtc.clone();
}
if (this.https_flv != null) {
instance.https_flv= this.https_flv.clone();
}
if (this.wss_flv != null) {
instance.wss_flv= this.wss_flv.clone();
}
if (this.https_hls != null) {
instance.https_hls= this.https_hls.clone();
}
if (this.wss_hls != null) {
instance.wss_hls= this.wss_hls.clone();
}
if (this.wss_ts != null) {
instance.wss_ts= this.wss_ts.clone();
}
if (this.https_fmp4 != null) {
instance.https_fmp4= this.https_fmp4.clone();
}
if (this.wss_fmp4 != null) {
instance.wss_fmp4= this.wss_fmp4.clone();
}
if (this.rtcs != null) {
instance.rtcs= this.rtcs.clone();
}
if (this.rtsp != null) {
instance.rtsp= this.rtsp.clone();
}
if (this.rtsps != null) {
instance.rtsps= this.rtsps.clone();
}
if (this.rtmp != null) {
instance.rtmp= this.rtmp.clone();
}
if (this.rtmps != null) {
instance.rtmps= this.rtmps.clone();
}
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}
@ -608,11 +542,5 @@ public class StreamInfo implements Serializable, Cloneable{
this.subStream = subStream;
}
public DownloadFileInfo getDownLoadFilePath() {
return downLoadFilePath;
}
public void setDownLoadFilePath(DownloadFileInfo downLoadFilePath) {
this.downLoadFilePath = downLoadFilePath;
}
}

View File

@ -6,7 +6,7 @@ import java.io.Serializable;
@Schema(description = "流地址信息")
public class StreamURL implements Serializable,Cloneable {
public class StreamURL implements Serializable {
@Schema(description = "协议")
private String protocol;
@ -77,8 +77,4 @@ public class StreamURL implements Serializable,Cloneable {
return null;
}
}
@Override
public StreamURL clone() throws CloneNotSupportedException {
return (StreamURL) super.clone();
}
}

View File

@ -1,177 +1,176 @@
package com.genersoft.iot.vmp.common;
/**
* @description: 定义常量
* @author: swwheihei
* @date: 2019年5月30日 下午3:04:04
*
*/
public class VideoManagerConstants {
public static final String WVP_SERVER_PREFIX = "VMP_SIGNALLING_SERVER_INFO_";
public static final String WVP_SERVER_STREAM_PREFIX = "VMP_SIGNALLING_STREAM_";
public static final String MEDIA_SERVER_PREFIX = "VMP_MEDIA_SERVER_";
public static final String MEDIA_SERVERS_ONLINE_PREFIX = "VMP_MEDIA_ONLINE_SERVERS_";
public static final String DEVICE_PREFIX = "VMP_DEVICE_";
// 设备同步完成
public static final String DEVICE_SYNC_PREFIX = "VMP_DEVICE_SYNC_";
public static final String CACHEKEY_PREFIX = "VMP_CHANNEL_";
public static final String KEEPLIVEKEY_PREFIX = "VMP_KEEPALIVE_";
// TODO 此处多了一个_暂不修改
public static final String INVITE_PREFIX = "VMP_INVITE";
public static final String PLAYER_PREFIX = "VMP_INVITE_PLAY_";
public static final String PLAY_BLACK_PREFIX = "VMP_INVITE_PLAYBACK_";
public static final String DOWNLOAD_PREFIX = "VMP_INVITE_DOWNLOAD_";
public static final String PLATFORM_KEEPALIVE_PREFIX = "VMP_PLATFORM_KEEPALIVE_";
public static final String PLATFORM_CATCH_PREFIX = "VMP_PLATFORM_CATCH_";
public static final String PLATFORM_REGISTER_PREFIX = "VMP_PLATFORM_REGISTER_";
public static final String PLATFORM_REGISTER_INFO_PREFIX = "VMP_PLATFORM_REGISTER_INFO_";
public static final String PLATFORM_SEND_RTP_INFO_PREFIX = "VMP_PLATFORM_SEND_RTP_INFO_";
public static final String EVENT_ONLINE_REGISTER = "1";
public static final String EVENT_ONLINE_MESSAGE = "3";
public static final String EVENT_OUTLINE_UNREGISTER = "1";
public static final String EVENT_OUTLINE_TIMEOUT = "2";
public static final String MEDIA_SSRC_USED_PREFIX = "VMP_MEDIA_USED_SSRC_";
public static final String MEDIA_TRANSACTION_USED_PREFIX = "VMP_MEDIA_TRANSACTION_";
public static final String MEDIA_STREAM_AUTHORITY = "VMP_MEDIA_STREAM_AUTHORITY_";
public static final String SIP_CSEQ_PREFIX = "VMP_SIP_CSEQ_";
public static final String SIP_SN_PREFIX = "VMP_SIP_SN_";
public static final String SIP_SUBSCRIBE_PREFIX = "VMP_SIP_SUBSCRIBE_";
public static final String SYSTEM_INFO_CPU_PREFIX = "VMP_SYSTEM_INFO_CPU_";
public static final String SYSTEM_INFO_MEM_PREFIX = "VMP_SYSTEM_INFO_MEM_";
public static final String SYSTEM_INFO_NET_PREFIX = "VMP_SYSTEM_INFO_NET_";
public static final String SYSTEM_INFO_DISK_PREFIX = "VMP_SYSTEM_INFO_DISK_";
public static final String REGISTER_EXPIRE_TASK_KEY_PREFIX = "VMP_device_register_expire_";
public static final String PUSH_STREAM_LIST = "VMP_PUSH_STREAM_LIST_";
//************************** redis 消息*********************************
/**
* 流变化的通知
*/
public static final String WVP_MSG_STREAM_CHANGE_PREFIX = "WVP_MSG_STREAM_CHANGE_";
/**
* 接收推流设备的GPS变化通知
*/
public static final String VM_MSG_GPS = "VM_MSG_GPS";
/**
* 接收推流设备的GPS变化通知
*/
public static final String VM_MSG_PUSH_STREAM_STATUS_CHANGE = "VM_MSG_PUSH_STREAM_STATUS_CHANGE";
/**
* 接收推流设备列表更新变化通知
*/
public static final String VM_MSG_PUSH_STREAM_LIST_CHANGE = "VM_MSG_PUSH_STREAM_LIST_CHANGE";
/**
* redis 消息通知设备推流到平台
*/
public static final String VM_MSG_STREAM_PUSH_REQUESTED = "VM_MSG_STREAM_PUSH_REQUESTED";
/**
* redis 消息通知上级平台开始观看流
*/
public static final String VM_MSG_STREAM_START_PLAY_NOTIFY = "VM_MSG_STREAM_START_PLAY_NOTIFY";
/**
* redis 消息通知上级平台停止观看流
*/
public static final String VM_MSG_STREAM_STOP_PLAY_NOTIFY = "VM_MSG_STREAM_STOP_PLAY_NOTIFY";
/**
* redis 消息接收关闭一个推流
*/
public static final String VM_MSG_STREAM_PUSH_CLOSE_REQUESTED = "VM_MSG_STREAM_PUSH_CLOSE_REQUESTED";
/**
* redis 消息通知平台通知设备推流结果
*/
public static final String VM_MSG_STREAM_PUSH_RESPONSE = "VM_MSG_STREAM_PUSH_RESPONSE";
/**
* redis 通知平台关闭推流
*/
public static final String VM_MSG_STREAM_PUSH_CLOSE = "VM_MSG_STREAM_PUSH_CLOSE";
/**
* redis 消息请求所有的在线通道
*/
public static final String VM_MSG_GET_ALL_ONLINE_REQUESTED = "VM_MSG_GET_ALL_ONLINE_REQUESTED";
/**
* 移动位置订阅通知
*/
public static final String VM_MSG_SUBSCRIBE_MOBILE_POSITION = "mobileposition";
/**
* 报警订阅的通知收到报警向redis发出通知
*/
public static final String VM_MSG_SUBSCRIBE_ALARM = "alarm";
/**
* 报警通知的发送 收到redis发出的通知转发给其他平台
*/
public static final String VM_MSG_SUBSCRIBE_ALARM_RECEIVE= "alarm_receive";
/**
* 设备状态订阅的通知
*/
public static final String VM_MSG_SUBSCRIBE_DEVICE_STATUS = "device";
//************************** 第三方 ****************************************
public static final String WVP_STREAM_GB_ID_PREFIX = "memberNo_";
public static final String WVP_STREAM_GPS_MSG_PREFIX = "WVP_STREAM_GPS_MSG_";
public static final String WVP_OTHER_SEND_RTP_INFO = "VMP_OTHER_SEND_RTP_INFO_";
public static final String WVP_OTHER_SEND_PS_INFO = "VMP_OTHER_SEND_PS_INFO_";
public static final String WVP_OTHER_RECEIVE_RTP_INFO = "VMP_OTHER_RECEIVE_RTP_INFO_";
public static final String WVP_OTHER_RECEIVE_PS_INFO = "VMP_OTHER_RECEIVE_PS_INFO_";
/**
* Redis Const
* 设备录像信息结果前缀
*/
public static final String REDIS_RECORD_INFO_RES_PRE = "GB_RECORD_INFO_RES_";
/**
* Redis Const
* 设备录像信息结果前缀
*/
public static final String REDIS_RECORD_INFO_RES_COUNT_PRE = "GB_RECORD_INFO_RES_COUNT:";
}
package com.genersoft.iot.vmp.common;
/**
* @description: 定义常量
* @author: swwheihei
* @date: 2019年5月30日 下午3:04:04
*
*/
public class VideoManagerConstants {
public static final String WVP_SERVER_PREFIX = "VMP_SIGNALLING_SERVER_INFO_";
public static final String WVP_SERVER_STREAM_PREFIX = "VMP_SIGNALLING_STREAM_";
public static final String MEDIA_SERVER_PREFIX = "VMP_MEDIA_SERVER_";
public static final String MEDIA_SERVERS_ONLINE_PREFIX = "VMP_MEDIA_ONLINE_SERVERS_";
public static final String DEVICE_PREFIX = "VMP_DEVICE_";
// 设备同步完成
public static final String DEVICE_SYNC_PREFIX = "VMP_DEVICE_SYNC_";
public static final String CACHEKEY_PREFIX = "VMP_CHANNEL_";
public static final String KEEPLIVEKEY_PREFIX = "VMP_KEEPALIVE_";
// TODO 此处多了一个_暂不修改
public static final String INVITE_PREFIX = "VMP_INVITE";
public static final String PLAYER_PREFIX = "VMP_INVITE_PLAY_";
public static final String PLAY_BLACK_PREFIX = "VMP_INVITE_PLAYBACK_";
public static final String DOWNLOAD_PREFIX = "VMP_INVITE_DOWNLOAD_";
public static final String PLATFORM_KEEPALIVE_PREFIX = "VMP_PLATFORM_KEEPALIVE_";
public static final String PLATFORM_CATCH_PREFIX = "VMP_PLATFORM_CATCH_";
public static final String PLATFORM_REGISTER_PREFIX = "VMP_PLATFORM_REGISTER_";
public static final String PLATFORM_REGISTER_INFO_PREFIX = "VMP_PLATFORM_REGISTER_INFO_";
public static final String PLATFORM_SEND_RTP_INFO_PREFIX = "VMP_PLATFORM_SEND_RTP_INFO_";
public static final String EVENT_ONLINE_REGISTER = "1";
public static final String EVENT_ONLINE_MESSAGE = "3";
public static final String EVENT_OUTLINE_UNREGISTER = "1";
public static final String EVENT_OUTLINE_TIMEOUT = "2";
public static final String MEDIA_SSRC_USED_PREFIX = "VMP_MEDIA_USED_SSRC_";
public static final String MEDIA_TRANSACTION_USED_PREFIX = "VMP_MEDIA_TRANSACTION_";
public static final String MEDIA_STREAM_AUTHORITY = "MEDIA_STREAM_AUTHORITY_";
public static final String SIP_CSEQ_PREFIX = "VMP_SIP_CSEQ_";
public static final String SIP_SN_PREFIX = "VMP_SIP_SN_";
public static final String SIP_SUBSCRIBE_PREFIX = "VMP_SIP_SUBSCRIBE_";
public static final String SYSTEM_INFO_CPU_PREFIX = "VMP_SYSTEM_INFO_CPU_";
public static final String SYSTEM_INFO_MEM_PREFIX = "VMP_SYSTEM_INFO_MEM_";
public static final String SYSTEM_INFO_NET_PREFIX = "VMP_SYSTEM_INFO_NET_";
public static final String SYSTEM_INFO_DISK_PREFIX = "VMP_SYSTEM_INFO_DISK_";
public static final String REGISTER_EXPIRE_TASK_KEY_PREFIX = "VMP_device_register_expire_";
//************************** redis 消息*********************************
/**
* 流变化的通知
*/
public static final String WVP_MSG_STREAM_CHANGE_PREFIX = "WVP_MSG_STREAM_CHANGE_";
/**
* 接收推流设备的GPS变化通知
*/
public static final String VM_MSG_GPS = "VM_MSG_GPS";
/**
* 接收推流设备的GPS变化通知
*/
public static final String VM_MSG_PUSH_STREAM_STATUS_CHANGE = "VM_MSG_PUSH_STREAM_STATUS_CHANGE";
/**
* 接收推流设备列表更新变化通知
*/
public static final String VM_MSG_PUSH_STREAM_LIST_CHANGE = "VM_MSG_PUSH_STREAM_LIST_CHANGE";
/**
* redis 消息通知设备推流到平台
*/
public static final String VM_MSG_STREAM_PUSH_REQUESTED = "VM_MSG_STREAM_PUSH_REQUESTED";
/**
* redis 消息通知上级平台开始观看流
*/
public static final String VM_MSG_STREAM_START_PLAY_NOTIFY = "VM_MSG_STREAM_START_PLAY_NOTIFY";
/**
* redis 消息通知上级平台停止观看流
*/
public static final String VM_MSG_STREAM_STOP_PLAY_NOTIFY = "VM_MSG_STREAM_STOP_PLAY_NOTIFY";
/**
* redis 消息接收关闭一个推流
*/
public static final String VM_MSG_STREAM_PUSH_CLOSE_REQUESTED = "VM_MSG_STREAM_PUSH_CLOSE_REQUESTED";
/**
* redis 消息通知平台通知设备推流结果
*/
public static final String VM_MSG_STREAM_PUSH_RESPONSE = "VM_MSG_STREAM_PUSH_RESPONSE";
/**
* redis 通知平台关闭推流
*/
public static final String VM_MSG_STREAM_PUSH_CLOSE = "VM_MSG_STREAM_PUSH_CLOSE";
/**
* redis 消息请求所有的在线通道
*/
public static final String VM_MSG_GET_ALL_ONLINE_REQUESTED = "VM_MSG_GET_ALL_ONLINE_REQUESTED";
/**
* 移动位置订阅通知
*/
public static final String VM_MSG_SUBSCRIBE_MOBILE_POSITION = "mobileposition";
/**
* 报警订阅的通知收到报警向redis发出通知
*/
public static final String VM_MSG_SUBSCRIBE_ALARM = "alarm";
/**
* 报警通知的发送 收到redis发出的通知转发给其他平台
*/
public static final String VM_MSG_SUBSCRIBE_ALARM_RECEIVE= "alarm_receive";
/**
* 设备状态订阅的通知
*/
public static final String VM_MSG_SUBSCRIBE_DEVICE_STATUS = "device";
//************************** 第三方 ****************************************
public static final String WVP_STREAM_GB_ID_PREFIX = "memberNo_";
public static final String WVP_STREAM_GPS_MSG_PREFIX = "WVP_STREAM_GPS_MSG_";
public static final String WVP_OTHER_SEND_RTP_INFO = "VMP_OTHER_SEND_RTP_INFO_";
public static final String WVP_OTHER_SEND_PS_INFO = "VMP_OTHER_SEND_PS_INFO_";
public static final String WVP_OTHER_RECEIVE_RTP_INFO = "VMP_OTHER_RECEIVE_RTP_INFO_";
public static final String WVP_OTHER_RECEIVE_PS_INFO = "VMP_OTHER_RECEIVE_PS_INFO_";
/**
* Redis Const
* 设备录像信息结果前缀
*/
public static final String REDIS_RECORD_INFO_RES_PRE = "GB_RECORD_INFO_RES_";
/**
* Redis Const
* 设备录像信息结果前缀
*/
public static final String REDIS_RECORD_INFO_RES_COUNT_PRE = "GB_RECORD_INFO_RES_COUNT:";
}

View File

@ -51,7 +51,7 @@ public class ApiAccessFilter extends OncePerRequestFilter {
filterChain.doFilter(servletRequest, servletResponse);
if (uriName != null && userSetting != null && userSetting.getLogInDatabase() != null && userSetting.getLogInDatabase()) {
if (uriName != null && userSetting != null && userSetting.getLogInDatebase() != null && userSetting.getLogInDatebase()) {
LogDto logDto = new LogDto();
logDto.setName(uriName);

View File

@ -12,10 +12,7 @@ import org.springframework.core.annotation.Order;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.ObjectUtils;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.*;
import java.nio.file.Files;
import java.util.Map;

View File

@ -1,83 +0,0 @@
package com.genersoft.iot.vmp.conf;
import com.alibaba.fastjson2.JSONObject;
import com.genersoft.iot.vmp.media.zlm.AssistRESTfulUtils;
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.service.IMediaServerService;
import com.genersoft.iot.vmp.service.bean.CloudRecordItem;
import com.genersoft.iot.vmp.storager.dao.CloudRecordServiceMapper;
import com.genersoft.iot.vmp.vmanager.cloudRecord.CloudRecordController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* 录像文件定时删除
*/
@Component
public class CloudRecordTimer {
private final static Logger logger = LoggerFactory.getLogger(CloudRecordTimer.class);
@Autowired
private IMediaServerService mediaServerService;
@Autowired
private CloudRecordServiceMapper cloudRecordServiceMapper;
@Autowired
private ZLMRESTfulUtils zlmresTfulUtils;
/**
* 定时查询待删除的录像文件
*/
// @Scheduled(fixedRate = 10000) //每五秒执行一次方便测试
@Scheduled(cron = "0 0 0 * * ?") //每天的0点执行
public void execute(){
logger.info("[录像文件定时清理] 开始清理过期录像文件");
// 获取配置了assist的流媒体节点
List<MediaServerItem> mediaServerItemList = mediaServerService.getAllOnline();
if (mediaServerItemList.isEmpty()) {
return;
}
long result = 0;
for (MediaServerItem mediaServerItem : mediaServerItemList) {
Calendar lastCalendar = Calendar.getInstance();
if (mediaServerItem.getRecordDay() > 0) {
lastCalendar.setTime(new Date());
// 获取保存的最后截至日[因为每个节点都有一个日期也就是支持每个节点设置不同的保存日期
lastCalendar.add(Calendar.DAY_OF_MONTH, -mediaServerItem.getRecordDay());
Long lastDate = lastCalendar.getTimeInMillis();
// 获取到截至日期之前的录像文件列表文件列表满足未被收藏和保持的这两个字段目前共能一致
// 为我自己业务系统相关的代码大家使用的时候直接使用收藏collect这一个类型即可
List<CloudRecordItem> cloudRecordItemList = cloudRecordServiceMapper.queryRecordListForDelete(lastDate, mediaServerItem.getId());
if (cloudRecordItemList.isEmpty()) {
continue;
}
// TODO 后续可以删除空了的过期日期文件夹
for (CloudRecordItem cloudRecordItem : cloudRecordItemList) {
String date = new File(cloudRecordItem.getFilePath()).getParentFile().getName();
JSONObject jsonObject = zlmresTfulUtils.deleteRecordDirectory(mediaServerItem, cloudRecordItem.getApp(),
cloudRecordItem.getStream(), date, cloudRecordItem.getFileName());
if (jsonObject.getInteger("code") != 0) {
logger.warn("[录像文件定时清理] 删除磁盘文件错误: {}:{}", cloudRecordItem.getFilePath(), jsonObject);
}
}
result += cloudRecordServiceMapper.deleteList(cloudRecordItemList);
}
}
logger.info("[录像文件定时清理] 共清理{}个过期录像文件", result);
}
}

View File

@ -1,5 +1,6 @@
package com.genersoft.iot.vmp.conf;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -20,10 +21,8 @@ import java.util.concurrent.TimeUnit;
* @author lin
*/
@Component
@Slf4j
public class DynamicTask {
private final Logger logger = LoggerFactory.getLogger(DynamicTask.class);
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
private final Map<String, ScheduledFuture<?>> futureMap = new ConcurrentHashMap<>();
@ -52,9 +51,9 @@ public class DynamicTask {
ScheduledFuture<?> future = futureMap.get(key);
if (future != null) {
if (future.isCancelled()) {
logger.debug("任务【{}】已存在但是关闭状态!!!", key);
log.debug("任务【{}】已存在但是关闭状态!!!", key);
} else {
logger.debug("任务【{}】已存在且已启动!!!", key);
log.debug("任务【{}】已存在且已启动!!!", key);
return;
}
}
@ -63,9 +62,9 @@ public class DynamicTask {
if (future != null){
futureMap.put(key, future);
runnableMap.put(key, task);
logger.debug("任务【{}】启动成功!!!", key);
log.debug("任务【{}】启动成功!!!", key);
}else {
logger.debug("任务【{}】启动失败!!!", key);
log.debug("任务【{}】启动失败!!!", key);
}
}
@ -85,12 +84,12 @@ public class DynamicTask {
// 获取执行的时刻
Instant startInstant = Instant.now().plusMillis(TimeUnit.MILLISECONDS.toMillis(delay));
ScheduledFuture future = futureMap.get(key);
ScheduledFuture<?> future = futureMap.get(key);
if (future != null) {
if (future.isCancelled()) {
logger.debug("任务【{}】已存在但是关闭状态!!!", key);
log.debug("任务【{}】已存在但是关闭状态!!!", key);
} else {
logger.debug("任务【{}】已存在且已启动!!!", key);
log.debug("任务【{}】已存在且已启动!!!", key);
return;
}
}
@ -99,9 +98,9 @@ public class DynamicTask {
if (future != null){
futureMap.put(key, future);
runnableMap.put(key, task);
logger.debug("任务【{}】启动成功!!!", key);
log.debug("任务【{}】启动成功!!!", key);
}else {
logger.debug("任务【{}】启动失败!!!", key);
log.debug("任务【{}】启动失败!!!", key);
}
}
@ -111,7 +110,7 @@ public class DynamicTask {
}
boolean result = false;
if (!ObjectUtils.isEmpty(futureMap.get(key)) && !futureMap.get(key).isCancelled() && !futureMap.get(key).isDone()) {
result = futureMap.get(key).cancel(false);
result = futureMap.get(key).cancel(true);
futureMap.remove(key);
runnableMap.remove(key);
}
@ -143,8 +142,7 @@ public class DynamicTask {
public void execute(){
if (futureMap.size() > 0) {
for (String key : futureMap.keySet()) {
ScheduledFuture<?> future = futureMap.get(key);
if (future.isDone() || future.isCancelled()) {
if (futureMap.get(key).isDone() || futureMap.get(key).isCancelled()) {
futureMap.remove(key);
runnableMap.remove(key);
}

View File

@ -86,12 +86,6 @@ public class MediaConfig{
@Value("${media.record-assist-port:0}")
private Integer recordAssistPort = 0;
@Value("${media.record-day:7}")
private Integer recordDay;
@Value("${media.record-path:}")
private String recordPath;
public String getId() {
return id;
}
@ -224,32 +218,13 @@ public class MediaConfig{
mediaServerItem.setRecordAssistIp(recordAssistIp);
mediaServerItem.setRecordAssistPort(recordAssistPort);
mediaServerItem.setHookAliveInterval(30.00f);
mediaServerItem.setRecordDay(recordDay);
if (recordPath != null) {
mediaServerItem.setRecordPath(recordPath);
}
mediaServerItem.setCreateTime(DateUtil.getNow());
mediaServerItem.setUpdateTime(DateUtil.getNow());
return mediaServerItem;
}
public Integer getRecordDay() {
return recordDay;
}
public void setRecordDay(Integer recordDay) {
this.recordDay = recordDay;
}
public String getRecordPath() {
return recordPath;
}
public void setRecordPath(String recordPath) {
this.recordPath = recordPath;
}
public String getRtpSendPortRange() {
return rtpSendPortRange;
}

View File

@ -18,7 +18,6 @@ import org.springframework.util.ObjectUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.ConnectException;
@ -65,18 +64,6 @@ public class ProxyServletConfig {
return queryStr;
}
@Override
protected HttpResponse doExecute(HttpServletRequest servletRequest, HttpServletResponse servletResponse,
HttpRequest proxyRequest) throws IOException {
HttpResponse response = super.doExecute(servletRequest, servletResponse, proxyRequest);
response.removeHeaders("Access-Control-Allow-Origin");
response.setHeader("Access-Control-Allow-Credentials","true");
response.removeHeaders("Access-Control-Allow-Credentials");
return response;
}
/**
* 异常处理
*/
@ -194,18 +181,6 @@ public class ProxyServletConfig {
return queryStr;
}
@Override
protected HttpResponse doExecute(HttpServletRequest servletRequest, HttpServletResponse servletResponse,
HttpRequest proxyRequest) throws IOException {
HttpResponse response = super.doExecute(servletRequest, servletResponse, proxyRequest);
String origin = servletRequest.getHeader("origin");
response.setHeader("Access-Control-Allow-Origin",origin);
response.setHeader("Access-Control-Allow-Credentials","true");
return response;
}
/**
* 异常处理
*/

View File

@ -4,11 +4,8 @@ import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
import com.genersoft.iot.vmp.service.IPlatformService;
import com.genersoft.iot.vmp.service.impl.PlatformServiceImpl;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
@ -36,7 +33,6 @@ public class SipPlatformRunner implements CommandLineRunner {
@Autowired
private ISIPCommanderForPlatform sipCommanderForPlatform;
private final static Logger logger = LoggerFactory.getLogger(PlatformServiceImpl.class);
@Override
public void run(String... args) throws Exception {
@ -54,15 +50,9 @@ public class SipPlatformRunner implements CommandLineRunner {
redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch);
if (parentPlatformCatchOld != null) {
// 取消订阅
try {
sipCommanderForPlatform.unregister(parentPlatform, parentPlatformCatchOld.getSipTransactionInfo(), null, (eventResult)->{
platformService.login(parentPlatform);
});
} catch (Exception e) {
logger.error("[命令发送失败] 国标级联 注销: {}", e.getMessage());
platformService.offline(parentPlatform, true);
continue;
}
sipCommanderForPlatform.unregister(parentPlatform, parentPlatformCatchOld.getSipTransactionInfo(), null, (eventResult)->{
platformService.login(parentPlatform);
});
}
// 设置所有平台离线

View File

@ -1,12 +1,9 @@
package com.genersoft.iot.vmp.conf;
import com.genersoft.iot.vmp.conf.security.JwtUtils;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.core.annotation.Order;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.beans.factory.annotation.Value;
@ -29,14 +26,10 @@ public class SpringDocConfig {
contact.setName("pan");
contact.setEmail("648540858@qq.com");
return new OpenAPI()
.components(new Components()
.addSecuritySchemes(JwtUtils.HEADER, new SecurityScheme()
.type(SecurityScheme.Type.HTTP)
.bearerFormat("JWT")))
.info(new Info().title("WVP-PRO 接口文档")
.contact(contact)
.description("开箱即用的28181协议视频平台")
.version("v3.1.0")
.version("v2.0")
.license(new License().name("Apache 2.0").url("http://springdoc.org")));
}

View File

@ -39,6 +39,4 @@ public class SystemInfoTimerTask {
}
}
}

View File

@ -1,7 +1,5 @@
package com.genersoft.iot.vmp.conf;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@ -16,9 +14,6 @@ import java.util.List;
@ConfigurationProperties(prefix = "user-settings", ignoreInvalidFields = true)
@Order(0)
public class UserSetting {
@Getter
@Setter
private Boolean disableRealtimePlay = Boolean.FALSE;
private Boolean savePositionHistory = Boolean.FALSE;
@ -28,7 +23,7 @@ public class UserSetting {
private Integer playTimeout = 18000;
private int platformPlayTimeout = 20000;
private int platformPlayTimeout = 60000;
private Boolean interfaceAuthentication = Boolean.TRUE;
@ -36,7 +31,7 @@ public class UserSetting {
private Boolean recordSip = Boolean.TRUE;
private Boolean logInDatabase = Boolean.TRUE;
private Boolean logInDatebase = Boolean.TRUE;
private Boolean usePushingAsStatus = Boolean.TRUE;
@ -56,11 +51,13 @@ public class UserSetting {
private Boolean refuseChannelStatusChannelFormNotify = Boolean.FALSE;
private Boolean deviceStatusNotify = Boolean.TRUE;
private Boolean deviceStatusNotify = Boolean.FALSE;
private Boolean useCustomSsrcForParentInvite = Boolean.TRUE;
private String serverId = "000000";
private String recordPath = null;
private String thirdPartyGBIdReg = "[\\s\\S]*";
private String civilCodeFile = "classpath:civilCode.csv";
@ -135,12 +132,12 @@ public class UserSetting {
this.interfaceAuthenticationExcludes = interfaceAuthenticationExcludes;
}
public Boolean getLogInDatabase() {
return logInDatabase;
public Boolean getLogInDatebase() {
return logInDatebase;
}
public void setLogInDatabase(Boolean logInDatabase) {
this.logInDatabase = logInDatabase;
public void setLogInDatebase(Boolean logInDatebase) {
this.logInDatebase = logInDatebase;
}
public String getServerId() {
@ -255,6 +252,14 @@ public class UserSetting {
this.refuseChannelStatusChannelFormNotify = refuseChannelStatusChannelFormNotify;
}
public String getRecordPath() {
return recordPath;
}
public void setRecordPath(String recordPath) {
this.recordPath = recordPath;
}
public int getMaxNotifyCountQueue() {
return maxNotifyCountQueue;
}

View File

@ -78,7 +78,6 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
// 构建UsernamePasswordAuthenticationToken,这里密码为null是因为提供了正确的JWT,实现自动登录
User user = new User();
user.setId(jwtUser.getUserId());
user.setUsername(jwtUser.getUserName());
user.setPassword(jwtUser.getPassword());
Role role = new Role();

View File

@ -1,10 +1,8 @@
package com.genersoft.iot.vmp.conf.security;
import com.genersoft.iot.vmp.conf.security.dto.JwtUser;
import com.genersoft.iot.vmp.service.IUserService;
import com.genersoft.iot.vmp.storager.dao.dto.User;
import org.jose4j.json.JsonUtil;
import org.jose4j.jwk.RsaJsonWebKey;
import org.jose4j.jwk.RsaJwkGenerator;
import org.jose4j.jws.AlgorithmIdentifiers;
import org.jose4j.jws.JsonWebSignature;
import org.jose4j.jwt.JwtClaims;
@ -16,69 +14,45 @@ import org.jose4j.jwt.consumer.JwtConsumerBuilder;
import org.jose4j.lang.JoseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.security.PrivateKey;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
@Component
public class JwtUtils implements InitializingBean {
public class JwtUtils {
private static final Logger logger = LoggerFactory.getLogger(JwtUtils.class);
public static final String HEADER = "access-token";
private static final String HEADER = "access-token";
private static final String AUDIENCE = "Audience";
private static final long EXPIRED_THRESHOLD = 10 * 60;
private static final String keyId = "3e79646c4dbc408383a9eed09f2b85ae";
private static final String privateKeyStr = "{\"kty\":\"RSA\",\"kid\":\"3e79646c4dbc408383a9eed09f2b85ae\",\"alg\":\"RS256\",\"n\":\"gndmVdiOTSJ5et2HIeTM5f1m61x5ojLUi5HDfvr-jRrESQ5kbKuySGHVwR4QhwinpY1wQqBnwc80tx7cb_6SSqsTOoGln6T_l3k2Pb54ClVnGWiW_u1kmX78V2TZOsVmZmwtdZCMi-2zWIyAdIEXE-gncIehoAgEoq2VAhaCURbJWro_EwzzQwNmCTkDodLAx4npXRd_qSu0Ayp0txym9OFovBXBULRvk4DPiy3i_bPUmCDxzC46pTtFOe9p82uybTehZfULZtXXqRm85FL9n5zkrsTllPNAyEGhgb0RK9sE5nK1m_wNNysDyfLC4EFf1VXTrKm14XNVjc2vqLb7Mw\",\"e\":\"AQAB\",\"d\":\"ed7U_k3rJ4yTk70JtRSIfjKGiEb67BO1TabcymnljKO7RU8nage84zZYuSu_XpQsHk6P1f0Gzxkicghm_Er-FrfVn2pp70Xu52z3yRd6BJUgWLDFk97ngScIyw5OiULKU9SrZk2frDpftNCSUcIgb50F8m0QAnBa_CdPsQKbuuhLv8V8tBAV7F_lAwvSBgu56wRo3hPz5dWH8YeXM7XBfQ9viFMNEKd21sP_j5C7ueUnXT66nBxe3ZJEU3iuMYM6D6dB_KW2GfZC6WmTgvGhhxJD0h7aYmfjkD99MDleB7SkpbvoODOqiQ5Epb7Nyh6kv5u4KUv2CJYtATLZkUeMkQ\",\"p\":\"uBUjWPWtlGksmOqsqCNWksfqJvMcnP_8TDYN7e4-WnHL4N-9HjRuPDnp6kHvCIEi9SEfxm7gNxlRcWegvNQr3IZCz7TnCTexXc5NOklB9OavWFla6u-s3Thn6Tz45-EUjpJr0VJMxhO-KxGmuTwUXBBp4vN6K2qV6rQNFmgkWzk\",\"q\":\"tW_i7cCec56bHkhITL_79dXHz_PLC_f7xlynmlZJGU_d6mqOKmLBNBbTMLnYW8uAFiFzWxDeDHh1o5uF0mSQR-Z1Fg35OftnpbWpy0Cbc2la5WgXQjOwtG1eLYIY2BD3-wQ1VYDBCvowr4FDi-sngxwLqvwmrJ0xjhi99O-Gzcs\",\"dp\":\"q1d5jE85Hz_6M-eTh_lEluEf0NtPEc-vvhw-QO4V-cecNpbrCBdTWBmr4dE3NdpFeJc5ZVFEv-SACyei1MBEh0ItI_pFZi4BmMfy2ELh8ptaMMkTOESYyVy8U7veDq9RnBcr5i1Nqr0rsBkA77-9T6gzdvycBZdzLYAkAmwzEvk\",\"dq\":\"q29A2K08Crs-jmp2Bi8Q_8QzvIX6wSBbwZ4ir24AO-5_HNP56IrPS0yV2GCB0pqCOGb6_Hz_koDvhtuYoqdqvMVAtMoXR3YJBUaVXPt65p4RyNmFwIPe31zHs_BNUTsXVRMw4c16mci03-Af1sEm4HdLfxAp6sfM3xr5wcnhcek\",\"qi\":\"rHPgVTyHUHuYzcxfouyBfb1XAY8nshwn0ddo81o1BccD4Z7zo5It6SefDHjxCAbcmbiCcXBSooLcY-NF5FMv3fg19UE21VyLQltHcVjRRp2tRs4OHcM8yaXIU2x6N6Z6BP2tOksHb9MOBY1wAQzFOAKg_G4Sxev6-_6ud6RISuc\"}";
private static final String publicKeyStr = "{\"kty\":\"RSA\",\"kid\":\"3e79646c4dbc408383a9eed09f2b85ae\",\"alg\":\"RS256\",\"n\":\"gndmVdiOTSJ5et2HIeTM5f1m61x5ojLUi5HDfvr-jRrESQ5kbKuySGHVwR4QhwinpY1wQqBnwc80tx7cb_6SSqsTOoGln6T_l3k2Pb54ClVnGWiW_u1kmX78V2TZOsVmZmwtdZCMi-2zWIyAdIEXE-gncIehoAgEoq2VAhaCURbJWro_EwzzQwNmCTkDodLAx4npXRd_qSu0Ayp0txym9OFovBXBULRvk4DPiy3i_bPUmCDxzC46pTtFOe9p82uybTehZfULZtXXqRm85FL9n5zkrsTllPNAyEGhgb0RK9sE5nK1m_wNNysDyfLC4EFf1VXTrKm14XNVjc2vqLb7Mw\",\"e\":\"AQAB\"}";
/**
* token过期时间(分钟)
*/
public static final long expirationTime = 30 * 24 * 60;
public static final long expirationTime = 30;
private static RsaJsonWebKey rsaJsonWebKey;
private static IUserService userService;
@Resource
public void setUserService(IUserService userService) {
JwtUtils.userService = userService;
}
@Override
public void afterPropertiesSet() {
public static String createToken(String username, String password, Integer roleId) {
try {
rsaJsonWebKey = generateRsaJsonWebKey();
} catch (JoseException e) {
logger.error("生成RsaJsonWebKey报错。", e);
}
}
/**
* 创建密钥对
* @throws JoseException JoseException
*/
private RsaJsonWebKey generateRsaJsonWebKey() throws JoseException {
// 生成一个RSA密钥对该密钥对将用于JWT的签名和验证包装在JWK中
RsaJsonWebKey rsaJsonWebKey = RsaJwkGenerator.generateJwk(2048);
// 给JWK一个密钥ID
rsaJsonWebKey.setKeyId(keyId);
return rsaJsonWebKey;
}
public static String createToken(String username) {
try {
/*
/**
* iss (issuer) 发行人
*
* sub (subject) 主题
*
* aud (audience) 接收方 用户
*
* exp (expiration time) 到期时间
*
* nbf (not before) 在此之前不可用
*
* iat (issued at) jwt的签发时间
*/
//Payload
JwtClaims claims = new JwtClaims();
claims.setGeneratedJwtId();
claims.setIssuedAtToNow();
@ -88,7 +62,9 @@ public class JwtUtils implements InitializingBean {
claims.setSubject("login");
claims.setAudience(AUDIENCE);
//添加自定义参数,必须是字符串类型
claims.setClaim("userName", username);
claims.setClaim("username", username);
claims.setClaim("password", password);
claims.setClaim("roleId", roleId);
//jws
JsonWebSignature jws = new JsonWebSignature();
@ -97,10 +73,12 @@ public class JwtUtils implements InitializingBean {
jws.setKeyIdHeaderValue(keyId);
jws.setPayload(claims.toJson());
jws.setKey(rsaJsonWebKey.getPrivateKey());
PrivateKey privateKey = new RsaJsonWebKey(JsonUtil.parseJson(privateKeyStr)).getPrivateKey();
jws.setKey(privateKey);
//get token
return jws.getCompactSerialization();
String idToken = jws.getCompactSerialization();
return idToken;
} catch (JoseException e) {
logger.error("[Token生成失败] {}", e.getMessage());
}
@ -112,6 +90,7 @@ public class JwtUtils implements InitializingBean {
return HEADER;
}
public static JwtUser verifyToken(String token) {
JwtUser jwtUser = new JwtUser();
@ -124,7 +103,7 @@ public class JwtUtils implements InitializingBean {
.setRequireSubject()
//.setExpectedIssuer("")
.setExpectedAudience(AUDIENCE)
.setVerificationKey(rsaJsonWebKey.getPublicKey())
.setVerificationKey(new RsaJsonWebKey(JsonUtil.parseJson(publicKeyStr)).getPublicKey())
.build();
JwtClaims claims = consumer.processToClaims(token);
@ -134,27 +113,26 @@ public class JwtUtils implements InitializingBean {
long timeRemaining = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8)) - expirationTime.getValue();
if (timeRemaining < 5 * 60) {
jwtUser.setStatus(JwtUser.TokenStatus.EXPIRING_SOON);
} else {
}else {
jwtUser.setStatus(JwtUser.TokenStatus.NORMAL);
}
String username = (String) claims.getClaimValue("userName");
User user = userService.getUserByUsername(username);
String username = (String) claims.getClaimValue("username");
String password = (String) claims.getClaimValue("password");
Long roleId = (Long) claims.getClaimValue("roleId");
jwtUser.setUserName(username);
jwtUser.setPassword(user.getPassword());
jwtUser.setRoleId(user.getRole().getId());
jwtUser.setUserId(user.getId());
jwtUser.setPassword(password);
jwtUser.setRoleId(roleId.intValue());
return jwtUser;
} catch (InvalidJwtException e) {
if (e.hasErrorCode(ErrorCodes.EXPIRED)) {
jwtUser.setStatus(JwtUser.TokenStatus.EXPIRED);
} else {
}else {
jwtUser.setStatus(JwtUser.TokenStatus.EXCEPTION);
}
return jwtUser;
} catch (Exception e) {
}catch (Exception e) {
logger.error("[Token解析失败] {}", e.getMessage());
jwtUser.setStatus(JwtUser.TokenStatus.EXPIRED);
return jwtUser;

View File

@ -0,0 +1,21 @@
package com.genersoft.iot.vmp.conf.security;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
@Component
@SuppressWarnings({"unused"})
@RequiredArgsConstructor
public class RequestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("{} 访问 {}",request.getRemoteHost(), request.getRequestURI());
return true;
}
}

View File

@ -0,0 +1,21 @@
package com.genersoft.iot.vmp.conf.security;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Slf4j
@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
private final RequestInterceptor requestInterceptor;
@Override
public void addInterceptors(@NotNull InterceptorRegistry registry) {
registry.addInterceptor(requestInterceptor)
.excludePathPatterns("/index/hook/**","/static/**")
.addPathPatterns("/**");
}
}

View File

@ -1,12 +1,12 @@
package com.genersoft.iot.vmp.conf.security;
import com.genersoft.iot.vmp.conf.UserSetting;
import org.springframework.core.annotation.Order;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
@ -25,11 +25,9 @@ import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
/**
* 配置Spring Security
*
* @author lin
*/
@Configuration
@ -69,8 +67,6 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
matchers.add("/");
matchers.add("/#/**");
matchers.add("/static/**");
matchers.add("/swagger-ui.html");
matchers.add("/swagger-ui/");
matchers.add("/index.html");
matchers.add("/doc.html");
matchers.add("/webjars/**");
@ -79,8 +75,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
matchers.add("/js/**");
matchers.add("/api/device/query/snap/**");
matchers.add("/record_proxy/*/**");
matchers.add("/api/emit");
matchers.add("/favicon.ico");
matchers.addAll(userSetting.getInterfaceAuthenticationExcludes());
// 可以直接访问的静态数据
web.ignoring().antMatchers(matchers.toArray(new String[0]));
}
@ -88,7 +83,6 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 配置认证方式
*
* @param auth
* @throws Exception
*/
@ -117,7 +111,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
.authorizeRequests()
.requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
.antMatchers(userSetting.getInterfaceAuthenticationExcludes().toArray(new String[0])).permitAll()
.antMatchers("/api/user/login", "/index/hook/**", "/swagger-ui/**", "/doc.html").permitAll()
.antMatchers("/api/user/login","/index/hook/**","/zlm_Proxy/FhTuMYqB2HeCuNOb/record/t/1/2023-03-25/16:35:07-16:35:16-9353.mp4").permitAll()
.anyRequest().authenticated()
// 异常处理器
.and()
@ -130,24 +124,18 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
}
CorsConfigurationSource configurationSource() {
CorsConfigurationSource configurationSource(){
// 配置跨域
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowedHeaders(Arrays.asList("*"));
corsConfiguration.setAllowedMethods(Arrays.asList("*"));
corsConfiguration.setMaxAge(3600L);
if (userSetting.getAllowedOrigins() != null && !userSetting.getAllowedOrigins().isEmpty()) {
corsConfiguration.setAllowCredentials(true);
corsConfiguration.setAllowedOrigins(userSetting.getAllowedOrigins());
}else {
corsConfiguration.setAllowCredentials(false);
corsConfiguration.setAllowedOrigins(Collections.singletonList(CorsConfiguration.ALL));
}
corsConfiguration.setAllowCredentials(true);
corsConfiguration.setAllowedOrigins(userSetting.getAllowedOrigins());
corsConfiguration.setExposedHeaders(Arrays.asList(JwtUtils.getHeader()));
UrlBasedCorsConfigurationSource url = new UrlBasedCorsConfigurationSource();
url.registerCorsConfiguration("/**", corsConfiguration);
url.registerCorsConfiguration("/**",corsConfiguration);
return url;
}

View File

@ -21,7 +21,6 @@ public class JwtUser {
EXCEPTION
}
private int userId;
private String userName;
private String password;
@ -30,14 +29,6 @@ public class JwtUser {
private TokenStatus status;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}

View File

@ -1,141 +1,141 @@
package com.genersoft.iot.vmp.gb28181;
import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.GbStringMsgParserFactory;
import com.genersoft.iot.vmp.gb28181.conf.DefaultProperties;
import com.genersoft.iot.vmp.gb28181.transmit.ISIPProcessorObserver;
import gov.nist.javax.sip.SipProviderImpl;
import gov.nist.javax.sip.SipStackImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import javax.sip.*;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@Component
@Order(value=10)
public class SipLayer implements CommandLineRunner {
private final static Logger logger = LoggerFactory.getLogger(SipLayer.class);
@Autowired
private SipConfig sipConfig;
@Autowired
private ISIPProcessorObserver sipProcessorObserver;
@Autowired
private UserSetting userSetting;
private final Map<String, SipProviderImpl> tcpSipProviderMap = new ConcurrentHashMap<>();
private final Map<String, SipProviderImpl> udpSipProviderMap = new ConcurrentHashMap<>();
@Override
public void run(String... args) {
List<String> monitorIps = new ArrayList<>();
// 使用逗号分割多个ip
String separator = ",";
if (sipConfig.getIp().indexOf(separator) > 0) {
String[] split = sipConfig.getIp().split(separator);
monitorIps.addAll(Arrays.asList(split));
}else {
monitorIps.add(sipConfig.getIp());
}
SipFactory.getInstance().setPathName("gov.nist");
if (monitorIps.size() > 0) {
for (String monitorIp : monitorIps) {
addListeningPoint(monitorIp, sipConfig.getPort());
}
if (udpSipProviderMap.size() + tcpSipProviderMap.size() == 0) {
System.exit(1);
}
}
}
private void addListeningPoint(String monitorIp, int port){
SipStackImpl sipStack;
try {
sipStack = (SipStackImpl)SipFactory.getInstance().createSipStack(DefaultProperties.getProperties("GB28181_SIP", userSetting.getSipLog()));
sipStack.setMessageParserFactory(new GbStringMsgParserFactory());
} catch (PeerUnavailableException e) {
logger.error("[SIP SERVER] SIP服务启动失败 监听地址{}失败,请检查ip是否正确", monitorIp);
return;
}
try {
ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(monitorIp, port, "TCP");
SipProviderImpl tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint);
tcpSipProvider.setDialogErrorsAutomaticallyHandled();
tcpSipProvider.addSipListener(sipProcessorObserver);
tcpSipProviderMap.put(monitorIp, tcpSipProvider);
logger.info("[SIP SERVER] tcp://{}:{} 启动成功", monitorIp, port);
} catch (TransportNotSupportedException
| TooManyListenersException
| ObjectInUseException
| InvalidArgumentException e) {
logger.error("[SIP SERVER] tcp://{}:{} SIP服务启动失败,请检查端口是否被占用或者ip是否正确"
, monitorIp, port);
}
try {
ListeningPoint udpListeningPoint = sipStack.createListeningPoint(monitorIp, port, "UDP");
SipProviderImpl udpSipProvider = (SipProviderImpl)sipStack.createSipProvider(udpListeningPoint);
udpSipProvider.addSipListener(sipProcessorObserver);
udpSipProviderMap.put(monitorIp, udpSipProvider);
logger.info("[SIP SERVER] udp://{}:{} 启动成功", monitorIp, port);
} catch (TransportNotSupportedException
| TooManyListenersException
| ObjectInUseException
| InvalidArgumentException e) {
logger.error("[SIP SERVER] udp://{}:{} SIP服务启动失败,请检查端口是否被占用或者ip是否正确"
, monitorIp, port);
}
}
public SipProviderImpl getUdpSipProvider(String ip) {
if (ObjectUtils.isEmpty(ip)) {
return null;
}
return udpSipProviderMap.get(ip);
}
public SipProviderImpl getUdpSipProvider() {
if (udpSipProviderMap.size() != 1) {
return null;
}
return udpSipProviderMap.values().stream().findFirst().get();
}
public SipProviderImpl getTcpSipProvider() {
if (tcpSipProviderMap.size() != 1) {
return null;
}
return tcpSipProviderMap.values().stream().findFirst().get();
}
public SipProviderImpl getTcpSipProvider(String ip) {
if (ObjectUtils.isEmpty(ip)) {
return null;
}
return tcpSipProviderMap.get(ip);
}
public String getLocalIp(String deviceLocalIp) {
if (!ObjectUtils.isEmpty(deviceLocalIp)) {
return deviceLocalIp;
}
return getUdpSipProvider().getListeningPoint().getIPAddress();
}
}
package com.genersoft.iot.vmp.gb28181;
import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.GbStringMsgParserFactory;
import com.genersoft.iot.vmp.gb28181.conf.DefaultProperties;
import com.genersoft.iot.vmp.gb28181.transmit.ISIPProcessorObserver;
import gov.nist.javax.sip.SipProviderImpl;
import gov.nist.javax.sip.SipStackImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import javax.sip.*;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@Component
@Order(value=10)
public class SipLayer implements CommandLineRunner {
private final static Logger logger = LoggerFactory.getLogger(SipLayer.class);
@Autowired
private SipConfig sipConfig;
@Autowired
private ISIPProcessorObserver sipProcessorObserver;
@Autowired
private UserSetting userSetting;
private final Map<String, SipProviderImpl> tcpSipProviderMap = new ConcurrentHashMap<>();
private final Map<String, SipProviderImpl> udpSipProviderMap = new ConcurrentHashMap<>();
@Override
public void run(String... args) {
List<String> monitorIps = new ArrayList<>();
// 使用逗号分割多个ip
String separator = ",";
if (sipConfig.getIp().indexOf(separator) > 0) {
String[] split = sipConfig.getIp().split(separator);
monitorIps.addAll(Arrays.asList(split));
}else {
monitorIps.add(sipConfig.getIp());
}
SipFactory.getInstance().setPathName("gov.nist");
if (monitorIps.size() > 0) {
for (String monitorIp : monitorIps) {
addListeningPoint(monitorIp, sipConfig.getPort());
}
if (udpSipProviderMap.size() + tcpSipProviderMap.size() == 0) {
System.exit(1);
}
}
}
private void addListeningPoint(String monitorIp, int port){
SipStackImpl sipStack;
try {
sipStack = (SipStackImpl)SipFactory.getInstance().createSipStack(DefaultProperties.getProperties("GB28181_SIP", userSetting.getSipLog()));
sipStack.setMessageParserFactory(new GbStringMsgParserFactory());
} catch (PeerUnavailableException e) {
logger.error("[SIP SERVER] SIP服务启动失败 监听地址{}失败,请检查ip是否正确", monitorIp);
return;
}
try {
ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(monitorIp, port, "TCP");
SipProviderImpl tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint);
tcpSipProvider.setDialogErrorsAutomaticallyHandled();
tcpSipProvider.addSipListener(sipProcessorObserver);
tcpSipProviderMap.put(monitorIp, tcpSipProvider);
logger.info("[SIP SERVER] tcp://{}:{} 启动成功", monitorIp, port);
} catch (TransportNotSupportedException
| TooManyListenersException
| ObjectInUseException
| InvalidArgumentException e) {
logger.error("[SIP SERVER] tcp://{}:{} SIP服务启动失败,请检查端口是否被占用或者ip是否正确"
, monitorIp, port);
}
try {
ListeningPoint udpListeningPoint = sipStack.createListeningPoint(monitorIp, port, "UDP");
SipProviderImpl udpSipProvider = (SipProviderImpl)sipStack.createSipProvider(udpListeningPoint);
udpSipProvider.addSipListener(sipProcessorObserver);
udpSipProviderMap.put(monitorIp, udpSipProvider);
logger.info("[SIP SERVER] udp://{}:{} 启动成功", monitorIp, port);
} catch (TransportNotSupportedException
| TooManyListenersException
| ObjectInUseException
| InvalidArgumentException e) {
logger.error("[SIP SERVER] udp://{}:{} SIP服务启动失败,请检查端口是否被占用或者ip是否正确"
, monitorIp, port);
}
}
public SipProviderImpl getUdpSipProvider(String ip) {
if (ObjectUtils.isEmpty(ip)) {
return null;
}
return udpSipProviderMap.get(ip);
}
public SipProviderImpl getUdpSipProvider() {
if (udpSipProviderMap.size() != 1) {
return null;
}
return udpSipProviderMap.values().stream().findFirst().get();
}
public SipProviderImpl getTcpSipProvider() {
if (tcpSipProviderMap.size() != 1) {
return null;
}
return tcpSipProviderMap.values().stream().findFirst().get();
}
public SipProviderImpl getTcpSipProvider(String ip) {
if (ObjectUtils.isEmpty(ip)) {
return null;
}
return tcpSipProviderMap.get(ip);
}
public String getLocalIp(String deviceLocalIp) {
if (!ObjectUtils.isEmpty(deviceLocalIp)) {
return deviceLocalIp;
}
return getUdpSipProvider().getListeningPoint().getIPAddress();
}
}

View File

@ -26,8 +26,8 @@
package com.genersoft.iot.vmp.gb28181.auth;
import gov.nist.core.InternalErrorHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import javax.sip.address.URI;
import javax.sip.header.AuthorizationHeader;
@ -46,19 +46,14 @@ import java.util.Random;
* @author M. Ranganathan
* @author Marc Bednarek
*/
@Slf4j
public class DigestServerAuthenticationHelper {
private Logger logger = LoggerFactory.getLogger(DigestServerAuthenticationHelper.class);
private MessageDigest messageDigest;
private final MessageDigest messageDigest;
public static final String DEFAULT_ALGORITHM = "MD5";
public static final String DEFAULT_SCHEME = "Digest";
/** to hex converter */
private static final char[] toHex = { '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
@ -93,8 +88,8 @@ public class DigestServerAuthenticationHelper {
long pad = rand.nextLong();
String nonceString = Long.valueOf(time).toString()
+ Long.valueOf(pad).toString();
byte mdbytes[] = messageDigest.digest(nonceString.getBytes());
return toHexString(mdbytes);
byte[] mdBytes = messageDigest.digest(nonceString.getBytes());
return toHexString(mdBytes);
}
public Response generateChallenge(HeaderFactory headerFactory, Response response, String realm) {
@ -138,12 +133,9 @@ public class DigestServerAuthenticationHelper {
return false;
}
String A2 = request.getMethod().toUpperCase() + ":" + uri.toString();
String A2 = request.getMethod().toUpperCase() + ":" + uri;
String HA1 = hashedPassword;
byte[] mdbytes = messageDigest.digest(A2.getBytes());
String HA2 = toHexString(mdbytes);
@ -177,7 +169,7 @@ public class DigestServerAuthenticationHelper {
String realm = authHeader.getRealm().trim();
String username = authHeader.getUsername().trim();
if ( username == null || realm == null ) {
if(ObjectUtils.anyNull(username,realm)){
return false;
}
@ -196,26 +188,22 @@ public class DigestServerAuthenticationHelper {
// nonce计数器是一个16进制的数值表示同一nonce下客户端发送出请求的数量
int nc = authHeader.getNonceCount();
String ncStr = String.format("%08x", nc).toUpperCase();
// String ncStr = new DecimalFormat("00000000").format(nc);
// String ncStr = new DecimalFormat("00000000").format(Integer.parseInt(nc + "", 16));
String A1 = String.join(":",username , realm , pass);
String A2 = String.join(":",request.getMethod().toUpperCase() , uri.toString());
String A1 = username + ":" + realm + ":" + pass;
String A2 = request.getMethod().toUpperCase() + ":" + uri.toString();
byte mdbytes[] = messageDigest.digest(A1.getBytes());
byte[] mdbytes = messageDigest.digest(A1.getBytes());
String HA1 = toHexString(mdbytes);
logger.debug("A1: " + A1);
logger.debug("A2: " + A2);
log.debug("A1: " + A1);
log.debug("A2: " + A2);
mdbytes = messageDigest.digest(A2.getBytes());
String HA2 = toHexString(mdbytes);
logger.debug("HA1: " + HA1);
logger.debug("HA2: " + HA2);
log.debug("HA1: " + HA1);
log.debug("HA2: " + HA2);
// String cnonce = authHeader.getCNonce();
logger.debug("nonce: " + nonce);
logger.debug("nc: " + ncStr);
logger.debug("cnonce: " + cnonce);
logger.debug("qop: " + qop);
log.debug("nonce: " + nonce);
log.debug("nc: " + ncStr);
log.debug("cnonce: " + cnonce);
log.debug("qop: " + qop);
String KD = HA1 + ":" + nonce;
if (qop != null && qop.equalsIgnoreCase("auth") ) {
@ -228,12 +216,12 @@ public class DigestServerAuthenticationHelper {
KD += ":" + qop;
}
KD += ":" + HA2;
logger.debug("KD: " + KD);
log.debug("KD: " + KD);
mdbytes = messageDigest.digest(KD.getBytes());
String mdString = toHexString(mdbytes);
logger.debug("mdString: " + mdString);
log.debug("mdString: " + mdString);
String response = authHeader.getResponse();
logger.debug("response: " + response);
log.debug("response: " + response);
return mdString.equals(response);
}

View File

@ -1,187 +1,187 @@
package com.genersoft.iot.vmp.gb28181.bean;
import io.swagger.v3.oas.annotations.media.Schema;
/**
* @author lin
*/
@Schema(description = "报警信息")
public class DeviceAlarm {
/**
* 数据库id
*/
@Schema(description = "数据库id")
private String id;
/**
* 设备Id
*/
@Schema(description = "设备的国标编号")
private String deviceId;
/**
* 通道Id
*/
@Schema(description = "通道的国标编号")
private String channelId;
/**
* 报警级别, 1为一级警情, 2为二级警情, 3为三级警情, 4为四级警情
*/
@Schema(description = "报警级别, 1为一级警情, 2为二级警情, 3为三级警情, 4为四级警情")
private String alarmPriority;
/**
* 报警方式 , 1为电话报警, 2为设备报警, 3为短信报警, 4为 GPS报警, 5为视频报警, 6为设备故障报警,
* 7其他报警;可以为直接组合如12为电话报警或 设备报警-
*/
@Schema(description = "报警方式 , 1为电话报警, 2为设备报警, 3为短信报警, 4为 GPS报警, 5为视频报警, 6为设备故障报警,\n" +
"\t * 7其他报警;可以为直接组合如12为电话报警或设备报警")
private String alarmMethod;
/**
* 报警时间
*/
@Schema(description = "报警时间")
private String alarmTime;
/**
* 报警内容描述
*/
@Schema(description = "报警内容描述")
private String alarmDescription;
/**
* 经度
*/
@Schema(description = "经度")
private double longitude;
/**
* 纬度
*/
@Schema(description = "纬度")
private double latitude;
/**
* 报警类型,
* 报警方式为2时,不携带 AlarmType为默认的报警设备报警,
* 携带 AlarmType取值及对应报警类型如下:
* 1-视频丢失报警;
* 2-设备防拆报警;
* 3-存储设备磁盘满报警;
* 4-设备高温报警;
* 5-设备低温报警
* 报警方式为5时,取值如下:
* 1-人工视频报警;
* 2-运动目标检测报警;
* 3-遗留物检测报警;
* 4-物体移除检测报警;
* 5-绊线检测报警;
* 6-入侵检测报警;
* 7-逆行检测报警;
* 8-徘徊检测报警;
* 9-流量统计报警;
* 10-密度检测报警;
* 11-视频异常检测报警;
* 12-快速移动报警
* 报警方式为6时,取值下:
* 1-存储设备磁盘故障报警;
* 2-存储设备风扇故障报警
*/
@Schema(description = "报警类型")
private String alarmType;
@Schema(description = "创建时间")
private String createTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public String getAlarmPriority() {
return alarmPriority;
}
public void setAlarmPriority(String alarmPriority) {
this.alarmPriority = alarmPriority;
}
public String getAlarmMethod() {
return alarmMethod;
}
public void setAlarmMethod(String alarmMethod) {
this.alarmMethod = alarmMethod;
}
public String getAlarmTime() {
return alarmTime;
}
public void setAlarmTime(String alarmTime) {
this.alarmTime = alarmTime;
}
public String getAlarmDescription() {
return alarmDescription;
}
public void setAlarmDescription(String alarmDescription) {
this.alarmDescription = alarmDescription;
}
public double getLongitude() {
return longitude;
}
public void setLongitude(double longitude) {
this.longitude = longitude;
}
public double getLatitude() {
return latitude;
}
public void setLatitude(double latitude) {
this.latitude = latitude;
}
public String getAlarmType() {
return alarmType;
}
public void setAlarmType(String alarmType) {
this.alarmType = alarmType;
}
public String getChannelId() {
return channelId;
}
public void setChannelId(String channelId) {
this.channelId = channelId;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
}
package com.genersoft.iot.vmp.gb28181.bean;
import io.swagger.v3.oas.annotations.media.Schema;
/**
* @author lin
*/
@Schema(description = "报警信息")
public class DeviceAlarm {
/**
* 数据库id
*/
@Schema(description = "数据库id")
private String id;
/**
* 设备Id
*/
@Schema(description = "设备的国标编号")
private String deviceId;
/**
* 通道Id
*/
@Schema(description = "通道的国标编号")
private String channelId;
/**
* 报警级别, 1为一级警情, 2为二级警情, 3为三级警情, 4为四级警情
*/
@Schema(description = "报警级别, 1为一级警情, 2为二级警情, 3为三级警情, 4为四级警情")
private String alarmPriority;
/**
* 报警方式 , 1为电话报警, 2为设备报警, 3为短信报警, 4为 GPS报警, 5为视频报警, 6为设备故障报警,
* 7其他报警;可以为直接组合如12为电话报警或 设备报警-
*/
@Schema(description = "报警方式 , 1为电话报警, 2为设备报警, 3为短信报警, 4为 GPS报警, 5为视频报警, 6为设备故障报警,\n" +
"\t * 7其他报警;可以为直接组合如12为电话报警或设备报警")
private String alarmMethod;
/**
* 报警时间
*/
@Schema(description = "报警时间")
private String alarmTime;
/**
* 报警内容描述
*/
@Schema(description = "报警内容描述")
private String alarmDescription;
/**
* 经度
*/
@Schema(description = "经度")
private double longitude;
/**
* 纬度
*/
@Schema(description = "纬度")
private double latitude;
/**
* 报警类型,
* 报警方式为2时,不携带 AlarmType为默认的报警设备报警,
* 携带 AlarmType取值及对应报警类型如下:
* 1-视频丢失报警;
* 2-设备防拆报警;
* 3-存储设备磁盘满报警;
* 4-设备高温报警;
* 5-设备低温报警
* 报警方式为5时,取值如下:
* 1-人工视频报警;
* 2-运动目标检测报警;
* 3-遗留物检测报警;
* 4-物体移除检测报警;
* 5-绊线检测报警;
* 6-入侵检测报警;
* 7-逆行检测报警;
* 8-徘徊检测报警;
* 9-流量统计报警;
* 10-密度检测报警;
* 11-视频异常检测报警;
* 12-快速移动报警
* 报警方式为6时,取值下:
* 1-存储设备磁盘故障报警;
* 2-存储设备风扇故障报警
*/
@Schema(description = "报警类型")
private String alarmType;
@Schema(description = "创建时间")
private String createTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public String getAlarmPriority() {
return alarmPriority;
}
public void setAlarmPriority(String alarmPriority) {
this.alarmPriority = alarmPriority;
}
public String getAlarmMethod() {
return alarmMethod;
}
public void setAlarmMethod(String alarmMethod) {
this.alarmMethod = alarmMethod;
}
public String getAlarmTime() {
return alarmTime;
}
public void setAlarmTime(String alarmTime) {
this.alarmTime = alarmTime;
}
public String getAlarmDescription() {
return alarmDescription;
}
public void setAlarmDescription(String alarmDescription) {
this.alarmDescription = alarmDescription;
}
public double getLongitude() {
return longitude;
}
public void setLongitude(double longitude) {
this.longitude = longitude;
}
public double getLatitude() {
return latitude;
}
public void setLatitude(double latitude) {
this.latitude = latitude;
}
public String getAlarmType() {
return alarmType;
}
public void setAlarmType(String alarmType) {
this.alarmType = alarmType;
}
public String getChannelId() {
return channelId;
}
public void setChannelId(String channelId) {
this.channelId = channelId;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
}

View File

View File

View File

View File

View File

View File

View File

@ -186,9 +186,6 @@ public class ParentPlatform {
@Schema(description = "是否作为消息通道")
private boolean asMessageChannel;
@Schema(description = "是否作为消息通道")
private boolean autoPushChannel;
public Integer getId() {
return id;
}
@ -428,12 +425,4 @@ public class ParentPlatform {
public void setAsMessageChannel(boolean asMessageChannel) {
this.asMessageChannel = asMessageChannel;
}
public boolean isAutoPushChannel() {
return autoPushChannel;
}
public void setAutoPushChannel(boolean autoPushChannel) {
this.autoPushChannel = autoPushChannel;
}
}

View File

View File

View File

View File

@ -1,102 +1,102 @@
package com.genersoft.iot.vmp.gb28181.bean;
import io.swagger.v3.oas.annotations.media.Schema;
import java.time.Instant;
import java.util.List;
/**
* @description:设备录像信息bean
* @author: swwheihei
* @date: 2020年5月8日 下午2:05:56
*/
@Schema(description = "设备录像查询结果信息")
public class RecordInfo {
@Schema(description = "设备编号")
private String deviceId;
@Schema(description = "通道编号")
private String channelId;
@Schema(description = "命令序列号")
private String sn;
@Schema(description = "设备名称")
private String name;
@Schema(description = "列表总数")
private int sumNum;
private int count;
private Instant lastTime;
@Schema(description = "")
private List<RecordItem> recordList;
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSumNum() {
return sumNum;
}
public void setSumNum(int sumNum) {
this.sumNum = sumNum;
}
public List<RecordItem> getRecordList() {
return recordList;
}
public void setRecordList(List<RecordItem> recordList) {
this.recordList = recordList;
}
public String getChannelId() {
return channelId;
}
public void setChannelId(String channelId) {
this.channelId = channelId;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public Instant getLastTime() {
return lastTime;
}
public void setLastTime(Instant lastTime) {
this.lastTime = lastTime;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
package com.genersoft.iot.vmp.gb28181.bean;
import io.swagger.v3.oas.annotations.media.Schema;
import java.time.Instant;
import java.util.List;
/**
* @description:设备录像信息bean
* @author: swwheihei
* @date: 2020年5月8日 下午2:05:56
*/
@Schema(description = "设备录像查询结果信息")
public class RecordInfo {
@Schema(description = "设备编号")
private String deviceId;
@Schema(description = "通道编号")
private String channelId;
@Schema(description = "命令序列号")
private String sn;
@Schema(description = "设备名称")
private String name;
@Schema(description = "列表总数")
private int sumNum;
private int count;
private Instant lastTime;
@Schema(description = "")
private List<RecordItem> recordList;
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSumNum() {
return sumNum;
}
public void setSumNum(int sumNum) {
this.sumNum = sumNum;
}
public List<RecordItem> getRecordList() {
return recordList;
}
public void setRecordList(List<RecordItem> recordList) {
this.recordList = recordList;
}
public String getChannelId() {
return channelId;
}
public void setChannelId(String channelId) {
this.channelId = channelId;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public Instant getLastTime() {
return lastTime;
}
public void setLastTime(Instant lastTime) {
this.lastTime = lastTime;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}

View File

@ -1,144 +1,144 @@
package com.genersoft.iot.vmp.gb28181.bean;
import com.genersoft.iot.vmp.utils.DateUtil;
import io.swagger.v3.oas.annotations.media.Schema;
import org.jetbrains.annotations.NotNull;
import java.time.Instant;
import java.time.temporal.TemporalAccessor;
/**
* @description:设备录像bean
* @author: swwheihei
* @date: 2020年5月8日 下午2:06:54
*/
@Schema(description = "设备录像详情")
public class RecordItem implements Comparable<RecordItem>{
@Schema(description = "设备编号")
private String deviceId;
@Schema(description = "名称")
private String name;
@Schema(description = "文件路径名 (可选)")
private String filePath;
@Schema(description = "录像文件大小,单位:Byte(可选)")
private String fileSize;
@Schema(description = "录像地址(可选)")
private String address;
@Schema(description = "录像开始时间(可选)")
private String startTime;
@Schema(description = "录像结束时间(可选)")
private String endTime;
@Schema(description = "保密属性(必选)缺省为0;0:不涉密,1:涉密")
private int secrecy;
@Schema(description = "录像产生类型(可选)time或alarm 或 manua")
private String type;
@Schema(description = "录像触发者ID(可选)")
private String recorderId;
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public int getSecrecy() {
return secrecy;
}
public void setSecrecy(int secrecy) {
this.secrecy = secrecy;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getRecorderId() {
return recorderId;
}
public void setRecorderId(String recorderId) {
this.recorderId = recorderId;
}
public String getFileSize() {
return fileSize;
}
public void setFileSize(String fileSize) {
this.fileSize = fileSize;
}
@Override
public int compareTo(@NotNull RecordItem recordItem) {
TemporalAccessor startTimeNow = DateUtil.formatter.parse(startTime);
TemporalAccessor startTimeParam = DateUtil.formatter.parse(recordItem.getStartTime());
Instant startTimeParamInstant = Instant.from(startTimeParam);
Instant startTimeNowInstant = Instant.from(startTimeNow);
if (startTimeNowInstant.equals(startTimeParamInstant)) {
return 0;
}else if (Instant.from(startTimeParam).isAfter(Instant.from(startTimeNow)) ) {
return -1;
}else {
return 1;
}
}
}
package com.genersoft.iot.vmp.gb28181.bean;
import com.genersoft.iot.vmp.utils.DateUtil;
import io.swagger.v3.oas.annotations.media.Schema;
import org.jetbrains.annotations.NotNull;
import java.time.Instant;
import java.time.temporal.TemporalAccessor;
/**
* @description:设备录像bean
* @author: swwheihei
* @date: 2020年5月8日 下午2:06:54
*/
@Schema(description = "设备录像详情")
public class RecordItem implements Comparable<RecordItem>{
@Schema(description = "设备编号")
private String deviceId;
@Schema(description = "名称")
private String name;
@Schema(description = "文件路径名 (可选)")
private String filePath;
@Schema(description = "录像文件大小,单位:Byte(可选)")
private String fileSize;
@Schema(description = "录像地址(可选)")
private String address;
@Schema(description = "录像开始时间(可选)")
private String startTime;
@Schema(description = "录像结束时间(可选)")
private String endTime;
@Schema(description = "保密属性(必选)缺省为0;0:不涉密,1:涉密")
private int secrecy;
@Schema(description = "录像产生类型(可选)time或alarm 或 manua")
private String type;
@Schema(description = "录像触发者ID(可选)")
private String recorderId;
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public int getSecrecy() {
return secrecy;
}
public void setSecrecy(int secrecy) {
this.secrecy = secrecy;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getRecorderId() {
return recorderId;
}
public void setRecorderId(String recorderId) {
this.recorderId = recorderId;
}
public String getFileSize() {
return fileSize;
}
public void setFileSize(String fileSize) {
this.fileSize = fileSize;
}
@Override
public int compareTo(@NotNull RecordItem recordItem) {
TemporalAccessor startTimeNow = DateUtil.formatter.parse(startTime);
TemporalAccessor startTimeParam = DateUtil.formatter.parse(recordItem.getStartTime());
Instant startTimeParamInstant = Instant.from(startTimeParam);
Instant startTimeNowInstant = Instant.from(startTimeNow);
if (startTimeNowInstant.equals(startTimeParamInstant)) {
return 0;
}else if (Instant.from(startTimeParam).isAfter(Instant.from(startTimeNow)) ) {
return -1;
}else {
return 1;
}
}
}

View File

View File

View File

View File

View File

@ -2,9 +2,12 @@ package com.genersoft.iot.vmp.gb28181.bean;
import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.conf.DynamicTask;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask;
import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeHandlerTask;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
import com.genersoft.iot.vmp.service.IPlatformService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@ -21,9 +24,6 @@ public class SubscribeHolder {
@Autowired
private DynamicTask dynamicTask;
@Autowired
private UserSetting userSetting;
private final String taskOverduePrefix = "subscribe_overdue_";
private static ConcurrentHashMap<String, SubscribeInfo> catalogMap = new ConcurrentHashMap<>();
@ -32,13 +32,11 @@ public class SubscribeHolder {
public void putCatalogSubscribe(String platformId, SubscribeInfo subscribeInfo) {
catalogMap.put(platformId, subscribeInfo);
if (subscribeInfo.getExpires() > 0) {
// 添加订阅到期
String taskOverdueKey = taskOverduePrefix + "catalog_" + platformId;
// 添加任务处理订阅过期
dynamicTask.startDelay(taskOverdueKey, () -> removeCatalogSubscribe(subscribeInfo.getId()),
subscribeInfo.getExpires() * 1000);
}
// 添加订阅到期
String taskOverdueKey = taskOverduePrefix + "catalog_" + platformId;
// 添加任务处理订阅过期
dynamicTask.startDelay(taskOverdueKey, () -> removeCatalogSubscribe(subscribeInfo.getId()),
subscribeInfo.getExpires() * 1000);
}
public SubscribeInfo getCatalogSubscribe(String platformId) {
@ -60,18 +58,16 @@ public class SubscribeHolder {
public void putMobilePositionSubscribe(String platformId, SubscribeInfo subscribeInfo) {
mobilePositionMap.put(platformId, subscribeInfo);
String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetting.getServerId() + "MobilePosition_" + platformId;
String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + "MobilePosition_" + platformId;
// 添加任务处理GPS定时推送
dynamicTask.startCron(key, new MobilePositionSubscribeHandlerTask(platformId),
subscribeInfo.getGpsInterval() * 1000);
String taskOverdueKey = taskOverduePrefix + "MobilePosition_" + platformId;
if (subscribeInfo.getExpires() > 0) {
// 添加任务处理订阅过期
dynamicTask.startDelay(taskOverdueKey, () -> {
removeMobilePositionSubscribe(subscribeInfo.getId());
},
subscribeInfo.getExpires() * 1000);
}
// 添加任务处理订阅过期
dynamicTask.startDelay(taskOverdueKey, () -> {
removeMobilePositionSubscribe(subscribeInfo.getId());
},
subscribeInfo.getExpires() * 1000);
}
public SubscribeInfo getMobilePositionSubscribe(String platformId) {
@ -80,7 +76,7 @@ public class SubscribeHolder {
public void removeMobilePositionSubscribe(String platformId) {
mobilePositionMap.remove(platformId);
String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetting.getServerId() + "MobilePosition_" + platformId;
String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + "MobilePosition_" + platformId;
// 结束任务处理GPS定时推送
dynamicTask.stop(key);
String taskOverdueKey = taskOverduePrefix + "MobilePosition_" + platformId;

View File

@ -18,9 +18,6 @@ public class SubscribeInfo {
}
public SubscribeInfo() {
}
private String id;
private SIPRequest request;
@ -36,21 +33,6 @@ public class SubscribeInfo {
private String sn;
private int gpsInterval;
/**
* 模拟的FromTag
*/
private String simulatedFromTag;
/**
* 模拟的ToTag
*/
private String simulatedToTag;
/**
* 模拟的CallID
*/
private String simulatedCallId;
public String getId() {
return id;
}
@ -114,28 +96,4 @@ public class SubscribeInfo {
public void setGpsInterval(int gpsInterval) {
this.gpsInterval = gpsInterval;
}
public String getSimulatedFromTag() {
return simulatedFromTag;
}
public void setSimulatedFromTag(String simulatedFromTag) {
this.simulatedFromTag = simulatedFromTag;
}
public String getSimulatedCallId() {
return simulatedCallId;
}
public void setSimulatedCallId(String simulatedCallId) {
this.simulatedCallId = simulatedCallId;
}
public String getSimulatedToTag() {
return simulatedToTag;
}
public void setSimulatedToTag(String simulatedToTag) {
this.simulatedToTag = simulatedToTag;
}
}

View File

View File

View File

@ -1,8 +1,8 @@
package com.genersoft.iot.vmp.gb28181.conf;
import gov.nist.core.StackLogger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.spi.LocationAwareLogger;
import org.springframework.stereotype.Component;
import java.util.Properties;
@ -10,132 +10,100 @@ import java.util.Properties;
@Component
public class StackLoggerImpl implements StackLogger {
/**
* 完全限定类名(Fully Qualified Class Name)用于定位日志位置
*/
private static final String FQCN = StackLoggerImpl.class.getName();
private final static Logger logger = LoggerFactory.getLogger(StackLoggerImpl.class);
/**
* 获取栈中类信息(以便底层日志记录系统能够提取正确的位置信息(方法名行号))
* @return LocationAwareLogger
*/
private static LocationAwareLogger getLocationAwareLogger() {
return (LocationAwareLogger) LoggerFactory.getLogger(new Throwable().getStackTrace()[4].getClassName());
}
@Override
public void logStackTrace() {
}
/**
* 封装打印日志的位置信息
* @param level 日志级别
* @param message 日志事件的消息
*/
private static void log(int level, String message) {
LocationAwareLogger locationAwareLogger = getLocationAwareLogger();
locationAwareLogger.log(null, FQCN, level, message, null, null);
}
@Override
public void logStackTrace(int traceLevel) {
System.out.println("traceLevel: " + traceLevel);
}
/**
* 封装打印日志的位置信息
* @param level 日志级别
* @param message 日志事件的消息
*/
private static void log(int level, String message, Throwable throwable) {
LocationAwareLogger locationAwareLogger = getLocationAwareLogger();
locationAwareLogger.log(null, FQCN, level, message, null, throwable);
}
@Override
public int getLineCount() {
return 0;
}
@Override
public void logStackTrace() {
@Override
public void logException(Throwable ex) {
}
}
@Override
public void logStackTrace(int traceLevel) {
System.out.println("traceLevel: " + traceLevel);
}
@Override
public void logDebug(String message) {
// logger.debug(message);
}
@Override
public int getLineCount() {
return 0;
}
@Override
public void logDebug(String message, Exception ex) {
// logger.debug(message);
}
@Override
public void logException(Throwable ex) {
@Override
public void logTrace(String message) {
logger.trace(message);
}
}
@Override
public void logFatalError(String message) {
// logger.error(message);
}
@Override
public void logDebug(String message) {
log(LocationAwareLogger.INFO_INT, message);
}
@Override
public void logError(String message) {
// logger.error(message);
}
@Override
public void logDebug(String message, Exception ex) {
log(LocationAwareLogger.INFO_INT, message, ex);
}
@Override
public boolean isLoggingEnabled() {
return true;
}
@Override
public void logTrace(String message) {
log(LocationAwareLogger.INFO_INT, message);
}
@Override
public boolean isLoggingEnabled(int logLevel) {
return true;
}
@Override
public void logFatalError(String message) {
log(LocationAwareLogger.INFO_INT, message);
}
@Override
public void logError(String message, Exception ex) {
// logger.error(message);
}
@Override
public void logError(String message) {
log(LocationAwareLogger.INFO_INT, message);
}
@Override
public void logWarning(String message) {
logger.warn(message);
}
@Override
public boolean isLoggingEnabled() {
return true;
}
@Override
public void logInfo(String message) {
logger.info(message);
}
@Override
public boolean isLoggingEnabled(int logLevel) {
return true;
}
@Override
public void disableLogging() {
@Override
public void logError(String message, Exception ex) {
log(LocationAwareLogger.INFO_INT, message, ex);
}
}
@Override
public void logWarning(String message) {
log(LocationAwareLogger.INFO_INT, message);
}
@Override
public void enableLogging() {
@Override
public void logInfo(String message) {
log(LocationAwareLogger.INFO_INT, message);
}
}
@Override
public void disableLogging() {
@Override
public void setBuildTimeStamp(String buildTimeStamp) {
}
}
@Override
public void enableLogging() {
@Override
public void setStackProperties(Properties stackProperties) {
}
}
@Override
public void setBuildTimeStamp(String buildTimeStamp) {
}
@Override
public void setStackProperties(Properties stackProperties) {
}
@Override
public String getLoggerName() {
return null;
}
@Override
public String getLoggerName() {
return null;
}
}

View File

@ -1,118 +1,118 @@
package com.genersoft.iot.vmp.gb28181.event;
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.device.RequestTimeoutEvent;
import com.genersoft.iot.vmp.gb28181.event.record.RecordEndEvent;
import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
import com.genersoft.iot.vmp.media.zlm.event.ZLMOfflineEvent;
import com.genersoft.iot.vmp.media.zlm.event.ZLMOnlineEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import com.genersoft.iot.vmp.gb28181.event.alarm.AlarmEvent;
import javax.sip.TimeoutEvent;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @description:Event事件通知推送器支持推送在线事件离线事件
* @author: swwheihei
* @date: 2020年5月6日 上午11:30:50
*/
@Component
public class EventPublisher {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
/**
* 设备报警事件
* @param deviceAlarm
*/
public void deviceAlarmEventPublish(DeviceAlarm deviceAlarm) {
AlarmEvent alarmEvent = new AlarmEvent(this);
alarmEvent.setAlarmInfo(deviceAlarm);
applicationEventPublisher.publishEvent(alarmEvent);
}
public void zlmOfflineEventPublish(String mediaServerId){
ZLMOfflineEvent outEvent = new ZLMOfflineEvent(this);
outEvent.setMediaServerId(mediaServerId);
applicationEventPublisher.publishEvent(outEvent);
}
public void zlmOnlineEventPublish(String mediaServerId) {
ZLMOnlineEvent outEvent = new ZLMOnlineEvent(this);
outEvent.setMediaServerId(mediaServerId);
applicationEventPublisher.publishEvent(outEvent);
}
public void catalogEventPublish(String platformId, DeviceChannel deviceChannel, String type) {
List<DeviceChannel> deviceChannelList = new ArrayList<>();
deviceChannelList.add(deviceChannel);
catalogEventPublish(platformId, deviceChannelList, type);
}
public void requestTimeOut(TimeoutEvent timeoutEvent) {
RequestTimeoutEvent requestTimeoutEvent = new RequestTimeoutEvent(this);
requestTimeoutEvent.setTimeoutEvent(timeoutEvent);
applicationEventPublisher.publishEvent(requestTimeoutEvent);
}
/**
*
* @param platformId
* @param deviceChannels
* @param type
*/
public void catalogEventPublish(String platformId, List<DeviceChannel> deviceChannels, String type) {
CatalogEvent outEvent = new CatalogEvent(this);
List<DeviceChannel> channels = new ArrayList<>();
if (deviceChannels.size() > 1) {
// 数据去重
Set<String> gbIdSet = new HashSet<>();
for (DeviceChannel deviceChannel : deviceChannels) {
if (!gbIdSet.contains(deviceChannel.getChannelId())) {
gbIdSet.add(deviceChannel.getChannelId());
channels.add(deviceChannel);
}
}
}else {
channels = deviceChannels;
}
outEvent.setDeviceChannels(channels);
outEvent.setType(type);
outEvent.setPlatformId(platformId);
applicationEventPublisher.publishEvent(outEvent);
}
public void catalogEventPublishForStream(String platformId, List<GbStream> gbStreams, String type) {
CatalogEvent outEvent = new CatalogEvent(this);
outEvent.setGbStreams(gbStreams);
outEvent.setType(type);
outEvent.setPlatformId(platformId);
applicationEventPublisher.publishEvent(outEvent);
}
public void catalogEventPublishForStream(String platformId, GbStream gbStream, String type) {
List<GbStream> gbStreamList = new ArrayList<>();
gbStreamList.add(gbStream);
catalogEventPublishForStream(platformId, gbStreamList, type);
}
public void recordEndEventPush(RecordInfo recordInfo) {
RecordEndEvent outEvent = new RecordEndEvent(this);
outEvent.setRecordInfo(recordInfo);
applicationEventPublisher.publishEvent(outEvent);
}
}
package com.genersoft.iot.vmp.gb28181.event;
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.device.RequestTimeoutEvent;
import com.genersoft.iot.vmp.gb28181.event.record.RecordEndEvent;
import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
import com.genersoft.iot.vmp.media.zlm.event.ZLMOfflineEvent;
import com.genersoft.iot.vmp.media.zlm.event.ZLMOnlineEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import com.genersoft.iot.vmp.gb28181.event.alarm.AlarmEvent;
import javax.sip.TimeoutEvent;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @description:Event事件通知推送器支持推送在线事件离线事件
* @author: swwheihei
* @date: 2020年5月6日 上午11:30:50
*/
@Component
public class EventPublisher {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
/**
* 设备报警事件
* @param deviceAlarm
*/
public void deviceAlarmEventPublish(DeviceAlarm deviceAlarm) {
AlarmEvent alarmEvent = new AlarmEvent(this);
alarmEvent.setAlarmInfo(deviceAlarm);
applicationEventPublisher.publishEvent(alarmEvent);
}
public void zlmOfflineEventPublish(String mediaServerId){
ZLMOfflineEvent outEvent = new ZLMOfflineEvent(this);
outEvent.setMediaServerId(mediaServerId);
applicationEventPublisher.publishEvent(outEvent);
}
public void zlmOnlineEventPublish(String mediaServerId) {
ZLMOnlineEvent outEvent = new ZLMOnlineEvent(this);
outEvent.setMediaServerId(mediaServerId);
applicationEventPublisher.publishEvent(outEvent);
}
public void catalogEventPublish(String platformId, DeviceChannel deviceChannel, String type) {
List<DeviceChannel> deviceChannelList = new ArrayList<>();
deviceChannelList.add(deviceChannel);
catalogEventPublish(platformId, deviceChannelList, type);
}
public void requestTimeOut(TimeoutEvent timeoutEvent) {
RequestTimeoutEvent requestTimeoutEvent = new RequestTimeoutEvent(this);
requestTimeoutEvent.setTimeoutEvent(timeoutEvent);
applicationEventPublisher.publishEvent(requestTimeoutEvent);
}
/**
*
* @param platformId
* @param deviceChannels
* @param type
*/
public void catalogEventPublish(String platformId, List<DeviceChannel> deviceChannels, String type) {
CatalogEvent outEvent = new CatalogEvent(this);
List<DeviceChannel> channels = new ArrayList<>();
if (deviceChannels.size() > 1) {
// 数据去重
Set<String> gbIdSet = new HashSet<>();
for (DeviceChannel deviceChannel : deviceChannels) {
if (!gbIdSet.contains(deviceChannel.getChannelId())) {
gbIdSet.add(deviceChannel.getChannelId());
channels.add(deviceChannel);
}
}
}else {
channels = deviceChannels;
}
outEvent.setDeviceChannels(channels);
outEvent.setType(type);
outEvent.setPlatformId(platformId);
applicationEventPublisher.publishEvent(outEvent);
}
public void catalogEventPublishForStream(String platformId, List<GbStream> gbStreams, String type) {
CatalogEvent outEvent = new CatalogEvent(this);
outEvent.setGbStreams(gbStreams);
outEvent.setType(type);
outEvent.setPlatformId(platformId);
applicationEventPublisher.publishEvent(outEvent);
}
public void catalogEventPublishForStream(String platformId, GbStream gbStream, String type) {
List<GbStream> gbStreamList = new ArrayList<>();
gbStreamList.add(gbStream);
catalogEventPublishForStream(platformId, gbStreamList, type);
}
public void recordEndEventPush(RecordInfo recordInfo) {
RecordEndEvent outEvent = new RecordEndEvent(this);
outEvent.setRecordInfo(recordInfo);
applicationEventPublisher.publishEvent(outEvent);
}
}

View File

View File

@ -1,68 +1,55 @@
package com.genersoft.iot.vmp.gb28181.event.alarm;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import java.io.PrintWriter;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 报警事件监听器.
*
* @author lawrencehj
* @author <a href="mailto:xiaoQQya@126.com">xiaoQQya</a>
* @since 2021/01/20
* @description: 报警事件监听
* @author: lawrencehj
* @data: 2021-01-20
*/
@Component
public class AlarmEventListener implements ApplicationListener<AlarmEvent> {
private static final Logger logger = LoggerFactory.getLogger(AlarmEventListener.class);
private final static Logger logger = LoggerFactory.getLogger(AlarmEventListener.class);
private static final Map<String, PrintWriter> SSE_CACHE = new ConcurrentHashMap<>();
private static Map<String, SseEmitter> sseEmitters = new Hashtable<>();
public void addSseEmitter(String browserId, PrintWriter writer) {
SSE_CACHE.put(browserId, writer);
logger.info("SSE 在线数量: {}", SSE_CACHE.size());
}
public void removeSseEmitter(String browserId, PrintWriter writer) {
SSE_CACHE.remove(browserId, writer);
logger.info("SSE 在线数量: {}", SSE_CACHE.size());
public void addSseEmitters(String browserId, SseEmitter sseEmitter) {
sseEmitters.put(browserId, sseEmitter);
}
@Override
public void onApplicationEvent(@NotNull AlarmEvent event) {
public void onApplicationEvent(AlarmEvent event) {
if (logger.isDebugEnabled()) {
logger.debug("设备报警事件触发, deviceId: {}, {}", event.getAlarmInfo().getDeviceId(), event.getAlarmInfo().getAlarmDescription());
logger.debug("设备报警事件触发deviceId" + event.getAlarmInfo().getDeviceId() + ", "
+ event.getAlarmInfo().getAlarmDescription());
}
String msg = "<strong>设备编码:</strong> <i>" + event.getAlarmInfo().getDeviceId() + "</i>"
+ "<br><strong>报警描述:</strong> <i>" + event.getAlarmInfo().getAlarmDescription() + "</i>"
+ "<br><strong>报警时间:</strong> <i>" + event.getAlarmInfo().getAlarmTime() + "</i>"
+ "<br><strong>报警位置:</strong> <i>" + event.getAlarmInfo().getLongitude() + "</i>"
+ ", <i>" + event.getAlarmInfo().getLatitude() + "</i>";
String msg = "<strong>设备编号:</strong> <i>" + event.getAlarmInfo().getDeviceId() + "</i>"
+ "<br><strong>通道编号:</strong> <i>" + event.getAlarmInfo().getChannelId() + "</i>"
+ "<br><strong>报警描述:</strong> <i>" + event.getAlarmInfo().getAlarmDescription() + "</i>"
+ "<br><strong>报警时间:</strong> <i>" + event.getAlarmInfo().getAlarmTime() + "</i>";
for (Iterator<Map.Entry<String, PrintWriter>> it = SSE_CACHE.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<String, PrintWriter> response = it.next();
logger.info("推送到 SSE 连接, 浏览器 ID: {}", response.getKey());
for (Iterator<Map.Entry<String, SseEmitter>> it = sseEmitters.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, SseEmitter> emitter = it.next();
logger.info("推送到SSE连接浏览器ID: " + emitter.getKey());
try {
PrintWriter writer = response.getValue();
if (writer.checkError()) {
it.remove();
continue;
emitter.getValue().send(msg);
} catch (IOException | IllegalStateException e) {
if (logger.isDebugEnabled()) {
logger.debug("SSE连接已关闭");
}
String sseMsg = "event:message\n" +
"data:" + msg + "\n" +
"\n";
writer.write(sseMsg);
writer.flush();
} catch (Exception e) {
// 移除已关闭的连接
it.remove();
}
}

View File

@ -36,17 +36,16 @@ public class RecordEndEventListener implements ApplicationListener<RecordEndEven
public void onApplicationEvent(RecordEndEvent event) {
String deviceId = event.getRecordInfo().getDeviceId();
String channelId = event.getRecordInfo().getChannelId();
String sn = event.getRecordInfo().getSn();
int count = event.getRecordInfo().getCount();
int sumNum = event.getRecordInfo().getSumNum();
logger.info("录像查询完成事件触发deviceId{}, channelId: {}, 录像数量{}/{}条",
event.getRecordInfo().getDeviceId(),
event.getRecordInfo().getChannelId(), count,sumNum);
logger.debug("handlerMap.size => {}", handlerMap.size());
if (!handlerMap.isEmpty()) {
String key = deviceId + channelId + sn;
if (handlerMap.size() > 0) {
String key = deviceId + channelId;
logger.debug("handlerMap.keys => {}", handlerMap.keySet());
RecordEndEventHandler handler = handlerMap.get(deviceId + channelId + sn);
RecordEndEventHandler handler = handlerMap.get(deviceId + channelId);
logger.debug("handler => {}", handler);
if (handler != null){
handler.handler(event.getRecordInfo());
@ -63,9 +62,6 @@ public class RecordEndEventListener implements ApplicationListener<RecordEndEven
scheduleMap.put(key,schedule);
}
}
}else {
logger.info("录像查询完成事件触发, 但是订阅为空取消发送deviceId{}, channelId: {}",
event.getRecordInfo().getDeviceId(), event.getRecordInfo().getChannelId());
}
}
@ -75,18 +71,18 @@ public class RecordEndEventListener implements ApplicationListener<RecordEndEven
* @param channelId
* @param recordEndEventHandler
*/
public void addEndEventHandler(String device, String channelId, String sn, RecordEndEventHandler recordEndEventHandler) {
logger.debug("RecordEndEventListener addEndEventHandler => deviceId: {}, channelId: {}, sn: {}", device,channelId, sn);
handlerMap.put(device + channelId + sn, recordEndEventHandler);
public void addEndEventHandler(String device, String channelId, RecordEndEventHandler recordEndEventHandler) {
logger.debug("RecordEndEventListener addEndEventHandler => deviceId: {}, channelId: {}", device,channelId);
handlerMap.put(device + channelId, recordEndEventHandler);
}
/**
* 添加
* @param device
* @param channelId
*/
public void delEndEventHandler(String device, String channelId, String sn) {
logger.debug("RecordEndEventListener delEndEventHandler => deviceId: {}, channelId: {}, sn: {}", device,channelId,sn);
handlerMap.remove(device + channelId + sn);
public void delEndEventHandler(String device, String channelId) {
logger.debug("RecordEndEventListener delEndEventHandler => deviceId: {}, channelId: {}", device,channelId);
handlerMap.remove(device + channelId);
}
}

View File

@ -93,10 +93,7 @@ public class CatalogEventLister implements ApplicationListener<CatalogEvent> {
}
if (event.getGbStreams() != null && event.getGbStreams().size() > 0){
for (GbStream gbStream : event.getGbStreams()) {
if (gbStream != null
&& gbStream.getStreamType() != null
&& gbStream.getStreamType().equals("push")
&& !userSetting.isUsePushingAsStatus()) {
if (gbStream.getStreamType().equals("push") && !userSetting.isUsePushingAsStatus()) {
continue;
}
DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStream(gbStream, gbStream.getCatalogId(), parentPlatform);
@ -148,13 +145,13 @@ public class CatalogEventLister implements ApplicationListener<CatalogEvent> {
if (event.getDeviceChannels() != null) {
deviceChannelList.addAll(event.getDeviceChannels());
}
if (event.getGbStreams() != null && !event.getGbStreams().isEmpty()){
if (event.getGbStreams() != null && event.getGbStreams().size() > 0){
for (GbStream gbStream : event.getGbStreams()) {
deviceChannelList.add(
gbStreamService.getDeviceChannelListByStreamWithStatus(gbStream, gbStream.getCatalogId(), parentPlatform));
}
}
if (!deviceChannelList.isEmpty()) {
if (deviceChannelList.size() > 0) {
logger.info("[Catalog事件: {}]平台:{},影响通道{}个", event.getType(), event.getPlatformId(), deviceChannelList.size());
try {
sipCommanderFroPlatform.sendNotifyForCatalogAddOrUpdate(event.getType(), parentPlatform, deviceChannelList, subscribe, null);
@ -163,10 +160,10 @@ public class CatalogEventLister implements ApplicationListener<CatalogEvent> {
logger.error("[命令发送失败] 国标级联 Catalog通知: {}", e.getMessage());
}
}
}else if (!parentPlatformMap.keySet().isEmpty()) {
}else if (parentPlatformMap.keySet().size() > 0) {
for (String gbId : parentPlatformMap.keySet()) {
List<ParentPlatform> parentPlatforms = parentPlatformMap.get(gbId);
if (parentPlatforms != null && !parentPlatforms.isEmpty()) {
if (parentPlatforms != null && parentPlatforms.size() > 0) {
for (ParentPlatform platform : parentPlatforms) {
SubscribeInfo subscribeInfo = subscribeHolder.getCatalogSubscribe(platform.getServerGBId());
if (subscribeInfo == null) {

View File

@ -71,7 +71,7 @@ public class RecordDataCatch {
msg.setKey(msgKey);
msg.setData(recordInfo);
deferredResultHolder.invokeAllResult(msg);
recordEndEventListener.delEndEventHandler(recordInfo.getDeviceId(),recordInfo.getChannelId(),recordInfo.getSn());
recordEndEventListener.delEndEventHandler(recordInfo.getDeviceId(),recordInfo.getChannelId());
data.remove(key);
}
}

View File

@ -8,7 +8,6 @@ import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
/**
@ -38,8 +37,7 @@ public class SSRCFactory {
public void initMediaServerSSRC(String mediaServerId, Set<String> usedSet) {
String sipDomain = sipConfig.getDomain();
String ssrcPrefix = sipDomain.length() >= 8 ? sipDomain.substring(3, 8) : sipDomain;
String ssrcPrefix = sipConfig.getDomain().substring(3, 8);
String redisKey = SSRC_INFO_KEY + userSetting.getServerId() + "_" + mediaServerId;
List<String> ssrcList = new ArrayList<>();
for (int i = 1; i < MAX_STREAM_COUNT; i++) {
@ -120,7 +118,7 @@ public class SSRCFactory {
*/
public boolean hasMediaServerSSRC(String mediaServerId) {
String redisKey = SSRC_INFO_KEY + userSetting.getServerId() + "_" + mediaServerId;
return Boolean.TRUE.equals(redisTemplate.hasKey(redisKey));
return redisTemplate.opsForSet().members(redisKey) != null;
}
}

View File

@ -1,177 +1,139 @@
package com.genersoft.iot.vmp.gb28181.session;
import com.genersoft.iot.vmp.common.InviteSessionType;
import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo;
import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
import com.genersoft.iot.vmp.utils.JsonUtil;
import com.genersoft.iot.vmp.utils.redis.RedisUtil;
import gov.nist.javax.sip.message.SIPResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.List;
/**
* 视频流session管理器管理视频预览预览回放的通信句柄
*/
@Component
public class VideoStreamSessionManager {
@Autowired
private UserSetting userSetting;
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
/**
* 添加一个点播/回放的事务信息
* 后续可以通过流Id/callID
* @param deviceId 设备ID
* @param channelId 通道ID
* @param callId 一次请求的CallID
* @param stream 流名称
* @param mediaServerId 所使用的流媒体ID
* @param response 回复
*/
public void put(String deviceId, String channelId, String callId, String stream, String ssrc, String mediaServerId, SIPResponse response, InviteSessionType type){
SsrcTransaction ssrcTransaction = new SsrcTransaction();
ssrcTransaction.setDeviceId(deviceId);
ssrcTransaction.setChannelId(channelId);
ssrcTransaction.setStream(stream);
ssrcTransaction.setSipTransactionInfo(new SipTransactionInfo(response));
ssrcTransaction.setCallId(callId);
ssrcTransaction.setSsrc(ssrc);
ssrcTransaction.setMediaServerId(mediaServerId);
ssrcTransaction.setType(type);
redisTemplate.opsForValue().set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId()
+ "_" + deviceId + "_" + channelId + "_" + callId + "_" + stream, ssrcTransaction);
}
public SsrcTransaction getSsrcTransaction(String deviceId, String channelId, String callId, String stream){
if (ObjectUtils.isEmpty(deviceId)) {
deviceId ="*";
}
if (ObjectUtils.isEmpty(channelId)) {
channelId ="*";
}
if (ObjectUtils.isEmpty(callId)) {
callId ="*";
}
if (ObjectUtils.isEmpty(stream)) {
stream ="*";
}
String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream;
List<Object> scanResult = RedisUtil.scan(redisTemplate, key);
if (scanResult.size() == 0) {
return null;
}
return (SsrcTransaction)redisTemplate.opsForValue().get(scanResult.get(0));
}
public SsrcTransaction getSsrcTransactionByCallId(String callId){
if (ObjectUtils.isEmpty(callId)) {
return null;
}
String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_*_*_" + callId+ "_*";
List<Object> scanResult = RedisUtil.scan(redisTemplate, key);
if (!scanResult.isEmpty()) {
return (SsrcTransaction)redisTemplate.opsForValue().get(scanResult.get(0));
}else {
key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_*_*_play_*";
scanResult = RedisUtil.scan(redisTemplate, key);
if (scanResult.isEmpty()) {
return null;
}
for (Object keyObj : scanResult) {
SsrcTransaction ssrcTransaction = (SsrcTransaction)redisTemplate.opsForValue().get(keyObj);
if (ssrcTransaction.getSipTransactionInfo() != null &&
ssrcTransaction.getSipTransactionInfo().getCallId().equals(callId)) {
return ssrcTransaction;
}
}
return null;
}
}
public List<SsrcTransaction> getSsrcTransactionForAll(String deviceId, String channelId, String callId, String stream){
if (ObjectUtils.isEmpty(deviceId)) {
deviceId ="*";
}
if (ObjectUtils.isEmpty(channelId)) {
channelId ="*";
}
if (ObjectUtils.isEmpty(callId)) {
callId ="*";
}
if (ObjectUtils.isEmpty(stream)) {
stream ="*";
}
String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream;
List<Object> scanResult = RedisUtil.scan(redisTemplate, key);
if (scanResult.size() == 0) {
return null;
}
List<SsrcTransaction> result = new ArrayList<>();
for (Object keyObj : scanResult) {
result.add((SsrcTransaction)redisTemplate.opsForValue().get(keyObj));
}
return result;
}
public String getMediaServerId(String deviceId, String channelId, String stream){
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
if (ssrcTransaction == null) {
return null;
}
return ssrcTransaction.getMediaServerId();
}
public String getSSRC(String deviceId, String channelId, String stream){
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
if (ssrcTransaction == null) {
return null;
}
return ssrcTransaction.getSsrc();
}
public void remove(String deviceId, String channelId, String stream) {
List<SsrcTransaction> ssrcTransactionList = getSsrcTransactionForAll(deviceId, channelId, null, stream);
if (ssrcTransactionList == null || ssrcTransactionList.isEmpty()) {
return;
}
for (SsrcTransaction ssrcTransaction : ssrcTransactionList) {
redisTemplate.delete(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_"
+ deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_" + ssrcTransaction.getStream());
}
}
public void removeByCallId(String deviceId, String channelId, String callId) {
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, callId, null);
if (ssrcTransaction == null ) {
return;
}
redisTemplate.delete(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_"
+ deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_" + ssrcTransaction.getStream());
}
public List<SsrcTransaction> getAllSsrc() {
List<Object> ssrcTransactionKeys = RedisUtil.scan(redisTemplate, String.format("%s_*_*_*_*", VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX+ userSetting.getServerId()));
List<SsrcTransaction> result= new ArrayList<>();
for (Object ssrcTransactionKey : ssrcTransactionKeys) {
String key = (String) ssrcTransactionKey;
SsrcTransaction ssrcTransaction = JsonUtil.redisJsonToObject(redisTemplate, key, SsrcTransaction.class);
result.add(ssrcTransaction);
}
return result;
}
}
package com.genersoft.iot.vmp.gb28181.session;
import com.genersoft.iot.vmp.common.InviteSessionType;
import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo;
import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
import com.genersoft.iot.vmp.utils.JsonUtil;
import com.genersoft.iot.vmp.utils.redis.RedisUtil;
import gov.nist.javax.sip.message.SIPResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.List;
/**
* 视频流session管理器管理视频预览预览回放的通信句柄
*/
@Component
public class VideoStreamSessionManager {
@Autowired
private UserSetting userSetting;
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
/**
* 添加一个点播/回放的事务信息
* 后续可以通过流Id/callID
* @param deviceId 设备ID
* @param channelId 通道ID
* @param callId 一次请求的CallID
* @param stream 流名称
* @param mediaServerId 所使用的流媒体ID
* @param response 回复
*/
public void put(String deviceId, String channelId, String callId, String stream, String ssrc, String mediaServerId, SIPResponse response, InviteSessionType type){
SsrcTransaction ssrcTransaction = new SsrcTransaction();
ssrcTransaction.setDeviceId(deviceId);
ssrcTransaction.setChannelId(channelId);
ssrcTransaction.setStream(stream);
ssrcTransaction.setSipTransactionInfo(new SipTransactionInfo(response));
ssrcTransaction.setCallId(callId);
ssrcTransaction.setSsrc(ssrc);
ssrcTransaction.setMediaServerId(mediaServerId);
ssrcTransaction.setType(type);
redisTemplate.opsForValue().set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId()
+ "_" + deviceId + "_" + channelId + "_" + callId + "_" + stream, ssrcTransaction);
}
public SsrcTransaction getSsrcTransaction(String deviceId, String channelId, String callId, String stream){
if (ObjectUtils.isEmpty(deviceId)) {
deviceId ="*";
}
if (ObjectUtils.isEmpty(channelId)) {
channelId ="*";
}
if (ObjectUtils.isEmpty(callId)) {
callId ="*";
}
if (ObjectUtils.isEmpty(stream)) {
stream ="*";
}
String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream;
List<Object> scanResult = RedisUtil.scan(redisTemplate, key);
if (scanResult.size() == 0) {
return null;
}
return (SsrcTransaction)redisTemplate.opsForValue().get(scanResult.get(0));
}
public List<SsrcTransaction> getSsrcTransactionForAll(String deviceId, String channelId, String callId, String stream){
if (ObjectUtils.isEmpty(deviceId)) {
deviceId ="*";
}
if (ObjectUtils.isEmpty(channelId)) {
channelId ="*";
}
if (ObjectUtils.isEmpty(callId)) {
callId ="*";
}
if (ObjectUtils.isEmpty(stream)) {
stream ="*";
}
String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream;
List<Object> scanResult = RedisUtil.scan(redisTemplate, key);
if (scanResult.size() == 0) {
return null;
}
List<SsrcTransaction> result = new ArrayList<>();
for (Object keyObj : scanResult) {
result.add((SsrcTransaction)redisTemplate.opsForValue().get(keyObj));
}
return result;
}
public String getMediaServerId(String deviceId, String channelId, String stream){
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
if (ssrcTransaction == null) {
return null;
}
return ssrcTransaction.getMediaServerId();
}
public String getSSRC(String deviceId, String channelId, String stream){
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
if (ssrcTransaction == null) {
return null;
}
return ssrcTransaction.getSsrc();
}
public void remove(String deviceId, String channelId, String stream) {
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
if (ssrcTransaction == null) {
return;
}
redisTemplate.delete(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_"
+ deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_" + ssrcTransaction.getStream());
}
public List<SsrcTransaction> getAllSsrc() {
List<Object> ssrcTransactionKeys = RedisUtil.scan(redisTemplate, String.format("%s_*_*_*_*", VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX+ userSetting.getServerId()));
List<SsrcTransaction> result= new ArrayList<>();
for (Object ssrcTransactionKey : ssrcTransactionKeys) {
String key = (String) ssrcTransactionKey;
SsrcTransaction ssrcTransaction = JsonUtil.redisJsonToObject(redisTemplate, key, SsrcTransaction.class);
result.add(ssrcTransaction);
}
return result;
}
}

View File

View File

@ -12,19 +12,13 @@ import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.service.IDeviceService;
import com.genersoft.iot.vmp.service.IMediaServerService;
import com.genersoft.iot.vmp.service.IPlatformService;
import com.genersoft.iot.vmp.service.impl.PlatformServiceImpl;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.sip.InvalidArgumentException;
import javax.sip.SipException;
import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -65,8 +59,6 @@ public class SipRunner implements CommandLineRunner {
@Autowired
private ISIPCommanderForPlatform commanderForPlatform;
private final static Logger logger = LoggerFactory.getLogger(PlatformServiceImpl.class);
@Override
public void run(String... args) throws Exception {
List<Device> deviceList = deviceService.getAllOnlineDevice();
@ -118,17 +110,11 @@ public class SipRunner implements CommandLineRunner {
if (jsonObject != null && jsonObject.getInteger("code") == 0) {
ParentPlatform platform = platformService.queryPlatformByServerGBId(sendRtpItem.getPlatformId());
if (platform != null) {
try {
commanderForPlatform.streamByeCmd(platform, sendRtpItem.getCallId());
} catch (InvalidArgumentException | ParseException | SipException e) {
logger.error("[命令发送失败] 国标级联 发送BYE: {}", e.getMessage());
}
commanderForPlatform.streamByeCmd(platform, sendRtpItem.getCallId());
}
}
}
}
}
}
}

View File

@ -89,17 +89,17 @@ public class CatalogSubscribeTask implements ISubscribeTask {
ResponseEvent event = (ResponseEvent) eventResult.event;
if (event.getResponse().getRawContent() != null) {
// 成功
logger.info("[取消目录订阅]成功: {}", device.getDeviceId());
logger.info("[取消目录订阅订阅]成功: {}", device.getDeviceId());
}else {
// 成功
logger.info("[取消目录订阅]成功: {}", device.getDeviceId());
logger.info("[取消目录订阅订阅]成功: {}", device.getDeviceId());
}
},eventResult -> {
// 失败
logger.warn("[取消目录订阅]失败,信令发送失败: {}-{} ", device.getDeviceId(), eventResult.msg);
logger.warn("[取消目录订阅订阅]失败,信令发送失败: {}-{} ", device.getDeviceId(), eventResult.msg);
});
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[命令发送失败] 取消目录订阅: {}", e.getMessage());
logger.error("[命令发送失败] 取消目录订阅订阅: {}", e.getMessage());
}
}
}

View File

@ -66,17 +66,17 @@ public class SIPSender {
// 添加错误订阅
if (errorEvent != null) {
sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> {
errorEvent.response(eventResult);
sipSubscribe.removeErrorSubscribe(eventResult.callId);
sipSubscribe.removeOkSubscribe(eventResult.callId);
errorEvent.response(eventResult);
}));
}
// 添加订阅
if (okEvent != null) {
sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> {
okEvent.response(eventResult);
sipSubscribe.removeOkSubscribe(eventResult.callId);
sipSubscribe.removeErrorSubscribe(eventResult.callId);
okEvent.response(eventResult);
});
}
if ("TCP".equals(transport)) {

View File

@ -1,160 +1,160 @@
package com.genersoft.iot.vmp.gb28181.transmit.callback;
import com.genersoft.iot.vmp.vmanager.bean.DeferredResultEx;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.context.request.async.DeferredResult;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* @description: 异步请求处理
* @author: swwheihei
* @date: 2020年5月8日 下午7:59:05
*/
@SuppressWarnings(value = {"rawtypes", "unchecked"})
@Component
public class DeferredResultHolder {
public static final String CALLBACK_CMD_DEVICESTATUS = "CALLBACK_DEVICESTATUS";
public static final String CALLBACK_CMD_DEVICEINFO = "CALLBACK_DEVICEINFO";
public static final String CALLBACK_CMD_DEVICECONTROL = "CALLBACK_DEVICECONTROL";
public static final String CALLBACK_CMD_DEVICECONFIG = "CALLBACK_DEVICECONFIG";
public static final String CALLBACK_CMD_CONFIGDOWNLOAD = "CALLBACK_CONFIGDOWNLOAD";
public static final String CALLBACK_CMD_CATALOG = "CALLBACK_CATALOG";
public static final String CALLBACK_CMD_RECORDINFO = "CALLBACK_RECORDINFO";
public static final String CALLBACK_CMD_PLAY = "CALLBACK_PLAY";
public static final String CALLBACK_CMD_PLAYBACK = "CALLBACK_PLAYBACK";
public static final String CALLBACK_CMD_DOWNLOAD = "CALLBACK_DOWNLOAD";
public static final String CALLBACK_CMD_PROXY = "CALLBACK_PROXY";
public static final String CALLBACK_CMD_STOP = "CALLBACK_STOP";
public static final String UPLOAD_FILE_CHANNEL = "UPLOAD_FILE_CHANNEL";
public static final String CALLBACK_CMD_MOBILE_POSITION = "CALLBACK_CMD_MOBILE_POSITION";
public static final String CALLBACK_CMD_PRESETQUERY = "CALLBACK_PRESETQUERY";
public static final String CALLBACK_CMD_ALARM = "CALLBACK_ALARM";
public static final String CALLBACK_CMD_BROADCAST = "CALLBACK_BROADCAST";
public static final String CALLBACK_CMD_SNAP= "CALLBACK_SNAP";
private Map<String, Map<String, DeferredResultEx>> map = new ConcurrentHashMap<>();
public void put(String key, String id, DeferredResultEx result) {
Map<String, DeferredResultEx> deferredResultMap = map.get(key);
if (deferredResultMap == null) {
deferredResultMap = new ConcurrentHashMap<>();
map.put(key, deferredResultMap);
}
deferredResultMap.put(id, result);
}
public void put(String key, String id, DeferredResult result) {
Map<String, DeferredResultEx> deferredResultMap = map.get(key);
if (deferredResultMap == null) {
deferredResultMap = new ConcurrentHashMap<>();
map.put(key, deferredResultMap);
}
deferredResultMap.put(id, new DeferredResultEx(result));
}
public DeferredResultEx get(String key, String id) {
Map<String, DeferredResultEx> deferredResultMap = map.get(key);
if (deferredResultMap == null || ObjectUtils.isEmpty(id)) {
return null;
}
return deferredResultMap.get(id);
}
public Collection<DeferredResultEx> getAllByKey(String key) {
Map<String, DeferredResultEx> deferredResultMap = map.get(key);
if (deferredResultMap == null) {
return null;
}
return deferredResultMap.values();
}
public boolean exist(String key, String id){
if (key == null) {
return false;
}
Map<String, DeferredResultEx> deferredResultMap = map.get(key);
if (id == null) {
return deferredResultMap != null;
}else {
return deferredResultMap != null && deferredResultMap.get(id) != null;
}
}
/**
* 释放单个请求
* @param msg
*/
public void invokeResult(RequestMessage msg) {
Map<String, DeferredResultEx> deferredResultMap = map.get(msg.getKey());
if (deferredResultMap == null) {
return;
}
DeferredResultEx result = deferredResultMap.get(msg.getId());
if (result == null) {
return;
}
result.getDeferredResult().setResult(msg.getData());
deferredResultMap.remove(msg.getId());
if (deferredResultMap.size() == 0) {
map.remove(msg.getKey());
}
}
/**
* 释放所有的请求
* @param msg
*/
public void invokeAllResult(RequestMessage msg) {
Map<String, DeferredResultEx> deferredResultMap = map.get(msg.getKey());
if (deferredResultMap == null) {
return;
}
synchronized (this) {
deferredResultMap = map.get(msg.getKey());
if (deferredResultMap == null) {
return;
}
Set<String> ids = deferredResultMap.keySet();
for (String id : ids) {
DeferredResultEx result = deferredResultMap.get(id);
if (result == null) {
return;
}
if (result.getFilter() != null) {
Object handler = result.getFilter().handler(msg.getData());
result.getDeferredResult().setResult(handler);
}else {
result.getDeferredResult().setResult(msg.getData());
}
}
map.remove(msg.getKey());
}
}
}
package com.genersoft.iot.vmp.gb28181.transmit.callback;
import com.genersoft.iot.vmp.vmanager.bean.DeferredResultEx;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.context.request.async.DeferredResult;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* @description: 异步请求处理
* @author: swwheihei
* @date: 2020年5月8日 下午7:59:05
*/
@SuppressWarnings(value = {"rawtypes", "unchecked"})
@Component
public class DeferredResultHolder {
public static final String CALLBACK_CMD_DEVICESTATUS = "CALLBACK_DEVICESTATUS";
public static final String CALLBACK_CMD_DEVICEINFO = "CALLBACK_DEVICEINFO";
public static final String CALLBACK_CMD_DEVICECONTROL = "CALLBACK_DEVICECONTROL";
public static final String CALLBACK_CMD_DEVICECONFIG = "CALLBACK_DEVICECONFIG";
public static final String CALLBACK_CMD_CONFIGDOWNLOAD = "CALLBACK_CONFIGDOWNLOAD";
public static final String CALLBACK_CMD_CATALOG = "CALLBACK_CATALOG";
public static final String CALLBACK_CMD_RECORDINFO = "CALLBACK_RECORDINFO";
public static final String CALLBACK_CMD_PLAY = "CALLBACK_PLAY";
public static final String CALLBACK_CMD_PLAYBACK = "CALLBACK_PLAYBACK";
public static final String CALLBACK_CMD_DOWNLOAD = "CALLBACK_DOWNLOAD";
public static final String CALLBACK_CMD_PROXY = "CALLBACK_PROXY";
public static final String CALLBACK_CMD_STOP = "CALLBACK_STOP";
public static final String UPLOAD_FILE_CHANNEL = "UPLOAD_FILE_CHANNEL";
public static final String CALLBACK_CMD_MOBILE_POSITION = "CALLBACK_CMD_MOBILE_POSITION";
public static final String CALLBACK_CMD_PRESETQUERY = "CALLBACK_PRESETQUERY";
public static final String CALLBACK_CMD_ALARM = "CALLBACK_ALARM";
public static final String CALLBACK_CMD_BROADCAST = "CALLBACK_BROADCAST";
public static final String CALLBACK_CMD_SNAP= "CALLBACK_SNAP";
private Map<String, Map<String, DeferredResultEx>> map = new ConcurrentHashMap<>();
public void put(String key, String id, DeferredResultEx result) {
Map<String, DeferredResultEx> deferredResultMap = map.get(key);
if (deferredResultMap == null) {
deferredResultMap = new ConcurrentHashMap<>();
map.put(key, deferredResultMap);
}
deferredResultMap.put(id, result);
}
public void put(String key, String id, DeferredResult result) {
Map<String, DeferredResultEx> deferredResultMap = map.get(key);
if (deferredResultMap == null) {
deferredResultMap = new ConcurrentHashMap<>();
map.put(key, deferredResultMap);
}
deferredResultMap.put(id, new DeferredResultEx(result));
}
public DeferredResultEx get(String key, String id) {
Map<String, DeferredResultEx> deferredResultMap = map.get(key);
if (deferredResultMap == null || ObjectUtils.isEmpty(id)) {
return null;
}
return deferredResultMap.get(id);
}
public Collection<DeferredResultEx> getAllByKey(String key) {
Map<String, DeferredResultEx> deferredResultMap = map.get(key);
if (deferredResultMap == null) {
return null;
}
return deferredResultMap.values();
}
public boolean exist(String key, String id){
if (key == null) {
return false;
}
Map<String, DeferredResultEx> deferredResultMap = map.get(key);
if (id == null) {
return deferredResultMap != null;
}else {
return deferredResultMap != null && deferredResultMap.get(id) != null;
}
}
/**
* 释放单个请求
* @param msg
*/
public void invokeResult(RequestMessage msg) {
Map<String, DeferredResultEx> deferredResultMap = map.get(msg.getKey());
if (deferredResultMap == null) {
return;
}
DeferredResultEx result = deferredResultMap.get(msg.getId());
if (result == null) {
return;
}
result.getDeferredResult().setResult(msg.getData());
deferredResultMap.remove(msg.getId());
if (deferredResultMap.size() == 0) {
map.remove(msg.getKey());
}
}
/**
* 释放所有的请求
* @param msg
*/
public void invokeAllResult(RequestMessage msg) {
Map<String, DeferredResultEx> deferredResultMap = map.get(msg.getKey());
if (deferredResultMap == null) {
return;
}
synchronized (this) {
deferredResultMap = map.get(msg.getKey());
if (deferredResultMap == null) {
return;
}
Set<String> ids = deferredResultMap.keySet();
for (String id : ids) {
DeferredResultEx result = deferredResultMap.get(id);
if (result == null) {
return;
}
if (result.getFilter() != null) {
Object handler = result.getFilter().handler(msg.getData());
result.getDeferredResult().setResult(handler);
}else {
result.getDeferredResult().setResult(msg.getData());
}
}
map.remove(msg.getKey());
}
}
}

View File

@ -1,39 +1,39 @@
package com.genersoft.iot.vmp.gb28181.transmit.callback;
/**
* @description: 请求信息定义
* @author: swwheihei
* @date: 2020年5月8日 下午1:09:18
*/
public class RequestMessage {
private String id;
private String key;
private Object data;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public void setKey(String key) {
this.key = key;
}
public String getKey() {
return key;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
package com.genersoft.iot.vmp.gb28181.transmit.callback;
/**
* @description: 请求信息定义
* @author: swwheihei
* @date: 2020年5月8日 下午1:09:18
*/
public class RequestMessage {
private String id;
private String key;
private Object data;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public void setKey(String key) {
this.key = key;
}
public String getKey() {
return key;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}

View File

@ -1,373 +1,364 @@
package com.genersoft.iot.vmp.gb28181.transmit.cmd;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
import gov.nist.javax.sip.message.SIPRequest;
import gov.nist.javax.sip.message.SIPResponse;
import javax.sip.InvalidArgumentException;
import javax.sip.SipException;
import java.text.ParseException;
import java.util.function.Function;
/**
* @description:设备能力接口用于定义设备的控制查询能力
* @author: swwheihei
* @date: 2020年5月3日 下午9:16:34
*/
public interface ISIPCommander {
/**
* 云台方向放控制使用配置文件中的默认镜头移动速度
*
* @param device 控制设备
* @param channelId 预览通道
* @param leftRight 镜头左移右移 0:停止 1:左移 2:右移
* @param upDown 镜头上移下移 0:停止 1:上移 2:下移
*/
void ptzdirectCmd(Device device,String channelId,int leftRight, int upDown) throws InvalidArgumentException, ParseException, SipException;
/**
* 云台方向放控制
*
* @param device 控制设备
* @param channelId 预览通道
* @param leftRight 镜头左移右移 0:停止 1:左移 2:右移
* @param upDown 镜头上移下移 0:停止 1:上移 2:下移
* @param moveSpeed 镜头移动速度
*/
void ptzdirectCmd(Device device,String channelId,int leftRight, int upDown, int moveSpeed) throws InvalidArgumentException, ParseException, SipException;
/**
* 云台缩放控制使用配置文件中的默认镜头缩放速度
*
* @param device 控制设备
* @param channelId 预览通道
* @param inOut 镜头放大缩小 0:停止 1:缩小 2:放大
*/
void ptzZoomCmd(Device device,String channelId,int inOut) throws InvalidArgumentException, ParseException, SipException;
/**
* 云台缩放控制
*
* @param device 控制设备
* @param channelId 预览通道
* @param inOut 镜头放大缩小 0:停止 1:缩小 2:放大
*/
void ptzZoomCmd(Device device,String channelId,int inOut, int moveSpeed) throws InvalidArgumentException, ParseException, SipException;
/**
* 云台控制支持方向与缩放控制
*
* @param device 控制设备
* @param channelId 预览通道
* @param leftRight 镜头左移右移 0:停止 1:左移 2:右移
* @param upDown 镜头上移下移 0:停止 1:上移 2:下移
* @param inOut 镜头放大缩小 0:停止 1:缩小 2:放大
* @param moveSpeed 镜头移动速度
* @param zoomSpeed 镜头缩放速度
*/
void ptzCmd(Device device,String channelId,int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed) throws InvalidArgumentException, SipException, ParseException;
/**
* 前端控制包括PTZ指令FI指令预置位指令巡航指令扫描指令和辅助开关指令
*
* @param device 控制设备
* @param channelId 预览通道
* @param cmdCode 指令码
* @param parameter1 数据1
* @param parameter2 数据2
* @param combineCode2 组合码2
*/
void frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2) throws SipException, InvalidArgumentException, ParseException;
/**
* 前端控制指令用于转发上级指令
* @param device 控制设备
* @param channelId 预览通道
* @param cmdString 前端控制指令串
*/
void fronEndCmd(Device device, String channelId, String cmdString, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 请求预览视频流
* @param device 视频设备
* @param channelId 预览通道
*/
void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
Function<String, Void> ignoreCallBack,
Function<SIPResponse, Void> inviteCallBack,
ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 请求回放视频流
*
* @param device 视频设备
* @param channelId 预览通道
* @param startTime 开始时间,格式要求yyyy-MM-dd HH:mm:ss
* @param endTime 结束时间,格式要求yyyy-MM-dd HH:mm:ss
*/
void playbackStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInf, Device device, String channelId, String startTime, String endTime,
Function<String, Void> ignoreCallBack,
Function<SIPResponse, Void> inviteCallBack,
ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 请求历史媒体下载
*
* @param device 视频设备
* @param channelId 预览通道
* @param startTime 开始时间,格式要求yyyy-MM-dd HH:mm:ss
* @param endTime 结束时间,格式要求yyyy-MM-dd HH:mm:ss
* @param downloadSpeed 下载倍速参数
*/
void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
String startTime, String endTime, int downloadSpeed, Function<String, Void> ignoreCallBack, Function<SIPResponse, Void> inviteCallBack, ZlmHttpHookSubscribe.Event hookEvent,
SipSubscribe.Event errorEvent,SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 视频流停止
*/
void streamByeCmd(Device device, String channelId, String stream, String callId, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException, SsrcTransactionNotFoundException;
void streamByeCmd(Device device, String channelId, String stream, String callId) throws InvalidArgumentException, ParseException, SipException, SsrcTransactionNotFoundException;
/**
* 回放暂停
*/
void playPauseCmd(Device device, StreamInfo streamInfo) throws InvalidArgumentException, ParseException, SipException;
/**
* 回放恢复
*/
void playResumeCmd(Device device, StreamInfo streamInfo) throws InvalidArgumentException, ParseException, SipException;
/**
* 回放拖动播放
*/
void playSeekCmd(Device device, StreamInfo streamInfo, long seekTime) throws InvalidArgumentException, ParseException, SipException;
/**
* 回放倍速播放
*/
void playSpeedCmd(Device device, StreamInfo streamInfo, Double speed) throws InvalidArgumentException, ParseException, SipException;
/**
* 回放控制
* @param device
* @param streamInfo
* @param content
*/
void playbackControlCmd(Device device, StreamInfo streamInfo, String content,SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, InvalidArgumentException, ParseException;
/**
* 语音广播
*
* @param device 视频设备
* @param channelId 预览通道
*/
void audioBroadcastCmd(Device device,String channelId);
/**
* 语音广播
*
* @param device 视频设备
*/
void audioBroadcastCmd(Device device, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
void audioBroadcastCmd(Device device) throws InvalidArgumentException, SipException, ParseException;
/**
* 音视频录像控制
*
* @param device 视频设备
* @param channelId 预览通道
* @param recordCmdStr 录像命令Record / StopRecord
*/
void recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 远程启动控制命令
*
* @param device 视频设备
*/
void teleBootCmd(Device device) throws InvalidArgumentException, SipException, ParseException;
/**
* 报警布防/撤防命令
*
* @param device 视频设备
*/
void guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 报警复位命令
*
* @param device 视频设备
* @param alarmMethod 报警方式可选
* @param alarmType 报警类型可选
*/
void alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 强制关键帧命令,设备收到此命令应立刻发送一个IDR帧
*
* @param device 视频设备
* @param channelId 预览通道
*/
void iFrameCmd(Device device, String channelId) throws InvalidArgumentException, SipException, ParseException;
/**
* 看守位控制命令
*
* @param device 视频设备
* @param channelId 通道id非通道则是设备本身
* @param enabled 看守位使能1 = 开启0 = 关闭
* @param resetTime 自动归位时间间隔开启看守位时使用单位:(s)
* @param presetIndex 调用预置位编号开启看守位时使用取值范围0~255
*/
void homePositionCmd(Device device, String channelId, String enabled, String resetTime, String presetIndex, SipSubscribe.Event errorEvent,SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 设备配置命令
*
* @param device 视频设备
*/
void deviceConfigCmd(Device device);
/**
* 设备配置命令basicParam
*
* @param device 视频设备
* @param channelId 通道编码可选
* @param name 设备/通道名称可选
* @param expiration 注册过期时间可选
* @param heartBeatInterval 心跳间隔时间可选
* @param heartBeatCount 心跳超时次数可选
*/
void deviceBasicConfigCmd(Device device, String channelId, String name, String expiration, String heartBeatInterval, String heartBeatCount, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 查询设备状态
*
* @param device 视频设备
*/
void deviceStatusQuery(Device device, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 查询设备信息
*
* @param device 视频设备
* @return
*/
void deviceInfoQuery(Device device) throws InvalidArgumentException, SipException, ParseException;
/**
* 查询目录列表
*
* @param device 视频设备
*/
void catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent) throws SipException, InvalidArgumentException, ParseException;
/**
* 查询录像信息
*
* @param device 视频设备
* @param startTime 开始时间,格式要求yyyy-MM-dd HH:mm:ss
* @param endTime 结束时间,格式要求yyyy-MM-dd HH:mm:ss
* @param sn
*/
void recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, Integer Secrecy, String type, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 查询报警信息
*
* @param device 视频设备
* @param startPriority 报警起始级别可选
* @param endPriority 报警终止级别可选
* @param alarmMethod 报警方式条件可选
* @param alarmType 报警类型
* @param startTime 报警发生起始时间可选
* @param endTime 报警发生终止时间可选
* @return true = 命令发送成功
*/
void alarmInfoQuery(Device device, String startPriority, String endPriority, String alarmMethod,
String alarmType, String startTime, String endTime, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 查询设备配置
*
* @param device 视频设备
* @param channelId 通道编码可选
* @param configType 配置类型
*/
void deviceConfigQuery(Device device, String channelId, String configType, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 查询设备预置位置
*
* @param device 视频设备
*/
void presetQuery(Device device, String channelId, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 查询移动设备位置数据
*
* @param device 视频设备
*/
void mobilePostitionQuery(Device device, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 订阅取消订阅移动位置
*
* @param device 视频设备
* @return true = 命令发送成功
*/
SIPRequest mobilePositionSubscribe(Device device, SIPRequest request, SipSubscribe.Event okEvent , SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 订阅取消订阅报警信息
* @param device 视频设备
* @param expires 订阅过期时间0 = 取消订阅
* @param startPriority 报警起始级别可选
* @param endPriority 报警终止级别可选
* @param alarmType 报警类型
* @param startTime 报警发生起始时间可选
* @param endTime 报警发生终止时间可选
* @return true = 命令发送成功
*/
void alarmSubscribe(Device device, int expires, String startPriority, String endPriority, String alarmMethod, String startTime, String endTime) throws InvalidArgumentException, SipException, ParseException;
/**
* 订阅取消订阅目录信息
* @param device 视频设备
* @return true = 命令发送成功
*/
SIPRequest catalogSubscribe(Device device, SIPRequest request, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 拉框控制命令
*
* @param device 控制设备
* @param channelId 通道id
* @param cmdString 前端控制指令串
*/
void dragZoomCmd(Device device, String channelId, String cmdString) throws InvalidArgumentException, SipException, ParseException;
/**
* 向设备发送报警NOTIFY消息 用于互联结构下此时将设备当成一个平级平台看待
* @param device 设备
* @param deviceAlarm 报警信息信息
* @return
*/
void sendAlarmMessage(Device device, DeviceAlarm deviceAlarm) throws InvalidArgumentException, SipException, ParseException;
}
package com.genersoft.iot.vmp.gb28181.transmit.cmd;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
import gov.nist.javax.sip.message.SIPRequest;
import javax.sip.InvalidArgumentException;
import javax.sip.SipException;
import java.text.ParseException;
/**
* @description:设备能力接口用于定义设备的控制查询能力
* @author: swwheihei
* @date: 2020年5月3日 下午9:16:34
*/
public interface ISIPCommander {
/**
* 云台方向放控制使用配置文件中的默认镜头移动速度
*
* @param device 控制设备
* @param channelId 预览通道
* @param leftRight 镜头左移右移 0:停止 1:左移 2:右移
* @param upDown 镜头上移下移 0:停止 1:上移 2:下移
*/
void ptzdirectCmd(Device device,String channelId,int leftRight, int upDown) throws InvalidArgumentException, ParseException, SipException;
/**
* 云台方向放控制
*
* @param device 控制设备
* @param channelId 预览通道
* @param leftRight 镜头左移右移 0:停止 1:左移 2:右移
* @param upDown 镜头上移下移 0:停止 1:上移 2:下移
* @param moveSpeed 镜头移动速度
*/
void ptzdirectCmd(Device device,String channelId,int leftRight, int upDown, int moveSpeed) throws InvalidArgumentException, ParseException, SipException;
/**
* 云台缩放控制使用配置文件中的默认镜头缩放速度
*
* @param device 控制设备
* @param channelId 预览通道
* @param inOut 镜头放大缩小 0:停止 1:缩小 2:放大
*/
void ptzZoomCmd(Device device,String channelId,int inOut) throws InvalidArgumentException, ParseException, SipException;
/**
* 云台缩放控制
*
* @param device 控制设备
* @param channelId 预览通道
* @param inOut 镜头放大缩小 0:停止 1:缩小 2:放大
*/
void ptzZoomCmd(Device device,String channelId,int inOut, int moveSpeed) throws InvalidArgumentException, ParseException, SipException;
/**
* 云台控制支持方向与缩放控制
*
* @param device 控制设备
* @param channelId 预览通道
* @param leftRight 镜头左移右移 0:停止 1:左移 2:右移
* @param upDown 镜头上移下移 0:停止 1:上移 2:下移
* @param inOut 镜头放大缩小 0:停止 1:缩小 2:放大
* @param moveSpeed 镜头移动速度
* @param zoomSpeed 镜头缩放速度
*/
void ptzCmd(Device device,String channelId,int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed) throws InvalidArgumentException, SipException, ParseException;
/**
* 前端控制包括PTZ指令FI指令预置位指令巡航指令扫描指令和辅助开关指令
*
* @param device 控制设备
* @param channelId 预览通道
* @param cmdCode 指令码
* @param parameter1 数据1
* @param parameter2 数据2
* @param combineCode2 组合码2
*/
void frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2) throws SipException, InvalidArgumentException, ParseException;
/**
* 前端控制指令用于转发上级指令
* @param device 控制设备
* @param channelId 预览通道
* @param cmdString 前端控制指令串
*/
void fronEndCmd(Device device, String channelId, String cmdString, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 请求预览视频流
* @param device 视频设备
* @param channelId 预览通道
*/
void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 请求回放视频流
*
* @param device 视频设备
* @param channelId 预览通道
* @param startTime 开始时间,格式要求yyyy-MM-dd HH:mm:ss
* @param endTime 结束时间,格式要求yyyy-MM-dd HH:mm:ss
*/
void playbackStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInf, Device device, String channelId, String startTime, String endTime,ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 请求历史媒体下载
*
* @param device 视频设备
* @param channelId 预览通道
* @param startTime 开始时间,格式要求yyyy-MM-dd HH:mm:ss
* @param endTime 结束时间,格式要求yyyy-MM-dd HH:mm:ss
* @param downloadSpeed 下载倍速参数
*/
void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
String startTime, String endTime, int downloadSpeed, ZlmHttpHookSubscribe.Event hookEvent,
SipSubscribe.Event errorEvent,SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 视频流停止
*/
void streamByeCmd(Device device, String channelId, String stream, String callId, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException, SsrcTransactionNotFoundException;
void streamByeCmd(Device device, String channelId, String stream, String callId) throws InvalidArgumentException, ParseException, SipException, SsrcTransactionNotFoundException;
/**
* 回放暂停
*/
void playPauseCmd(Device device, StreamInfo streamInfo) throws InvalidArgumentException, ParseException, SipException;
/**
* 回放恢复
*/
void playResumeCmd(Device device, StreamInfo streamInfo) throws InvalidArgumentException, ParseException, SipException;
/**
* 回放拖动播放
*/
void playSeekCmd(Device device, StreamInfo streamInfo, long seekTime) throws InvalidArgumentException, ParseException, SipException;
/**
* 回放倍速播放
*/
void playSpeedCmd(Device device, StreamInfo streamInfo, Double speed) throws InvalidArgumentException, ParseException, SipException;
/**
* 回放控制
* @param device
* @param streamInfo
* @param content
*/
void playbackControlCmd(Device device, StreamInfo streamInfo, String content,SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, InvalidArgumentException, ParseException;
/**
* 语音广播
*
* @param device 视频设备
* @param channelId 预览通道
*/
void audioBroadcastCmd(Device device,String channelId);
/**
* 语音广播
*
* @param device 视频设备
*/
void audioBroadcastCmd(Device device, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
void audioBroadcastCmd(Device device) throws InvalidArgumentException, SipException, ParseException;
/**
* 音视频录像控制
*
* @param device 视频设备
* @param channelId 预览通道
* @param recordCmdStr 录像命令Record / StopRecord
*/
void recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 远程启动控制命令
*
* @param device 视频设备
*/
void teleBootCmd(Device device) throws InvalidArgumentException, SipException, ParseException;
/**
* 报警布防/撤防命令
*
* @param device 视频设备
*/
void guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 报警复位命令
*
* @param device 视频设备
* @param alarmMethod 报警方式可选
* @param alarmType 报警类型可选
*/
void alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 强制关键帧命令,设备收到此命令应立刻发送一个IDR帧
*
* @param device 视频设备
* @param channelId 预览通道
*/
void iFrameCmd(Device device, String channelId) throws InvalidArgumentException, SipException, ParseException;
/**
* 看守位控制命令
*
* @param device 视频设备
* @param channelId 通道id非通道则是设备本身
* @param enabled 看守位使能1 = 开启0 = 关闭
* @param resetTime 自动归位时间间隔开启看守位时使用单位:(s)
* @param presetIndex 调用预置位编号开启看守位时使用取值范围0~255
*/
void homePositionCmd(Device device, String channelId, String enabled, String resetTime, String presetIndex, SipSubscribe.Event errorEvent,SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 设备配置命令
*
* @param device 视频设备
*/
void deviceConfigCmd(Device device);
/**
* 设备配置命令basicParam
*
* @param device 视频设备
* @param channelId 通道编码可选
* @param name 设备/通道名称可选
* @param expiration 注册过期时间可选
* @param heartBeatInterval 心跳间隔时间可选
* @param heartBeatCount 心跳超时次数可选
*/
void deviceBasicConfigCmd(Device device, String channelId, String name, String expiration, String heartBeatInterval, String heartBeatCount, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 查询设备状态
*
* @param device 视频设备
*/
void deviceStatusQuery(Device device, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 查询设备信息
*
* @param device 视频设备
* @return
*/
void deviceInfoQuery(Device device) throws InvalidArgumentException, SipException, ParseException;
/**
* 查询目录列表
*
* @param device 视频设备
*/
void catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent) throws SipException, InvalidArgumentException, ParseException;
/**
* 查询录像信息
*
* @param device 视频设备
* @param startTime 开始时间,格式要求yyyy-MM-dd HH:mm:ss
* @param endTime 结束时间,格式要求yyyy-MM-dd HH:mm:ss
* @param sn
*/
void recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, Integer Secrecy, String type, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 查询报警信息
*
* @param device 视频设备
* @param startPriority 报警起始级别可选
* @param endPriority 报警终止级别可选
* @param alarmMethod 报警方式条件可选
* @param alarmType 报警类型
* @param startTime 报警发生起始时间可选
* @param endTime 报警发生终止时间可选
* @return true = 命令发送成功
*/
void alarmInfoQuery(Device device, String startPriority, String endPriority, String alarmMethod,
String alarmType, String startTime, String endTime, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 查询设备配置
*
* @param device 视频设备
* @param channelId 通道编码可选
* @param configType 配置类型
*/
void deviceConfigQuery(Device device, String channelId, String configType, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 查询设备预置位置
*
* @param device 视频设备
*/
void presetQuery(Device device, String channelId, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 查询移动设备位置数据
*
* @param device 视频设备
*/
void mobilePostitionQuery(Device device, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 订阅取消订阅移动位置
*
* @param device 视频设备
* @return true = 命令发送成功
*/
SIPRequest mobilePositionSubscribe(Device device, SIPRequest request, SipSubscribe.Event okEvent , SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 订阅取消订阅报警信息
* @param device 视频设备
* @param expires 订阅过期时间0 = 取消订阅
* @param startPriority 报警起始级别可选
* @param endPriority 报警终止级别可选
* @param alarmType 报警类型
* @param startTime 报警发生起始时间可选
* @param endTime 报警发生终止时间可选
* @return true = 命令发送成功
*/
void alarmSubscribe(Device device, int expires, String startPriority, String endPriority, String alarmMethod, String startTime, String endTime) throws InvalidArgumentException, SipException, ParseException;
/**
* 订阅取消订阅目录信息
* @param device 视频设备
* @return true = 命令发送成功
*/
SIPRequest catalogSubscribe(Device device, SIPRequest request, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 拉框控制命令
*
* @param device 控制设备
* @param channelId 通道id
* @param cmdString 前端控制指令串
*/
void dragZoomCmd(Device device, String channelId, String cmdString) throws InvalidArgumentException, SipException, ParseException;
/**
* 向设备发送报警NOTIFY消息 用于互联结构下此时将设备当成一个平级平台看待
* @param device 设备
* @param deviceAlarm 报警信息信息
* @return
*/
void sendAlarmMessage(Device device, DeviceAlarm deviceAlarm) throws InvalidArgumentException, SipException, ParseException;
}

View File

@ -20,8 +20,6 @@ public interface ISIPCommanderForPlatform {
void register(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws InvalidArgumentException, ParseException, SipException;
void register(ParentPlatform parentPlatform, SipTransactionInfo sipTransactionInfo, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws InvalidArgumentException, ParseException, SipException;
void register(ParentPlatform parentPlatform, SipTransactionInfo sipTransactionInfo, WWWAuthenticateHeader www, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent, boolean isRegister) throws SipException, InvalidArgumentException, ParseException;
/**

View File

@ -227,11 +227,11 @@ public class SIPRequestHeaderPlarformProvider {
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(parentPlatform.getDeviceGBId(),
parentPlatform.getDeviceIp() + ":" + parentPlatform.getDevicePort());
Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, subscribeInfo.getResponse() != null ? subscribeInfo.getResponse().getToTag(): subscribeInfo.getSimulatedToTag());
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, subscribeInfo.getResponse().getToTag());
// to
SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerGBDomain());
Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI);
ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress, subscribeInfo.getRequest() != null ?subscribeInfo.getRequest().getFromTag(): subscribeInfo.getSimulatedFromTag());
ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress, subscribeInfo.getRequest().getFromTag());
// Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
@ -241,7 +241,7 @@ public class SIPRequestHeaderPlarformProvider {
// 设置编码 防止中文乱码
messageFactory.setDefaultContentEncodingCharset("gb2312");
CallIdHeader callIdHeader = SipFactory.getInstance().createHeaderFactory().createCallIdHeader(subscribeInfo.getRequest() != null ? subscribeInfo.getRequest().getCallIdHeader().getCallId(): subscribeInfo.getSimulatedCallId());
CallIdHeader callIdHeader = SipFactory.getInstance().createHeaderFactory().createCallIdHeader(subscribeInfo.getRequest().getCallIdHeader().getCallId());
request = (SIPRequest) messageFactory.createRequest(requestURI, Request.NOTIFY, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards);

View File

@ -1,320 +1,318 @@
package com.genersoft.iot.vmp.gb28181.transmit.cmd;
import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.gb28181.SipLayer;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.utils.GitUtil;
import gov.nist.javax.sip.message.SIPRequest;
import gov.nist.javax.sip.message.SIPResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.sip.InvalidArgumentException;
import javax.sip.PeerUnavailableException;
import javax.sip.SipException;
import javax.sip.SipFactory;
import javax.sip.address.Address;
import javax.sip.address.SipURI;
import javax.sip.header.*;
import javax.sip.message.Request;
import java.text.ParseException;
import java.util.ArrayList;
/**
* @description:摄像头命令request创造器 TODO 冗余代码太多待优化
* @author: swwheihei
* @date: 2020年5月6日 上午9:29:02
*/
@Component
public class SIPRequestHeaderProvider {
@Autowired
private SipConfig sipConfig;
@Autowired
private SipLayer sipLayer;
@Autowired
private GitUtil gitUtil;
@Autowired
private IRedisCatchStorage redisCatchStorage;
@Autowired
private VideoStreamSessionManager streamSession;
public Request createMessageRequest(Device device, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException {
Request request = null;
// sipuri
SipURI requestURI = SipFactory.getInstance().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
// via
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), viaTag);
viaHeader.setRPort();
viaHeaders.add(viaHeader);
// from
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());
Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, fromTag);
// to
SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI);
ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress, toTag);
// Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
// ceq
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.MESSAGE);
request = SipFactory.getInstance().createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards);
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
request.setContent(content, contentTypeHeader);
return request;
}
public Request createInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag, String ssrc, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException {
Request request = null;
//请求行
SipURI requestLine = SipFactory.getInstance().createAddressFactory().createSipURI(channelId, device.getHostAddress());
//via
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
HeaderFactory headerFactory = SipFactory.getInstance().createHeaderFactory();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), viaTag);
viaHeader.setRPort();
viaHeaders.add(viaHeader);
//from
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());
Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记否则无法创建会话无法回应ack
//to
SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(channelId, device.getHostAddress());
Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI);
ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress,null);
//Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
//ceq
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);
request = SipFactory.getInstance().createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
// Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort()));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
// Subject
SubjectHeader subjectHeader = SipFactory.getInstance().createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0));
request.addHeader(subjectHeader);
ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
request.setContent(content, contentTypeHeader);
return request;
}
public Request createPlaybackInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader, String ssrc) throws ParseException, InvalidArgumentException, PeerUnavailableException {
Request request = null;
//请求行
SipURI requestLine = SipFactory.getInstance().createAddressFactory().createSipURI(channelId, device.getHostAddress());
// via
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), viaTag);
viaHeader.setRPort();
viaHeaders.add(viaHeader);
//from
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());
Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记否则无法创建会话无法回应ack
//to
SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(channelId, device.getHostAddress());
Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI);
ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress,null);
//Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
//ceq
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);
request = SipFactory.getInstance().createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
// Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort()));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
// Subject
SubjectHeader subjectHeader = SipFactory.getInstance().createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0));
request.addHeader(subjectHeader);
ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
request.setContent(content, contentTypeHeader);
return request;
}
public Request createByteRequest(Device device, String channelId, SipTransactionInfo transactionInfo) throws ParseException, InvalidArgumentException, PeerUnavailableException {
Request request = null;
//请求行
SipURI requestLine = SipFactory.getInstance().createAddressFactory().createSipURI(channelId, device.getHostAddress());
// SipURI requestLine = SipFactory.getInstance().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
// via
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), SipUtils.getNewViaTag());
viaHeaders.add(viaHeader);
//from
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain());
Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, transactionInfo.getFromTag());
//to
SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(channelId,device.getHostAddress());
// SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(device.getDeviceId(),device.getHostAddress());
Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI);
ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress, transactionInfo.getToTag());
//Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
//ceq
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.BYE);
CallIdHeader callIdHeader = SipFactory.getInstance().createHeaderFactory().createCallIdHeader(transactionInfo.getCallId());
request = SipFactory.getInstance().createMessageFactory().createRequest(requestLine, Request.BYE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
return request;
}
public Request createSubscribeRequest(Device device, String content, SIPRequest requestOld, Integer expires, String event, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException {
Request request = null;
// sipuri
SipURI requestURI = SipFactory.getInstance().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
// via
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(),
device.getTransport(), SipUtils.getNewViaTag());
viaHeader.setRPort();
viaHeaders.add(viaHeader);
// from
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());
Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, requestOld == null ? SipUtils.getNewFromTag() :requestOld.getFromTag());
// to
SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI);
ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress, requestOld == null ? null :requestOld.getToTag());
// Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
// ceq
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.SUBSCRIBE);
request = SipFactory.getInstance().createMessageFactory().createRequest(requestURI, Request.SUBSCRIBE, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards);
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
// Expires
ExpiresHeader expireHeader = SipFactory.getInstance().createHeaderFactory().createExpiresHeader(expires);
request.addHeader(expireHeader);
// Event
EventHeader eventHeader = SipFactory.getInstance().createHeaderFactory().createEventHeader(event);
int random = (int) Math.floor(Math.random() * 10000);
eventHeader.setEventId(random + "");
request.addHeader(eventHeader);
ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
request.setContent(content, contentTypeHeader);
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
return request;
}
public SIPRequest createInfoRequest(Device device, String channelId, String content, SipTransactionInfo transactionInfo)
throws SipException, ParseException, InvalidArgumentException {
if (device == null || transactionInfo == null) {
return null;
}
SIPRequest request = null;
//请求行
SipURI requestLine = SipFactory.getInstance().createAddressFactory().createSipURI(channelId, device.getHostAddress());
// via
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), SipUtils.getNewViaTag());
viaHeaders.add(viaHeader);
//from
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain());
Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, transactionInfo.getFromTag());
//to
SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(channelId,device.getHostAddress());
Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI);
ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress, transactionInfo.getToTag());
//Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
//ceq
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INFO);
CallIdHeader callIdHeader = SipFactory.getInstance().createHeaderFactory().createCallIdHeader(transactionInfo.getCallId());
request = (SIPRequest)SipFactory.getInstance().createMessageFactory().createRequest(requestLine, Request.INFO, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
if (content != null) {
ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("Application",
"MANSRTSP");
request.setContent(content, contentTypeHeader);
}
return request;
}
public Request createAckRequest(String localIp, SipURI sipURI, SIPResponse sipResponse) throws ParseException, InvalidArgumentException, PeerUnavailableException {
// via
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(localIp, sipConfig.getPort(), sipResponse.getTopmostViaHeader().getTransport(), SipUtils.getNewViaTag());
viaHeaders.add(viaHeader);
//Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
//ceq
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(sipResponse.getCSeqHeader().getSeqNumber(), Request.ACK);
Request request = SipFactory.getInstance().createMessageFactory().createRequest(sipURI, Request.ACK, sipResponse.getCallIdHeader(), cSeqHeader, sipResponse.getFromHeader(), sipResponse.getToHeader(), viaHeaders, maxForwards);
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), localIp + ":"+sipConfig.getPort()));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
return request;
}
}
package com.genersoft.iot.vmp.gb28181.transmit.cmd;
import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.gb28181.SipLayer;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.utils.GitUtil;
import gov.nist.javax.sip.message.SIPRequest;
import gov.nist.javax.sip.message.SIPResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.sip.InvalidArgumentException;
import javax.sip.PeerUnavailableException;
import javax.sip.SipException;
import javax.sip.SipFactory;
import javax.sip.address.Address;
import javax.sip.address.SipURI;
import javax.sip.header.*;
import javax.sip.message.Request;
import java.text.ParseException;
import java.util.ArrayList;
/**
* @description:摄像头命令request创造器 TODO 冗余代码太多待优化
* @author: swwheihei
* @date: 2020年5月6日 上午9:29:02
*/
@Component
public class SIPRequestHeaderProvider {
@Autowired
private SipConfig sipConfig;
@Autowired
private SipLayer sipLayer;
@Autowired
private GitUtil gitUtil;
@Autowired
private IRedisCatchStorage redisCatchStorage;
@Autowired
private VideoStreamSessionManager streamSession;
public Request createMessageRequest(Device device, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException {
Request request = null;
// sipuri
SipURI requestURI = SipFactory.getInstance().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
// via
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), viaTag);
viaHeader.setRPort();
viaHeaders.add(viaHeader);
// from
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());
Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, fromTag);
// to
SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI);
ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress, toTag);
// Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
// ceq
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.MESSAGE);
request = SipFactory.getInstance().createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards);
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
request.setContent(content, contentTypeHeader);
return request;
}
public Request createInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag, String ssrc, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException {
Request request = null;
//请求行
SipURI requestLine = SipFactory.getInstance().createAddressFactory().createSipURI(channelId, device.getHostAddress());
//via
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
HeaderFactory headerFactory = SipFactory.getInstance().createHeaderFactory();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), viaTag);
viaHeader.setRPort();
viaHeaders.add(viaHeader);
//from
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());
Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记否则无法创建会话无法回应ack
//to
SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(channelId, device.getHostAddress());
Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI);
ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress,null);
//Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
//ceq
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);
request = SipFactory.getInstance().createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
// Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort()));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
// Subject
SubjectHeader subjectHeader = SipFactory.getInstance().createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0));
request.addHeader(subjectHeader);
ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
request.setContent(content, contentTypeHeader);
return request;
}
public Request createPlaybackInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader, String ssrc) throws ParseException, InvalidArgumentException, PeerUnavailableException {
Request request = null;
//请求行
SipURI requestLine = SipFactory.getInstance().createAddressFactory().createSipURI(channelId, device.getHostAddress());
// via
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), viaTag);
viaHeader.setRPort();
viaHeaders.add(viaHeader);
//from
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());
Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记否则无法创建会话无法回应ack
//to
SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(channelId, device.getHostAddress());
Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI);
ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress,null);
//Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
//ceq
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);
request = SipFactory.getInstance().createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
// Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort()));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
// Subject
SubjectHeader subjectHeader = SipFactory.getInstance().createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0));
request.addHeader(subjectHeader);
ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
request.setContent(content, contentTypeHeader);
return request;
}
public Request createByteRequest(Device device, String channelId, SipTransactionInfo transactionInfo) throws ParseException, InvalidArgumentException, PeerUnavailableException {
Request request = null;
//请求行
SipURI requestLine = SipFactory.getInstance().createAddressFactory().createSipURI(channelId, device.getHostAddress());
// via
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), SipUtils.getNewViaTag());
viaHeaders.add(viaHeader);
//from
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain());
Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, transactionInfo.getFromTag());
//to
SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(channelId,device.getHostAddress());
Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI);
ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress, transactionInfo.getToTag());
//Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
//ceq
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.BYE);
CallIdHeader callIdHeader = SipFactory.getInstance().createHeaderFactory().createCallIdHeader(transactionInfo.getCallId());
request = SipFactory.getInstance().createMessageFactory().createRequest(requestLine, Request.BYE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
return request;
}
public Request createSubscribeRequest(Device device, String content, SIPRequest requestOld, Integer expires, String event, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException {
Request request = null;
// sipuri
SipURI requestURI = SipFactory.getInstance().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
// via
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(),
device.getTransport(), SipUtils.getNewViaTag());
viaHeader.setRPort();
viaHeaders.add(viaHeader);
// from
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());
Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, requestOld == null ? SipUtils.getNewFromTag() :requestOld.getFromTag());
// to
SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI);
ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress, requestOld == null ? null :requestOld.getToTag());
// Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
// ceq
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.SUBSCRIBE);
request = SipFactory.getInstance().createMessageFactory().createRequest(requestURI, Request.SUBSCRIBE, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards);
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
// Expires
ExpiresHeader expireHeader = SipFactory.getInstance().createHeaderFactory().createExpiresHeader(expires);
request.addHeader(expireHeader);
// Event
EventHeader eventHeader = SipFactory.getInstance().createHeaderFactory().createEventHeader(event);
int random = (int) Math.floor(Math.random() * 10000);
eventHeader.setEventId(random + "");
request.addHeader(eventHeader);
ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
request.setContent(content, contentTypeHeader);
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
return request;
}
public SIPRequest createInfoRequest(Device device, String channelId, String content, SipTransactionInfo transactionInfo)
throws SipException, ParseException, InvalidArgumentException {
if (device == null || transactionInfo == null) {
return null;
}
SIPRequest request = null;
//请求行
SipURI requestLine = SipFactory.getInstance().createAddressFactory().createSipURI(channelId, device.getHostAddress());
// via
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), SipUtils.getNewViaTag());
viaHeaders.add(viaHeader);
//from
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain());
Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, transactionInfo.getFromTag());
//to
SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(channelId,device.getHostAddress());
Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI);
ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress, transactionInfo.getToTag());
//Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
//ceq
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INFO);
CallIdHeader callIdHeader = SipFactory.getInstance().createHeaderFactory().createCallIdHeader(transactionInfo.getCallId());
request = (SIPRequest)SipFactory.getInstance().createMessageFactory().createRequest(requestLine, Request.INFO, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
if (content != null) {
ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("Application",
"MANSRTSP");
request.setContent(content, contentTypeHeader);
}
return request;
}
public Request createAckRequest(String localIp, SipURI sipURI, SIPResponse sipResponse) throws ParseException, InvalidArgumentException, PeerUnavailableException {
// via
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(localIp, sipConfig.getPort(), sipResponse.getTopmostViaHeader().getTransport(), SipUtils.getNewViaTag());
viaHeaders.add(viaHeader);
//Forwards
MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70);
//ceq
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(sipResponse.getCSeqHeader().getSeqNumber(), Request.ACK);
Request request = SipFactory.getInstance().createMessageFactory().createRequest(sipURI, Request.ACK, sipResponse.getCallIdHeader(), cSeqHeader, sipResponse.getFromHeader(), sipResponse.getToHeader(), viaHeaders, maxForwards);
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), localIp + ":"+sipConfig.getPort()));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
return request;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -19,8 +19,7 @@ import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.utils.GitUtil;
import gov.nist.javax.sip.message.MessageFactoryImpl;
import gov.nist.javax.sip.message.SIPRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.DependsOn;
import org.springframework.lang.Nullable;
@ -37,12 +36,10 @@ import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Component
@DependsOn("sipLayer")
public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
private final Logger logger = LoggerFactory.getLogger(SIPCommanderFroPlatform.class);
@Autowired
private SIPRequestHeaderPlarformProvider headerProviderPlatformProvider;
@ -112,11 +109,14 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
toTag, callIdHeader, isRegister? parentPlatform.getExpires() : 0);
// callid 写入缓存 等注册成功可以更新状态
String callIdFromHeader = callIdHeader.getCallId();
redisCatchStorage.updatePlatformRegisterInfo(callIdFromHeader, PlatformRegisterInfo.getInstance(parentPlatform.getServerGBId(), isRegister));
PlatformRegisterInfo instance = PlatformRegisterInfo.getInstance(parentPlatform.getServerGBId(), isRegister);
log.info("callIdFromHeader {}",callIdFromHeader);
log.info("PlatformRegisterInfo {}",instance);
redisCatchStorage.updatePlatformRegisterInfo(callIdFromHeader, instance);
sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (event)->{
if (event != null) {
logger.info("向上级平台 [ {} ] 注册发生错误: {} ",
log.info("向上级平台 [ {} ] 注册发生错误: {} ",
parentPlatform.getServerGBId(),
event.msg);
}
@ -148,13 +148,13 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
Request request = headerProviderPlatformProvider.createMessageRequest(
parentPlatform,
keepaliveXml.toString(),
SipUtils.getNewFromTag(),
SipUtils.getNewViaTag(),
callIdHeader);
sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, errorEvent, okEvent);
Request request = headerProviderPlatformProvider.createMessageRequest(
parentPlatform,
keepaliveXml.toString(),
SipUtils.getNewFromTag(),
SipUtils.getNewViaTag(),
callIdHeader);
sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, errorEvent, okEvent);
return callIdHeader.getCallId();
}
@ -215,7 +215,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
}else {
if (channel.getChannelId().length() != 20) {
catalogXml.append("</Item>\r\n");
logger.warn("[编号长度异常] {} 长度错误请使用20位长度的国标编号,当前长度:{}", channel.getChannelId(), channel.getChannelId().length());
log.warn("[编号长度异常] {} 长度错误请使用20位长度的国标编号,当前长度:{}", channel.getChannelId(), channel.getChannelId().length());
catalogXml.append("</Item>\r\n");
continue;
}
@ -383,9 +383,9 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
String callId = request.getCallIdHeader().getCallId();
logger.info("[命令发送] 国标级联{} 目录查询回复: 共{}条,已发送{}条", parentPlatform.getServerGBId(),
log.info("[命令发送] 国标级联{} 目录查询回复: 共{}条,已发送{}条", parentPlatform.getServerGBId(),
channels.size(), Math.min(index + parentPlatform.getCatalogGroup(), channels.size()));
logger.debug(catalogXml);
log.debug(catalogXml);
if (sendAfterResponse) {
// 默认按照收到200回复后发送下一条 如果超时收不到回复就以30毫秒的间隔直接发送
dynamicTask.startDelay(timeoutTaskKey, ()->{
@ -394,11 +394,11 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
try {
sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext, false);
} catch (SipException | InvalidArgumentException | ParseException e) {
logger.error("[命令发送失败] 国标级联 目录查询回复: {}", e.getMessage());
log.error("[命令发送失败] 国标级联 目录查询回复: {}", e.getMessage());
}
}, 3000);
sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, eventResult -> {
logger.error("[目录推送失败] 国标级联 platform : {}, code: {}, msg: {}, 停止发送", parentPlatform.getServerGBId(), eventResult.statusCode, eventResult.msg);
log.error("[目录推送失败] 国标级联 platform : {}, code: {}, msg: {}, 停止发送", parentPlatform.getServerGBId(), eventResult.statusCode, eventResult.msg);
dynamicTask.stop(timeoutTaskKey);
}, eventResult -> {
dynamicTask.stop(timeoutTaskKey);
@ -406,12 +406,12 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
try {
sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext, true);
} catch (SipException | InvalidArgumentException | ParseException e) {
logger.error("[命令发送失败] 国标级联 目录查询回复: {}", e.getMessage());
log.error("[命令发送失败] 国标级联 目录查询回复: {}", e.getMessage());
}
});
}else {
sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, eventResult -> {
logger.error("[目录推送失败] 国标级联 platform : {}, code: {}, msg: {}, 停止发送", parentPlatform.getServerGBId(), eventResult.statusCode, eventResult.msg);
log.error("[目录推送失败] 国标级联 platform : {}, code: {}, msg: {}, 停止发送", parentPlatform.getServerGBId(), eventResult.statusCode, eventResult.msg);
dynamicTask.stop(timeoutTaskKey);
}, null);
dynamicTask.startDelay(timeoutTaskKey, ()->{
@ -419,7 +419,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
try {
sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext, false);
} catch (SipException | InvalidArgumentException | ParseException e) {
logger.error("[命令发送失败] 国标级联 目录查询回复: {}", e.getMessage());
log.error("[命令发送失败] 国标级联 目录查询回复: {}", e.getMessage());
}
}, 30);
}
@ -498,8 +498,8 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
if (parentPlatform == null) {
return;
}
if (logger.isDebugEnabled()) {
logger.debug("[发送 移动位置订阅] {}/{}->{},{}", parentPlatform.getServerGBId(), gpsMsgInfo.getId(), gpsMsgInfo.getLng(), gpsMsgInfo.getLat());
if (log.isDebugEnabled()) {
log.debug("[发送 移动位置订阅] {}/{}->{},{}", parentPlatform.getServerGBId(), gpsMsgInfo.getId(), gpsMsgInfo.getLng(), gpsMsgInfo.getLat());
}
String characterSet = parentPlatform.getCharacterSet();
@ -518,7 +518,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
.append("</Notify>\r\n");
sendNotify(parentPlatform, deviceStatusXml.toString(), subscribeInfo, eventResult -> {
logger.error("发送NOTIFY通知消息失败。错误{} {}", eventResult.statusCode, eventResult.msg);
log.error("发送NOTIFY通知消息失败。错误{} {}", eventResult.statusCode, eventResult.msg);
}, null);
}
@ -528,7 +528,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
if (parentPlatform == null) {
return;
}
logger.info("[发送报警通知]平台: {}/{}->{},{}: {}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(),
log.info("[发送报警通知]平台: {}/{}->{},{}: {}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(),
deviceAlarm.getLongitude(), deviceAlarm.getLatitude(), JSON.toJSONString(deviceAlarm));
String characterSet = parentPlatform.getCharacterSet();
StringBuffer deviceStatusXml = new StringBuffer(600);
@ -557,7 +557,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
@Override
public void sendNotifyForCatalogAddOrUpdate(String type, ParentPlatform parentPlatform, List<DeviceChannel> deviceChannels, SubscribeInfo subscribeInfo, Integer index) throws InvalidArgumentException, ParseException, NoSuchFieldException, SipException, IllegalAccessException {
if (parentPlatform == null || deviceChannels == null || deviceChannels.isEmpty() || subscribeInfo == null) {
if (parentPlatform == null || deviceChannels == null || deviceChannels.size() == 0 || subscribeInfo == null) {
return;
}
if (index == null) {
@ -575,16 +575,15 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
Integer finalIndex = index;
String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, channels,
deviceChannels.size(), type, subscribeInfo);
logger.info("[发送NOTIFY通知]类型: {},发送数量: {}", type, channels.size());
sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> {
logger.error("发送NOTIFY通知消息失败。错误{} {}", eventResult.statusCode, eventResult.msg);
log.error("发送NOTIFY通知消息失败。错误{} {}", eventResult.statusCode, eventResult.msg);
}, (eventResult -> {
try {
sendNotifyForCatalogAddOrUpdate(type, parentPlatform, deviceChannels, subscribeInfo,
finalIndex + parentPlatform.getCatalogGroup());
} catch (InvalidArgumentException | ParseException | NoSuchFieldException | SipException |
IllegalAccessException e) {
logger.error("[命令发送失败] 国标级联 NOTIFY通知: {}", e.getMessage());
log.error("[命令发送失败] 国标级联 NOTIFY通知: {}", e.getMessage());
}
}));
}
@ -599,7 +598,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
SIPRequest notifyRequest = headerProviderPlatformProvider.createNotifyRequest(parentPlatform, catalogXmlContent, subscribeInfo);
sipSender.transmitRequest(parentPlatform.getDeviceIp(), notifyRequest, errorEvent, okEvent);
sipSender.transmitRequest(parentPlatform.getDeviceIp(), notifyRequest);
}
private String getCatalogXmlContentForCatalogAddOrUpdate(ParentPlatform parentPlatform, List<DeviceChannel> channels, int sumNum, String type, SubscribeInfo subscribeInfo) {
@ -611,9 +610,9 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
.append("<CmdType>Catalog</CmdType>\r\n")
.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n")
.append("<DeviceID>" + parentPlatform.getDeviceGBId() + "</DeviceID>\r\n")
.append("<SumNum>"+ sumNum +"</SumNum>\r\n")
.append("<SumNum>1</SumNum>\r\n")
.append("<DeviceList Num=\"" + channels.size() + "\">\r\n");
if (!channels.isEmpty()) {
if (channels.size() > 0) {
for (DeviceChannel channel : channels) {
if (parentPlatform.getServerGBId().equals(channel.getParentId())) {
channel.setParentId(parentPlatform.getDeviceGBId());
@ -664,7 +663,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
|| deviceChannels == null
|| deviceChannels.size() == 0
|| subscribeInfo == null) {
logger.warn("[缺少必要参数]");
log.warn("[缺少必要参数]");
return;
}
@ -680,18 +679,17 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
}else {
channels = deviceChannels.subList(index, deviceChannels.size());
}
logger.info("[发送NOTIFY通知]类型: {},发送数量: {}", type, channels.size());
Integer finalIndex = index;
String catalogXmlContent = getCatalogXmlContentForCatalogOther(parentPlatform, channels, type);
sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> {
logger.error("发送NOTIFY通知消息失败。错误{} {}", eventResult.statusCode, eventResult.msg);
log.error("发送NOTIFY通知消息失败。错误{} {}", eventResult.statusCode, eventResult.msg);
}, eventResult -> {
try {
sendNotifyForCatalogOther(type, parentPlatform, deviceChannels, subscribeInfo,
finalIndex + parentPlatform.getCatalogGroup());
} catch (InvalidArgumentException | ParseException | NoSuchFieldException | SipException |
IllegalAccessException e) {
logger.error("[命令发送失败] 国标级联 NOTIFY通知: {}", e.getMessage());
log.error("[命令发送失败] 国标级联 NOTIFY通知: {}", e.getMessage());
}
});
}
@ -724,17 +722,17 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
}
@Override
public void recordInfo(DeviceChannel deviceChannel, ParentPlatform parentPlatform, String fromTag, RecordInfo recordInfo) throws SipException, InvalidArgumentException, ParseException {
log.debug("deviceChannel => {}, parentPlatform => {}, fromTag => {}, recordInfo => {}", deviceChannel, parentPlatform, fromTag, recordInfo);
if ( parentPlatform ==null) {
return ;
}
logger.info("[国标级联] 发送录像数据通道: {}", recordInfo.getChannelId());
String characterSet = parentPlatform.getCharacterSet();
StringBuffer recordXml = new StringBuffer(600);
recordXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n")
.append("<Response>\r\n")
.append("<CmdType>RecordInfo</CmdType>\r\n")
.append("<SN>" +recordInfo.getSn() + "</SN>\r\n")
.append("<DeviceID>" + deviceChannel.getChannelId() + "</DeviceID>\r\n")
.append("<DeviceID>" + recordInfo.getChannelId() + "</DeviceID>\r\n")
.append("<SumNum>" + recordInfo.getSumNum() + "</SumNum>\r\n");
if (recordInfo.getRecordList() == null ) {
recordXml.append("<RecordList Num=\"0\">\r\n");
@ -744,7 +742,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
for (RecordItem recordItem : recordInfo.getRecordList()) {
recordXml.append("<Item>\r\n");
if (deviceChannel != null) {
recordXml.append("<DeviceID>" + deviceChannel.getChannelId() + "</DeviceID>\r\n")
recordXml.append("<DeviceID>" + recordItem.getDeviceId() + "</DeviceID>\r\n")
.append("<Name>" + recordItem.getName() + "</Name>\r\n")
.append("<StartTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(recordItem.getStartTime()) + "</StartTime>\r\n")
.append("<EndTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(recordItem.getEndTime()) + "</EndTime>\r\n")
@ -764,14 +762,12 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
recordXml.append("</RecordList>\r\n")
.append("</Response>\r\n");
logger.info("[国标级联] 发送录像数据通道:{}, 内容: {}", recordInfo.getChannelId(), recordXml);
// callid
CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, recordXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, null, eventResult -> {
logger.info("[国标级联] 发送录像数据通道:{}, 发送成功", recordInfo.getChannelId());
});
sipSender.transmitRequest(parentPlatform.getDeviceIp(), request);
}
@ -813,14 +809,14 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
@Override
public void streamByeCmd(ParentPlatform parentPlatform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException {
if (sendRtpItem == null ) {
logger.info("[向上级发送BYE] sendRtpItem 为NULL");
log.info("[向上级发送BYE] sendRtpItem 为NULL");
return;
}
if (parentPlatform == null) {
logger.info("[向上级发送BYE] platform 为NULL");
log.info("[向上级发送BYE] platform 为NULL");
return;
}
logger.info("[向上级发送BYE] {}/{}", parentPlatform.getServerGBId(), sendRtpItem.getChannelId());
log.info("[向上级发送BYE] {}/{}", parentPlatform.getServerGBId(), sendRtpItem.getChannelId());
String mediaServerId = sendRtpItem.getMediaServerId();
MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
if (mediaServerItem != null) {
@ -829,7 +825,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
}
SIPRequest byeRequest = headerProviderPlatformProvider.createByeRequest(parentPlatform, sendRtpItem);
if (byeRequest == null) {
logger.warn("[向上级发送bye]:无法创建 byeRequest");
log.warn("[向上级发送bye]:无法创建 byeRequest");
}
sipSender.transmitRequest(parentPlatform.getDeviceIp(),byeRequest);
}

View File

@ -3,7 +3,6 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request;
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import com.google.common.primitives.Bytes;
import gov.nist.javax.sip.message.SIPRequest;
import gov.nist.javax.sip.message.SIPResponse;
import org.apache.commons.lang3.ArrayUtils;
@ -197,14 +196,15 @@ public abstract class SIPRequestProcessorParent {
result.add(rawContent[i]);
}
}
byte[] bytesResult = Bytes.toArray(result);
Byte[] bytes = new Byte[0];
byte[] bytesResult = ArrayUtils.toPrimitive(result.toArray(bytes));
Document xml;
try {
xml = reader.read(new ByteArrayInputStream(bytesResult));
}catch (DocumentException e) {
logger.warn("[xml解析异常] 文如下: \r\n{}", new String(bytesResult));
logger.warn("[xml解析异常] 文如下: 尝试兼容性处理");
logger.warn("[xml解析异常] 文如下: \r\n{}", new String(bytesResult));
logger.warn("[xml解析异常] 文如下: 尝试兼容性处理");
String[] xmlLineArray = new String(bytesResult).split("\\r?\\n");
// 兼容海康的address字段带有<破换xml结构导致无法解析xml的问题

Some files were not shown because too many files have changed in this diff Show More