Commit 96bb3814f65edb36327eb02f2ea1beed30f06dfc

Authored by 648540858
2 parents aed45e0f c62a8986

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
Showing 91 changed files with 737 additions and 628 deletions
doc/_content/qa/play_error.md
1 <!-- 点播错误 --> 1 <!-- 点播错误 -->
2 # 点播错误 2 # 点播错误
3 -排查点播错误你首先要清[点播的基本流程](_content/theory/play.md),一般的流程如下: 3 +排查点播错误你首先要清[点播的基本流程](_content/theory/play.md),一般的流程如下:
4 ```plantuml 4 ```plantuml
5 @startuml 5 @startuml
6 "WEB用户" -> "WVP-PRO": 1. 发起点播请求 6 "WEB用户" -> "WVP-PRO": 1. 发起点播请求
@@ -153,13 +153,17 @@ @@ -153,13 +153,17 @@
153 <version>2.1.3</version> 153 <version>2.1.3</version>
154 </dependency> 154 </dependency>
155 155
156 - <!-- json解析库fastjson --> 156 + <!-- json解析库fastjson2 -->
157 <dependency> 157 <dependency>
158 - <groupId>com.alibaba</groupId>  
159 - <artifactId>fastjson</artifactId>  
160 - <version>1.2.83</version> 158 + <groupId>com.alibaba.fastjson2</groupId>
  159 + <artifactId>fastjson2</artifactId>
  160 + <version>2.0.17</version>
  161 + </dependency>
  162 + <dependency>
  163 + <groupId>com.alibaba.fastjson2</groupId>
  164 + <artifactId>fastjson2-extension</artifactId>
  165 + <version>2.0.17</version>
161 </dependency> 166 </dependency>
162 -  
163 167
164 <!-- okhttp --> 168 <!-- okhttp -->
165 <dependency> 169 <dependency>
src/main/java/com/genersoft/iot/vmp/common/VersionPo.java
1 package com.genersoft.iot.vmp.common; 1 package com.genersoft.iot.vmp.common;
2 2
3 -import com.alibaba.fastjson.annotation.JSONField; 3 +import com.alibaba.fastjson2.annotation.JSONField;
4 4
5 public class VersionPo { 5 public class VersionPo {
6 /** 6 /**
src/main/java/com/genersoft/iot/vmp/conf/GlobalResponseAdvice.java
1 package com.genersoft.iot.vmp.conf; 1 package com.genersoft.iot.vmp.conf;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.support.spring.http.converter.FastJsonHttpMessageConverter;
5 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; 5 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
6 import com.genersoft.iot.vmp.vmanager.bean.WVPResult; 6 import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
7 import org.jetbrains.annotations.NotNull; 7 import org.jetbrains.annotations.NotNull;
src/main/java/com/genersoft/iot/vmp/conf/MediaStatusTimerTask.java
1 package com.genersoft.iot.vmp.conf; 1 package com.genersoft.iot.vmp.conf;
2 2
3 -import com.alibaba.fastjson.JSONObject;  
4 import org.springframework.scheduling.annotation.Scheduled; 3 import org.springframework.scheduling.annotation.Scheduled;
5 4
6 /** 5 /**
src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
@@ -37,6 +37,8 @@ public class UserSetting { @@ -37,6 +37,8 @@ public class UserSetting {
37 37
38 private Boolean streamOnDemand = Boolean.TRUE; 38 private Boolean streamOnDemand = Boolean.TRUE;
39 39
  40 + private Boolean pushAuthority = Boolean.TRUE;
  41 +
40 private String serverId = "000000"; 42 private String serverId = "000000";
41 43
42 private String thirdPartyGBIdReg = "[\\s\\S]*"; 44 private String thirdPartyGBIdReg = "[\\s\\S]*";
@@ -166,4 +168,12 @@ public class UserSetting { @@ -166,4 +168,12 @@ public class UserSetting {
166 public void setUseSourceIpAsStreamIp(Boolean useSourceIpAsStreamIp) { 168 public void setUseSourceIpAsStreamIp(Boolean useSourceIpAsStreamIp) {
167 this.useSourceIpAsStreamIp = useSourceIpAsStreamIp; 169 this.useSourceIpAsStreamIp = useSourceIpAsStreamIp;
168 } 170 }
  171 +
  172 + public Boolean getPushAuthority() {
  173 + return pushAuthority;
  174 + }
  175 +
  176 + public void setPushAuthority(Boolean pushAuthority) {
  177 + this.pushAuthority = pushAuthority;
  178 + }
169 } 179 }
src/main/java/com/genersoft/iot/vmp/conf/WVPTimerTask.java
1 package com.genersoft.iot.vmp.conf; 1 package com.genersoft.iot.vmp.conf;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.service.IMediaServerService; 4 import com.genersoft.iot.vmp.service.IMediaServerService;
5 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 5 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
6 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.beans.factory.annotation.Autowired;
src/main/java/com/genersoft/iot/vmp/conf/redis/RedisConfig.java
1 package com.genersoft.iot.vmp.conf.redis; 1 package com.genersoft.iot.vmp.conf.redis;
2 2
3 3
4 -import com.alibaba.fastjson.parser.ParserConfig;  
5 import com.genersoft.iot.vmp.common.VideoManagerConstants; 4 import com.genersoft.iot.vmp.common.VideoManagerConstants;
6 import com.genersoft.iot.vmp.service.redisMsg.*; 5 import com.genersoft.iot.vmp.service.redisMsg.*;
7 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,8 +54,7 @@ public class RedisConfig extends CachingConfigurerSupport { @@ -55,8 +54,7 @@ public class RedisConfig extends CachingConfigurerSupport {
55 // value值的序列化采用fastJsonRedisSerializer 54 // value值的序列化采用fastJsonRedisSerializer
56 redisTemplate.setValueSerializer(fastJsonRedisSerializer); 55 redisTemplate.setValueSerializer(fastJsonRedisSerializer);
57 redisTemplate.setHashValueSerializer(fastJsonRedisSerializer); 56 redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
58 - // 全局开启AutoType,不建议使用  
59 - ParserConfig.getGlobalInstance().setAutoTypeSupport(true); 57 +
60 // key的序列化采用StringRedisSerializer 58 // key的序列化采用StringRedisSerializer
61 redisTemplate.setKeySerializer(new StringRedisSerializer()); 59 redisTemplate.setKeySerializer(new StringRedisSerializer());
62 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); 60 redisTemplate.setHashKeySerializer(new StringRedisSerializer());
src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java
1 package com.genersoft.iot.vmp.conf.security; 1 package com.genersoft.iot.vmp.conf.security;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; 4 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
5 import org.apache.poi.hssf.eventmodel.ERFListener; 5 import org.apache.poi.hssf.eventmodel.ERFListener;
6 import org.slf4j.Logger; 6 import org.slf4j.Logger;
src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamInfo.java
1 package com.genersoft.iot.vmp.gb28181.bean; 1 package com.genersoft.iot.vmp.gb28181.bean;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 4 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
5 5
6 public class InviteStreamInfo { 6 public class InviteStreamInfo {
src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java
@@ -42,7 +42,7 @@ public class CatalogDataCatch { @@ -42,7 +42,7 @@ public class CatalogDataCatch {
42 catalogData.setSn(sn); 42 catalogData.setSn(sn);
43 catalogData.setTotal(total); 43 catalogData.setTotal(total);
44 catalogData.setDevice(device); 44 catalogData.setDevice(device);
45 - catalogData.setChannelList(Collections.synchronizedList(new ArrayList<>())); 45 + catalogData.setChannelList(deviceChannelList);
46 catalogData.setStatus(CatalogData.CatalogDataStatus.runIng); 46 catalogData.setStatus(CatalogData.CatalogDataStatus.runIng);
47 catalogData.setLastTime(Instant.now()); 47 catalogData.setLastTime(Instant.now());
48 data.put(deviceId, catalogData); 48 data.put(deviceId, catalogData);
src/main/java/com/genersoft/iot/vmp/gb28181/task/SipRunner.java
1 package com.genersoft.iot.vmp.gb28181.task; 1 package com.genersoft.iot.vmp.gb28181.task;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.conf.UserSetting; 4 import com.genersoft.iot.vmp.conf.UserSetting;
5 import com.genersoft.iot.vmp.gb28181.bean.Device; 5 import com.genersoft.iot.vmp.gb28181.bean.Device;
6 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 6 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
1 package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl; 1 package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.common.StreamInfo; 4 import com.genersoft.iot.vmp.common.StreamInfo;
5 import com.genersoft.iot.vmp.conf.DynamicTask; 5 import com.genersoft.iot.vmp.conf.DynamicTask;
6 import com.genersoft.iot.vmp.conf.SipConfig; 6 import com.genersoft.iot.vmp.conf.SipConfig;
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
1 package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl; 1 package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl;
2 2
3 -import com.alibaba.fastjson.JSONObject;  
4 -import com.genersoft.iot.vmp.gb28181.SipLayer; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONObject;
5 import com.genersoft.iot.vmp.gb28181.bean.*; 5 import com.genersoft.iot.vmp.gb28181.bean.*;
6 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; 6 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
7 import com.genersoft.iot.vmp.gb28181.transmit.SIPSender; 7 import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
@@ -347,7 +347,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -347,7 +347,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
347 return; 347 return;
348 } 348 }
349 logger.info("[发送报警通知] {}/{}->{},{}: {}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(), 349 logger.info("[发送报警通知] {}/{}->{},{}: {}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(),
350 - deviceAlarm.getLongitude(), deviceAlarm.getLatitude(), JSONObject.toJSON(deviceAlarm)); 350 + deviceAlarm.getLongitude(), deviceAlarm.getLatitude(), JSON.toJSONString(deviceAlarm));
351 String characterSet = parentPlatform.getCharacterSet(); 351 String characterSet = parentPlatform.getCharacterSet();
352 StringBuffer deviceStatusXml = new StringBuffer(600); 352 StringBuffer deviceStatusXml = new StringBuffer(600);
353 deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); 353 deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.conf.DynamicTask; 5 import com.genersoft.iot.vmp.conf.DynamicTask;
5 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 6 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
6 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; 7 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
@@ -141,7 +142,7 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In @@ -141,7 +142,7 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In
141 logger.info("调用ZLM推流接口, 结果: {}", jsonObject); 142 logger.info("调用ZLM推流接口, 结果: {}", jsonObject);
142 logger.info("RTP推流成功[ {}/{} ],{}->{}:{}, " ,param.get("app"), param.get("stream"), jsonObject.getString("local_port"), param.get("dst_url"), param.get("dst_port")); 143 logger.info("RTP推流成功[ {}/{} ],{}->{}:{}, " ,param.get("app"), param.get("stream"), jsonObject.getString("local_port"), param.get("dst_url"), param.get("dst_port"));
143 } else { 144 } else {
144 - logger.error("RTP推流失败: {}, 参数:{}",jsonObject.getString("msg"),JSONObject.toJSON(param)); 145 + logger.error("RTP推流失败: {}, 参数:{}",jsonObject.getString("msg"), JSON.toJSONString(param));
145 if (sendRtpItem.isOnlyAudio()) { 146 if (sendRtpItem.isOnlyAudio()) {
146 // TODO 可能是语音对讲 147 // TODO 可能是语音对讲
147 }else { 148 }else {
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.conf.DynamicTask; 4 import com.genersoft.iot.vmp.conf.DynamicTask;
5 import com.genersoft.iot.vmp.conf.UserSetting; 5 import com.genersoft.iot.vmp.conf.UserSetting;
6 import com.genersoft.iot.vmp.gb28181.bean.*; 6 import com.genersoft.iot.vmp.gb28181.bean.*;
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.conf.SipConfig; 4 import com.genersoft.iot.vmp.conf.SipConfig;
5 import com.genersoft.iot.vmp.conf.UserSetting; 5 import com.genersoft.iot.vmp.conf.UserSetting;
6 import com.genersoft.iot.vmp.gb28181.bean.*; 6 import com.genersoft.iot.vmp.gb28181.bean.*;
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.conf.SipConfig; 5 import com.genersoft.iot.vmp.conf.SipConfig;
5 import com.genersoft.iot.vmp.conf.UserSetting; 6 import com.genersoft.iot.vmp.conf.UserSetting;
6 import com.genersoft.iot.vmp.gb28181.bean.*; 7 import com.genersoft.iot.vmp.gb28181.bean.*;
@@ -184,7 +185,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme @@ -184,7 +185,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
184 deviceAlarm.setAlarmType(getText(sipMsgInfo.getRootElement().element("Info"), "AlarmType")); 185 deviceAlarm.setAlarmType(getText(sipMsgInfo.getRootElement().element("Info"), "AlarmType"));
185 } 186 }
186 } 187 }
187 - logger.info("[收到报警通知]内容:{}", JSONObject.toJSON(deviceAlarm)); 188 + logger.info("[收到报警通知]内容:{}", JSON.toJSONString(deviceAlarm));
188 if ("7".equals(deviceAlarm.getAlarmMethod()) ) { 189 if ("7".equals(deviceAlarm.getAlarmMethod()) ) {
189 // 发送给平台的报警信息。 发送redis通知 190 // 发送给平台的报警信息。 发送redis通知
190 AlarmChannelMessage alarmChannelMessage = new AlarmChannelMessage(); 191 AlarmChannelMessage alarmChannelMessage = new AlarmChannelMessage();
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.conf.UserSetting; 4 import com.genersoft.iot.vmp.conf.UserSetting;
5 import com.genersoft.iot.vmp.gb28181.bean.*; 5 import com.genersoft.iot.vmp.gb28181.bean.*;
6 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; 6 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/AlarmResponseMessageHandler.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.gb28181.bean.Device; 4 import com.genersoft.iot.vmp.gb28181.bean.Device;
5 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 5 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
6 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; 6 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/BroadcastResponseMessageHandler.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.gb28181.bean.Device; 4 import com.genersoft.iot.vmp.gb28181.bean.Device;
5 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 5 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
6 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; 6 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/ConfigDownloadResponseMessageHandler.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.gb28181.bean.Device; 4 import com.genersoft.iot.vmp.gb28181.bean.Device;
5 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 5 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
6 import com.genersoft.iot.vmp.gb28181.event.EventPublisher; 6 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceConfigResponseMessageHandler.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.gb28181.bean.Device; 4 import com.genersoft.iot.vmp.gb28181.bean.Device;
5 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 5 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
6 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; 6 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceControlResponseMessageHandler.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.gb28181.bean.Device; 4 import com.genersoft.iot.vmp.gb28181.bean.Device;
5 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 5 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
6 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; 6 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceStatusResponseMessageHandler.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.common.VideoManagerConstants; 4 import com.genersoft.iot.vmp.common.VideoManagerConstants;
5 import com.genersoft.iot.vmp.gb28181.bean.Device; 5 import com.genersoft.iot.vmp.gb28181.bean.Device;
6 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 6 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.conf.UserSetting; 4 import com.genersoft.iot.vmp.conf.UserSetting;
5 import com.genersoft.iot.vmp.gb28181.bean.*; 5 import com.genersoft.iot.vmp.gb28181.bean.*;
6 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; 6 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
1 package com.genersoft.iot.vmp.gb28181.utils; 1 package com.genersoft.iot.vmp.gb28181.utils;
2 2
3 -import com.alibaba.fastjson.JSONArray;  
4 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONArray;
  4 +import com.alibaba.fastjson2.JSONObject;
5 import com.genersoft.iot.vmp.gb28181.bean.Device; 5 import com.genersoft.iot.vmp.gb28181.bean.Device;
6 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; 6 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
7 import com.genersoft.iot.vmp.gb28181.bean.TreeType; 7 import com.genersoft.iot.vmp.gb28181.bean.TreeType;
src/main/java/com/genersoft/iot/vmp/media/zlm/AssistRESTfulUtils.java
1 package com.genersoft.iot.vmp.media.zlm; 1 package com.genersoft.iot.vmp.media.zlm;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONObject;
5 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 5 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
6 import okhttp3.*; 6 import okhttp3.*;
7 import okhttp3.logging.HttpLoggingInterceptor; 7 import okhttp3.logging.HttpLoggingInterceptor;
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -5,7 +5,7 @@ import java.util.HashMap; @@ -5,7 +5,7 @@ import java.util.HashMap;
5 import java.util.List; 5 import java.util.List;
6 import java.util.Map; 6 import java.util.Map;
7 7
8 -import com.alibaba.fastjson.JSON; 8 +import com.alibaba.fastjson2.JSON;
9 import com.genersoft.iot.vmp.common.StreamInfo; 9 import com.genersoft.iot.vmp.common.StreamInfo;
10 import com.genersoft.iot.vmp.conf.UserSetting; 10 import com.genersoft.iot.vmp.conf.UserSetting;
11 import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; 11 import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
@@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher; @@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
14 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; 14 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
15 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; 15 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
16 import com.genersoft.iot.vmp.media.zlm.dto.*; 16 import com.genersoft.iot.vmp.media.zlm.dto.*;
  17 +import com.genersoft.iot.vmp.media.zlm.dto.hook.*;
17 import com.genersoft.iot.vmp.service.*; 18 import com.genersoft.iot.vmp.service.*;
18 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 19 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
19 import com.genersoft.iot.vmp.storager.IVideoManagerStorage; 20 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
@@ -29,7 +30,7 @@ import org.springframework.web.bind.annotation.RequestMapping; @@ -29,7 +30,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
29 import org.springframework.web.bind.annotation.ResponseBody; 30 import org.springframework.web.bind.annotation.ResponseBody;
30 import org.springframework.web.bind.annotation.RestController; 31 import org.springframework.web.bind.annotation.RestController;
31 32
32 -import com.alibaba.fastjson.JSONObject; 33 +import com.alibaba.fastjson2.JSONObject;
33 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; 34 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
34 35
35 import javax.servlet.http.HttpServletRequest; 36 import javax.servlet.http.HttpServletRequest;
@@ -108,17 +109,20 @@ public class ZLMHttpHookListener { @@ -108,17 +109,20 @@ public class ZLMHttpHookListener {
108 */ 109 */
109 @ResponseBody 110 @ResponseBody
110 @PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8") 111 @PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8")
111 - public JSONObject onServerKeepalive(@RequestBody JSONObject json){ 112 + public JSONObject onServerKeepalive(@RequestBody OnServerKeepaliveHookParam param){
112 113
113 - logger.info("[ ZLM HOOK ]on_server_keepalive API调用,参数:" + json.toString());  
114 - String mediaServerId = json.getString("mediaServerId");  
115 - List<ZlmHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(HookType.on_server_keepalive);  
116 - if (subscribes != null && subscribes.size() > 0) {  
117 - for (ZlmHttpHookSubscribe.Event subscribe : subscribes) {  
118 - subscribe.response(null, json); 114 + logger.info("[ZLM HOOK] 收到zlm心跳:" + param.getMediaServerId());
  115 +
  116 + taskExecutor.execute(()->{
  117 + List<ZlmHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(HookType.on_server_keepalive);
  118 + JSONObject json = (JSONObject) JSON.toJSON(param);
  119 + if (subscribes != null && subscribes.size() > 0) {
  120 + for (ZlmHttpHookSubscribe.Event subscribe : subscribes) {
  121 + subscribe.response(null, json);
  122 + }
119 } 123 }
120 - }  
121 - mediaServerService.updateMediaServerKeepalive(mediaServerId, json.getJSONObject("data")); 124 + });
  125 + mediaServerService.updateMediaServerKeepalive(param.getMediaServerId(), param.getData());
122 126
123 JSONObject ret = new JSONObject(); 127 JSONObject ret = new JSONObject();
124 ret.put("code", 0); 128 ret.put("code", 0);
@@ -126,43 +130,6 @@ public class ZLMHttpHookListener { @@ -126,43 +130,6 @@ public class ZLMHttpHookListener {
126 130
127 return ret; 131 return ret;
128 } 132 }
129 -  
130 - /**  
131 - * 流量统计事件,播放器或推流器断开时并且耗用流量超过特定阈值时会触发此事件,阈值通过配置文件general.flowThreshold配置;此事件对回复不敏感。  
132 - *  
133 - */  
134 - @ResponseBody  
135 - @PostMapping(value = "/on_flow_report", produces = "application/json;charset=UTF-8")  
136 - public JSONObject onFlowReport(@RequestBody JSONObject json){  
137 -  
138 - if (logger.isDebugEnabled()) {  
139 - logger.debug("[ ZLM HOOK ]on_flow_report API调用,参数:" + json.toString());  
140 - }  
141 - JSONObject ret = new JSONObject();  
142 - ret.put("code", 0);  
143 - ret.put("msg", "success");  
144 - return ret;  
145 - }  
146 -  
147 - /**  
148 - * 访问http文件服务器上hls之外的文件时触发。  
149 - *  
150 - */  
151 - @ResponseBody  
152 - @PostMapping(value = "/on_http_access", produces = "application/json;charset=UTF-8")  
153 - public JSONObject onHttpAccess(@RequestBody JSONObject json){  
154 -  
155 - if (logger.isDebugEnabled()) {  
156 - logger.debug("[ ZLM HOOK ]on_http_access API 调用,参数:" + json.toString());  
157 - }  
158 - String mediaServerId = json.getString("mediaServerId");  
159 - JSONObject ret = new JSONObject();  
160 - ret.put("code", 0);  
161 - ret.put("err", "");  
162 - ret.put("path", "");  
163 - ret.put("second", 600);  
164 - return ret;  
165 - }  
166 133
167 /** 134 /**
168 * 播放器鉴权事件,rtsp/rtmp/http-flv/ws-flv/hls的播放都将触发此鉴权事件。 135 * 播放器鉴权事件,rtsp/rtmp/http-flv/ws-flv/hls的播放都将触发此鉴权事件。
@@ -171,20 +138,21 @@ public class ZLMHttpHookListener { @@ -171,20 +138,21 @@ public class ZLMHttpHookListener {
171 @ResponseBody 138 @ResponseBody
172 @PostMapping(value = "/on_play", produces = "application/json;charset=UTF-8") 139 @PostMapping(value = "/on_play", produces = "application/json;charset=UTF-8")
173 public JSONObject onPlay(@RequestBody OnPlayHookParam param){ 140 public JSONObject onPlay(@RequestBody OnPlayHookParam param){
174 -  
175 - JSONObject json = (JSONObject)JSON.toJSON(param);  
176 -  
177 if (logger.isDebugEnabled()) { 141 if (logger.isDebugEnabled()) {
178 - logger.debug("[ ZLM HOOK ]on_play API调用,参数:" + JSON.toJSONString(param)); 142 + logger.debug("[ZLM HOOK] 播放鉴权:{}->{}" + param.getMediaServerId(), param);
179 } 143 }
180 String mediaServerId = param.getMediaServerId(); 144 String mediaServerId = param.getMediaServerId();
181 - ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_play, json);  
182 - if (subscribe != null ) {  
183 - MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);  
184 - if (mediaInfo != null) {  
185 - subscribe.response(mediaInfo, json); 145 +
  146 + taskExecutor.execute(()->{
  147 + JSONObject json = (JSONObject) JSON.toJSON(param);
  148 + ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_play, json);
  149 + if (subscribe != null ) {
  150 + MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);
  151 + if (mediaInfo != null) {
  152 + subscribe.response(mediaInfo, json);
  153 + }
186 } 154 }
187 - } 155 + });
188 JSONObject ret = new JSONObject(); 156 JSONObject ret = new JSONObject();
189 if (!"rtp".equals(param.getApp())) { 157 if (!"rtp".equals(param.getApp())) {
190 Map<String, String> paramMap = urlParamToMap(param.getParams()); 158 Map<String, String> paramMap = urlParamToMap(param.getParams());
@@ -211,46 +179,49 @@ public class ZLMHttpHookListener { @@ -211,46 +179,49 @@ public class ZLMHttpHookListener {
211 179
212 JSONObject json = (JSONObject) JSON.toJSON(param); 180 JSONObject json = (JSONObject) JSON.toJSON(param);
213 181
214 - logger.info("[ ZLM HOOK ]on_publish API调用,参数:" + json.toString()); 182 + logger.info("[ZLM HOOK]推流鉴权:{}->{}", param.getMediaServerId(), param);
215 JSONObject ret = new JSONObject(); 183 JSONObject ret = new JSONObject();
216 String mediaServerId = json.getString("mediaServerId"); 184 String mediaServerId = json.getString("mediaServerId");
217 MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId); 185 MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);
  186 +
218 if (!"rtp".equals(param.getApp())) { 187 if (!"rtp".equals(param.getApp())) {
219 - // 推流鉴权  
220 - if (param.getParams() == null) {  
221 - logger.info("推流鉴权失败: 缺少不要参数:sign=md5(user表的pushKey)");  
222 - ret.put("code", 401);  
223 - ret.put("msg", "Unauthorized");  
224 - return ret;  
225 - }  
226 - Map<String, String> paramMap = urlParamToMap(param.getParams());  
227 - String sign = paramMap.get("sign");  
228 - if (sign == null) {  
229 - logger.info("推流鉴权失败: 缺少不要参数:sign=md5(user表的pushKey)");  
230 - ret.put("code", 401);  
231 - ret.put("msg", "Unauthorized");  
232 - return ret;  
233 - }  
234 - // 推流自定义播放鉴权码  
235 - String callId = paramMap.get("callId");  
236 - // 鉴权配置  
237 - boolean hasAuthority = userService.checkPushAuthority(callId, sign);  
238 - if (!hasAuthority) {  
239 - logger.info("推流鉴权失败: sign 无权限: callId={}. sign={}", callId, sign);  
240 - ret.put("code", 401);  
241 - ret.put("msg", "Unauthorized");  
242 - return ret;  
243 - }  
244 - StreamAuthorityInfo streamAuthorityInfo = StreamAuthorityInfo.getInstanceByHook(param);  
245 - streamAuthorityInfo.setCallId(callId);  
246 - streamAuthorityInfo.setSign(sign);  
247 - // 鉴权通过  
248 - redisCatchStorage.updateStreamAuthorityInfo(param.getApp(), param.getStream(), streamAuthorityInfo);  
249 - // 通知assist新的callId  
250 - if (mediaInfo != null && mediaInfo.getRecordAssistPort() > 0) {  
251 - taskExecutor.execute(()->{  
252 - assistRESTfulUtils.addStreamCallInfo(mediaInfo, param.getApp(), param.getStream(), callId, null);  
253 - }); 188 + if (userSetting.getPushAuthority()) {
  189 +// 推流鉴权
  190 + if (param.getParams() == null) {
  191 + logger.info("推流鉴权失败: 缺少不要参数:sign=md5(user表的pushKey)");
  192 + ret.put("code", 401);
  193 + ret.put("msg", "Unauthorized");
  194 + return ret;
  195 + }
  196 + Map<String, String> paramMap = urlParamToMap(param.getParams());
  197 + String sign = paramMap.get("sign");
  198 + if (sign == null) {
  199 + logger.info("推流鉴权失败: 缺少不要参数:sign=md5(user表的pushKey)");
  200 + ret.put("code", 401);
  201 + ret.put("msg", "Unauthorized");
  202 + return ret;
  203 + }
  204 + // 推流自定义播放鉴权码
  205 + String callId = paramMap.get("callId");
  206 + // 鉴权配置
  207 + boolean hasAuthority = userService.checkPushAuthority(callId, sign);
  208 + if (!hasAuthority) {
  209 + logger.info("推流鉴权失败: sign 无权限: callId={}. sign={}", callId, sign);
  210 + ret.put("code", 401);
  211 + ret.put("msg", "Unauthorized");
  212 + return ret;
  213 + }
  214 + StreamAuthorityInfo streamAuthorityInfo = StreamAuthorityInfo.getInstanceByHook(param);
  215 + streamAuthorityInfo.setCallId(callId);
  216 + streamAuthorityInfo.setSign(sign);
  217 + // 鉴权通过
  218 + redisCatchStorage.updateStreamAuthorityInfo(param.getApp(), param.getStream(), streamAuthorityInfo);
  219 + // 通知assist新的callId
  220 + if (mediaInfo != null && mediaInfo.getRecordAssistPort() > 0) {
  221 + taskExecutor.execute(()->{
  222 + assistRESTfulUtils.addStreamCallInfo(mediaInfo, param.getApp(), param.getStream(), callId, null);
  223 + });
  224 + }
254 } 225 }
255 }else { 226 }else {
256 zlmMediaListManager.sendStreamEvent(param.getApp(),param.getStream(), param.getMediaServerId()); 227 zlmMediaListManager.sendStreamEvent(param.getApp(),param.getStream(), param.getMediaServerId());
@@ -258,21 +229,22 @@ public class ZLMHttpHookListener { @@ -258,21 +229,22 @@ public class ZLMHttpHookListener {
258 229
259 ret.put("code", 0); 230 ret.put("code", 0);
260 ret.put("msg", "success"); 231 ret.put("msg", "success");
261 - ret.put("enable_hls", true); 232 +
262 if (!"rtp".equals(param.getApp())) { 233 if (!"rtp".equals(param.getApp())) {
263 ret.put("enable_audio", true); 234 ret.put("enable_audio", true);
264 } 235 }
265 236
266 -  
267 - ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_publish, json);  
268 - if (subscribe != null) {  
269 - if (mediaInfo != null) {  
270 - subscribe.response(mediaInfo, json);  
271 - }else {  
272 - ret.put("code", 1);  
273 - ret.put("msg", "zlm not register"); 237 + taskExecutor.execute(()->{
  238 + ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_publish, json);
  239 + if (subscribe != null) {
  240 + if (mediaInfo != null) {
  241 + subscribe.response(mediaInfo, json);
  242 + }else {
  243 + ret.put("code", 1);
  244 + ret.put("msg", "zlm not register");
  245 + }
274 } 246 }
275 - } 247 + });
276 248
277 if ("rtp".equals(param.getApp())) { 249 if ("rtp".equals(param.getApp())) {
278 ret.put("enable_mp4", userSetting.getRecordSip()); 250 ret.put("enable_mp4", userSetting.getRecordSip());
@@ -292,111 +264,8 @@ public class ZLMHttpHookListener { @@ -292,111 +264,8 @@ public class ZLMHttpHookListener {
292 ret.put("mp4_max_second", 10); 264 ret.put("mp4_max_second", 10);
293 ret.put("enable_mp4", true); 265 ret.put("enable_mp4", true);
294 ret.put("enable_audio", true); 266 ret.put("enable_audio", true);
295 -  
296 - }  
297 - }  
298 - return ret;  
299 - }  
300 -  
301 -  
302 -  
303 - /**  
304 - * 录制mp4完成后通知事件;此事件对回复不敏感。  
305 - *  
306 - */  
307 - @ResponseBody  
308 - @PostMapping(value = "/on_record_mp4", produces = "application/json;charset=UTF-8")  
309 - public JSONObject onRecordMp4(@RequestBody JSONObject json){  
310 -  
311 - if (logger.isDebugEnabled()) {  
312 - logger.debug("[ ZLM HOOK ]on_record_mp4 API调用,参数:" + json.toString());  
313 - }  
314 - String mediaServerId = json.getString("mediaServerId");  
315 - JSONObject ret = new JSONObject();  
316 - ret.put("code", 0);  
317 - ret.put("msg", "success");  
318 - return ret;  
319 - }  
320 - /**  
321 - * 录制hls完成后通知事件;此事件对回复不敏感。  
322 - *  
323 - */  
324 - @ResponseBody  
325 - @PostMapping(value = "/on_record_ts", produces = "application/json;charset=UTF-8")  
326 - public JSONObject onRecordTs(@RequestBody JSONObject json){  
327 -  
328 - if (logger.isDebugEnabled()) {  
329 - logger.debug("[ ZLM HOOK ]on_record_ts API调用,参数:" + json.toString());  
330 - }  
331 - String mediaServerId = json.getString("mediaServerId");  
332 - JSONObject ret = new JSONObject();  
333 - ret.put("code", 0);  
334 - ret.put("msg", "success");  
335 - return ret;  
336 - }  
337 -  
338 - /**  
339 - * rtsp专用的鉴权事件,先触发on_rtsp_realm事件然后才会触发on_rtsp_auth事件。  
340 - *  
341 - */  
342 - @ResponseBody  
343 - @PostMapping(value = "/on_rtsp_realm", produces = "application/json;charset=UTF-8")  
344 - public JSONObject onRtspRealm(@RequestBody JSONObject json){  
345 -  
346 - if (logger.isDebugEnabled()) {  
347 - logger.debug("[ ZLM HOOK ]on_rtsp_realm API调用,参数:" + json.toString());  
348 - }  
349 - String mediaServerId = json.getString("mediaServerId");  
350 - JSONObject ret = new JSONObject();  
351 - ret.put("code", 0);  
352 - ret.put("realm", "");  
353 - return ret;  
354 - }  
355 -  
356 -  
357 - /**  
358 - * 该rtsp流是否开启rtsp专用方式的鉴权事件,开启后才会触发on_rtsp_auth事件。需要指出的是rtsp也支持url参数鉴权,它支持两种方式鉴权。  
359 - *  
360 - */  
361 - @ResponseBody  
362 - @PostMapping(value = "/on_rtsp_auth", produces = "application/json;charset=UTF-8")  
363 - public JSONObject onRtspAuth(@RequestBody JSONObject json){  
364 -  
365 - if (logger.isDebugEnabled()) {  
366 - logger.debug("[ ZLM HOOK ]on_rtsp_auth API调用,参数:" + json.toString());  
367 - }  
368 - String mediaServerId = json.getString("mediaServerId");  
369 - JSONObject ret = new JSONObject();  
370 - ret.put("code", 0);  
371 - ret.put("encrypted", false);  
372 - ret.put("passwd", "test");  
373 - return ret;  
374 - }  
375 -  
376 - /**  
377 - * shell登录鉴权,ZLMediaKit提供简单的telnet调试方式,使用telnet 127.0.0.1 9000能进入MediaServer进程的shell界面。  
378 - *  
379 - */  
380 - @ResponseBody  
381 - @PostMapping(value = "/on_shell_login", produces = "application/json;charset=UTF-8")  
382 - public JSONObject onShellLogin(@RequestBody JSONObject json){  
383 -  
384 - if (logger.isDebugEnabled()) {  
385 - logger.debug("[ ZLM HOOK ]on_shell_login API调用,参数:" + json.toString());  
386 - }  
387 - String mediaServerId = json.getString("mediaServerId");  
388 - ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_shell_login, json);  
389 - if (subscribe != null ) {  
390 - MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);  
391 - if (mediaInfo != null) {  
392 - subscribe.response(mediaInfo, json);  
393 } 267 }
394 -  
395 } 268 }
396 -  
397 - JSONObject ret = new JSONObject();  
398 - ret.put("code", 0);  
399 - ret.put("msg", "success");  
400 return ret; 269 return ret;
401 } 270 }
402 271
@@ -406,137 +275,139 @@ public class ZLMHttpHookListener { @@ -406,137 +275,139 @@ public class ZLMHttpHookListener {
406 */ 275 */
407 @ResponseBody 276 @ResponseBody
408 @PostMapping(value = "/on_stream_changed", produces = "application/json;charset=UTF-8") 277 @PostMapping(value = "/on_stream_changed", produces = "application/json;charset=UTF-8")
409 - public JSONObject onStreamChanged(@RequestBody MediaItem item){  
410 -  
411 - logger.info("[ ZLM HOOK ]on_stream_changed API调用,参数:" + JSONObject.toJSONString(item));  
412 - String mediaServerId = item.getMediaServerId();  
413 - JSONObject json = (JSONObject) JSON.toJSON(item);  
414 - ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_stream_changed, json);  
415 - if (subscribe != null ) {  
416 - MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);  
417 - if (mediaInfo != null) {  
418 - subscribe.response(mediaInfo, json);  
419 - }  
420 - }  
421 - // 流消失移除redis play  
422 - String app = item.getApp();  
423 - String stream = item.getStream();  
424 - String schema = item.getSchema();  
425 - List<MediaItem.MediaTrack> tracks = item.getTracks();  
426 - boolean regist = item.isRegist();  
427 - if (regist) {  
428 - if (item.getOriginType() == OriginType.RTMP_PUSH.ordinal()  
429 - || item.getOriginType() == OriginType.RTSP_PUSH.ordinal()  
430 - || item.getOriginType() == OriginType.RTC_PUSH.ordinal()) {  
431 -  
432 - StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(app, stream);  
433 - if (streamAuthorityInfo == null) {  
434 - streamAuthorityInfo = StreamAuthorityInfo.getInstanceByHook(item);  
435 - }else {  
436 - streamAuthorityInfo.setOriginType(item.getOriginType());  
437 - streamAuthorityInfo.setOriginTypeStr(item.getOriginTypeStr());  
438 - }  
439 - redisCatchStorage.updateStreamAuthorityInfo(app, stream, streamAuthorityInfo);  
440 - } 278 + public JSONObject onStreamChanged(@RequestBody OnStreamChangedHookParam param){
  279 +
  280 + if (param.isRegist()) {
  281 + logger.info("[ZLM HOOK] 流注册, {}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream());
441 }else { 282 }else {
442 - redisCatchStorage.removeStreamAuthorityInfo(app, stream); 283 + logger.info("[ZLM HOOK] 流注销, {}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream());
443 } 284 }
444 285
445 - if ("rtsp".equals(schema)){  
446 - logger.info("on_stream_changed:注册->{}, app->{}, stream->{}", regist, app, stream);  
447 - if (regist) {  
448 - mediaServerService.addCount(mediaServerId);  
449 - }else {  
450 - mediaServerService.removeCount(mediaServerId);  
451 - }  
452 - if (item.getOriginType() == OriginType.PULL.ordinal()  
453 - || item.getOriginType() == OriginType.FFMPEG_PULL.ordinal()) {  
454 - // 设置拉流代理上线/离线  
455 - streamProxyService.updateStatus(regist, app, stream); 286 +
  287 + JSONObject json = (JSONObject) JSON.toJSON(param);
  288 + taskExecutor.execute(()->{
  289 + ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_stream_changed, json);
  290 + if (subscribe != null ) {
  291 + MediaServerItem mediaInfo = mediaServerService.getOne(param.getMediaServerId());
  292 + if (mediaInfo != null) {
  293 + subscribe.response(mediaInfo, json);
  294 + }
456 } 295 }
457 - if ("rtp".equals(app) && !regist ) {  
458 - StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(stream);  
459 - if (streamInfo!=null){  
460 - redisCatchStorage.stopPlay(streamInfo);  
461 - storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());  
462 - }else{  
463 - streamInfo = redisCatchStorage.queryPlayback(null, null, stream, null);  
464 - if (streamInfo != null) {  
465 - redisCatchStorage.stopPlayback(streamInfo.getDeviceID(), streamInfo.getChannelId(),  
466 - streamInfo.getStream(), null); 296 + // 流消失移除redis play
  297 + List<OnStreamChangedHookParam.MediaTrack> tracks = param.getTracks();
  298 + if (param.isRegist()) {
  299 + if (param.getOriginType() == OriginType.RTMP_PUSH.ordinal()
  300 + || param.getOriginType() == OriginType.RTSP_PUSH.ordinal()
  301 + || param.getOriginType() == OriginType.RTC_PUSH.ordinal()) {
  302 +
  303 + StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(param.getApp(), param.getStream());
  304 + if (streamAuthorityInfo == null) {
  305 + streamAuthorityInfo = StreamAuthorityInfo.getInstanceByHook(param);
  306 + }else {
  307 + streamAuthorityInfo.setOriginType(param.getOriginType());
  308 + streamAuthorityInfo.setOriginTypeStr(param.getOriginTypeStr());
467 } 309 }
  310 + redisCatchStorage.updateStreamAuthorityInfo(param.getApp(), param.getStream(), streamAuthorityInfo);
468 } 311 }
469 }else { 312 }else {
470 - if (!"rtp".equals(app)){  
471 - String type = OriginType.values()[item.getOriginType()].getType();  
472 - MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);  
473 -  
474 - if (mediaServerItem != null){  
475 - if (regist) {  
476 - StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(app, stream);  
477 - String callId = null;  
478 - if (streamAuthorityInfo != null) {  
479 - callId = streamAuthorityInfo.getCallId();  
480 - }  
481 - StreamInfo streamInfoByAppAndStream = mediaService.getStreamInfoByAppAndStream(mediaServerItem,  
482 - app, stream, tracks, callId);  
483 - item.setStreamInfo(streamInfoByAppAndStream);  
484 - redisCatchStorage.addStream(mediaServerItem, type, app, stream, item);  
485 - if (item.getOriginType() == OriginType.RTSP_PUSH.ordinal()  
486 - || item.getOriginType() == OriginType.RTMP_PUSH.ordinal()  
487 - || item.getOriginType() == OriginType.RTC_PUSH.ordinal() ) {  
488 - item.setSeverId(userSetting.getServerId());  
489 - zlmMediaListManager.addPush(item);  
490 - }  
491 - }else {  
492 - // 兼容流注销时类型从redis记录获取  
493 - MediaItem mediaItem = redisCatchStorage.getStreamInfo(app, stream, mediaServerId);  
494 - if (mediaItem != null) {  
495 - type = OriginType.values()[mediaItem.getOriginType()].getType();  
496 - redisCatchStorage.removeStream(mediaServerItem.getId(), type, app, stream);  
497 - }  
498 - GbStream gbStream = storager.getGbStream(app, stream);  
499 - if (gbStream != null) { 313 + redisCatchStorage.removeStreamAuthorityInfo(param.getApp(), param.getStream());
  314 + }
  315 +
  316 + if ("rtsp".equals(param.getSchema())){
  317 + if (param.isRegist()) {
  318 + mediaServerService.addCount(param.getMediaServerId());
  319 + }else {
  320 + mediaServerService.removeCount(param.getMediaServerId());
  321 + }
  322 + if (param.getOriginType() == OriginType.PULL.ordinal()
  323 + || param.getOriginType() == OriginType.FFMPEG_PULL.ordinal()) {
  324 + // 设置拉流代理上线/离线
  325 + streamProxyService.updateStatus(param.isRegist(), param.getApp(), param.getStream());
  326 + }
  327 + if ("rtp".equals(param.getApp()) && !param.isRegist() ) {
  328 + StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(param.getStream());
  329 + if (streamInfo!=null){
  330 + redisCatchStorage.stopPlay(streamInfo);
  331 + storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
  332 + }else{
  333 + streamInfo = redisCatchStorage.queryPlayback(null, null, param.getStream(), null);
  334 + if (streamInfo != null) {
  335 + redisCatchStorage.stopPlayback(streamInfo.getDeviceID(), streamInfo.getChannelId(),
  336 + streamInfo.getStream(), null);
  337 + }
  338 + }
  339 + }else {
  340 + if (!"rtp".equals(param.getApp())){
  341 + String type = OriginType.values()[param.getOriginType()].getType();
  342 + MediaServerItem mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
  343 +
  344 + if (mediaServerItem != null){
  345 + if (param.isRegist()) {
  346 + StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(param.getApp(), param.getStream());
  347 + String callId = null;
  348 + if (streamAuthorityInfo != null) {
  349 + callId = streamAuthorityInfo.getCallId();
  350 + }
  351 + StreamInfo streamInfoByAppAndStream = mediaService.getStreamInfoByAppAndStream(mediaServerItem,
  352 + param.getApp(), param.getStream(), tracks, callId);
  353 + param.setStreamInfo(streamInfoByAppAndStream);
  354 + redisCatchStorage.addStream(mediaServerItem, type, param.getApp(), param.getStream(), param);
  355 + if (param.getOriginType() == OriginType.RTSP_PUSH.ordinal()
  356 + || param.getOriginType() == OriginType.RTMP_PUSH.ordinal()
  357 + || param.getOriginType() == OriginType.RTC_PUSH.ordinal() ) {
  358 + param.setSeverId(userSetting.getServerId());
  359 + zlmMediaListManager.addPush(param);
  360 + }
  361 + }else {
  362 + // 兼容流注销时类型从redis记录获取
  363 + OnStreamChangedHookParam onStreamChangedHookParam = redisCatchStorage.getStreamInfo(param.getApp(), param.getStream(), param.getMediaServerId());
  364 + if (onStreamChangedHookParam != null) {
  365 + type = OriginType.values()[onStreamChangedHookParam.getOriginType()].getType();
  366 + redisCatchStorage.removeStream(mediaServerItem.getId(), type, param.getApp(), param.getStream());
  367 + }
  368 + GbStream gbStream = storager.getGbStream(param.getApp(), param.getStream());
  369 + if (gbStream != null) {
500 // eventPublisher.catalogEventPublishForStream(null, gbStream, CatalogEvent.OFF); 370 // eventPublisher.catalogEventPublishForStream(null, gbStream, CatalogEvent.OFF);
  371 + }
  372 + zlmMediaListManager.removeMedia(param.getApp(), param.getStream());
  373 + }
  374 + if (type != null) {
  375 + // 发送流变化redis消息
  376 + JSONObject jsonObject = new JSONObject();
  377 + jsonObject.put("serverId", userSetting.getServerId());
  378 + jsonObject.put("app", param.getApp());
  379 + jsonObject.put("stream", param.getStream());
  380 + jsonObject.put("register", param.isRegist());
  381 + jsonObject.put("mediaServerId", param.getMediaServerId());
  382 + redisCatchStorage.sendStreamChangeMsg(type, jsonObject);
501 } 383 }
502 - zlmMediaListManager.removeMedia(app, stream);  
503 - }  
504 - if (type != null) {  
505 - // 发送流变化redis消息  
506 - JSONObject jsonObject = new JSONObject();  
507 - jsonObject.put("serverId", userSetting.getServerId());  
508 - jsonObject.put("app", app);  
509 - jsonObject.put("stream", stream);  
510 - jsonObject.put("register", regist);  
511 - jsonObject.put("mediaServerId", mediaServerId);  
512 - redisCatchStorage.sendStreamChangeMsg(type, jsonObject);  
513 } 384 }
514 } 385 }
515 } 386 }
516 - }  
517 - if (!regist) {  
518 - List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServerByStream(stream);  
519 - if (sendRtpItems.size() > 0) {  
520 - for (SendRtpItem sendRtpItem : sendRtpItems) {  
521 - if (sendRtpItem.getApp().equals(app)) {  
522 - String platformId = sendRtpItem.getPlatformId();  
523 - ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId);  
524 - Device device = deviceService.getDevice(platformId);  
525 -  
526 - try {  
527 - if (platform != null) {  
528 - commanderFroPlatform.streamByeCmd(platform, sendRtpItem);  
529 - }else {  
530 - cmder.streamByeCmd(device, sendRtpItem.getChannelId(), stream, sendRtpItem.getCallId()); 387 + if (!param.isRegist()) {
  388 + List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServerByStream(param.getStream());
  389 + if (sendRtpItems.size() > 0) {
  390 + for (SendRtpItem sendRtpItem : sendRtpItems) {
  391 + if (sendRtpItem.getApp().equals(param.getApp())) {
  392 + String platformId = sendRtpItem.getPlatformId();
  393 + ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId);
  394 + Device device = deviceService.getDevice(platformId);
  395 +
  396 + try {
  397 + if (platform != null) {
  398 + commanderFroPlatform.streamByeCmd(platform, sendRtpItem);
  399 + }else {
  400 + cmder.streamByeCmd(device, sendRtpItem.getChannelId(), param.getStream(), sendRtpItem.getCallId());
  401 + }
  402 + } catch (SipException | InvalidArgumentException | ParseException | SsrcTransactionNotFoundException e) {
  403 + logger.error("[命令发送失败] 国标级联 发送BYE: {}", e.getMessage());
531 } 404 }
532 - } catch (SipException | InvalidArgumentException | ParseException | SsrcTransactionNotFoundException e) {  
533 - logger.error("[命令发送失败] 国标级联 发送BYE: {}", e.getMessage());  
534 } 405 }
535 } 406 }
536 } 407 }
537 } 408 }
538 } 409 }
539 - } 410 + });
540 411
541 JSONObject ret = new JSONObject(); 412 JSONObject ret = new JSONObject();
542 ret.put("code", 0); 413 ret.put("code", 0);
@@ -550,19 +421,16 @@ public class ZLMHttpHookListener { @@ -550,19 +421,16 @@ public class ZLMHttpHookListener {
550 */ 421 */
551 @ResponseBody 422 @ResponseBody
552 @PostMapping(value = "/on_stream_none_reader", produces = "application/json;charset=UTF-8") 423 @PostMapping(value = "/on_stream_none_reader", produces = "application/json;charset=UTF-8")
553 - public JSONObject onStreamNoneReader(@RequestBody JSONObject json){ 424 + public JSONObject onStreamNoneReader(@RequestBody OnStreamNoneReaderHookParam param){
554 425
555 - logger.info("[ ZLM HOOK ]on_stream_none_reader API调用,参数:" + json.toString());  
556 - String mediaServerId = json.getString("mediaServerId");  
557 - String streamId = json.getString("stream");  
558 - String app = json.getString("app"); 426 + logger.info("[ZLM HOOK]流无人观看:{]->{}->{}/{}" + param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream());
559 JSONObject ret = new JSONObject(); 427 JSONObject ret = new JSONObject();
560 ret.put("code", 0); 428 ret.put("code", 0);
561 // 录像下载 429 // 录像下载
562 - ret.put("close", userSetting.getStreamOnDemand());  
563 - if ("rtp".equals(app)){ 430 + if ("rtp".equals(param.getApp())){
  431 + ret.put("close", userSetting.getStreamOnDemand());
564 // 国标流, 点播/录像回放/录像下载 432 // 国标流, 点播/录像回放/录像下载
565 - StreamInfo streamInfoForPlayCatch = redisCatchStorage.queryPlayByStreamId(streamId); 433 + StreamInfo streamInfoForPlayCatch = redisCatchStorage.queryPlayByStreamId(param.getStream());
566 // 点播 434 // 点播
567 if (streamInfoForPlayCatch != null) { 435 if (streamInfoForPlayCatch != null) {
568 // 收到无人观看说明流也没有在往上级推送 436 // 收到无人观看说明流也没有在往上级推送
@@ -596,7 +464,7 @@ public class ZLMHttpHookListener { @@ -596,7 +464,7 @@ public class ZLMHttpHookListener {
596 return ret; 464 return ret;
597 } 465 }
598 // 录像回放 466 // 录像回放
599 - StreamInfo streamInfoForPlayBackCatch = redisCatchStorage.queryPlayback(null, null, streamId, null); 467 + StreamInfo streamInfoForPlayBackCatch = redisCatchStorage.queryPlayback(null, null, param.getStream(), null);
600 if (streamInfoForPlayBackCatch != null ) { 468 if (streamInfoForPlayBackCatch != null ) {
601 if (streamInfoForPlayBackCatch.isPause()) { 469 if (streamInfoForPlayBackCatch.isPause()) {
602 ret.put("close", false); 470 ret.put("close", false);
@@ -617,7 +485,7 @@ public class ZLMHttpHookListener { @@ -617,7 +485,7 @@ public class ZLMHttpHookListener {
617 return ret; 485 return ret;
618 } 486 }
619 // 录像下载 487 // 录像下载
620 - StreamInfo streamInfoForDownload = redisCatchStorage.queryDownload(null, null, streamId, null); 488 + StreamInfo streamInfoForDownload = redisCatchStorage.queryDownload(null, null, param.getStream(), null);
621 // 进行录像下载时无人观看不断流 489 // 进行录像下载时无人观看不断流
622 if (streamInfoForDownload != null) { 490 if (streamInfoForDownload != null) {
623 ret.put("close", false); 491 ret.put("close", false);
@@ -626,19 +494,19 @@ public class ZLMHttpHookListener { @@ -626,19 +494,19 @@ public class ZLMHttpHookListener {
626 }else { 494 }else {
627 // 非国标流 推流/拉流代理 495 // 非国标流 推流/拉流代理
628 // 拉流代理 496 // 拉流代理
629 - StreamProxyItem streamProxyItem = streamProxyService.getStreamProxyByAppAndStream(app, streamId); 497 + StreamProxyItem streamProxyItem = streamProxyService.getStreamProxyByAppAndStream(param.getApp(), param.getStream());
630 if (streamProxyItem != null ) { 498 if (streamProxyItem != null ) {
631 if (streamProxyItem.isEnable_remove_none_reader()) { 499 if (streamProxyItem.isEnable_remove_none_reader()) {
632 // 无人观看自动移除 500 // 无人观看自动移除
633 ret.put("close", true); 501 ret.put("close", true);
634 - streamProxyService.del(app, streamId); 502 + streamProxyService.del(param.getApp(), param.getStream());
635 String url = streamProxyItem.getUrl() != null?streamProxyItem.getUrl():streamProxyItem.getSrc_url(); 503 String url = streamProxyItem.getUrl() != null?streamProxyItem.getUrl():streamProxyItem.getSrc_url();
636 - logger.info("[{}/{}]<-[{}] 拉流代理无人观看已经移除", app, streamId, url); 504 + logger.info("[{}/{}]<-[{}] 拉流代理无人观看已经移除", param.getApp(), param.getStream(), url);
637 }else if (streamProxyItem.isEnable_disable_none_reader()) { 505 }else if (streamProxyItem.isEnable_disable_none_reader()) {
638 // 无人观看停用 506 // 无人观看停用
639 ret.put("close", true); 507 ret.put("close", true);
640 // 修改数据 508 // 修改数据
641 - streamProxyService.stop(app, streamId); 509 + streamProxyService.stop(param.getApp(), param.getStream());
642 }else { 510 }else {
643 ret.put("close", false); 511 ret.put("close", false);
644 } 512 }
@@ -660,35 +528,33 @@ public class ZLMHttpHookListener { @@ -660,35 +528,33 @@ public class ZLMHttpHookListener {
660 */ 528 */
661 @ResponseBody 529 @ResponseBody
662 @PostMapping(value = "/on_stream_not_found", produces = "application/json;charset=UTF-8") 530 @PostMapping(value = "/on_stream_not_found", produces = "application/json;charset=UTF-8")
663 - public JSONObject onStreamNotFound(@RequestBody JSONObject json){  
664 - if (logger.isDebugEnabled()) {  
665 - logger.debug("[ ZLM HOOK ]on_stream_not_found API调用,参数:" + json.toString());  
666 - }  
667 - String mediaServerId = json.getString("mediaServerId");  
668 - MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);  
669 - if (userSetting.isAutoApplyPlay() && mediaInfo != null) {  
670 - String app = json.getString("app");  
671 - String streamId = json.getString("stream");  
672 - if ("rtp".equals(app)) {  
673 - if (mediaInfo.isRtpEnable()) {  
674 - String[] s = streamId.split("_");  
675 - if (s.length == 2) {  
676 - String deviceId = s[0];  
677 - String channelId = s[1];  
678 - Device device = redisCatchStorage.getDevice(deviceId);  
679 - if (device != null) {  
680 - playService.play(mediaInfo,deviceId, channelId, null, null, null); 531 + public JSONObject onStreamNotFound(@RequestBody OnStreamNotFoundHookParam param){
  532 + logger.info("[ZLM HOOK] 流未找到:{}->{}->{}/{}" + param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream());
  533 + taskExecutor.execute(()->{
  534 + MediaServerItem mediaInfo = mediaServerService.getOne(param.getMediaServerId());
  535 + if (userSetting.isAutoApplyPlay() && mediaInfo != null) {
  536 + if ("rtp".equals(param.getApp())) {
  537 + if (mediaInfo.isRtpEnable()) {
  538 + String[] s = param.getStream().split("_");
  539 + if (s.length == 2) {
  540 + String deviceId = s[0];
  541 + String channelId = s[1];
  542 + Device device = redisCatchStorage.getDevice(deviceId);
  543 + if (device != null) {
  544 + playService.play(mediaInfo,deviceId, channelId, null, null, null);
  545 + }
681 } 546 }
682 } 547 }
683 - }  
684 - }else {  
685 - // 拉流代理  
686 - StreamProxyItem streamProxyByAppAndStream = streamProxyService.getStreamProxyByAppAndStream(app, streamId);  
687 - if (streamProxyByAppAndStream != null && streamProxyByAppAndStream.isEnable_disable_none_reader()) {  
688 - streamProxyService.start(app, streamId); 548 + }else {
  549 + // 拉流代理
  550 + StreamProxyItem streamProxyByAppAndStream = streamProxyService.getStreamProxyByAppAndStream(param.getApp(), param.getStream());
  551 + if (streamProxyByAppAndStream != null && streamProxyByAppAndStream.isEnable_disable_none_reader()) {
  552 + streamProxyService.start(param.getApp(), param.getStream());
  553 + }
689 } 554 }
690 } 555 }
691 - } 556 + });
  557 +
692 558
693 JSONObject ret = new JSONObject(); 559 JSONObject ret = new JSONObject();
694 ret.put("code", 0); 560 ret.put("code", 0);
@@ -704,22 +570,20 @@ public class ZLMHttpHookListener { @@ -704,22 +570,20 @@ public class ZLMHttpHookListener {
704 @PostMapping(value = "/on_server_started", produces = "application/json;charset=UTF-8") 570 @PostMapping(value = "/on_server_started", produces = "application/json;charset=UTF-8")
705 public JSONObject onServerStarted(HttpServletRequest request, @RequestBody JSONObject jsonObject){ 571 public JSONObject onServerStarted(HttpServletRequest request, @RequestBody JSONObject jsonObject){
706 572
707 - if (logger.isDebugEnabled()) {  
708 - logger.debug("[ ZLM HOOK ]on_server_started API调用,参数:" + jsonObject.toString());  
709 - }  
710 - String remoteAddr = request.getRemoteAddr();  
711 - jsonObject.put("ip", remoteAddr);  
712 - List<ZlmHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(HookType.on_server_started);  
713 - if (subscribes != null && subscribes.size() > 0) {  
714 - for (ZlmHttpHookSubscribe.Event subscribe : subscribes) {  
715 - subscribe.response(null, jsonObject); 573 + jsonObject.put("ip", request.getRemoteAddr());
  574 + ZLMServerConfig zlmServerConfig = JSON.to(ZLMServerConfig.class, jsonObject);
  575 + zlmServerConfig.setIp(request.getRemoteAddr());
  576 + logger.info("[ZLM HOOK] zlm 启动 " + zlmServerConfig.getGeneralMediaServerId());
  577 + taskExecutor.execute(()->{
  578 + List<ZlmHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(HookType.on_server_started);
  579 + if (subscribes != null && subscribes.size() > 0) {
  580 + for (ZlmHttpHookSubscribe.Event subscribe : subscribes) {
  581 + subscribe.response(null, jsonObject);
  582 + }
716 } 583 }
717 - }  
718 -  
719 - ZLMServerConfig zlmServerConfig = JSONObject.toJavaObject(jsonObject, ZLMServerConfig.class);  
720 - if (zlmServerConfig !=null ) {  
721 mediaServerService.zlmServerOnline(zlmServerConfig); 584 mediaServerService.zlmServerOnline(zlmServerConfig);
722 - } 585 + });
  586 +
723 JSONObject ret = new JSONObject(); 587 JSONObject ret = new JSONObject();
724 ret.put("code", 0); 588 ret.put("code", 0);
725 ret.put("msg", "success"); 589 ret.put("msg", "success");
@@ -731,33 +595,33 @@ public class ZLMHttpHookListener { @@ -731,33 +595,33 @@ public class ZLMHttpHookListener {
731 */ 595 */
732 @ResponseBody 596 @ResponseBody
733 @PostMapping(value = "/on_send_rtp_stopped", produces = "application/json;charset=UTF-8") 597 @PostMapping(value = "/on_send_rtp_stopped", produces = "application/json;charset=UTF-8")
734 - public JSONObject onSendRtpStopped(HttpServletRequest request, @RequestBody JSONObject jsonObject){ 598 + public JSONObject onSendRtpStopped(HttpServletRequest request, @RequestBody OnSendRtpStoppedHookParam param){
735 599
736 - logger.info("[ ZLM HOOK ]on_send_rtp_stopped API调用,参数:" + jsonObject); 600 + logger.info("[ZLM HOOK] 发送rtp被动关闭:{}->{}/{}", param.getMediaServerId(), param.getApp(), param.getStream());
737 601
738 JSONObject ret = new JSONObject(); 602 JSONObject ret = new JSONObject();
739 ret.put("code", 0); 603 ret.put("code", 0);
740 ret.put("msg", "success"); 604 ret.put("msg", "success");
741 605
742 // 查找对应的上级推流,发送停止 606 // 查找对应的上级推流,发送停止
743 - String app = jsonObject.getString("app");  
744 - if (!"rtp".equals(app)) { 607 + if (!"rtp".equals(param.getApp())) {
745 return ret; 608 return ret;
746 } 609 }
747 - String stream = jsonObject.getString("stream");  
748 - List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServerByStream(stream);  
749 - if (sendRtpItems.size() > 0) {  
750 - for (SendRtpItem sendRtpItem : sendRtpItems) {  
751 - ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(sendRtpItem.getPlatformId());  
752 - try {  
753 - commanderFroPlatform.streamByeCmd(parentPlatform, sendRtpItem.getCallId());  
754 - } catch (SipException | InvalidArgumentException | ParseException e) {  
755 - logger.error("[命令发送失败] 国标级联 发送BYE: {}", e.getMessage()); 610 + taskExecutor.execute(()->{
  611 + List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServerByStream(param.getStream());
  612 + if (sendRtpItems.size() > 0) {
  613 + for (SendRtpItem sendRtpItem : sendRtpItems) {
  614 + ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(sendRtpItem.getPlatformId());
  615 + try {
  616 + commanderFroPlatform.streamByeCmd(parentPlatform, sendRtpItem.getCallId());
  617 + } catch (SipException | InvalidArgumentException | ParseException e) {
  618 + logger.error("[命令发送失败] 国标级联 发送BYE: {}", e.getMessage());
  619 + }
  620 + redisCatchStorage.deleteSendRTPServer(parentPlatform.getServerGBId(), sendRtpItem.getChannelId(),
  621 + sendRtpItem.getCallId(), sendRtpItem.getStreamId());
756 } 622 }
757 - redisCatchStorage.deleteSendRTPServer(parentPlatform.getServerGBId(), sendRtpItem.getChannelId(),  
758 - sendRtpItem.getCallId(), sendRtpItem.getStreamId());  
759 } 623 }
760 - } 624 + });
761 625
762 626
763 return ret; 627 return ret;
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
@@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.media.zlm; @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.media.zlm;
3 import com.genersoft.iot.vmp.conf.UserSetting; 3 import com.genersoft.iot.vmp.conf.UserSetting;
4 import com.genersoft.iot.vmp.gb28181.bean.GbStream; 4 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
5 import com.genersoft.iot.vmp.media.zlm.dto.*; 5 import com.genersoft.iot.vmp.media.zlm.dto.*;
  6 +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
6 import com.genersoft.iot.vmp.service.IMediaServerService; 7 import com.genersoft.iot.vmp.service.IMediaServerService;
7 import com.genersoft.iot.vmp.service.IStreamProxyService; 8 import com.genersoft.iot.vmp.service.IStreamProxyService;
8 import com.genersoft.iot.vmp.service.IStreamPushService; 9 import com.genersoft.iot.vmp.service.IStreamPushService;
@@ -67,19 +68,19 @@ public class ZLMMediaListManager { @@ -67,19 +68,19 @@ public class ZLMMediaListManager {
67 68
68 private Map<String, ChannelOnlineEvent> channelOnPublishEvents = new ConcurrentHashMap<>(); 69 private Map<String, ChannelOnlineEvent> channelOnPublishEvents = new ConcurrentHashMap<>();
69 70
70 - public StreamPushItem addPush(MediaItem mediaItem) {  
71 - StreamPushItem transform = streamPushService.transform(mediaItem);  
72 - StreamPushItem pushInDb = streamPushService.getPush(mediaItem.getApp(), mediaItem.getStream());  
73 - transform.setPushIng(mediaItem.isRegist()); 71 + public StreamPushItem addPush(OnStreamChangedHookParam onStreamChangedHookParam) {
  72 + StreamPushItem transform = streamPushService.transform(onStreamChangedHookParam);
  73 + StreamPushItem pushInDb = streamPushService.getPush(onStreamChangedHookParam.getApp(), onStreamChangedHookParam.getStream());
  74 + transform.setPushIng(onStreamChangedHookParam.isRegist());
74 transform.setUpdateTime(DateUtil.getNow()); 75 transform.setUpdateTime(DateUtil.getNow());
75 transform.setPushTime(DateUtil.getNow()); 76 transform.setPushTime(DateUtil.getNow());
76 - transform.setSelf(userSetting.getServerId().equals(mediaItem.getSeverId())); 77 + transform.setSelf(userSetting.getServerId().equals(onStreamChangedHookParam.getSeverId()));
77 if (pushInDb == null) { 78 if (pushInDb == null) {
78 transform.setCreateTime(DateUtil.getNow()); 79 transform.setCreateTime(DateUtil.getNow());
79 streamPushMapper.add(transform); 80 streamPushMapper.add(transform);
80 }else { 81 }else {
81 streamPushMapper.update(transform); 82 streamPushMapper.update(transform);
82 - gbStreamMapper.updateMediaServer(mediaItem.getApp(), mediaItem.getStream(), mediaItem.getMediaServerId()); 83 + gbStreamMapper.updateMediaServer(onStreamChangedHookParam.getApp(), onStreamChangedHookParam.getStream(), onStreamChangedHookParam.getMediaServerId());
83 } 84 }
84 ChannelOnlineEvent channelOnlineEventLister = getChannelOnlineEventLister(transform.getApp(), transform.getStream()); 85 ChannelOnlineEvent channelOnlineEventLister = getChannelOnlineEventLister(transform.getApp(), transform.getStream());
85 if ( channelOnlineEventLister != null) { 86 if ( channelOnlineEventLister != null) {
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
1 package com.genersoft.iot.vmp.media.zlm; 1 package com.genersoft.iot.vmp.media.zlm;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONObject;
5 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 5 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
6 import okhttp3.*; 6 import okhttp3.*;
7 import okhttp3.logging.HttpLoggingInterceptor; 7 import okhttp3.logging.HttpLoggingInterceptor;
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
1 package com.genersoft.iot.vmp.media.zlm; 1 package com.genersoft.iot.vmp.media.zlm;
2 2
3 -import com.alibaba.fastjson.JSONArray;  
4 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONArray;
  4 +import com.alibaba.fastjson2.JSONObject;
5 import com.genersoft.iot.vmp.conf.UserSetting; 5 import com.genersoft.iot.vmp.conf.UserSetting;
6 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; 6 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
7 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 7 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
@@ -333,7 +333,7 @@ public class ZLMRTPServerFactory { @@ -333,7 +333,7 @@ public class ZLMRTPServerFactory {
333 result= true; 333 result= true;
334 logger.info("[停止RTP推流] 成功"); 334 logger.info("[停止RTP推流] 成功");
335 } else { 335 } else {
336 - logger.error("[停止RTP推流] 失败: {}, 参数:{}->\r\n{}",jsonObject.getString("msg"),JSONObject.toJSON(param), jsonObject); 336 + logger.error("[停止RTP推流] 失败: {}, 参数:{}->\r\n{}",jsonObject.getString("msg"),jsonObject.toJSONString(param));
337 } 337 }
338 return result; 338 return result;
339 } 339 }
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
1 package com.genersoft.iot.vmp.media.zlm; 1 package com.genersoft.iot.vmp.media.zlm;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONArray;  
5 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONArray;
  5 +import com.alibaba.fastjson2.JSONObject;
6 import com.genersoft.iot.vmp.conf.DynamicTask; 6 import com.genersoft.iot.vmp.conf.DynamicTask;
7 import com.genersoft.iot.vmp.conf.MediaConfig; 7 import com.genersoft.iot.vmp.conf.MediaConfig;
8 import com.genersoft.iot.vmp.gb28181.event.EventPublisher; 8 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
@@ -62,7 +62,7 @@ public class ZLMRunner implements CommandLineRunner { @@ -62,7 +62,7 @@ public class ZLMRunner implements CommandLineRunner {
62 // 订阅 zlm启动事件, 新的zlm也会从这里进入系统 62 // 订阅 zlm启动事件, 新的zlm也会从这里进入系统
63 hookSubscribe.addSubscribe(hookSubscribeForServerStarted, 63 hookSubscribe.addSubscribe(hookSubscribeForServerStarted,
64 (MediaServerItem mediaServerItem, JSONObject response)->{ 64 (MediaServerItem mediaServerItem, JSONObject response)->{
65 - ZLMServerConfig zlmServerConfig = JSONObject.toJavaObject(response, ZLMServerConfig.class); 65 + ZLMServerConfig zlmServerConfig = response.to(ZLMServerConfig.class);
66 if (zlmServerConfig !=null ) { 66 if (zlmServerConfig !=null ) {
67 if (startGetMedia != null) { 67 if (startGetMedia != null) {
68 startGetMedia.remove(zlmServerConfig.getGeneralMediaServerId()); 68 startGetMedia.remove(zlmServerConfig.getGeneralMediaServerId());
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java
1 package com.genersoft.iot.vmp.media.zlm; 1 package com.genersoft.iot.vmp.media.zlm;
2 2
3 -import com.alibaba.fastjson.annotation.JSONField; 3 +import com.alibaba.fastjson2.annotation.JSONField;
4 4
5 public class ZLMServerConfig { 5 public class ZLMServerConfig {
6 6
src/main/java/com/genersoft/iot/vmp/media/zlm/ZlmHttpHookSubscribe.java
1 package com.genersoft.iot.vmp.media.zlm; 1 package com.genersoft.iot.vmp.media.zlm;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.media.zlm.dto.HookType; 4 import com.genersoft.iot.vmp.media.zlm.dto.HookType;
5 import com.genersoft.iot.vmp.media.zlm.dto.IHookSubscribe; 5 import com.genersoft.iot.vmp.media.zlm.dto.IHookSubscribe;
6 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 6 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/HookSubscribeFactory.java
1 package com.genersoft.iot.vmp.media.zlm.dto; 1 package com.genersoft.iot.vmp.media.zlm.dto;
2 2
3 3
4 -import com.alibaba.fastjson.JSONObject; 4 +import com.alibaba.fastjson2.JSONObject;
5 5
6 /** 6 /**
7 * hook 订阅工厂 7 * hook 订阅工厂
@@ -11,7 +11,7 @@ public class HookSubscribeFactory { @@ -11,7 +11,7 @@ public class HookSubscribeFactory {
11 11
12 public static HookSubscribeForStreamChange on_stream_changed(String app, String stream, boolean regist, String scheam, String mediaServerId) { 12 public static HookSubscribeForStreamChange on_stream_changed(String app, String stream, boolean regist, String scheam, String mediaServerId) {
13 HookSubscribeForStreamChange hookSubscribe = new HookSubscribeForStreamChange(); 13 HookSubscribeForStreamChange hookSubscribe = new HookSubscribeForStreamChange();
14 - JSONObject subscribeKey = new com.alibaba.fastjson.JSONObject(); 14 + JSONObject subscribeKey = new com.alibaba.fastjson2.JSONObject();
15 subscribeKey.put("app", app); 15 subscribeKey.put("app", app);
16 subscribeKey.put("stream", stream); 16 subscribeKey.put("stream", stream);
17 subscribeKey.put("regist", regist); 17 subscribeKey.put("regist", regist);
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/HookSubscribeForServerStarted.java
1 package com.genersoft.iot.vmp.media.zlm.dto; 1 package com.genersoft.iot.vmp.media.zlm.dto;
2 2
3 -import com.alibaba.fastjson.JSONObject;  
4 -import com.alibaba.fastjson.annotation.JSONField; 3 +import com.alibaba.fastjson2.JSONObject;
  4 +import com.alibaba.fastjson2.annotation.JSONField;
5 5
6 import java.time.Instant; 6 import java.time.Instant;
7 7
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/HookSubscribeForStreamChange.java
1 package com.genersoft.iot.vmp.media.zlm.dto; 1 package com.genersoft.iot.vmp.media.zlm.dto;
2 2
3 -import com.alibaba.fastjson.JSONObject;  
4 -import com.alibaba.fastjson.annotation.JSONField; 3 +import com.alibaba.fastjson2.JSONObject;
  4 +import com.alibaba.fastjson2.annotation.JSONField;
5 5
6 import java.time.Instant; 6 import java.time.Instant;
7 7
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/IHookSubscribe.java
1 package com.genersoft.iot.vmp.media.zlm.dto; 1 package com.genersoft.iot.vmp.media.zlm.dto;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 4
5 import java.time.Instant; 5 import java.time.Instant;
6 6
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/ServerKeepaliveData.java 0 → 100644
  1 +package com.genersoft.iot.vmp.media.zlm.dto;
  2 +
  3 +public class ServerKeepaliveData {
  4 +}
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamAuthorityInfo.java
1 package com.genersoft.iot.vmp.media.zlm.dto; 1 package com.genersoft.iot.vmp.media.zlm.dto;
2 2
  3 +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnPublishHookParam;
  4 +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
  5 +
3 /** 6 /**
4 * 流的鉴权信息 7 * 流的鉴权信息
5 * @author lin 8 * @author lin
@@ -102,13 +105,13 @@ public class StreamAuthorityInfo { @@ -102,13 +105,13 @@ public class StreamAuthorityInfo {
102 return streamAuthorityInfo; 105 return streamAuthorityInfo;
103 } 106 }
104 107
105 - public static StreamAuthorityInfo getInstanceByHook(MediaItem mediaItem) { 108 + public static StreamAuthorityInfo getInstanceByHook(OnStreamChangedHookParam onStreamChangedHookParam) {
106 StreamAuthorityInfo streamAuthorityInfo = new StreamAuthorityInfo(); 109 StreamAuthorityInfo streamAuthorityInfo = new StreamAuthorityInfo();
107 - streamAuthorityInfo.setApp(mediaItem.getApp());  
108 - streamAuthorityInfo.setStream(mediaItem.getStream());  
109 - streamAuthorityInfo.setId(mediaItem.getMediaServerId());  
110 - streamAuthorityInfo.setOriginType(mediaItem.getOriginType());  
111 - streamAuthorityInfo.setOriginTypeStr(mediaItem.getOriginTypeStr()); 110 + streamAuthorityInfo.setApp(onStreamChangedHookParam.getApp());
  111 + streamAuthorityInfo.setStream(onStreamChangedHookParam.getStream());
  112 + streamAuthorityInfo.setId(onStreamChangedHookParam.getMediaServerId());
  113 + streamAuthorityInfo.setOriginType(onStreamChangedHookParam.getOriginType());
  114 + streamAuthorityInfo.setOriginTypeStr(onStreamChangedHookParam.getOriginTypeStr());
112 return streamAuthorityInfo; 115 return streamAuthorityInfo;
113 } 116 }
114 } 117 }
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamPushItem.java
1 package com.genersoft.iot.vmp.media.zlm.dto; 1 package com.genersoft.iot.vmp.media.zlm.dto;
2 2
3 import com.genersoft.iot.vmp.gb28181.bean.GbStream; 3 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
  4 +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
4 import com.genersoft.iot.vmp.utils.DateUtil; 5 import com.genersoft.iot.vmp.utils.DateUtil;
5 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
6 import org.jetbrains.annotations.NotNull; 7 import org.jetbrains.annotations.NotNull;
7 -import org.springframework.util.unit.DataUnit;  
8 8
9 import java.util.List; 9 import java.util.List;
10 10
@@ -59,7 +59,7 @@ public class StreamPushItem extends GbStream implements Comparable&lt;StreamPushIte @@ -59,7 +59,7 @@ public class StreamPushItem extends GbStream implements Comparable&lt;StreamPushIte
59 * 客户端和服务器网络信息,可能为null类型 59 * 客户端和服务器网络信息,可能为null类型
60 */ 60 */
61 @Schema(description = "客户端和服务器网络信息,可能为null类型") 61 @Schema(description = "客户端和服务器网络信息,可能为null类型")
62 - private MediaItem.OriginSock originSock; 62 + private OnStreamChangedHookParam.OriginSock originSock;
63 63
64 /** 64 /**
65 * 产生源类型的字符串描述 65 * 产生源类型的字符串描述
@@ -83,7 +83,7 @@ public class StreamPushItem extends GbStream implements Comparable&lt;StreamPushIte @@ -83,7 +83,7 @@ public class StreamPushItem extends GbStream implements Comparable&lt;StreamPushIte
83 * 音视频轨道 83 * 音视频轨道
84 */ 84 */
85 @Schema(description = "音视频轨道") 85 @Schema(description = "音视频轨道")
86 - private List<MediaItem.MediaTrack> tracks; 86 + private List<OnStreamChangedHookParam.MediaTrack> tracks;
87 87
88 /** 88 /**
89 * 音视频轨道 89 * 音视频轨道
@@ -223,11 +223,11 @@ public class StreamPushItem extends GbStream implements Comparable&lt;StreamPushIte @@ -223,11 +223,11 @@ public class StreamPushItem extends GbStream implements Comparable&lt;StreamPushIte
223 this.originType = originType; 223 this.originType = originType;
224 } 224 }
225 225
226 - public MediaItem.OriginSock getOriginSock() { 226 + public OnStreamChangedHookParam.OriginSock getOriginSock() {
227 return originSock; 227 return originSock;
228 } 228 }
229 229
230 - public void setOriginSock(MediaItem.OriginSock originSock) { 230 + public void setOriginSock(OnStreamChangedHookParam.OriginSock originSock) {
231 this.originSock = originSock; 231 this.originSock = originSock;
232 } 232 }
233 233
@@ -256,11 +256,11 @@ public class StreamPushItem extends GbStream implements Comparable&lt;StreamPushIte @@ -256,11 +256,11 @@ public class StreamPushItem extends GbStream implements Comparable&lt;StreamPushIte
256 this.aliveSecond = aliveSecond; 256 this.aliveSecond = aliveSecond;
257 } 257 }
258 258
259 - public List<MediaItem.MediaTrack> getTracks() { 259 + public List<OnStreamChangedHookParam.MediaTrack> getTracks() {
260 return tracks; 260 return tracks;
261 } 261 }
262 262
263 - public void setTracks(List<MediaItem.MediaTrack> tracks) { 263 + public void setTracks(List<OnStreamChangedHookParam.MediaTrack> tracks) {
264 this.tracks = tracks; 264 this.tracks = tracks;
265 } 265 }
266 266
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/HookParam.java renamed to src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/HookParam.java
1 -package com.genersoft.iot.vmp.media.zlm.dto; 1 +package com.genersoft.iot.vmp.media.zlm.dto.hook;
2 2
3 /** 3 /**
4 * zlm hook事件的参数 4 * zlm hook事件的参数
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/OnPlayHookParam.java renamed to src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnPlayHookParam.java
1 -package com.genersoft.iot.vmp.media.zlm.dto; 1 +package com.genersoft.iot.vmp.media.zlm.dto.hook;
2 2
3 /** 3 /**
4 * zlm hook事件中的on_play事件的参数 4 * zlm hook事件中的on_play事件的参数
@@ -79,4 +79,8 @@ public class OnPlayHookParam extends HookParam{ @@ -79,4 +79,8 @@ public class OnPlayHookParam extends HookParam{
79 this.vhost = vhost; 79 this.vhost = vhost;
80 } 80 }
81 81
  82 + @Override
  83 + public String toString() {
  84 + return String.format("%s://%s:%s/%s/%s?%s", schema, ip, port, app, stream, params);
  85 + }
82 } 86 }
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/OnPublishHookParam.java renamed to src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnPublishHookParam.java
1 -package com.genersoft.iot.vmp.media.zlm.dto; 1 +package com.genersoft.iot.vmp.media.zlm.dto.hook;
2 2
3 /** 3 /**
4 * zlm hook事件中的on_publish事件的参数 4 * zlm hook事件中的on_publish事件的参数
@@ -79,4 +79,8 @@ public class OnPublishHookParam extends HookParam{ @@ -79,4 +79,8 @@ public class OnPublishHookParam extends HookParam{
79 this.vhost = vhost; 79 this.vhost = vhost;
80 } 80 }
81 81
  82 + @Override
  83 + public String toString() {
  84 + return String.format("%s://%s:%s/%s/%s?%s", schema, ip, port, app, stream, params);
  85 + }
82 } 86 }
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnSendRtpStoppedHookParam.java 0 → 100644
  1 +package com.genersoft.iot.vmp.media.zlm.dto.hook;
  2 +
  3 +/**
  4 + * zlm hook事件中的on_send_rtp_stopped事件的参数
  5 + * @author lin
  6 + */
  7 +public class OnSendRtpStoppedHookParam extends HookParam{
  8 + private String app;
  9 + private String stream;
  10 +
  11 +
  12 + public String getApp() {
  13 + return app;
  14 + }
  15 +
  16 + public void setApp(String app) {
  17 + this.app = app;
  18 + }
  19 +
  20 + public String getStream() {
  21 + return stream;
  22 + }
  23 +
  24 + public void setStream(String stream) {
  25 + this.stream = stream;
  26 + }
  27 +}
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnServerKeepaliveHookParam.java 0 → 100644
  1 +package com.genersoft.iot.vmp.media.zlm.dto.hook;
  2 +
  3 +import com.genersoft.iot.vmp.media.zlm.dto.ServerKeepaliveData;
  4 +
  5 +/**
  6 + * zlm hook事件中的on_play事件的参数
  7 + * @author lin
  8 + */
  9 +public class OnServerKeepaliveHookParam extends HookParam{
  10 +
  11 + private ServerKeepaliveData data;
  12 +
  13 + public ServerKeepaliveData getData() {
  14 + return data;
  15 + }
  16 +
  17 + public void setData(ServerKeepaliveData data) {
  18 + this.data = data;
  19 + }
  20 +}
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaItem.java renamed to src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnStreamChangedHookParam.java
1 -package com.genersoft.iot.vmp.media.zlm.dto; 1 +package com.genersoft.iot.vmp.media.zlm.dto.hook;
2 2
3 import com.genersoft.iot.vmp.common.StreamInfo; 3 import com.genersoft.iot.vmp.common.StreamInfo;
4 4
@@ -7,7 +7,7 @@ import java.util.List; @@ -7,7 +7,7 @@ import java.util.List;
7 /** 7 /**
8 * @author lin 8 * @author lin
9 */ 9 */
10 -public class MediaItem { 10 +public class OnStreamChangedHookParam extends HookParam{
11 11
12 /** 12 /**
13 * 注册/注销 13 * 注册/注销
@@ -69,11 +69,6 @@ public class MediaItem { @@ -69,11 +69,6 @@ public class MediaItem {
69 private String originUrl; 69 private String originUrl;
70 70
71 /** 71 /**
72 - * 流媒体服务器id  
73 - */  
74 - private String mediaServerId;  
75 -  
76 - /**  
77 * 服务器id 72 * 服务器id
78 */ 73 */
79 private String severId; 74 private String severId;
@@ -412,14 +407,6 @@ public class MediaItem { @@ -412,14 +407,6 @@ public class MediaItem {
412 this.docker = docker; 407 this.docker = docker;
413 } 408 }
414 409
415 - public String getMediaServerId() {  
416 - return mediaServerId;  
417 - }  
418 -  
419 - public void setMediaServerId(String mediaServerId) {  
420 - this.mediaServerId = mediaServerId;  
421 - }  
422 -  
423 public StreamInfo getStreamInfo() { 410 public StreamInfo getStreamInfo() {
424 return streamInfo; 411 return streamInfo;
425 } 412 }
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnStreamNoneReaderHookParam.java 0 → 100644
  1 +package com.genersoft.iot.vmp.media.zlm.dto.hook;
  2 +
  3 +public class OnStreamNoneReaderHookParam extends HookParam{
  4 +
  5 + private String schema;
  6 + private String app;
  7 + private String stream;
  8 + private String vhost;
  9 +
  10 + public String getSchema() {
  11 + return schema;
  12 + }
  13 +
  14 + public void setSchema(String schema) {
  15 + this.schema = schema;
  16 + }
  17 +
  18 + public String getApp() {
  19 + return app;
  20 + }
  21 +
  22 + public void setApp(String app) {
  23 + this.app = app;
  24 + }
  25 +
  26 + public String getStream() {
  27 + return stream;
  28 + }
  29 +
  30 + public void setStream(String stream) {
  31 + this.stream = stream;
  32 + }
  33 +
  34 + public String getVhost() {
  35 + return vhost;
  36 + }
  37 +
  38 + public void setVhost(String vhost) {
  39 + this.vhost = vhost;
  40 + }
  41 +}
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnStreamNotFoundHookParam.java 0 → 100644
  1 +package com.genersoft.iot.vmp.media.zlm.dto.hook;
  2 +
  3 +/**
  4 + * zlm hook事件中的on_stream_not_found事件的参数
  5 + * @author lin
  6 + */
  7 +public class OnStreamNotFoundHookParam extends HookParam{
  8 + private String id;
  9 + private String app;
  10 + private String stream;
  11 + private String ip;
  12 + private String params;
  13 + private int port;
  14 + private String schema;
  15 + private String vhost;
  16 +
  17 +
  18 + public String getId() {
  19 + return id;
  20 + }
  21 +
  22 + public void setId(String id) {
  23 + this.id = id;
  24 + }
  25 +
  26 + public String getApp() {
  27 + return app;
  28 + }
  29 +
  30 + public void setApp(String app) {
  31 + this.app = app;
  32 + }
  33 +
  34 + public String getStream() {
  35 + return stream;
  36 + }
  37 +
  38 + public void setStream(String stream) {
  39 + this.stream = stream;
  40 + }
  41 +
  42 + public String getIp() {
  43 + return ip;
  44 + }
  45 +
  46 + public void setIp(String ip) {
  47 + this.ip = ip;
  48 + }
  49 +
  50 + public String getParams() {
  51 + return params;
  52 + }
  53 +
  54 + public void setParams(String params) {
  55 + this.params = params;
  56 + }
  57 +
  58 + public int getPort() {
  59 + return port;
  60 + }
  61 +
  62 + public void setPort(int port) {
  63 + this.port = port;
  64 + }
  65 +
  66 + public String getSchema() {
  67 + return schema;
  68 + }
  69 +
  70 + public void setSchema(String schema) {
  71 + this.schema = schema;
  72 + }
  73 +
  74 + public String getVhost() {
  75 + return vhost;
  76 + }
  77 +
  78 + public void setVhost(String vhost) {
  79 + this.vhost = vhost;
  80 + }
  81 +
  82 + @Override
  83 + public String toString() {
  84 + return String.format("%s://%s:%s/%s/%s?%s", schema, ip, port, app, stream, params);
  85 + }
  86 +}
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/OriginType.java renamed to src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OriginType.java
1 -package com.genersoft.iot.vmp.media.zlm.dto; 1 +package com.genersoft.iot.vmp.media.zlm.dto.hook;
2 2
3 public enum OriginType { 3 public enum OriginType {
4 // 不可调整顺序 4 // 不可调整顺序
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
1 package com.genersoft.iot.vmp.service; 1 package com.genersoft.iot.vmp.service;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.gb28181.bean.Device; 4 import com.genersoft.iot.vmp.gb28181.bean.Device;
5 import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; 5 import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
6 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 6 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
  7 +import com.genersoft.iot.vmp.media.zlm.dto.ServerKeepaliveData;
7 import com.genersoft.iot.vmp.service.bean.MediaServerLoad; 8 import com.genersoft.iot.vmp.service.bean.MediaServerLoad;
8 import com.genersoft.iot.vmp.service.bean.SSRCInfo; 9 import com.genersoft.iot.vmp.service.bean.SSRCInfo;
9 import com.genersoft.iot.vmp.vmanager.bean.WVPResult; 10 import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
@@ -86,7 +87,7 @@ public interface IMediaServerService { @@ -86,7 +87,7 @@ public interface IMediaServerService {
86 87
87 MediaServerItem getDefaultMediaServer(); 88 MediaServerItem getDefaultMediaServer();
88 89
89 - void updateMediaServerKeepalive(String mediaServerId, JSONObject data); 90 + void updateMediaServerKeepalive(String mediaServerId, ServerKeepaliveData data);
90 91
91 boolean checkRtpServer(MediaServerItem mediaServerItem, String rtp, String stream); 92 boolean checkRtpServer(MediaServerItem mediaServerItem, String rtp, String stream);
92 93
src/main/java/com/genersoft/iot/vmp/service/IMediaService.java
1 package com.genersoft.iot.vmp.service; 1 package com.genersoft.iot.vmp.service;
2 2
3 -import com.alibaba.fastjson.JSONArray; 3 +import com.alibaba.fastjson2.JSONArray;
4 import com.genersoft.iot.vmp.common.StreamInfo; 4 import com.genersoft.iot.vmp.common.StreamInfo;
5 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 5 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
6 6
src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
1 package com.genersoft.iot.vmp.service; 1 package com.genersoft.iot.vmp.service;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.common.StreamInfo; 4 import com.genersoft.iot.vmp.common.StreamInfo;
5 import com.genersoft.iot.vmp.conf.exception.ServiceException; 5 import com.genersoft.iot.vmp.conf.exception.ServiceException;
6 import com.genersoft.iot.vmp.gb28181.bean.Device; 6 import com.genersoft.iot.vmp.gb28181.bean.Device;
src/main/java/com/genersoft/iot/vmp/service/IStreamProxyService.java
1 package com.genersoft.iot.vmp.service; 1 package com.genersoft.iot.vmp.service;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.common.StreamInfo; 4 import com.genersoft.iot.vmp.common.StreamInfo;
5 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 5 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
6 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; 6 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
1 package com.genersoft.iot.vmp.service; 1 package com.genersoft.iot.vmp.service;
2 2
3 import com.genersoft.iot.vmp.gb28181.bean.GbStream; 3 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
4 -import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;  
5 -import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; 4 +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
6 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 5 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
7 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; 6 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
8 import com.genersoft.iot.vmp.service.bean.StreamPushItemFromRedis; 7 import com.genersoft.iot.vmp.service.bean.StreamPushItemFromRedis;
9 import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo; 8 import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
10 -import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto;  
11 import com.github.pagehelper.PageInfo; 9 import com.github.pagehelper.PageInfo;
12 10
13 import java.util.List; 11 import java.util.List;
@@ -38,7 +36,7 @@ public interface IStreamPushService { @@ -38,7 +36,7 @@ public interface IStreamPushService {
38 36
39 List<StreamPushItem> getPushList(String mediaSererId); 37 List<StreamPushItem> getPushList(String mediaSererId);
40 38
41 - StreamPushItem transform(MediaItem item); 39 + StreamPushItem transform(OnStreamChangedHookParam item);
42 40
43 StreamPushItem getPush(String app, String streamId); 41 StreamPushItem getPush(String app, String streamId);
44 42
src/main/java/com/genersoft/iot/vmp/service/bean/PlayBackResult.java
1 package com.genersoft.iot.vmp.service.bean; 1 package com.genersoft.iot.vmp.service.bean;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; 4 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
5 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 5 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
6 6
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -10,6 +10,7 @@ import java.util.Set; @@ -10,6 +10,7 @@ import java.util.Set;
10 10
11 import com.genersoft.iot.vmp.conf.DynamicTask; 11 import com.genersoft.iot.vmp.conf.DynamicTask;
12 import com.genersoft.iot.vmp.conf.exception.ControllerException; 12 import com.genersoft.iot.vmp.conf.exception.ControllerException;
  13 +import com.genersoft.iot.vmp.media.zlm.dto.ServerKeepaliveData;
13 import com.genersoft.iot.vmp.service.bean.MediaServerLoad; 14 import com.genersoft.iot.vmp.service.bean.MediaServerLoad;
14 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 15 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
15 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; 16 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
@@ -23,9 +24,9 @@ import org.springframework.transaction.TransactionDefinition; @@ -23,9 +24,9 @@ import org.springframework.transaction.TransactionDefinition;
23 import org.springframework.transaction.TransactionStatus; 24 import org.springframework.transaction.TransactionStatus;
24 import org.springframework.util.ObjectUtils; 25 import org.springframework.util.ObjectUtils;
25 26
26 -import com.alibaba.fastjson.JSON;  
27 -import com.alibaba.fastjson.JSONArray;  
28 -import com.alibaba.fastjson.JSONObject; 27 +import com.alibaba.fastjson2.JSON;
  28 +import com.alibaba.fastjson2.JSONArray;
  29 +import com.alibaba.fastjson2.JSONObject;
29 import com.genersoft.iot.vmp.common.VideoManagerConstants; 30 import com.genersoft.iot.vmp.common.VideoManagerConstants;
30 import com.genersoft.iot.vmp.conf.SipConfig; 31 import com.genersoft.iot.vmp.conf.SipConfig;
31 import com.genersoft.iot.vmp.conf.UserSetting; 32 import com.genersoft.iot.vmp.conf.UserSetting;
@@ -434,7 +435,7 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -434,7 +435,7 @@ public class MediaServerServiceImpl implements IMediaServerService {
434 if (mediaServerConfig != null && mediaServerConfig.getInteger("code") == 0) { 435 if (mediaServerConfig != null && mediaServerConfig.getInteger("code") == 0) {
435 logger.info("[zlm心跳到期]:{}验证后zlm仍在线,恢复心跳信息,请检查zlm是否可以正常向wvp发送心跳", serverItem.getId()); 436 logger.info("[zlm心跳到期]:{}验证后zlm仍在线,恢复心跳信息,请检查zlm是否可以正常向wvp发送心跳", serverItem.getId());
436 // 添加zlm信息 437 // 添加zlm信息
437 - updateMediaServerKeepalive(serverItem.getId(), mediaServerConfig); 438 + updateMediaServerKeepalive(serverItem.getId(), null);
438 }else { 439 }else {
439 publisher.zlmOfflineEventPublish(serverItem.getId()); 440 publisher.zlmOfflineEventPublish(serverItem.getId());
440 } 441 }
@@ -526,15 +527,15 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -526,15 +527,15 @@ public class MediaServerServiceImpl implements IMediaServerService {
526 Map<String, Object> param = new HashMap<>(); 527 Map<String, Object> param = new HashMap<>();
527 param.put("api.secret",mediaServerItem.getSecret()); // -profile:v Baseline 528 param.put("api.secret",mediaServerItem.getSecret()); // -profile:v Baseline
528 param.put("hook.enable","1"); 529 param.put("hook.enable","1");
529 - param.put("hook.on_flow_report",String.format("%s/on_flow_report", hookPrex)); 530 + param.put("hook.on_flow_report","");
530 param.put("hook.on_play",String.format("%s/on_play", hookPrex)); 531 param.put("hook.on_play",String.format("%s/on_play", hookPrex));
531 - param.put("hook.on_http_access",String.format("%s/on_http_access", hookPrex)); 532 + param.put("hook.on_http_access","");
532 param.put("hook.on_publish", String.format("%s/on_publish", hookPrex)); 533 param.put("hook.on_publish", String.format("%s/on_publish", hookPrex));
533 - param.put("hook.on_record_ts",String.format("%s/on_record_ts", hookPrex));  
534 - param.put("hook.on_rtsp_auth",String.format("%s/on_rtsp_auth", hookPrex));  
535 - param.put("hook.on_rtsp_realm",String.format("%s/on_rtsp_realm", hookPrex)); 534 + param.put("hook.on_record_ts","");
  535 + param.put("hook.on_rtsp_auth","");
  536 + param.put("hook.on_rtsp_realm","");
536 param.put("hook.on_server_started",String.format("%s/on_server_started", hookPrex)); 537 param.put("hook.on_server_started",String.format("%s/on_server_started", hookPrex));
537 - param.put("hook.on_shell_login",String.format("%s/on_shell_login", hookPrex)); 538 + param.put("hook.on_shell_login","");
538 param.put("hook.on_stream_changed",String.format("%s/on_stream_changed", hookPrex)); 539 param.put("hook.on_stream_changed",String.format("%s/on_stream_changed", hookPrex));
539 param.put("hook.on_stream_none_reader",String.format("%s/on_stream_none_reader", hookPrex)); 540 param.put("hook.on_stream_none_reader",String.format("%s/on_stream_none_reader", hookPrex));
540 param.put("hook.on_stream_not_found",String.format("%s/on_stream_not_found", hookPrex)); 541 param.put("hook.on_stream_not_found",String.format("%s/on_stream_not_found", hookPrex));
@@ -551,6 +552,7 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -551,6 +552,7 @@ public class MediaServerServiceImpl implements IMediaServerService {
551 // 此参数不应大于播放器超时时间 552 // 此参数不应大于播放器超时时间
552 // 优化此消息以更快的收到流注销事件 553 // 优化此消息以更快的收到流注销事件
553 param.put("general.continue_push_ms", "3000" ); 554 param.put("general.continue_push_ms", "3000" );
  555 + param.put("general.publishToHls", "0" );
554 // 最多等待未初始化的Track时间,单位毫秒,超时之后会忽略未初始化的Track, 设置此选项优化那些音频错误的不规范流, 556 // 最多等待未初始化的Track时间,单位毫秒,超时之后会忽略未初始化的Track, 设置此选项优化那些音频错误的不规范流,
555 // 等zlm支持给每个rtpServer设置关闭音频的时候可以不设置此选项 557 // 等zlm支持给每个rtpServer设置关闭音频的时候可以不设置此选项
556 // param.put("general.wait_track_ready_ms", "3000" ); 558 // param.put("general.wait_track_ready_ms", "3000" );
@@ -645,7 +647,7 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -645,7 +647,7 @@ public class MediaServerServiceImpl implements IMediaServerService {
645 } 647 }
646 648
647 @Override 649 @Override
648 - public void updateMediaServerKeepalive(String mediaServerId, JSONObject data) { 650 + public void updateMediaServerKeepalive(String mediaServerId, ServerKeepaliveData data) {
649 MediaServerItem mediaServerItem = getOne(mediaServerId); 651 MediaServerItem mediaServerItem = getOne(mediaServerId);
650 if (mediaServerItem == null) { 652 if (mediaServerItem == null) {
651 // 缓存不存在,从数据库查询,如果数据库不存在则是错误的 653 // 缓存不存在,从数据库查询,如果数据库不存在则是错误的
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
1 package com.genersoft.iot.vmp.service.impl; 1 package com.genersoft.iot.vmp.service.impl;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONArray;  
5 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONArray;
  5 +import com.alibaba.fastjson2.JSONObject;
6 import com.genersoft.iot.vmp.common.StreamInfo; 6 import com.genersoft.iot.vmp.common.StreamInfo;
7 import com.genersoft.iot.vmp.common.StreamURL; 7 import com.genersoft.iot.vmp.common.StreamURL;
8 import com.genersoft.iot.vmp.conf.MediaConfig; 8 import com.genersoft.iot.vmp.conf.MediaConfig;
9 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; 9 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
10 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 10 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
11 -import com.genersoft.iot.vmp.media.zlm.dto.OnPublishHookParam;  
12 import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; 11 import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo;
13 import com.genersoft.iot.vmp.service.IMediaServerService; 12 import com.genersoft.iot.vmp.service.IMediaServerService;
14 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 13 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
@@ -17,7 +16,6 @@ import com.genersoft.iot.vmp.service.IMediaService; @@ -17,7 +16,6 @@ import com.genersoft.iot.vmp.service.IMediaService;
17 import org.springframework.beans.factory.annotation.Autowired; 16 import org.springframework.beans.factory.annotation.Autowired;
18 import org.springframework.stereotype.Service; 17 import org.springframework.stereotype.Service;
19 import org.springframework.util.ObjectUtils; 18 import org.springframework.util.ObjectUtils;
20 -import org.springframework.util.StringUtils;  
21 19
22 import java.net.URL; 20 import java.net.URL;
23 21
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -25,9 +25,9 @@ import org.springframework.stereotype.Service; @@ -25,9 +25,9 @@ import org.springframework.stereotype.Service;
25 import org.springframework.util.ObjectUtils; 25 import org.springframework.util.ObjectUtils;
26 import org.springframework.web.context.request.async.DeferredResult; 26 import org.springframework.web.context.request.async.DeferredResult;
27 27
28 -import com.alibaba.fastjson.JSON;  
29 -import com.alibaba.fastjson.JSONArray;  
30 -import com.alibaba.fastjson.JSONObject; 28 +import com.alibaba.fastjson2.JSON;
  29 +import com.alibaba.fastjson2.JSONArray;
  30 +import com.alibaba.fastjson2.JSONObject;
31 import com.genersoft.iot.vmp.common.StreamInfo; 31 import com.genersoft.iot.vmp.common.StreamInfo;
32 import com.genersoft.iot.vmp.conf.DynamicTask; 32 import com.genersoft.iot.vmp.conf.DynamicTask;
33 import com.genersoft.iot.vmp.conf.UserSetting; 33 import com.genersoft.iot.vmp.conf.UserSetting;
@@ -188,7 +188,7 @@ public class PlayServiceImpl implements IPlayService { @@ -188,7 +188,7 @@ public class PlayServiceImpl implements IPlayService {
188 188
189 resultHolder.invokeAllResult(msg); 189 resultHolder.invokeAllResult(msg);
190 if (hookEvent != null) { 190 if (hookEvent != null) {
191 - hookEvent.response(mediaServerItem, JSONObject.parseObject(JSON.toJSONString(streamInfo))); 191 + hookEvent.response(mediaServerItem, JSON.parseObject(JSON.toJSONString(streamInfo)));
192 } 192 }
193 } 193 }
194 194
src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
1 package com.genersoft.iot.vmp.service.impl; 1 package com.genersoft.iot.vmp.service.impl;
2 2
3 -import com.alibaba.fastjson.JSONArray;  
4 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONArray;
  4 +import com.alibaba.fastjson2.JSONObject;
5 import com.genersoft.iot.vmp.common.StreamInfo; 5 import com.genersoft.iot.vmp.common.StreamInfo;
6 import com.genersoft.iot.vmp.conf.UserSetting; 6 import com.genersoft.iot.vmp.conf.UserSetting;
7 import com.genersoft.iot.vmp.conf.exception.ControllerException; 7 import com.genersoft.iot.vmp.conf.exception.ControllerException;
8 import com.genersoft.iot.vmp.gb28181.bean.GbStream; 8 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
9 -import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;  
10 -import com.genersoft.iot.vmp.gb28181.bean.TreeType;  
11 import com.genersoft.iot.vmp.gb28181.event.EventPublisher; 9 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
12 import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; 10 import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
13 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; 11 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
14 -import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; 12 +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
15 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 13 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
16 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; 14 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
17 import com.genersoft.iot.vmp.service.IGbStreamService; 15 import com.genersoft.iot.vmp.service.IGbStreamService;
@@ -27,7 +25,6 @@ import com.genersoft.iot.vmp.service.IStreamProxyService; @@ -27,7 +25,6 @@ import com.genersoft.iot.vmp.service.IStreamProxyService;
27 import com.genersoft.iot.vmp.utils.DateUtil; 25 import com.genersoft.iot.vmp.utils.DateUtil;
28 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; 26 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
29 import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo; 27 import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
30 -import com.genersoft.iot.vmp.vmanager.bean.WVPResult;  
31 import com.github.pagehelper.PageInfo; 28 import com.github.pagehelper.PageInfo;
32 import org.slf4j.Logger; 29 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory; 30 import org.slf4j.LoggerFactory;
@@ -37,9 +34,7 @@ import org.springframework.stereotype.Service; @@ -37,9 +34,7 @@ import org.springframework.stereotype.Service;
37 import org.springframework.transaction.TransactionDefinition; 34 import org.springframework.transaction.TransactionDefinition;
38 import org.springframework.transaction.TransactionStatus; 35 import org.springframework.transaction.TransactionStatus;
39 import org.springframework.util.ObjectUtils; 36 import org.springframework.util.ObjectUtils;
40 -import org.springframework.util.StringUtils;  
41 37
42 -import java.net.InetAddress;  
43 import java.util.*; 38 import java.util.*;
44 39
45 /** 40 /**
@@ -389,18 +384,18 @@ public class StreamProxyServiceImpl implements IStreamProxyService { @@ -389,18 +384,18 @@ public class StreamProxyServiceImpl implements IStreamProxyService {
389 String type = "PULL"; 384 String type = "PULL";
390 385
391 // 发送redis消息 386 // 发送redis消息
392 - List<MediaItem> mediaItems = redisCatchStorage.getStreams(mediaServerId, type);  
393 - if (mediaItems.size() > 0) {  
394 - for (MediaItem mediaItem : mediaItems) { 387 + List<OnStreamChangedHookParam> onStreamChangedHookParams = redisCatchStorage.getStreams(mediaServerId, type);
  388 + if (onStreamChangedHookParams.size() > 0) {
  389 + for (OnStreamChangedHookParam onStreamChangedHookParam : onStreamChangedHookParams) {
395 JSONObject jsonObject = new JSONObject(); 390 JSONObject jsonObject = new JSONObject();
396 jsonObject.put("serverId", userSetting.getServerId()); 391 jsonObject.put("serverId", userSetting.getServerId());
397 - jsonObject.put("app", mediaItem.getApp());  
398 - jsonObject.put("stream", mediaItem.getStream()); 392 + jsonObject.put("app", onStreamChangedHookParam.getApp());
  393 + jsonObject.put("stream", onStreamChangedHookParam.getStream());
399 jsonObject.put("register", false); 394 jsonObject.put("register", false);
400 jsonObject.put("mediaServerId", mediaServerId); 395 jsonObject.put("mediaServerId", mediaServerId);
401 redisCatchStorage.sendStreamChangeMsg(type, jsonObject); 396 redisCatchStorage.sendStreamChangeMsg(type, jsonObject);
402 // 移除redis内流的信息 397 // 移除redis内流的信息
403 - redisCatchStorage.removeStream(mediaServerId, type, mediaItem.getApp(), mediaItem.getStream()); 398 + redisCatchStorage.removeStream(mediaServerId, type, onStreamChangedHookParam.getApp(), onStreamChangedHookParam.getStream());
404 } 399 }
405 } 400 }
406 } 401 }
@@ -415,6 +410,47 @@ public class StreamProxyServiceImpl implements IStreamProxyService { @@ -415,6 +410,47 @@ public class StreamProxyServiceImpl implements IStreamProxyService {
415 return streamProxyMapper.updateStatus(app, stream, status); 410 return streamProxyMapper.updateStatus(app, stream, status);
416 } 411 }
417 412
  413 + private void syncPullStream(String mediaServerId){
  414 + MediaServerItem mediaServer = mediaServerService.getOne(mediaServerId);
  415 + if (mediaServer != null) {
  416 + List<OnStreamChangedHookParam> allPullStream = redisCatchStorage.getStreams(mediaServerId, "PULL");
  417 + if (allPullStream.size() > 0) {
  418 + zlmresTfulUtils.getMediaList(mediaServer, jsonObject->{
  419 + Map<String, StreamInfo> stringStreamInfoMap = new HashMap<>();
  420 + if (jsonObject.getInteger("code") == 0) {
  421 + JSONArray data = jsonObject.getJSONArray("data");
  422 + if(data != null && data.size() > 0) {
  423 + for (int i = 0; i < data.size(); i++) {
  424 + JSONObject streamJSONObj = data.getJSONObject(i);
  425 + if ("rtsp".equals(streamJSONObj.getString("schema"))) {
  426 + StreamInfo streamInfo = new StreamInfo();
  427 + String app = streamJSONObj.getString("app");
  428 + String stream = streamJSONObj.getString("stream");
  429 + streamInfo.setApp(app);
  430 + streamInfo.setStream(stream);
  431 + stringStreamInfoMap.put(app+stream, streamInfo);
  432 + }
  433 + }
  434 + }
  435 + }
  436 + if (stringStreamInfoMap.size() == 0) {
  437 + redisCatchStorage.removeStream(mediaServerId, "PULL");
  438 + }else {
  439 + for (String key : stringStreamInfoMap.keySet()) {
  440 + StreamInfo streamInfo = stringStreamInfoMap.get(key);
  441 + if (stringStreamInfoMap.get(streamInfo.getApp() + streamInfo.getStream()) == null) {
  442 + redisCatchStorage.removeStream(mediaServerId, "PULL", streamInfo.getApp(),
  443 + streamInfo.getStream());
  444 + }
  445 + }
  446 + }
  447 + });
  448 + }
  449 +
  450 + }
  451 +
  452 + }
  453 +
418 @Override 454 @Override
419 public ResourceBaceInfo getOverview() { 455 public ResourceBaceInfo getOverview() {
420 return streamProxyMapper.getOverview(); 456 return streamProxyMapper.getOverview();
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
1 package com.genersoft.iot.vmp.service.impl; 1 package com.genersoft.iot.vmp.service.impl;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONArray;  
5 -import com.alibaba.fastjson.JSONObject;  
6 -import com.alibaba.fastjson.TypeReference; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONArray;
  5 +import com.alibaba.fastjson2.JSONObject;
  6 +import com.alibaba.fastjson2.TypeReference;
7 import com.genersoft.iot.vmp.conf.MediaConfig; 7 import com.genersoft.iot.vmp.conf.MediaConfig;
8 import com.genersoft.iot.vmp.conf.UserSetting; 8 import com.genersoft.iot.vmp.conf.UserSetting;
9 import com.genersoft.iot.vmp.gb28181.bean.*; 9 import com.genersoft.iot.vmp.gb28181.bean.*;
@@ -11,6 +11,8 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher; @@ -11,6 +11,8 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
11 import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; 11 import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
12 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; 12 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
13 import com.genersoft.iot.vmp.media.zlm.dto.*; 13 import com.genersoft.iot.vmp.media.zlm.dto.*;
  14 +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
  15 +import com.genersoft.iot.vmp.media.zlm.dto.hook.OriginType;
14 import com.genersoft.iot.vmp.service.IGbStreamService; 16 import com.genersoft.iot.vmp.service.IGbStreamService;
15 import com.genersoft.iot.vmp.service.IMediaServerService; 17 import com.genersoft.iot.vmp.service.IMediaServerService;
16 import com.genersoft.iot.vmp.service.IStreamPushService; 18 import com.genersoft.iot.vmp.service.IStreamPushService;
@@ -29,7 +31,6 @@ import org.springframework.stereotype.Service; @@ -29,7 +31,6 @@ import org.springframework.stereotype.Service;
29 import org.springframework.transaction.TransactionDefinition; 31 import org.springframework.transaction.TransactionDefinition;
30 import org.springframework.transaction.TransactionStatus; 32 import org.springframework.transaction.TransactionStatus;
31 import org.springframework.util.ObjectUtils; 33 import org.springframework.util.ObjectUtils;
32 -import org.springframework.util.StringUtils;  
33 34
34 import java.util.*; 35 import java.util.*;
35 import java.util.stream.Collectors; 36 import java.util.stream.Collectors;
@@ -93,8 +94,8 @@ public class StreamPushServiceImpl implements IStreamPushService { @@ -93,8 +94,8 @@ public class StreamPushServiceImpl implements IStreamPushService {
93 94
94 Map<String, StreamPushItem> result = new HashMap<>(); 95 Map<String, StreamPushItem> result = new HashMap<>();
95 96
96 - List<MediaItem> mediaItems = JSON.parseObject(jsonData, new TypeReference<List<MediaItem>>() {});  
97 - for (MediaItem item : mediaItems) { 97 + List<OnStreamChangedHookParam> onStreamChangedHookParams = JSON.parseObject(jsonData, new TypeReference<List<OnStreamChangedHookParam>>() {});
  98 + for (OnStreamChangedHookParam item : onStreamChangedHookParams) {
98 99
99 // 不保存国标推理以及拉流代理的流 100 // 不保存国标推理以及拉流代理的流
100 if (item.getOriginType() == OriginType.RTSP_PUSH.ordinal() 101 if (item.getOriginType() == OriginType.RTSP_PUSH.ordinal()
@@ -112,7 +113,7 @@ public class StreamPushServiceImpl implements IStreamPushService { @@ -112,7 +113,7 @@ public class StreamPushServiceImpl implements IStreamPushService {
112 return new ArrayList<>(result.values()); 113 return new ArrayList<>(result.values());
113 } 114 }
114 @Override 115 @Override
115 - public StreamPushItem transform(MediaItem item) { 116 + public StreamPushItem transform(OnStreamChangedHookParam item) {
116 StreamPushItem streamPushItem = new StreamPushItem(); 117 StreamPushItem streamPushItem = new StreamPushItem();
117 streamPushItem.setApp(item.getApp()); 118 streamPushItem.setApp(item.getApp());
118 streamPushItem.setMediaServerId(item.getMediaServerId()); 119 streamPushItem.setMediaServerId(item.getMediaServerId());
@@ -206,8 +207,8 @@ public class StreamPushServiceImpl implements IStreamPushService { @@ -206,8 +207,8 @@ public class StreamPushServiceImpl implements IStreamPushService {
206 List<StreamPushItem> pushList = getPushList(mediaServerId); 207 List<StreamPushItem> pushList = getPushList(mediaServerId);
207 Map<String, StreamPushItem> pushItemMap = new HashMap<>(); 208 Map<String, StreamPushItem> pushItemMap = new HashMap<>();
208 // redis记录 209 // redis记录
209 - List<MediaItem> mediaItems = redisCatchStorage.getStreams(mediaServerId, "PUSH");  
210 - Map<String, MediaItem> streamInfoPushItemMap = new HashMap<>(); 210 + List<OnStreamChangedHookParam> onStreamChangedHookParams = redisCatchStorage.getStreams(mediaServerId, "PUSH");
  211 + Map<String, OnStreamChangedHookParam> streamInfoPushItemMap = new HashMap<>();
211 if (pushList.size() > 0) { 212 if (pushList.size() > 0) {
212 for (StreamPushItem streamPushItem : pushList) { 213 for (StreamPushItem streamPushItem : pushList) {
213 if (ObjectUtils.isEmpty(streamPushItem.getGbId())) { 214 if (ObjectUtils.isEmpty(streamPushItem.getGbId())) {
@@ -215,9 +216,9 @@ public class StreamPushServiceImpl implements IStreamPushService { @@ -215,9 +216,9 @@ public class StreamPushServiceImpl implements IStreamPushService {
215 } 216 }
216 } 217 }
217 } 218 }
218 - if (mediaItems.size() > 0) {  
219 - for (MediaItem mediaItem : mediaItems) {  
220 - streamInfoPushItemMap.put(mediaItem.getApp() + mediaItem.getStream(), mediaItem); 219 + if (onStreamChangedHookParams.size() > 0) {
  220 + for (OnStreamChangedHookParam onStreamChangedHookParam : onStreamChangedHookParams) {
  221 + streamInfoPushItemMap.put(onStreamChangedHookParam.getApp() + onStreamChangedHookParam.getStream(), onStreamChangedHookParam);
221 } 222 }
222 } 223 }
223 zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{ 224 zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{
@@ -258,19 +259,19 @@ public class StreamPushServiceImpl implements IStreamPushService { @@ -258,19 +259,19 @@ public class StreamPushServiceImpl implements IStreamPushService {
258 } 259 }
259 260
260 } 261 }
261 - Collection<MediaItem> offlineMediaItemList = streamInfoPushItemMap.values();  
262 - if (offlineMediaItemList.size() > 0) { 262 + Collection<OnStreamChangedHookParam> offlineOnStreamChangedHookParamList = streamInfoPushItemMap.values();
  263 + if (offlineOnStreamChangedHookParamList.size() > 0) {
263 String type = "PUSH"; 264 String type = "PUSH";
264 - for (MediaItem offlineMediaItem : offlineMediaItemList) { 265 + for (OnStreamChangedHookParam offlineOnStreamChangedHookParam : offlineOnStreamChangedHookParamList) {
265 JSONObject jsonObject = new JSONObject(); 266 JSONObject jsonObject = new JSONObject();
266 jsonObject.put("serverId", userSetting.getServerId()); 267 jsonObject.put("serverId", userSetting.getServerId());
267 - jsonObject.put("app", offlineMediaItem.getApp());  
268 - jsonObject.put("stream", offlineMediaItem.getStream()); 268 + jsonObject.put("app", offlineOnStreamChangedHookParam.getApp());
  269 + jsonObject.put("stream", offlineOnStreamChangedHookParam.getStream());
269 jsonObject.put("register", false); 270 jsonObject.put("register", false);
270 jsonObject.put("mediaServerId", mediaServerId); 271 jsonObject.put("mediaServerId", mediaServerId);
271 redisCatchStorage.sendStreamChangeMsg(type, jsonObject); 272 redisCatchStorage.sendStreamChangeMsg(type, jsonObject);
272 // 移除redis内流的信息 273 // 移除redis内流的信息
273 - redisCatchStorage.removeStream(mediaServerItem.getId(), "PUSH", offlineMediaItem.getApp(), offlineMediaItem.getStream()); 274 + redisCatchStorage.removeStream(mediaServerItem.getId(), "PUSH", offlineOnStreamChangedHookParam.getApp(), offlineOnStreamChangedHookParam.getStream());
274 } 275 }
275 } 276 }
276 })); 277 }));
@@ -288,15 +289,15 @@ public class StreamPushServiceImpl implements IStreamPushService { @@ -288,15 +289,15 @@ public class StreamPushServiceImpl implements IStreamPushService {
288 // 发送流停止消息 289 // 发送流停止消息
289 String type = "PUSH"; 290 String type = "PUSH";
290 // 发送redis消息 291 // 发送redis消息
291 - List<MediaItem> streamInfoList = redisCatchStorage.getStreams(mediaServerId, type); 292 + List<OnStreamChangedHookParam> streamInfoList = redisCatchStorage.getStreams(mediaServerId, type);
292 if (streamInfoList.size() > 0) { 293 if (streamInfoList.size() > 0) {
293 - for (MediaItem mediaItem : streamInfoList) { 294 + for (OnStreamChangedHookParam onStreamChangedHookParam : streamInfoList) {
294 // 移除redis内流的信息 295 // 移除redis内流的信息
295 - redisCatchStorage.removeStream(mediaServerId, type, mediaItem.getApp(), mediaItem.getStream()); 296 + redisCatchStorage.removeStream(mediaServerId, type, onStreamChangedHookParam.getApp(), onStreamChangedHookParam.getStream());
296 JSONObject jsonObject = new JSONObject(); 297 JSONObject jsonObject = new JSONObject();
297 jsonObject.put("serverId", userSetting.getServerId()); 298 jsonObject.put("serverId", userSetting.getServerId());
298 - jsonObject.put("app", mediaItem.getApp());  
299 - jsonObject.put("stream", mediaItem.getStream()); 299 + jsonObject.put("app", onStreamChangedHookParam.getApp());
  300 + jsonObject.put("stream", onStreamChangedHookParam.getStream());
300 jsonObject.put("register", false); 301 jsonObject.put("register", false);
301 jsonObject.put("mediaServerId", mediaServerId); 302 jsonObject.put("mediaServerId", mediaServerId);
302 redisCatchStorage.sendStreamChangeMsg(type, jsonObject); 303 redisCatchStorage.sendStreamChangeMsg(type, jsonObject);
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisAlarmMsgListener.java
1 package com.genersoft.iot.vmp.service.redisMsg; 1 package com.genersoft.iot.vmp.service.redisMsg;
2 2
3 -import com.alibaba.fastjson.JSON; 3 +import com.alibaba.fastjson2.JSON;
4 import com.genersoft.iot.vmp.gb28181.bean.*; 4 import com.genersoft.iot.vmp.gb28181.bean.*;
5 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; 5 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
6 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; 6 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGbPlayMsgListener.java
1 package com.genersoft.iot.vmp.service.redisMsg; 1 package com.genersoft.iot.vmp.service.redisMsg;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONObject;
5 import com.genersoft.iot.vmp.conf.DynamicTask; 5 import com.genersoft.iot.vmp.conf.DynamicTask;
6 import com.genersoft.iot.vmp.conf.UserSetting; 6 import com.genersoft.iot.vmp.conf.UserSetting;
7 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; 7 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGpsMsgListener.java
1 package com.genersoft.iot.vmp.service.redisMsg; 1 package com.genersoft.iot.vmp.service.redisMsg;
2 2
3 -import com.alibaba.fastjson.JSON; 3 +import com.alibaba.fastjson2.JSON;
4 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; 4 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
5 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 5 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
6 import com.genersoft.iot.vmp.storager.IVideoManagerStorage; 6 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisPushStreamResponseListener.java
1 package com.genersoft.iot.vmp.service.redisMsg; 1 package com.genersoft.iot.vmp.service.redisMsg;
2 2
3 -import com.alibaba.fastjson.JSON; 3 +import com.alibaba.fastjson2.JSON;
4 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; 4 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
5 import com.genersoft.iot.vmp.service.bean.MessageForPushChannelResponse; 5 import com.genersoft.iot.vmp.service.bean.MessageForPushChannelResponse;
6 import org.slf4j.Logger; 6 import org.slf4j.Logger;
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisPushStreamStatusListMsgListener.java
1 package com.genersoft.iot.vmp.service.redisMsg; 1 package com.genersoft.iot.vmp.service.redisMsg;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONObject;
5 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; 5 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
6 import com.genersoft.iot.vmp.service.IGbStreamService; 6 import com.genersoft.iot.vmp.service.IGbStreamService;
7 import com.genersoft.iot.vmp.service.IMediaServerService; 7 import com.genersoft.iot.vmp.service.IMediaServerService;
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisPushStreamStatusMsgListener.java
1 package com.genersoft.iot.vmp.service.redisMsg; 1 package com.genersoft.iot.vmp.service.redisMsg;
2 2
3 -import com.alibaba.fastjson.JSON; 3 +import com.alibaba.fastjson2.JSON;
4 import com.genersoft.iot.vmp.common.VideoManagerConstants; 4 import com.genersoft.iot.vmp.common.VideoManagerConstants;
5 import com.genersoft.iot.vmp.conf.DynamicTask; 5 import com.genersoft.iot.vmp.conf.DynamicTask;
6 import com.genersoft.iot.vmp.service.IStreamPushService; 6 import com.genersoft.iot.vmp.service.IStreamPushService;
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisStreamMsgListener.java
1 package com.genersoft.iot.vmp.service.redisMsg; 1 package com.genersoft.iot.vmp.service.redisMsg;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONObject;
5 import com.genersoft.iot.vmp.conf.UserSetting; 5 import com.genersoft.iot.vmp.conf.UserSetting;
6 6
7 import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager; 7 import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager;
8 -import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; 8 +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
9 import org.slf4j.Logger; 9 import org.slf4j.Logger;
10 import org.slf4j.LoggerFactory; 10 import org.slf4j.LoggerFactory;
11 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.beans.factory.annotation.Autowired;
@@ -66,20 +66,20 @@ public class RedisStreamMsgListener implements MessageListener { @@ -66,20 +66,20 @@ public class RedisStreamMsgListener implements MessageListener {
66 String stream = steamMsgJson.getString("stream"); 66 String stream = steamMsgJson.getString("stream");
67 boolean register = steamMsgJson.getBoolean("register"); 67 boolean register = steamMsgJson.getBoolean("register");
68 String mediaServerId = steamMsgJson.getString("mediaServerId"); 68 String mediaServerId = steamMsgJson.getString("mediaServerId");
69 - MediaItem mediaItem = new MediaItem();  
70 - mediaItem.setSeverId(serverId);  
71 - mediaItem.setApp(app);  
72 - mediaItem.setStream(stream);  
73 - mediaItem.setRegist(register);  
74 - mediaItem.setMediaServerId(mediaServerId);  
75 - mediaItem.setCreateStamp(System.currentTimeMillis()/1000);  
76 - mediaItem.setAliveSecond(0L);  
77 - mediaItem.setTotalReaderCount("0");  
78 - mediaItem.setOriginType(0);  
79 - mediaItem.setOriginTypeStr("0");  
80 - mediaItem.setOriginTypeStr("unknown"); 69 + OnStreamChangedHookParam onStreamChangedHookParam = new OnStreamChangedHookParam();
  70 + onStreamChangedHookParam.setSeverId(serverId);
  71 + onStreamChangedHookParam.setApp(app);
  72 + onStreamChangedHookParam.setStream(stream);
  73 + onStreamChangedHookParam.setRegist(register);
  74 + onStreamChangedHookParam.setMediaServerId(mediaServerId);
  75 + onStreamChangedHookParam.setCreateStamp(System.currentTimeMillis()/1000);
  76 + onStreamChangedHookParam.setAliveSecond(0L);
  77 + onStreamChangedHookParam.setTotalReaderCount("0");
  78 + onStreamChangedHookParam.setOriginType(0);
  79 + onStreamChangedHookParam.setOriginTypeStr("0");
  80 + onStreamChangedHookParam.setOriginTypeStr("unknown");
81 if (register) { 81 if (register) {
82 - zlmMediaListManager.addPush(mediaItem); 82 + zlmMediaListManager.addPush(onStreamChangedHookParam);
83 }else { 83 }else {
84 zlmMediaListManager.removeMedia(app, stream); 84 zlmMediaListManager.removeMedia(app, stream);
85 } 85 }
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
1 package com.genersoft.iot.vmp.storager; 1 package com.genersoft.iot.vmp.storager;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.common.StreamInfo; 4 import com.genersoft.iot.vmp.common.StreamInfo;
5 import com.genersoft.iot.vmp.common.SystemAllInfo; 5 import com.genersoft.iot.vmp.common.SystemAllInfo;
6 import com.genersoft.iot.vmp.gb28181.bean.*; 6 import com.genersoft.iot.vmp.gb28181.bean.*;
7 import com.genersoft.iot.vmp.media.zlm.dto.*; 7 import com.genersoft.iot.vmp.media.zlm.dto.*;
  8 +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
8 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; 9 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
9 import com.genersoft.iot.vmp.service.bean.MessageForPushChannel; 10 import com.genersoft.iot.vmp.service.bean.MessageForPushChannel;
10 -import com.genersoft.iot.vmp.service.bean.SSRCInfo;  
11 import com.genersoft.iot.vmp.service.bean.ThirdPartyGB; 11 import com.genersoft.iot.vmp.service.bean.ThirdPartyGB;
12 import com.genersoft.iot.vmp.storager.dao.dto.PlatformRegisterInfo; 12 import com.genersoft.iot.vmp.storager.dao.dto.PlatformRegisterInfo;
13 13
@@ -131,7 +131,7 @@ public interface IRedisCatchStorage { @@ -131,7 +131,7 @@ public interface IRedisCatchStorage {
131 * @param app 131 * @param app
132 * @param streamId 132 * @param streamId
133 */ 133 */
134 - void addStream(MediaServerItem mediaServerItem, String type, String app, String streamId, MediaItem item); 134 + void addStream(MediaServerItem mediaServerItem, String type, String app, String streamId, OnStreamChangedHookParam item);
135 135
136 /** 136 /**
137 * 移除流信息从redis 137 * 移除流信息从redis
@@ -165,7 +165,7 @@ public interface IRedisCatchStorage { @@ -165,7 +165,7 @@ public interface IRedisCatchStorage {
165 */ 165 */
166 ThirdPartyGB queryMemberNoGBId(String queryKey); 166 ThirdPartyGB queryMemberNoGBId(String queryKey);
167 167
168 - List<MediaItem> getStreams(String mediaServerId, String pull); 168 + List<OnStreamChangedHookParam> getStreams(String mediaServerId, String pull);
169 169
170 /** 170 /**
171 * 将device信息写入redis 171 * 将device信息写入redis
@@ -191,7 +191,7 @@ public interface IRedisCatchStorage { @@ -191,7 +191,7 @@ public interface IRedisCatchStorage {
191 191
192 void resetAllSN(); 192 void resetAllSN();
193 193
194 - MediaItem getStreamInfo(String app, String streamId, String mediaServerId); 194 + OnStreamChangedHookParam getStreamInfo(String app, String streamId, String mediaServerId);
195 195
196 void addCpuInfo(double cpuInfo); 196 void addCpuInfo(double cpuInfo);
197 197
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
1 package com.genersoft.iot.vmp.storager.impl; 1 package com.genersoft.iot.vmp.storager.impl;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONObject;
5 import com.genersoft.iot.vmp.common.StreamInfo; 5 import com.genersoft.iot.vmp.common.StreamInfo;
6 import com.genersoft.iot.vmp.common.SystemAllInfo; 6 import com.genersoft.iot.vmp.common.SystemAllInfo;
7 import com.genersoft.iot.vmp.common.VideoManagerConstants; 7 import com.genersoft.iot.vmp.common.VideoManagerConstants;
8 import com.genersoft.iot.vmp.conf.UserSetting; 8 import com.genersoft.iot.vmp.conf.UserSetting;
9 import com.genersoft.iot.vmp.gb28181.bean.*; 9 import com.genersoft.iot.vmp.gb28181.bean.*;
10 -import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; 10 +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
11 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 11 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
12 import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; 12 import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo;
13 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; 13 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
@@ -573,14 +573,14 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @@ -573,14 +573,14 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
573 } 573 }
574 574
575 @Override 575 @Override
576 - public void addStream(MediaServerItem mediaServerItem, String type, String app, String streamId, MediaItem mediaItem) { 576 + public void addStream(MediaServerItem mediaServerItem, String type, String app, String streamId, OnStreamChangedHookParam onStreamChangedHookParam) {
577 // 查找是否使用了callID 577 // 查找是否使用了callID
578 StreamAuthorityInfo streamAuthorityInfo = getStreamAuthorityInfo(app, streamId); 578 StreamAuthorityInfo streamAuthorityInfo = getStreamAuthorityInfo(app, streamId);
579 String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_" + type + "_" + app + "_" + streamId + "_" + mediaServerItem.getId(); 579 String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_" + type + "_" + app + "_" + streamId + "_" + mediaServerItem.getId();
580 if (streamAuthorityInfo != null) { 580 if (streamAuthorityInfo != null) {
581 - mediaItem.setCallId(streamAuthorityInfo.getCallId()); 581 + onStreamChangedHookParam.setCallId(streamAuthorityInfo.getCallId());
582 } 582 }
583 - RedisUtil.set(key, mediaItem); 583 + RedisUtil.set(key, onStreamChangedHookParam);
584 } 584 }
585 585
586 @Override 586 @Override
@@ -625,7 +625,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @@ -625,7 +625,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
625 public ThirdPartyGB queryMemberNoGBId(String queryKey) { 625 public ThirdPartyGB queryMemberNoGBId(String queryKey) {
626 String key = VideoManagerConstants.WVP_STREAM_GB_ID_PREFIX + queryKey; 626 String key = VideoManagerConstants.WVP_STREAM_GB_ID_PREFIX + queryKey;
627 JSONObject jsonObject = (JSONObject)RedisUtil.get(key); 627 JSONObject jsonObject = (JSONObject)RedisUtil.get(key);
628 - return JSONObject.toJavaObject(jsonObject, ThirdPartyGB.class); 628 + return jsonObject.to(ThirdPartyGB.class);
629 } 629 }
630 630
631 @Override 631 @Override
@@ -638,13 +638,13 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @@ -638,13 +638,13 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
638 } 638 }
639 639
640 @Override 640 @Override
641 - public List<MediaItem> getStreams(String mediaServerId, String type) {  
642 - List<MediaItem> result = new ArrayList<>(); 641 + public List<OnStreamChangedHookParam> getStreams(String mediaServerId, String type) {
  642 + List<OnStreamChangedHookParam> result = new ArrayList<>();
643 String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_" + type + "_*_*_" + mediaServerId; 643 String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_" + type + "_*_*_" + mediaServerId;
644 List<Object> streams = RedisUtil.scan(key); 644 List<Object> streams = RedisUtil.scan(key);
645 for (Object stream : streams) { 645 for (Object stream : streams) {
646 - MediaItem mediaItem = (MediaItem)RedisUtil.get((String) stream);  
647 - result.add(mediaItem); 646 + OnStreamChangedHookParam onStreamChangedHookParam = (OnStreamChangedHookParam)RedisUtil.get((String) stream);
  647 + result.add(onStreamChangedHookParam);
648 } 648 }
649 return result; 649 return result;
650 } 650 }
@@ -716,14 +716,14 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @@ -716,14 +716,14 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
716 716
717 717
718 @Override 718 @Override
719 - public MediaItem getStreamInfo(String app, String streamId, String mediaServerId) { 719 + public OnStreamChangedHookParam getStreamInfo(String app, String streamId, String mediaServerId) {
720 String scanKey = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_*_" + app + "_" + streamId + "_" + mediaServerId; 720 String scanKey = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_*_" + app + "_" + streamId + "_" + mediaServerId;
721 721
722 - MediaItem result = null; 722 + OnStreamChangedHookParam result = null;
723 List<Object> keys = RedisUtil.scan(scanKey); 723 List<Object> keys = RedisUtil.scan(scanKey);
724 if (keys.size() > 0) { 724 if (keys.size() > 0) {
725 String key = (String) keys.get(0); 725 String key = (String) keys.get(0);
726 - result = (MediaItem)RedisUtil.get(key); 726 + result = (OnStreamChangedHookParam)RedisUtil.get(key);
727 } 727 }
728 728
729 return result; 729 return result;
src/main/java/com/genersoft/iot/vmp/utils/SystemInfoUtils.java
1 package com.genersoft.iot.vmp.utils; 1 package com.genersoft.iot.vmp.utils;
2 2
  3 +import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener;
  4 +import org.slf4j.Logger;
  5 +import org.slf4j.LoggerFactory;
3 import org.springframework.util.ObjectUtils; 6 import org.springframework.util.ObjectUtils;
4 import oshi.SystemInfo; 7 import oshi.SystemInfo;
5 import oshi.hardware.*; 8 import oshi.hardware.*;
@@ -21,6 +24,8 @@ import java.util.concurrent.TimeUnit; @@ -21,6 +24,8 @@ import java.util.concurrent.TimeUnit;
21 */ 24 */
22 public class SystemInfoUtils { 25 public class SystemInfoUtils {
23 26
  27 + private final static Logger logger = LoggerFactory.getLogger(SystemInfoUtils.class);
  28 +
24 /** 29 /**
25 * 获取cpu信息 30 * 获取cpu信息
26 * @return 31 * @return
@@ -73,7 +78,7 @@ public class SystemInfoUtils { @@ -73,7 +78,7 @@ public class SystemInfoUtils {
73 try { 78 try {
74 Thread.sleep(1000); 79 Thread.sleep(1000);
75 } catch (InterruptedException e) { 80 } catch (InterruptedException e) {
76 - throw new RuntimeException(e); 81 + logger.error("[线程休眠失败] : {}", e.getMessage());
77 } 82 }
78 List<NetworkIF> afterNetworkIFs = hal.getNetworkIFs(); 83 List<NetworkIF> afterNetworkIFs = hal.getNetworkIFs();
79 NetworkIF afterNet = afterNetworkIFs.get(afterNetworkIFs.size() - 1); 84 NetworkIF afterNet = afterNetworkIFs.get(afterNetworkIFs.size() - 1);
src/main/java/com/genersoft/iot/vmp/utils/redis/FastJsonRedisSerializer.java
@@ -2,11 +2,13 @@ package com.genersoft.iot.vmp.utils.redis; @@ -2,11 +2,13 @@ package com.genersoft.iot.vmp.utils.redis;
2 2
3 import java.nio.charset.Charset; 3 import java.nio.charset.Charset;
4 4
  5 +import com.alibaba.fastjson2.JSONReader;
  6 +import com.alibaba.fastjson2.JSONWriter;
5 import org.springframework.data.redis.serializer.RedisSerializer; 7 import org.springframework.data.redis.serializer.RedisSerializer;
6 import org.springframework.data.redis.serializer.SerializationException; 8 import org.springframework.data.redis.serializer.SerializationException;
7 9
8 -import com.alibaba.fastjson.JSON;  
9 -import com.alibaba.fastjson.serializer.SerializerFeature; 10 +import com.alibaba.fastjson2.JSON;
  11 +import com.alibaba.fastjson2.JSONWriter.Feature;
10 12
11 /** 13 /**
12 * @description:使用fastjson实现redis的序列化 14 * @description:使用fastjson实现redis的序列化
@@ -29,7 +31,7 @@ public class FastJsonRedisSerializer&lt;T&gt; implements RedisSerializer&lt;T&gt; { @@ -29,7 +31,7 @@ public class FastJsonRedisSerializer&lt;T&gt; implements RedisSerializer&lt;T&gt; {
29 if (t == null) { 31 if (t == null) {
30 return new byte[0]; 32 return new byte[0];
31 } 33 }
32 - return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); 34 + return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET);
33 } 35 }
34 36
35 @Override 37 @Override
@@ -38,6 +40,6 @@ public class FastJsonRedisSerializer&lt;T&gt; implements RedisSerializer&lt;T&gt; { @@ -38,6 +40,6 @@ public class FastJsonRedisSerializer&lt;T&gt; implements RedisSerializer&lt;T&gt; {
38 return null; 40 return null;
39 } 41 }
40 String str = new String(bytes, DEFAULT_CHARSET); 42 String str = new String(bytes, DEFAULT_CHARSET);
41 - return (T) JSON.parseObject(str, clazz); 43 + return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType);
42 } 44 }
43 } 45 }
src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java
@@ -3,7 +3,7 @@ package com.genersoft.iot.vmp.utils.redis; @@ -3,7 +3,7 @@ package com.genersoft.iot.vmp.utils.redis;
3 import java.util.*; 3 import java.util.*;
4 import java.util.concurrent.TimeUnit; 4 import java.util.concurrent.TimeUnit;
5 5
6 -import com.alibaba.fastjson.JSONObject; 6 +import com.alibaba.fastjson2.JSONObject;
7 import com.genersoft.iot.vmp.utils.SpringBeanFactory; 7 import com.genersoft.iot.vmp.utils.SpringBeanFactory;
8 import gov.nist.javax.sip.stack.UDPMessageChannel; 8 import gov.nist.javax.sip.stack.UDPMessageChannel;
9 import org.springframework.data.redis.core.*; 9 import org.springframework.data.redis.core.*;
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 7
8 package com.genersoft.iot.vmp.vmanager.gb28181.device; 8 package com.genersoft.iot.vmp.vmanager.gb28181.device;
9 9
10 -import com.alibaba.fastjson.JSONObject; 10 +import com.alibaba.fastjson2.JSONObject;
11 import com.genersoft.iot.vmp.conf.exception.ControllerException; 11 import com.genersoft.iot.vmp.conf.exception.ControllerException;
12 import com.genersoft.iot.vmp.gb28181.bean.Device; 12 import com.genersoft.iot.vmp.gb28181.bean.Device;
13 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; 13 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 7
8 package com.genersoft.iot.vmp.vmanager.gb28181.device; 8 package com.genersoft.iot.vmp.vmanager.gb28181.device;
9 9
10 -import com.alibaba.fastjson.JSONObject; 10 +import com.alibaba.fastjson2.JSONObject;
11 import com.genersoft.iot.vmp.conf.exception.ControllerException; 11 import com.genersoft.iot.vmp.conf.exception.ControllerException;
12 import com.genersoft.iot.vmp.gb28181.bean.Device; 12 import com.genersoft.iot.vmp.gb28181.bean.Device;
13 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; 13 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
1 package com.genersoft.iot.vmp.vmanager.gb28181.device; 1 package com.genersoft.iot.vmp.vmanager.gb28181.device;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.conf.DynamicTask; 4 import com.genersoft.iot.vmp.conf.DynamicTask;
5 import com.genersoft.iot.vmp.conf.exception.ControllerException; 5 import com.genersoft.iot.vmp.conf.exception.ControllerException;
6 import com.genersoft.iot.vmp.gb28181.bean.Device; 6 import com.genersoft.iot.vmp.gb28181.bean.Device;
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java
1 package com.genersoft.iot.vmp.vmanager.gb28181.platform; 1 package com.genersoft.iot.vmp.vmanager.gb28181.platform;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONObject;
5 import com.genersoft.iot.vmp.common.VideoManagerConstants; 5 import com.genersoft.iot.vmp.common.VideoManagerConstants;
6 import com.genersoft.iot.vmp.conf.DynamicTask; 6 import com.genersoft.iot.vmp.conf.DynamicTask;
7 import com.genersoft.iot.vmp.conf.UserSetting; 7 import com.genersoft.iot.vmp.conf.UserSetting;
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
1 package com.genersoft.iot.vmp.vmanager.gb28181.play; 1 package com.genersoft.iot.vmp.vmanager.gb28181.play;
2 2
3 -import com.alibaba.fastjson.JSONArray; 3 +import com.alibaba.fastjson2.JSONArray;
4 import com.genersoft.iot.vmp.common.StreamInfo; 4 import com.genersoft.iot.vmp.common.StreamInfo;
5 import com.genersoft.iot.vmp.conf.UserSetting; 5 import com.genersoft.iot.vmp.conf.UserSetting;
6 import com.genersoft.iot.vmp.conf.exception.ControllerException; 6 import com.genersoft.iot.vmp.conf.exception.ControllerException;
@@ -33,7 +33,7 @@ import org.springframework.web.bind.annotation.PostMapping; @@ -33,7 +33,7 @@ import org.springframework.web.bind.annotation.PostMapping;
33 import org.springframework.web.bind.annotation.RequestMapping; 33 import org.springframework.web.bind.annotation.RequestMapping;
34 import org.springframework.web.bind.annotation.RestController; 34 import org.springframework.web.bind.annotation.RestController;
35 35
36 -import com.alibaba.fastjson.JSONObject; 36 +import com.alibaba.fastjson2.JSONObject;
37 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; 37 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
38 import com.genersoft.iot.vmp.storager.IVideoManagerStorage; 38 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
39 import org.springframework.web.context.request.async.DeferredResult; 39 import org.springframework.web.context.request.async.DeferredResult;
src/main/java/com/genersoft/iot/vmp/vmanager/record/RecordController.java
1 //package com.genersoft.iot.vmp.vmanager.record; 1 //package com.genersoft.iot.vmp.vmanager.record;
2 // 2 //
3 -//import com.alibaba.fastjson.JSONObject; 3 +//import com.alibaba.fastjson2.JSONObject;
4 //import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; 4 //import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
5 //import com.genersoft.iot.vmp.service.IRecordInfoServer; 5 //import com.genersoft.iot.vmp.service.IRecordInfoServer;
6 //import com.genersoft.iot.vmp.storager.dao.dto.RecordInfo; 6 //import com.genersoft.iot.vmp.storager.dao.dto.RecordInfo;
src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java
1 package com.genersoft.iot.vmp.vmanager.server; 1 package com.genersoft.iot.vmp.vmanager.server;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONObject;
5 import com.genersoft.iot.vmp.VManageBootstrap; 5 import com.genersoft.iot.vmp.VManageBootstrap;
6 import com.genersoft.iot.vmp.common.SystemAllInfo; 6 import com.genersoft.iot.vmp.common.SystemAllInfo;
7 import com.genersoft.iot.vmp.common.VersionPo; 7 import com.genersoft.iot.vmp.common.VersionPo;
src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java
1 package com.genersoft.iot.vmp.vmanager.streamProxy; 1 package com.genersoft.iot.vmp.vmanager.streamProxy;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.common.StreamInfo; 4 import com.genersoft.iot.vmp.common.StreamInfo;
5 import com.genersoft.iot.vmp.conf.exception.ControllerException; 5 import com.genersoft.iot.vmp.conf.exception.ControllerException;
6 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 6 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java
1 package com.genersoft.iot.vmp.web.gb28181; 1 package com.genersoft.iot.vmp.web.gb28181;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.conf.exception.ControllerException; 4 import com.genersoft.iot.vmp.conf.exception.ControllerException;
5 import com.genersoft.iot.vmp.gb28181.bean.Device; 5 import com.genersoft.iot.vmp.gb28181.bean.Device;
6 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; 6 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiController.java
1 package com.genersoft.iot.vmp.web.gb28181; 1 package com.genersoft.iot.vmp.web.gb28181;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.conf.SipConfig; 4 import com.genersoft.iot.vmp.conf.SipConfig;
5 import org.slf4j.Logger; 5 import org.slf4j.Logger;
6 import org.slf4j.LoggerFactory; 6 import org.slf4j.LoggerFactory;
src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java
1 package com.genersoft.iot.vmp.web.gb28181; 1 package com.genersoft.iot.vmp.web.gb28181;
2 2
3 -import com.alibaba.fastjson.JSONArray;  
4 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONArray;
  4 +import com.alibaba.fastjson2.JSONObject;
5 import com.genersoft.iot.vmp.gb28181.bean.Device; 5 import com.genersoft.iot.vmp.gb28181.bean.Device;
6 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; 6 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
7 import com.genersoft.iot.vmp.service.IDeviceService; 7 import com.genersoft.iot.vmp.service.IDeviceService;
src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
1 package com.genersoft.iot.vmp.web.gb28181; 1 package com.genersoft.iot.vmp.web.gb28181;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.common.StreamInfo; 4 import com.genersoft.iot.vmp.common.StreamInfo;
5 import com.genersoft.iot.vmp.conf.UserSetting; 5 import com.genersoft.iot.vmp.conf.UserSetting;
6 import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; 6 import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
src/main/resources/all-application.yml
@@ -192,6 +192,8 @@ user-settings: @@ -192,6 +192,8 @@ user-settings:
192 use-source-ip-as-stream-ip: true 192 use-source-ip-as-stream-ip: true
193 # 按需拉流, true:有人观看拉流,无人观看释放, false:拉起后不自动释放 193 # 按需拉流, true:有人观看拉流,无人观看释放, false:拉起后不自动释放
194 stream-on-demand: true 194 stream-on-demand: true
  195 + # 推流鉴权, 默认开启
  196 + push-authority: true
195 197
196 # 关闭在线文档(生产环境建议关闭) 198 # 关闭在线文档(生产环境建议关闭)
197 springdoc: 199 springdoc:
web_src/src/components/console/ConsoleResource.vue
1 <template > 1 <template >
2 <div id="consoleResource" style="width: 100%; height: 100%; background: #FFFFFF; text-align: center"> 2 <div id="consoleResource" style="width: 100%; height: 100%; background: #FFFFFF; text-align: center">
3 <div style="width: 50%;height: 50%; float:left; "> 3 <div style="width: 50%;height: 50%; float:left; ">
4 - <el-progress :width="100" :stroke-width="8" type="circle" :percentage="deviceInfo.online/deviceInfo.total*100" style="margin-top: 20px; font-size: 18px"></el-progress> 4 + <el-progress :width="100" :stroke-width="8" type="circle" :percentage="Math.floor(deviceInfo.online/deviceInfo.total*100)" style="margin-top: 20px; font-size: 18px"></el-progress>
5 <div class="resourceInfo"> 5 <div class="resourceInfo">
6 设备总数:{{deviceInfo.total}}<br/> 6 设备总数:{{deviceInfo.total}}<br/>
7 在线数:{{deviceInfo.online}} 7 在线数:{{deviceInfo.online}}
8 </div> 8 </div>
9 </div> 9 </div>
10 <div style="width: 50%;height: 50%; float:left; "> 10 <div style="width: 50%;height: 50%; float:left; ">
11 - <el-progress :width="100" :stroke-width="10" type="circle" :percentage="channelInfo.online/channelInfo.total*100" style="margin-top: 20px"></el-progress> 11 + <el-progress :width="100" :stroke-width="10" type="circle" :percentage="Math.floor(channelInfo.online/channelInfo.total*100)" style="margin-top: 20px"></el-progress>
12 <div class="resourceInfo"> 12 <div class="resourceInfo">
13 通道总数:{{channelInfo.total}}<br/> 13 通道总数:{{channelInfo.total}}<br/>
14 在线数:{{channelInfo.online}} 14 在线数:{{channelInfo.online}}
15 </div> 15 </div>
16 </div> 16 </div>
17 <div style="width: 50%;height: 50%; float:left; "> 17 <div style="width: 50%;height: 50%; float:left; ">
18 - <el-progress :width="100" :stroke-width="10" type="circle" :percentage="pushInfo.online/pushInfo.total*100" style="margin-top: 20px"></el-progress> 18 + <el-progress :width="100" :stroke-width="10" type="circle" :percentage="Math.floor(pushInfo.online/pushInfo.total*100)" style="margin-top: 20px"></el-progress>
19 <div class="resourceInfo"> 19 <div class="resourceInfo">
20 推流总数:{{pushInfo.total}}<br/> 20 推流总数:{{pushInfo.total}}<br/>
21 在线数:{{pushInfo.online}} 21 在线数:{{pushInfo.online}}
22 </div> 22 </div>
23 </div> 23 </div>
24 <div style="width: 50%;height: 50%; float:left; "> 24 <div style="width: 50%;height: 50%; float:left; ">
25 - <el-progress :width="100" :stroke-width="10" type="circle" :percentage="proxyInfo.online/proxyInfo.total*100" style="margin-top: 20px"></el-progress> 25 + <el-progress :width="100" :stroke-width="10" type="circle" :percentage="Math.floor(proxyInfo.online/proxyInfo.total*100)" style="margin-top: 20px"></el-progress>
26 <div class="resourceInfo"> 26 <div class="resourceInfo">
27 拉流代理总数:{{proxyInfo.total}}<br/> 27 拉流代理总数:{{proxyInfo.total}}<br/>
28 在线数:{{proxyInfo.online}} 28 在线数:{{proxyInfo.online}}
web_src/src/components/dialog/devicePlayer.vue
@@ -121,6 +121,10 @@ @@ -121,6 +121,10 @@
121 <el-tag >RTC:</el-tag> 121 <el-tag >RTC:</el-tag>
122 <span>{{ streamInfo.rtc.url }}</span> 122 <span>{{ streamInfo.rtc.url }}</span>
123 </el-dropdown-item> 123 </el-dropdown-item>
  124 + <el-dropdown-item :command="streamInfo.rtcs.url">
  125 + <el-tag >RTCS:</el-tag>
  126 + <span>{{ streamInfo.rtcs }}</span>
  127 + </el-dropdown-item>
124 <el-dropdown-item :command="streamInfo.rtmp.url"> 128 <el-dropdown-item :command="streamInfo.rtmp.url">
125 <el-tag >RTMP:</el-tag> 129 <el-tag >RTMP:</el-tag>
126 <span>{{ streamInfo.rtmp.url }}</span> 130 <span>{{ streamInfo.rtmp.url }}</span>
@@ -322,7 +326,7 @@ export default { @@ -322,7 +326,7 @@ export default {
322 player: { 326 player: {
323 jessibuca : ["ws_flv", "wss_flv"], 327 jessibuca : ["ws_flv", "wss_flv"],
324 livePlayer : ["ws_flv", "wss_flv"], 328 livePlayer : ["ws_flv", "wss_flv"],
325 - webRTC: ["rtc", "rtc"], 329 + webRTC: ["rtc", "rtcs"],
326 }, 330 },
327 videoHistory: { 331 videoHistory: {
328 date: '', 332 date: '',
@@ -393,7 +397,7 @@ export default { @@ -393,7 +397,7 @@ export default {
393 changePlayer: function (tab) { 397 changePlayer: function (tab) {
394 console.log(this.player[tab.name][0]) 398 console.log(this.player[tab.name][0])
395 this.activePlayer = tab.name; 399 this.activePlayer = tab.name;
396 - this.videoUrl = this.streamInfo[this.player[tab.name][0]].url 400 + this.videoUrl = this.getUrlByStreamInfo()
397 console.log(this.videoUrl) 401 console.log(this.videoUrl)
398 }, 402 },
399 openDialog: function (tab, deviceId, channelId, param) { 403 openDialog: function (tab, deviceId, channelId, param) {
web_src/src/components/dialog/rtcPlayer.vue
@@ -51,7 +51,7 @@ export default { @@ -51,7 +51,7 @@ export default {
51 }); 51 });
52 52
53 webrtcPlayer.on(ZLMRTCClient.Events.WEBRTC_ON_REMOTE_STREAMS,(e)=>{//获取到了远端流,可以播放 53 webrtcPlayer.on(ZLMRTCClient.Events.WEBRTC_ON_REMOTE_STREAMS,(e)=>{//获取到了远端流,可以播放
54 - console.error('播放成功',e.streams) 54 + console.log('播放成功',e.streams)
55 this.eventcallbacK("playing", "播放成功") 55 this.eventcallbacK("playing", "播放成功")
56 }); 56 });
57 57
@@ -59,7 +59,7 @@ export default { @@ -59,7 +59,7 @@ export default {
59 console.error('offer anwser 交换失败',e) 59 console.error('offer anwser 交换失败',e)
60 this.eventcallbacK("OFFER ANSWER ERROR ", "offer anwser 交换失败") 60 this.eventcallbacK("OFFER ANSWER ERROR ", "offer anwser 交换失败")
61 if (e.code ==-400 && e.msg=="流不存在"){ 61 if (e.code ==-400 && e.msg=="流不存在"){
62 - console.log("111111") 62 + console.log("流不存在")
63 this.timer = setTimeout(()=>{ 63 this.timer = setTimeout(()=>{
64 this.webrtcPlayer.close(); 64 this.webrtcPlayer.close();
65 this.play(url) 65 this.play(url)
web_src/src/components/live.vue
@@ -138,8 +138,14 @@ export default { @@ -138,8 +138,14 @@ export default {
138 url: '/api/play/start/' + deviceId + '/' + channelId 138 url: '/api/play/start/' + deviceId + '/' + channelId
139 }).then(function (res) { 139 }).then(function (res) {
140 if (res.data.code === 0 && res.data.data) { 140 if (res.data.code === 0 && res.data.data) {
141 - itemData.playUrl = res.data.data.https_flv.url  
142 - that.setPlayUrl(res.data.data.ws_flv.url, idxTmp) 141 + let videoUrl;
  142 + if (location.protocol === "https:") {
  143 + videoUrl = res.data.data.wss_flv.url;
  144 + } else {
  145 + videoUrl = res.data.data.ws_flv.url;
  146 + }
  147 + itemData.playUrl = videoUrl;
  148 + that.setPlayUrl(videoUrl, idxTmp);
143 } else { 149 } else {
144 that.$message.error(res.data.msg); 150 that.$message.error(res.data.msg);
145 } 151 }