Commit 2a1f979651340fbf9b530ab2d2f9e5857cbeeb1a

Authored by 648540858
1 parent a1398a56

简化zlm节点接入逻辑

src/main/java/com/genersoft/iot/vmp/conf/MediaStatusTimerTask.java 0 → 100644
  1 +package com.genersoft.iot.vmp.conf;
  2 +
  3 +import com.alibaba.fastjson.JSONObject;
  4 +import org.springframework.scheduling.annotation.Scheduled;
  5 +
  6 +/**
  7 + * 定时向zlm同步媒体流状态
  8 + */
  9 +public class MediaStatusTimerTask {
  10 +
  11 +
  12 + @Scheduled(fixedRate = 2 * 1000) //每3秒执行一次
  13 + public void execute(){
  14 +
  15 + }
  16 +}
src/main/java/com/genersoft/iot/vmp/conf/ProxyServletConfig.java
@@ -18,6 +18,7 @@ import org.springframework.util.StringUtils; @@ -18,6 +18,7 @@ import org.springframework.util.StringUtils;
18 18
19 import javax.servlet.ServletException; 19 import javax.servlet.ServletException;
20 import javax.servlet.http.HttpServletRequest; 20 import javax.servlet.http.HttpServletRequest;
  21 +import javax.servlet.http.HttpServletResponse;
21 import java.io.IOException; 22 import java.io.IOException;
22 import java.net.ConnectException; 23 import java.net.ConnectException;
23 24
@@ -126,7 +127,11 @@ public class ProxyServletConfig { @@ -126,7 +127,11 @@ public class ProxyServletConfig {
126 MediaServerItem getMediaInfoByUri(String uri){ 127 MediaServerItem getMediaInfoByUri(String uri){
127 String[] split = uri.split("/"); 128 String[] split = uri.split("/");
128 String mediaServerId = split[2]; 129 String mediaServerId = split[2];
129 - return mediaServerService.getOne(mediaServerId); 130 + if ("default".equals(mediaServerId)) {
  131 + return mediaServerService.getDefaultMediaServer();
  132 + }else {
  133 + return mediaServerService.getOne(mediaServerId);
  134 + }
130 } 135 }
131 136
132 /** 137 /**
@@ -140,13 +145,13 @@ public class ProxyServletConfig { @@ -140,13 +145,13 @@ public class ProxyServletConfig {
140 if (mediaInfo == null) { 145 if (mediaInfo == null) {
141 return url; 146 return url;
142 } 147 }
143 - return url.replace(mediaInfo.getId() + "/", ""); 148 + return url.replace(mediaInfo.getId() + "/", "").replace("default/", "");
144 } 149 }
145 } 150 }
146 151
147 @Bean 152 @Bean
148 public ServletRegistrationBean recordServletRegistrationBean(){ 153 public ServletRegistrationBean recordServletRegistrationBean(){
149 - ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new RecordProxySerlet(),"/record_proxy/*"); 154 + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new RecordProxyServlet(),"/record_proxy/*");
150 servletRegistrationBean.setName("record_proxy"); 155 servletRegistrationBean.setName("record_proxy");
151 servletRegistrationBean.addInitParameter("targetUri", "http://127.0.0.1:18081"); 156 servletRegistrationBean.addInitParameter("targetUri", "http://127.0.0.1:18081");
152 servletRegistrationBean.addUrlMappings(); 157 servletRegistrationBean.addUrlMappings();
@@ -156,8 +161,22 @@ public class ProxyServletConfig { @@ -156,8 +161,22 @@ public class ProxyServletConfig {
156 return servletRegistrationBean; 161 return servletRegistrationBean;
157 } 162 }
158 163
159 - class RecordProxySerlet extends ProxyServlet{ 164 + class RecordProxyServlet extends ProxyServlet{
160 165
  166 + @Override
  167 + protected String rewriteQueryStringFromRequest(HttpServletRequest servletRequest, String queryString) {
  168 + String queryStr = super.rewriteQueryStringFromRequest(servletRequest, queryString);
  169 + MediaServerItem mediaInfo = getMediaInfoByUri(servletRequest.getRequestURI());
  170 + String remoteHost = String.format("http://%s:%s", mediaInfo.getIp(), mediaInfo.getHttpPort());
  171 + if (mediaInfo != null) {
  172 + if (!StringUtils.isEmpty(queryStr)) {
  173 + queryStr += "&remoteHost=" + remoteHost;
  174 + }else {
  175 + queryStr = "remoteHost=" + remoteHost;
  176 + }
  177 + }
  178 + return queryStr;
  179 + }
161 180
162 /** 181 /**
163 * 异常处理 182 * 异常处理
@@ -222,7 +241,12 @@ public class ProxyServletConfig { @@ -222,7 +241,12 @@ public class ProxyServletConfig {
222 MediaServerItem getMediaInfoByUri(String uri){ 241 MediaServerItem getMediaInfoByUri(String uri){
223 String[] split = uri.split("/"); 242 String[] split = uri.split("/");
224 String mediaServerId = split[2]; 243 String mediaServerId = split[2];
225 - return mediaServerService.getOne(mediaServerId); 244 + if ("default".equals(mediaServerId)) {
  245 + return mediaServerService.getDefaultMediaServer();
  246 + }else {
  247 + return mediaServerService.getOne(mediaServerId);
  248 + }
  249 +
226 } 250 }
227 251
228 /** 252 /**
@@ -236,7 +260,7 @@ public class ProxyServletConfig { @@ -236,7 +260,7 @@ public class ProxyServletConfig {
236 if (mediaInfo == null) { 260 if (mediaInfo == null) {
237 return url; 261 return url;
238 } 262 }
239 - return url.replace(mediaInfo.getId() + "/", ""); 263 + return url.replace(mediaInfo.getId() + "/", "").replace("default/", "");
240 } 264 }
241 } 265 }
242 266
src/main/java/com/genersoft/iot/vmp/conf/ThreadPoolTaskConfig.java
@@ -38,7 +38,7 @@ public class ThreadPoolTaskConfig { @@ -38,7 +38,7 @@ public class ThreadPoolTaskConfig {
38 /** 38 /**
39 * 线程池名前缀 39 * 线程池名前缀
40 */ 40 */
41 - private static final String threadNamePrefix = "wvp-sip-handle-"; 41 + private static final String threadNamePrefix = "wvp-sip-";
42 42
43 @Bean("taskExecutor") // bean的名称,默认为首字母小写的方法名 43 @Bean("taskExecutor") // bean的名称,默认为首字母小写的方法名
44 public ThreadPoolTaskExecutor taskExecutor() { 44 public ThreadPoolTaskExecutor taskExecutor() {
src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java renamed to src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java
1 -package com.genersoft.iot.vmp.conf; 1 +package com.genersoft.iot.vmp.conf.runner;
2 2
3 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 3 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
4 import com.genersoft.iot.vmp.storager.IVideoManagerStorager; 4 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
@@ -70,6 +70,7 @@ public class SipLayer{ @@ -70,6 +70,7 @@ public class SipLayer{
70 try { 70 try {
71 tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getMonitorIp(), sipConfig.getPort(), "TCP"); 71 tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getMonitorIp(), sipConfig.getPort(), "TCP");
72 tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint); 72 tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint);
  73 + tcpSipProvider.setDialogErrorsAutomaticallyHandled();
73 tcpSipProvider.addSipListener(sipProcessorObserver); 74 tcpSipProvider.addSipListener(sipProcessorObserver);
74 logger.info("Sip Server TCP 启动成功 port {" + sipConfig.getMonitorIp() + ":" + sipConfig.getPort() + "}"); 75 logger.info("Sip Server TCP 启动成功 port {" + sipConfig.getMonitorIp() + ":" + sipConfig.getPort() + "}");
75 } catch (TransportNotSupportedException e) { 76 } catch (TransportNotSupportedException e) {
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java
@@ -4,12 +4,11 @@ import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; @@ -4,12 +4,11 @@ import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
4 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; 4 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
5 import com.genersoft.iot.vmp.gb28181.transmit.event.response.ISIPResponseProcessor; 5 import com.genersoft.iot.vmp.gb28181.transmit.event.response.ISIPResponseProcessor;
6 import com.genersoft.iot.vmp.gb28181.transmit.event.timeout.ITimeoutProcessor; 6 import com.genersoft.iot.vmp.gb28181.transmit.event.timeout.ITimeoutProcessor;
  7 +import gov.nist.javax.sip.message.SIPRequest;
7 import org.slf4j.Logger; 8 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory; 9 import org.slf4j.LoggerFactory;
9 import org.springframework.beans.factory.annotation.Autowired; 10 import org.springframework.beans.factory.annotation.Autowired;
10 -import org.springframework.beans.factory.annotation.Qualifier;  
11 import org.springframework.scheduling.annotation.Async; 11 import org.springframework.scheduling.annotation.Async;
12 -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;  
13 import org.springframework.stereotype.Component; 12 import org.springframework.stereotype.Component;
14 13
15 import javax.sip.*; 14 import javax.sip.*;
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.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.alibaba.fastjson.JSON; 3 import com.alibaba.fastjson.JSON;
4 import com.alibaba.fastjson.JSONArray; 4 import com.alibaba.fastjson.JSONArray;
5 import com.alibaba.fastjson.JSONObject; 5 import com.alibaba.fastjson.JSONObject;
  6 +import com.genersoft.iot.vmp.common.VideoManagerConstants;
6 import com.genersoft.iot.vmp.conf.MediaConfig; 7 import com.genersoft.iot.vmp.conf.MediaConfig;
7 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 8 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
8 import com.genersoft.iot.vmp.service.IMediaServerService; 9 import com.genersoft.iot.vmp.service.IMediaServerService;
@@ -12,6 +13,7 @@ import org.slf4j.LoggerFactory; @@ -12,6 +13,7 @@ import org.slf4j.LoggerFactory;
12 import org.springframework.beans.factory.annotation.Autowired; 13 import org.springframework.beans.factory.annotation.Autowired;
13 import org.springframework.boot.CommandLineRunner; 14 import org.springframework.boot.CommandLineRunner;
14 import org.springframework.core.annotation.Order; 15 import org.springframework.core.annotation.Order;
  16 +import org.springframework.scheduling.annotation.Async;
15 import org.springframework.stereotype.Component; 17 import org.springframework.stereotype.Component;
16 18
17 import java.util.*; 19 import java.util.*;
@@ -41,22 +43,9 @@ public class ZLMRunner implements CommandLineRunner { @@ -41,22 +43,9 @@ public class ZLMRunner implements CommandLineRunner {
41 43
42 @Override 44 @Override
43 public void run(String... strings) throws Exception { 45 public void run(String... strings) throws Exception {
44 - // 清楚redis缓存的在线zlm信息  
45 - mediaServerService.clearMediaServerForOnline();  
46 -  
47 - // 将配置文件的meida配置写入数据库  
48 -// MediaServerItem presetMediaServer = mediaServerService.getOneByHostAndPort(  
49 -// mediaConfig.getIp(), mediaConfig.getHttpPort());  
50 -// if (presetMediaServer != null) {  
51 -// MediaServerItem mediaSerItem = mediaConfig.getMediaSerItem();  
52 -// mediaSerItem.setId(presetMediaServer.getId());  
53 -// mediaServerService.update(mediaSerItem);  
54 -// }else {  
55 -// if (mediaConfig.getId() != null) {  
56 -// MediaServerItem mediaSerItem = mediaConfig.getMediaSerItem();  
57 -// mediaServerService.add(mediaSerItem);  
58 -// }  
59 -// } 46 + if (mediaServerService.getDefaultMediaServer() == null) {
  47 + mediaServerService.addToDatabase(mediaConfig.getMediaSerItem());
  48 + }
60 49
61 // 订阅 zlm启动事件, 新的zlm也会从这里进入系统 50 // 订阅 zlm启动事件, 新的zlm也会从这里进入系统
62 hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_started,null, 51 hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_started,null,
@@ -65,7 +54,6 @@ public class ZLMRunner implements CommandLineRunner { @@ -65,7 +54,6 @@ public class ZLMRunner implements CommandLineRunner {
65 if (zlmServerConfig !=null ) { 54 if (zlmServerConfig !=null ) {
66 startGetMedia.remove(zlmServerConfig.getGeneralMediaServerId()); 55 startGetMedia.remove(zlmServerConfig.getGeneralMediaServerId());
67 mediaServerService.handLeZLMServerConfig(zlmServerConfig); 56 mediaServerService.handLeZLMServerConfig(zlmServerConfig);
68 -// zLmRunning(zlmServerConfig);  
69 } 57 }
70 }); 58 });
71 59
@@ -80,17 +68,7 @@ public class ZLMRunner implements CommandLineRunner { @@ -80,17 +68,7 @@ public class ZLMRunner implements CommandLineRunner {
80 for (MediaServerItem mediaServerItem : all) { 68 for (MediaServerItem mediaServerItem : all) {
81 if (startGetMedia == null) startGetMedia = new HashMap<>(); 69 if (startGetMedia == null) startGetMedia = new HashMap<>();
82 startGetMedia.put(mediaServerItem.getId(), true); 70 startGetMedia.put(mediaServerItem.getId(), true);
83 - new Thread(() -> {  
84 -  
85 - ZLMServerConfig zlmServerConfig = getMediaServerConfig(mediaServerItem);  
86 - if (zlmServerConfig != null) {  
87 - zlmServerConfig.setIp(mediaServerItem.getIp());  
88 - zlmServerConfig.setHttpPort(mediaServerItem.getHttpPort());  
89 - startGetMedia.remove(mediaServerItem.getId());  
90 - mediaServerService.handLeZLMServerConfig(zlmServerConfig);  
91 - }  
92 -  
93 - }).start(); 71 + connectZlmServer(mediaServerItem);
94 } 72 }
95 Timer timer = new Timer(); 73 Timer timer = new Timer();
96 // 2分钟后未连接到则不再去主动连接, TODO 并对重启前使用此在zlm的通道发送bye 74 // 2分钟后未连接到则不再去主动连接, TODO 并对重启前使用此在zlm的通道发送bye
@@ -109,6 +87,17 @@ public class ZLMRunner implements CommandLineRunner { @@ -109,6 +87,17 @@ public class ZLMRunner implements CommandLineRunner {
109 }, 60 * 1000 * 2); 87 }, 60 * 1000 * 2);
110 } 88 }
111 89
  90 + @Async
  91 + public void connectZlmServer(MediaServerItem mediaServerItem){
  92 + ZLMServerConfig zlmServerConfig = getMediaServerConfig(mediaServerItem);
  93 + if (zlmServerConfig != null) {
  94 + zlmServerConfig.setIp(mediaServerItem.getIp());
  95 + zlmServerConfig.setHttpPort(mediaServerItem.getHttpPort());
  96 + startGetMedia.remove(mediaServerItem.getId());
  97 + mediaServerService.handLeZLMServerConfig(zlmServerConfig);
  98 + }
  99 + }
  100 +
112 public ZLMServerConfig getMediaServerConfig(MediaServerItem mediaServerItem) { 101 public ZLMServerConfig getMediaServerConfig(MediaServerItem mediaServerItem) {
113 if (startGetMedia == null) { return null;} 102 if (startGetMedia == null) { return null;}
114 if (!mediaServerItem.isDefaultServer() && mediaServerService.getOne(mediaServerItem.getId()) == null) { 103 if (!mediaServerItem.isDefaultServer() && mediaServerService.getOne(mediaServerItem.getId()) == null) {
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
@@ -54,6 +54,8 @@ public interface IMediaServerService { @@ -54,6 +54,8 @@ public interface IMediaServerService {
54 54
55 WVPResult<String> add(MediaServerItem mediaSerItem); 55 WVPResult<String> add(MediaServerItem mediaSerItem);
56 56
  57 + int addToDatabase(MediaServerItem mediaSerItem);
  58 +
57 void resetOnlineServerItem(MediaServerItem serverItem); 59 void resetOnlineServerItem(MediaServerItem serverItem);
58 60
59 WVPResult<MediaServerItem> checkMediaServer(String ip, int port, String secret); 61 WVPResult<MediaServerItem> checkMediaServer(String ip, int port, String secret);
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -27,6 +27,7 @@ import org.springframework.beans.factory.annotation.Value; @@ -27,6 +27,7 @@ import org.springframework.beans.factory.annotation.Value;
27 import org.springframework.boot.CommandLineRunner; 27 import org.springframework.boot.CommandLineRunner;
28 import org.springframework.core.annotation.Order; 28 import org.springframework.core.annotation.Order;
29 import org.springframework.stereotype.Service; 29 import org.springframework.stereotype.Service;
  30 +import org.springframework.util.StringUtils;
30 31
31 import java.text.SimpleDateFormat; 32 import java.text.SimpleDateFormat;
32 import java.util.*; 33 import java.util.*;
@@ -80,6 +81,9 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR @@ -80,6 +81,9 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
80 logger.info("Media Server 缓存初始化"); 81 logger.info("Media Server 缓存初始化");
81 List<MediaServerItem> mediaServerItemList = mediaServerMapper.queryAll(); 82 List<MediaServerItem> mediaServerItemList = mediaServerMapper.queryAll();
82 for (MediaServerItem mediaServerItem : mediaServerItemList) { 83 for (MediaServerItem mediaServerItem : mediaServerItemList) {
  84 + if (StringUtils.isEmpty(mediaServerItem.getId())) {
  85 + continue;
  86 + }
83 // 更新 87 // 更新
84 if (mediaServerItem.getSsrcConfig() == null) { 88 if (mediaServerItem.getSsrcConfig() == null) {
85 SsrcConfig ssrcConfig = new SsrcConfig(mediaServerItem.getId(), null, sipConfig.getDomain()); 89 SsrcConfig ssrcConfig = new SsrcConfig(mediaServerItem.getId(), null, sipConfig.getDomain());
@@ -283,6 +287,11 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR @@ -283,6 +287,11 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
283 return result; 287 return result;
284 } 288 }
285 289
  290 + @Override
  291 + public int addToDatabase(MediaServerItem mediaSerItem) {
  292 + return mediaServerMapper.add(mediaSerItem);
  293 + }
  294 +
286 /** 295 /**
287 * 处理zlm上线 296 * 处理zlm上线
288 * @param zlmServerConfig zlm上线携带的参数 297 * @param zlmServerConfig zlm上线携带的参数
@@ -296,69 +305,84 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR @@ -296,69 +305,84 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
296 if (serverItem == null) { 305 if (serverItem == null) {
297 serverItem = mediaServerMapper.queryOneByHostAndPort(zlmServerConfig.getIp(), zlmServerConfig.getHttpPort()); 306 serverItem = mediaServerMapper.queryOneByHostAndPort(zlmServerConfig.getIp(), zlmServerConfig.getHttpPort());
298 } 307 }
299 - if (zlmServerConfig.getGeneralMediaServerId().equals(mediaConfig.getId())  
300 - || (zlmServerConfig.getIp().equals(mediaConfig.getIp()) && zlmServerConfig.getHttpPort() == mediaConfig.getHttpPort())) {  
301 - // 配置文件的zlm  
302 - // 如果是配置文件中的zlm。 也就是默认zlm。 一切以配置文件内容为准  
303 - // docker部署不会使用zlm配置的端口号不是默认的则不做更新, 配置修改需要自行修改server配置;  
304 - MediaServerItem serverItemFromConfig = mediaConfig.getMediaSerItem();  
305 - serverItemFromConfig.setId(zlmServerConfig.getGeneralMediaServerId());  
306 - if (mediaConfig.getHttpPort() == 0) {  
307 - serverItemFromConfig.setHttpPort(zlmServerConfig.getHttpPort());  
308 - }  
309 - if (mediaConfig.getHttpSSlPort() == 0) {  
310 - serverItemFromConfig.setHttpSSlPort(zlmServerConfig.getHttpSSLport());  
311 - }  
312 - if (mediaConfig.getRtmpPort() == 0) {  
313 - serverItemFromConfig.setRtmpPort(zlmServerConfig.getRtmpPort());  
314 - }  
315 - if (mediaConfig.getRtmpSSlPort() == 0) {  
316 - serverItemFromConfig.setRtmpSSlPort(zlmServerConfig.getRtmpSslPort());  
317 - }  
318 - if (mediaConfig.getRtspPort() == 0) {  
319 - serverItemFromConfig.setRtspPort(zlmServerConfig.getRtspPort());  
320 - }  
321 - if (mediaConfig.getRtspSSLPort() == 0) {  
322 - serverItemFromConfig.setRtspSSLPort(zlmServerConfig.getRtspSSlport());  
323 - }  
324 - if (mediaConfig.getRtpProxyPort() == 0) {  
325 - serverItemFromConfig.setRtpProxyPort(zlmServerConfig.getRtpProxyPort());  
326 - }  
327 - if (serverItem != null){  
328 - mediaServerMapper.delDefault();  
329 - mediaServerMapper.add(serverItemFromConfig);  
330 - String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItemFromConfig.getId();  
331 - MediaServerItem serverItemInRedis = (MediaServerItem)redisUtil.get(key);  
332 - if (serverItemInRedis != null) {  
333 - serverItemFromConfig.setSsrcConfig(serverItemInRedis.getSsrcConfig());  
334 - }else {  
335 - serverItemFromConfig.setSsrcConfig(new SsrcConfig(serverItemFromConfig.getId(), null, sipConfig.getDomain()));  
336 - }  
337 - redisUtil.set(key, serverItemFromConfig);  
338 - }else {  
339 - String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItemFromConfig.getId();  
340 - serverItemFromConfig.setSsrcConfig(new SsrcConfig(serverItemFromConfig.getId(), null, sipConfig.getDomain()));  
341 - redisUtil.set(key, serverItemFromConfig);  
342 - mediaServerMapper.add(serverItemFromConfig);  
343 - }  
344 - resetOnlineServerItem(serverItemFromConfig);  
345 - setZLMConfig(serverItemFromConfig);  
346 - }else {  
347 - String now = this.format.format(System.currentTimeMillis());  
348 - if (serverItem == null){  
349 - // 一个新的zlm接入wvp  
350 - serverItem = new MediaServerItem(zlmServerConfig, sipConfig.getIp());  
351 - serverItem.setCreateTime(now);  
352 - serverItem.setUpdateTime(now);  
353 - String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItem.getId();  
354 - serverItem.setSsrcConfig(new SsrcConfig(serverItem.getId(), null, sipConfig.getDomain()));  
355 - redisUtil.set(key, serverItem);  
356 - // 存入数据库  
357 - mediaServerMapper.add(serverItem);  
358 - setZLMConfig(serverItem);  
359 - }  
360 - resetOnlineServerItem(serverItem); 308 + if (serverItem == null) {
  309 + logger.warn("[未注册的zlm] 拒接接入:来自{}:{}", zlmServerConfig.getIp(),zlmServerConfig.getHttpPort() );
  310 + return;
  311 + }
  312 + if (StringUtils.isEmpty(serverItem.getId())) {
  313 + serverItem.setId(zlmServerConfig.getGeneralMediaServerId());
  314 + redisUtil.set(VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItem.getId(), serverItem);
361 } 315 }
  316 + serverItem.setStatus(true);
  317 + mediaServerMapper.update(serverItem);
  318 + resetOnlineServerItem(serverItem);
  319 + setZLMConfig(serverItem);
  320 +
  321 +// if (zlmServerConfig.getGeneralMediaServerId().equals(mediaConfig.getId())
  322 +// || (zlmServerConfig.getIp().equals(mediaConfig.getIp()) && zlmServerConfig.getHttpPort() == mediaConfig.getHttpPort())) {
  323 +// // 配置文件的zlm
  324 +// // 如果是配置文件中的zlm。 也就是默认zlm。 一切以配置文件内容为准
  325 +// // wvp互惠修改zlm的端口,需要自行配置。
  326 +// MediaServerItem serverItemFromConfig = mediaConfig.getMediaSerItem();
  327 +// serverItemFromConfig.setId(zlmServerConfig.getGeneralMediaServerId());
  328 +// if (mediaConfig.getHttpPort() == 0) {
  329 +// serverItemFromConfig.setHttpPort(zlmServerConfig.getHttpPort());
  330 +// }
  331 +// if (mediaConfig.getHttpSSlPort() == 0) {
  332 +// serverItemFromConfig.setHttpSSlPort(zlmServerConfig.getHttpSSLport());
  333 +// }
  334 +// if (mediaConfig.getRtmpPort() == 0) {
  335 +// serverItemFromConfig.setRtmpPort(zlmServerConfig.getRtmpPort());
  336 +// }
  337 +// if (mediaConfig.getRtmpSSlPort() == 0) {
  338 +// serverItemFromConfig.setRtmpSSlPort(zlmServerConfig.getRtmpSslPort());
  339 +// }
  340 +// if (mediaConfig.getRtspPort() == 0) {
  341 +// serverItemFromConfig.setRtspPort(zlmServerConfig.getRtspPort());
  342 +// }
  343 +// if (mediaConfig.getRtspSSLPort() == 0) {
  344 +// serverItemFromConfig.setRtspSSLPort(zlmServerConfig.getRtspSSlport());
  345 +// }
  346 +// if (mediaConfig.getRtpProxyPort() == 0) {
  347 +// serverItemFromConfig.setRtpProxyPort(zlmServerConfig.getRtpProxyPort());
  348 +// }
  349 +// if (serverItem != null){
  350 +// mediaServerMapper.delDefault();
  351 +// mediaServerMapper.add(serverItemFromConfig);
  352 +// String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItemFromConfig.getId();
  353 +// MediaServerItem serverItemInRedis = (MediaServerItem)redisUtil.get(key);
  354 +// if (serverItemInRedis != null) {
  355 +// serverItemFromConfig.setSsrcConfig(serverItemInRedis.getSsrcConfig());
  356 +// }else {
  357 +// serverItemFromConfig.setSsrcConfig(new SsrcConfig(serverItemFromConfig.getId(), null, sipConfig.getDomain()));
  358 +// }
  359 +// redisUtil.set(key, serverItemFromConfig);
  360 +// }else {
  361 +// String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItemFromConfig.getId();
  362 +// serverItemFromConfig.setSsrcConfig(new SsrcConfig(serverItemFromConfig.getId(), null, sipConfig.getDomain()));
  363 +// redisUtil.set(key, serverItemFromConfig);
  364 +// mediaServerMapper.add(serverItemFromConfig);
  365 +// }
  366 +// resetOnlineServerItem(serverItemFromConfig);
  367 +// setZLMConfig(serverItemFromConfig);
  368 +// }
  369 + // 移除未添加的zlm的接入,所有的zlm必须先添加后才可以加入使用
  370 +// else {
  371 +// String now = this.format.format(System.currentTimeMillis());
  372 +// if (serverItem == null){
  373 +// // 一个新的zlm接入wvp
  374 +// serverItem = new MediaServerItem(zlmServerConfig, sipConfig.getIp());
  375 +// serverItem.setCreateTime(now);
  376 +// serverItem.setUpdateTime(now);
  377 +// String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItem.getId();
  378 +// serverItem.setSsrcConfig(new SsrcConfig(serverItem.getId(), null, sipConfig.getDomain()));
  379 +// redisUtil.set(key, serverItem);
  380 +// // 存入数据库
  381 +// mediaServerMapper.add(serverItem);
  382 +// setZLMConfig(serverItem);
  383 +// }
  384 +// resetOnlineServerItem(serverItem);
  385 +// }
362 } 386 }
363 387
364 @Override 388 @Override
web_src/src/components/MediaServerManger.vue
@@ -18,7 +18,8 @@ @@ -18,7 +18,8 @@
18 <div class="card-img-zlm"></div> 18 <div class="card-img-zlm"></div>
19 <div style="padding: 14px;text-align: left"> 19 <div style="padding: 14px;text-align: left">
20 <span style="font-size: 16px">{{item.id}}</span> 20 <span style="font-size: 16px">{{item.id}}</span>
21 - <el-button icon="el-icon-edit" style="padding: 0;float: right;" type="text" @click="edit(item)">编辑</el-button> 21 + <el-button v-if="!item.defaultServer" icon="el-icon-edit" style="padding: 0;float: right;" type="text" @click="edit(item)">编辑</el-button>
  22 + <el-button v-if="item.defaultServer" icon="el-icon-edit" style="padding: 0;float: right;" type="text" @click="edit(item)">查看</el-button>
22 <el-button icon="el-icon-delete" style="margin-right: 10px;padding: 0;float: right;" type="text" @click="del(item)">移除</el-button> 23 <el-button icon="el-icon-delete" style="margin-right: 10px;padding: 0;float: right;" type="text" @click="del(item)">移除</el-button>
23 <div style="margin-top: 13px; line-height: 12px; "> 24 <div style="margin-top: 13px; line-height: 12px; ">
24 <span style="font-size: 14px; color: #999; margin-top: 5px; ">{{item.ip}}</span> 25 <span style="font-size: 14px; color: #999; margin-top: 5px; ">{{item.ip}}</span>
@@ -27,6 +28,7 @@ @@ -27,6 +28,7 @@
27 </div> 28 </div>
28 <i v-if="item.status" class="iconfont icon-online server-card-status-online" title="在线"></i> 29 <i v-if="item.status" class="iconfont icon-online server-card-status-online" title="在线"></i>
29 <i v-if="!item.status" class="iconfont icon-online server-card-status-offline" title="离线"></i> 30 <i v-if="!item.status" class="iconfont icon-online server-card-status-offline" title="离线"></i>
  31 + <i v-if="item.defaultServer" class="server-card-default" >默认</i>
30 </el-card> 32 </el-card>
31 </el-col> 33 </el-col>
32 </el-row> 34 </el-row>
@@ -173,6 +175,13 @@ @@ -173,6 +175,13 @@
173 color: #808080; 175 color: #808080;
174 font-size: 18px; 176 font-size: 18px;
175 } 177 }
  178 + .server-card-default{
  179 + position: absolute;
  180 + left: 20px;
  181 + top: 20px;
  182 + color: #808080;
  183 + font-size: 18px;
  184 + }
176 .server-card:hover { 185 .server-card:hover {
177 border: 1px solid #adadad; 186 border: 1px solid #adadad;
178 } 187 }
web_src/src/components/dialog/MediaServerEdit.vue
@@ -12,13 +12,13 @@ @@ -12,13 +12,13 @@
12 <div id="formStep" style="margin-top: 1rem; margin-right: 20px;"> 12 <div id="formStep" style="margin-top: 1rem; margin-right: 20px;">
13 <el-form v-if="currentStep == 1" ref="mediaServerForm" :rules="rules" :model="mediaServerForm" label-width="140px" > 13 <el-form v-if="currentStep == 1" ref="mediaServerForm" :rules="rules" :model="mediaServerForm" label-width="140px" >
14 <el-form-item label="IP" prop="ip"> 14 <el-form-item label="IP" prop="ip">
15 - <el-input v-model="mediaServerForm.ip" placeholder="媒体服务IP" clearable></el-input> 15 + <el-input v-model="mediaServerForm.ip" placeholder="媒体服务IP" clearable :disabled="mediaServerForm.defaultServer"></el-input>
16 </el-form-item> 16 </el-form-item>
17 <el-form-item label="HTTP端口" prop="httpPort"> 17 <el-form-item label="HTTP端口" prop="httpPort">
18 - <el-input v-model="mediaServerForm.httpPort" placeholder="媒体服务HTTP端口" clearable></el-input> 18 + <el-input v-model="mediaServerForm.httpPort" placeholder="媒体服务HTTP端口" clearable :disabled="mediaServerForm.defaultServer"></el-input>
19 </el-form-item> 19 </el-form-item>
20 <el-form-item label="SECRET" prop="secret"> 20 <el-form-item label="SECRET" prop="secret">
21 - <el-input v-model="mediaServerForm.secret" placeholder="媒体服务SECRET" clearable></el-input> 21 + <el-input v-model="mediaServerForm.secret" placeholder="媒体服务SECRET" clearable :disabled="mediaServerForm.defaultServer"></el-input>
22 </el-form-item> 22 </el-form-item>
23 <el-form-item> 23 <el-form-item>
24 <div style="float: right;"> 24 <div style="float: right;">
@@ -34,34 +34,34 @@ @@ -34,34 +34,34 @@
34 <el-col :span="12"> 34 <el-col :span="12">
35 <el-form v-if="currentStep === 2 || currentStep === 3" ref="mediaServerForm1" :rules="rules" :model="mediaServerForm" label-width="140px" > 35 <el-form v-if="currentStep === 2 || currentStep === 3" ref="mediaServerForm1" :rules="rules" :model="mediaServerForm" label-width="140px" >
36 <el-form-item label="IP" prop="ip"> 36 <el-form-item label="IP" prop="ip">
37 - <el-input v-if="currentStep === 2" v-model="mediaServerForm.ip" disabled></el-input>  
38 - <el-input v-if="currentStep === 3" v-model="mediaServerForm.ip"></el-input> 37 + <el-input v-if="currentStep === 2" v-model="mediaServerForm.ip" disabled :disabled="mediaServerForm.defaultServer"></el-input>
  38 + <el-input v-if="currentStep === 3" v-model="mediaServerForm.ip" :disabled="mediaServerForm.defaultServer"></el-input>
39 </el-form-item> 39 </el-form-item>
40 <el-form-item label="HTTP端口" prop="httpPort"> 40 <el-form-item label="HTTP端口" prop="httpPort">
41 - <el-input v-if="currentStep === 2" v-model="mediaServerForm.httpPort" disabled></el-input>  
42 - <el-input v-if="currentStep === 3" v-model="mediaServerForm.httpPort"></el-input> 41 + <el-input v-if="currentStep === 2" v-model="mediaServerForm.httpPort" disabled :disabled="mediaServerForm.defaultServer"></el-input>
  42 + <el-input v-if="currentStep === 3" v-model="mediaServerForm.httpPort" :disabled="mediaServerForm.defaultServer"></el-input>
43 </el-form-item> 43 </el-form-item>
44 <el-form-item label="SECRET" prop="secret"> 44 <el-form-item label="SECRET" prop="secret">
45 - <el-input v-if="currentStep === 2" v-model="mediaServerForm.secret" disabled></el-input>  
46 - <el-input v-if="currentStep === 3" v-model="mediaServerForm.secret"></el-input> 45 + <el-input v-if="currentStep === 2" v-model="mediaServerForm.secret" disabled :disabled="mediaServerForm.defaultServer"></el-input>
  46 + <el-input v-if="currentStep === 3" v-model="mediaServerForm.secret" :disabled="mediaServerForm.defaultServer"></el-input>
47 </el-form-item> 47 </el-form-item>
48 <el-form-item label="HOOK IP" prop="ip"> 48 <el-form-item label="HOOK IP" prop="ip">
49 - <el-input v-model="mediaServerForm.hookIp" placeholder="媒体服务HOOK_IP" clearable></el-input> 49 + <el-input v-model="mediaServerForm.hookIp" placeholder="媒体服务HOOK_IP" clearable :disabled="mediaServerForm.defaultServer"></el-input>
50 </el-form-item> 50 </el-form-item>
51 <el-form-item label="SDP IP" prop="ip"> 51 <el-form-item label="SDP IP" prop="ip">
52 - <el-input v-model="mediaServerForm.sdpIp" placeholder="媒体服务SDP_IP" clearable></el-input> 52 + <el-input v-model="mediaServerForm.sdpIp" placeholder="媒体服务SDP_IP" clearable :disabled="mediaServerForm.defaultServer"></el-input>
53 </el-form-item> 53 </el-form-item>
54 <el-form-item label="流IP" prop="ip"> 54 <el-form-item label="流IP" prop="ip">
55 - <el-input v-model="mediaServerForm.streamIp" placeholder="媒体服务流IP" clearable></el-input> 55 + <el-input v-model="mediaServerForm.streamIp" placeholder="媒体服务流IP" clearable :disabled="mediaServerForm.defaultServer"></el-input>
56 </el-form-item> 56 </el-form-item>
57 <el-form-item label="HTTPS PORT" prop="httpSSlPort"> 57 <el-form-item label="HTTPS PORT" prop="httpSSlPort">
58 - <el-input v-model="mediaServerForm.httpSSlPort" placeholder="媒体服务HTTPS_PORT" clearable></el-input> 58 + <el-input v-model="mediaServerForm.httpSSlPort" placeholder="媒体服务HTTPS_PORT" clearable :disabled="mediaServerForm.defaultServer"></el-input>
59 </el-form-item> 59 </el-form-item>
60 <el-form-item label="RTSP PORT" prop="rtspPort"> 60 <el-form-item label="RTSP PORT" prop="rtspPort">
61 - <el-input v-model="mediaServerForm.rtspPort" placeholder="媒体服务RTSP_PORT" clearable></el-input> 61 + <el-input v-model="mediaServerForm.rtspPort" placeholder="媒体服务RTSP_PORT" clearable :disabled="mediaServerForm.defaultServer"></el-input>
62 </el-form-item> 62 </el-form-item>
63 <el-form-item label="RTSPS PORT" prop="rtspSSLPort"> 63 <el-form-item label="RTSPS PORT" prop="rtspSSLPort">
64 - <el-input v-model="mediaServerForm.rtspSSLPort" placeholder="媒体服务RTSPS_PORT" clearable></el-input> 64 + <el-input v-model="mediaServerForm.rtspSSLPort" placeholder="媒体服务RTSPS_PORT" clearable :disabled="mediaServerForm.defaultServer"></el-input>
65 </el-form-item> 65 </el-form-item>
66 66
67 </el-form> 67 </el-form>
@@ -69,36 +69,36 @@ @@ -69,36 +69,36 @@
69 <el-col :span="12"> 69 <el-col :span="12">
70 <el-form v-if="currentStep === 2 || currentStep === 3" ref="mediaServerForm2" :rules="rules" :model="mediaServerForm" label-width="180px" > 70 <el-form v-if="currentStep === 2 || currentStep === 3" ref="mediaServerForm2" :rules="rules" :model="mediaServerForm" label-width="180px" >
71 <el-form-item label="RTMP PORT" prop="rtmpPort"> 71 <el-form-item label="RTMP PORT" prop="rtmpPort">
72 - <el-input v-model="mediaServerForm.rtmpPort" placeholder="媒体服务RTMP_PORT" clearable></el-input> 72 + <el-input v-model="mediaServerForm.rtmpPort" placeholder="媒体服务RTMP_PORT" clearable :disabled="mediaServerForm.defaultServer"></el-input>
73 </el-form-item> 73 </el-form-item>
74 <el-form-item label="RTMPS PORT" prop="rtmpSSlPort"> 74 <el-form-item label="RTMPS PORT" prop="rtmpSSlPort">
75 - <el-input v-model="mediaServerForm.rtmpSSlPort" placeholder="媒体服务RTMPS_PORT" clearable></el-input> 75 + <el-input v-model="mediaServerForm.rtmpSSlPort" placeholder="媒体服务RTMPS_PORT" clearable :disabled="mediaServerForm.defaultServer"></el-input>
76 </el-form-item> 76 </el-form-item>
77 <el-form-item label="自动配置媒体服务" > 77 <el-form-item label="自动配置媒体服务" >
78 - <el-switch v-model="mediaServerForm.autoConfig"></el-switch> 78 + <el-switch v-model="mediaServerForm.autoConfig" :disabled="mediaServerForm.defaultServer"></el-switch>
79 </el-form-item> 79 </el-form-item>
80 <el-form-item label="收流端口模式" > 80 <el-form-item label="收流端口模式" >
81 - <el-switch active-text="多端口" inactive-text="单端口" v-model="mediaServerForm.rtpEnable"></el-switch> 81 + <el-switch active-text="多端口" inactive-text="单端口" v-model="mediaServerForm.rtpEnable" :disabled="mediaServerForm.defaultServer"></el-switch>
82 </el-form-item> 82 </el-form-item>
83 83
84 <el-form-item v-if="!mediaServerForm.rtpEnable" label="收流端口" prop="rtpProxyPort"> 84 <el-form-item v-if="!mediaServerForm.rtpEnable" label="收流端口" prop="rtpProxyPort">
85 - <el-input v-model.number="mediaServerForm.rtpProxyPort" clearable></el-input> 85 + <el-input v-model.number="mediaServerForm.rtpProxyPort" clearable :disabled="mediaServerForm.defaultServer"></el-input>
86 </el-form-item> 86 </el-form-item>
87 <el-form-item v-if="mediaServerForm.rtpEnable" label="收流端口" > 87 <el-form-item v-if="mediaServerForm.rtpEnable" label="收流端口" >
88 - <el-input v-model="rtpPortRange1" placeholder="起始" @change="portRangeChange" clearable style="width: 100px" prop="rtpPortRange1"></el-input> 88 + <el-input v-model="rtpPortRange1" placeholder="起始" @change="portRangeChange" clearable style="width: 100px" prop="rtpPortRange1" :disabled="mediaServerForm.defaultServer"></el-input>
89 - 89 -
90 - <el-input v-model="rtpPortRange2" placeholder="终止" @change="portRangeChange" clearable style="width: 100px" prop="rtpPortRange2"></el-input> 90 + <el-input v-model="rtpPortRange2" placeholder="终止" @change="portRangeChange" clearable style="width: 100px" prop="rtpPortRange2" :disabled="mediaServerForm.defaultServer"></el-input>
91 </el-form-item> 91 </el-form-item>
92 <el-form-item label="推流端口" prop="sendRtpPortRange1"> 92 <el-form-item label="推流端口" prop="sendRtpPortRange1">
93 - <el-input v-model="sendRtpPortRange1" placeholder="起始" @change="portRangeChange" clearable style="width: 100px" prop="sendRtpPortRange1"></el-input> 93 + <el-input v-model="sendRtpPortRange1" placeholder="起始" @change="portRangeChange" clearable style="width: 100px" prop="sendRtpPortRange1" :disabled="mediaServerForm.defaultServer"></el-input>
94 - 94 -
95 - <el-input v-model="sendRtpPortRange2" placeholder="终止" @change="portRangeChange" clearable style="width: 100px" prop="sendRtpPortRange2"></el-input> 95 + <el-input v-model="sendRtpPortRange2" placeholder="终止" @change="portRangeChange" clearable style="width: 100px" prop="sendRtpPortRange2" :disabled="mediaServerForm.defaultServer"></el-input>
96 </el-form-item> 96 </el-form-item>
97 <el-form-item label="无人观看多久后停止拉流" > 97 <el-form-item label="无人观看多久后停止拉流" >
98 - <el-input v-model.number="mediaServerForm.streamNoneReaderDelayMS" clearable></el-input> 98 + <el-input v-model.number="mediaServerForm.streamNoneReaderDelayMS" clearable :disabled="mediaServerForm.defaultServer"></el-input>
99 </el-form-item> 99 </el-form-item>
100 <el-form-item label="录像管理服务端口" prop="recordAssistPort"> 100 <el-form-item label="录像管理服务端口" prop="recordAssistPort">
101 - <el-input v-model.number="mediaServerForm.recordAssistPort"> 101 + <el-input v-model.number="mediaServerForm.recordAssistPort" :disabled="mediaServerForm.defaultServer">
102 <!-- <el-button v-if="mediaServerForm.recordAssistPort > 0" slot="append" type="primary" @click="checkRecordServer">测试</el-button>--> 102 <!-- <el-button v-if="mediaServerForm.recordAssistPort > 0" slot="append" type="primary" @click="checkRecordServer">测试</el-button>-->
103 <el-button v-if="mediaServerForm.recordAssistPort > 0" class="el-icon-check" slot="append" type="primary" @click="checkRecordServer"></el-button> 103 <el-button v-if="mediaServerForm.recordAssistPort > 0" class="el-icon-check" slot="append" type="primary" @click="checkRecordServer"></el-button>
104 </el-input> 104 </el-input>
@@ -108,8 +108,9 @@ @@ -108,8 +108,9 @@
108 </el-form-item> 108 </el-form-item>
109 <el-form-item> 109 <el-form-item>
110 <div style="float: right;"> 110 <div style="float: right;">
111 - <el-button type="primary" @click="onSubmit" >提交</el-button>  
112 - <el-button @click="close">取消</el-button> 111 + <el-button v-if="!mediaServerForm.defaultServer" type="primary" @click="onSubmit" >提交</el-button>
  112 + <el-button v-if="!mediaServerForm.defaultServer" @click="close">取消</el-button>
  113 + <el-button v-if="mediaServerForm.defaultServer" @click="close">关闭</el-button>
113 </div> 114 </div>
114 </el-form-item> 115 </el-form-item>
115 </el-form> 116 </el-form>