Commit e8fc19d8712d59563966809207381fce30ad395a
1 parent
b95fe5fb
优化视频
Showing
21 changed files
with
2454 additions
and
617 deletions
src/main/java/com/genersoft/iot/vmp/conf/StreamProxyTask.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.conf; | |
| 2 | + | |
| 3 | +import com.genersoft.iot.vmp.service.StremProxyService1078; | |
| 4 | +import org.apache.commons.collections4.CollectionUtils; | |
| 5 | +import org.apache.commons.lang3.StringUtils; | |
| 6 | +import org.slf4j.Logger; | |
| 7 | +import org.slf4j.LoggerFactory; | |
| 8 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 9 | +import org.springframework.data.redis.core.RedisTemplate; | |
| 10 | +import org.springframework.scheduling.annotation.Scheduled; | |
| 11 | +import org.springframework.stereotype.Component; | |
| 12 | + | |
| 13 | +import java.util.Date; | |
| 14 | +import java.util.Objects; | |
| 15 | +import java.util.Set; | |
| 16 | +import java.util.concurrent.TimeUnit; | |
| 17 | + | |
| 18 | +@Component | |
| 19 | +public class StreamProxyTask { | |
| 20 | + @Autowired | |
| 21 | + private RedisTemplate redisTemplate; | |
| 22 | + @Autowired | |
| 23 | + private StremProxyService1078 stremProxyService1078; | |
| 24 | + private Logger logger = LoggerFactory.getLogger(StreamProxyTask.class); | |
| 25 | + | |
| 26 | + public static final Long TIME_OUT = 180L; | |
| 27 | + | |
| 28 | + @Scheduled(cron = "0 15 * * * ? ") | |
| 29 | + public void work() { | |
| 30 | + Set<String> keys = redisTemplate.keys("tag:history:port:*"); | |
| 31 | + if (CollectionUtils.isEmpty(keys)) { | |
| 32 | + return; | |
| 33 | + } | |
| 34 | + Long nowDate = new Date().getTime(); | |
| 35 | + for (String key : keys) { | |
| 36 | + String stream = StringUtils.substringAfter(key, "tag:history:port:"); | |
| 37 | + if (StringUtils.isEmpty(stream)) { | |
| 38 | + continue; | |
| 39 | + } | |
| 40 | + | |
| 41 | + Object value = redisTemplate.opsForValue().get("tag:history:httpPort:time:"+stream); | |
| 42 | + if(Objects.isNull(value)){ | |
| 43 | + sendIORequestStop(stream); | |
| 44 | + continue; | |
| 45 | + } | |
| 46 | + try { | |
| 47 | + Long val = (Long) value; | |
| 48 | + if(val == 0L){ | |
| 49 | + sendIORequestStop(stream); | |
| 50 | + continue; | |
| 51 | + } | |
| 52 | + | |
| 53 | + Long val1 = (nowDate-val)/1000; | |
| 54 | + if(val1 > TIME_OUT){ | |
| 55 | + sendIORequestStop(stream); | |
| 56 | + } | |
| 57 | + | |
| 58 | + }catch (Exception e){ | |
| 59 | + logger.error("[{}]停流失败",stream,e); | |
| 60 | + } | |
| 61 | + } | |
| 62 | + | |
| 63 | + // task execution logic | |
| 64 | + } | |
| 65 | + | |
| 66 | + private void sendIORequestStop(String stream){ | |
| 67 | + try { | |
| 68 | + String sim = StringUtils.substringBeforeLast(stream,"-"); | |
| 69 | + String channel = StringUtils.substringAfterLast(stream,"-"); | |
| 70 | + Object port = redisTemplate.opsForValue().get("tag:history:port:" + stream); | |
| 71 | + Object portHtt = redisTemplate.opsForValue().get("tag:history:httpPort:" + stream); | |
| 72 | + stremProxyService1078.sendIORequestStop(sim,channel,stream, (Integer) port, (Integer) portHtt); | |
| 73 | + | |
| 74 | + }catch (Exception e){ | |
| 75 | + logger.error("[{}]停流失败",stream,e); | |
| 76 | + } | |
| 77 | + | |
| 78 | + } | |
| 79 | +} | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/StremProxyService1078.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.service; | |
| 2 | + | |
| 3 | +import java.util.Map; | |
| 4 | + | |
| 5 | +public interface StremProxyService1078 { | |
| 6 | + Map<String, Object> sendIORequestStop(String sim, String channel, String stream, Integer port, Integer httpPort); | |
| 7 | + | |
| 8 | + Map<String, Object> sendIORequestStop( String stream); | |
| 9 | +} | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
| ... | ... | @@ -18,10 +18,7 @@ import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange; |
| 18 | 18 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 19 | 19 | import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; |
| 20 | 20 | import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; |
| 21 | -import com.genersoft.iot.vmp.service.IGbStreamService; | |
| 22 | -import com.genersoft.iot.vmp.service.IMediaServerService; | |
| 23 | -import com.genersoft.iot.vmp.service.IMediaService; | |
| 24 | -import com.genersoft.iot.vmp.service.IStreamProxyService; | |
| 21 | +import com.genersoft.iot.vmp.service.*; | |
| 25 | 22 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| 26 | 23 | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; |
| 27 | 24 | import com.genersoft.iot.vmp.storager.dao.GbStreamMapper; |
| ... | ... | @@ -32,9 +29,11 @@ import com.genersoft.iot.vmp.utils.DateUtil; |
| 32 | 29 | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; |
| 33 | 30 | import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo; |
| 34 | 31 | import com.github.pagehelper.PageInfo; |
| 32 | +import org.apache.commons.lang3.StringUtils; | |
| 35 | 33 | import org.slf4j.Logger; |
| 36 | 34 | import org.slf4j.LoggerFactory; |
| 37 | 35 | import org.springframework.beans.factory.annotation.Autowired; |
| 36 | +import org.springframework.data.redis.core.RedisTemplate; | |
| 38 | 37 | import org.springframework.jdbc.datasource.DataSourceTransactionManager; |
| 39 | 38 | import org.springframework.scheduling.annotation.Scheduled; |
| 40 | 39 | import org.springframework.stereotype.Service; |
| ... | ... | @@ -43,10 +42,8 @@ import org.springframework.transaction.TransactionStatus; |
| 43 | 42 | import org.springframework.util.CollectionUtils; |
| 44 | 43 | import org.springframework.util.ObjectUtils; |
| 45 | 44 | |
| 46 | -import java.util.HashMap; | |
| 47 | -import java.util.List; | |
| 48 | -import java.util.Map; | |
| 49 | -import java.util.UUID; | |
| 45 | +import java.util.*; | |
| 46 | +import java.util.concurrent.TimeUnit; | |
| 50 | 47 | import java.util.function.Function; |
| 51 | 48 | import java.util.stream.Collectors; |
| 52 | 49 | |
| ... | ... | @@ -106,14 +103,18 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 106 | 103 | |
| 107 | 104 | @Autowired |
| 108 | 105 | TransactionDefinition transactionDefinition; |
| 106 | + @Autowired | |
| 107 | + private StremProxyService1078 stremProxyService1078; | |
| 108 | + @Autowired | |
| 109 | + private RedisTemplate redisTemplate; | |
| 109 | 110 | |
| 110 | 111 | |
| 111 | 112 | @Override |
| 112 | 113 | public void save(StreamProxyItem param, GeneralCallback<StreamInfo> callback) { |
| 113 | 114 | MediaServerItem mediaInfo; |
| 114 | - if (ObjectUtils.isEmpty(param.getMediaServerId()) || "auto".equals(param.getMediaServerId())){ | |
| 115 | + if (ObjectUtils.isEmpty(param.getMediaServerId()) || "auto".equals(param.getMediaServerId())) { | |
| 115 | 116 | mediaInfo = mediaServerService.getMediaServerForMinimumLoad(null); |
| 116 | - }else { | |
| 117 | + } else { | |
| 117 | 118 | mediaInfo = mediaServerService.getOne(param.getMediaServerId()); |
| 118 | 119 | } |
| 119 | 120 | if (mediaInfo == null) { |
| ... | ... | @@ -144,17 +145,17 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 144 | 145 | if (schema.equalsIgnoreCase("rtsp")) { |
| 145 | 146 | port = mediaInfo.getRtspPort(); |
| 146 | 147 | schemaForUri = schema; |
| 147 | - }else if (schema.equalsIgnoreCase("flv")) { | |
| 148 | + } else if (schema.equalsIgnoreCase("flv")) { | |
| 148 | 149 | port = mediaInfo.getRtmpPort(); |
| 149 | 150 | schemaForUri = schema; |
| 150 | - }else { | |
| 151 | + } else { | |
| 151 | 152 | port = mediaInfo.getRtmpPort(); |
| 152 | 153 | schemaForUri = schema; |
| 153 | 154 | } |
| 154 | 155 | |
| 155 | 156 | dstUrl = String.format("%s://%s:%s/%s/%s", schemaForUri, "127.0.0.1", port, param.getApp(), |
| 156 | 157 | param.getStream()); |
| 157 | - }else { | |
| 158 | + } else { | |
| 158 | 159 | dstUrl = String.format("rtsp://%s:%s/%s/%s", "127.0.0.1", mediaInfo.getRtspPort(), param.getApp(), |
| 159 | 160 | param.getStream()); |
| 160 | 161 | } |
| ... | ... | @@ -165,7 +166,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 165 | 166 | // 更新 |
| 166 | 167 | if (videoManagerStorager.queryStreamProxy(param.getApp(), param.getStream()) != null) { |
| 167 | 168 | saveResult = updateStreamProxy(param); |
| 168 | - }else { // 新增 | |
| 169 | + } else { // 新增 | |
| 169 | 170 | saveResult = addStreamProxy(param); |
| 170 | 171 | } |
| 171 | 172 | if (!saveResult) { |
| ... | ... | @@ -181,11 +182,11 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 181 | 182 | if (param.isEnable()) { |
| 182 | 183 | String talkKey = UUID.randomUUID().toString(); |
| 183 | 184 | String delayTalkKey = UUID.randomUUID().toString(); |
| 184 | - dynamicTask.startDelay(delayTalkKey, ()->{ | |
| 185 | + dynamicTask.startDelay(delayTalkKey, () -> { | |
| 185 | 186 | StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStreamWithCheck(param.getApp(), param.getStream(), mediaInfo.getId(), false); |
| 186 | 187 | if (streamInfo != null) { |
| 187 | 188 | callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), streamInfo); |
| 188 | - }else { | |
| 189 | + } else { | |
| 189 | 190 | dynamicTask.stop(talkKey); |
| 190 | 191 | callback.run(ErrorCode.ERROR100.getCode(), "超时", null); |
| 191 | 192 | } |
| ... | ... | @@ -197,22 +198,21 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 197 | 198 | StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream( |
| 198 | 199 | mediaInfo, param.getApp(), param.getStream(), null, null); |
| 199 | 200 | callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), streamInfo); |
| 200 | - }else { | |
| 201 | + } else { | |
| 201 | 202 | param.setEnable(false); |
| 202 | 203 | // 直接移除 |
| 203 | 204 | if (param.isEnableRemoveNoneReader()) { |
| 204 | 205 | del(param.getApp(), param.getStream()); |
| 205 | - }else { | |
| 206 | + } else { | |
| 206 | 207 | updateStreamProxy(param); |
| 207 | 208 | } |
| 208 | - if (jsonObject == null){ | |
| 209 | + if (jsonObject == null) { | |
| 209 | 210 | callback.run(ErrorCode.ERROR100.getCode(), "记录已保存,启用失败", null); |
| 210 | - }else { | |
| 211 | + } else { | |
| 211 | 212 | callback.run(ErrorCode.ERROR100.getCode(), jsonObject.getString("msg"), null); |
| 212 | 213 | } |
| 213 | 214 | } |
| 214 | - } | |
| 215 | - else{ | |
| 215 | + } else { | |
| 216 | 216 | StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream( |
| 217 | 217 | mediaInfo, param.getApp(), param.getStream(), null, null); |
| 218 | 218 | callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), streamInfo); |
| ... | ... | @@ -228,8 +228,8 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 228 | 228 | for (int i = 0; i < paramArray.length; i++) { |
| 229 | 229 | if (paramArray[i].equalsIgnoreCase("-f")) { |
| 230 | 230 | if (i + 1 < paramArray.length - 1) { |
| 231 | - return paramArray[i+1]; | |
| 232 | - }else { | |
| 231 | + return paramArray[i + 1]; | |
| 232 | + } else { | |
| 233 | 233 | return null; |
| 234 | 234 | } |
| 235 | 235 | |
| ... | ... | @@ -240,6 +240,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 240 | 240 | |
| 241 | 241 | /** |
| 242 | 242 | * 新增代理流 |
| 243 | + * | |
| 243 | 244 | * @param streamProxyItem |
| 244 | 245 | * @return |
| 245 | 246 | */ |
| ... | ... | @@ -259,14 +260,14 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 259 | 260 | return false; |
| 260 | 261 | } |
| 261 | 262 | } |
| 262 | - }else { | |
| 263 | + } else { | |
| 263 | 264 | //事务回滚 |
| 264 | 265 | dataSourceTransactionManager.rollback(transactionStatus); |
| 265 | 266 | return false; |
| 266 | 267 | } |
| 267 | 268 | result = true; |
| 268 | 269 | dataSourceTransactionManager.commit(transactionStatus); //手动提交 |
| 269 | - }catch (Exception e) { | |
| 270 | + } catch (Exception e) { | |
| 270 | 271 | logger.error("向数据库添加流代理失败:", e); |
| 271 | 272 | dataSourceTransactionManager.rollback(transactionStatus); |
| 272 | 273 | } |
| ... | ... | @@ -277,6 +278,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 277 | 278 | |
| 278 | 279 | /** |
| 279 | 280 | * 更新代理流 |
| 281 | + * | |
| 280 | 282 | * @param streamProxyItem |
| 281 | 283 | * @return |
| 282 | 284 | */ |
| ... | ... | @@ -302,7 +304,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 302 | 304 | |
| 303 | 305 | dataSourceTransactionManager.commit(transactionStatus); //手动提交 |
| 304 | 306 | result = true; |
| 305 | - }catch (Exception e) { | |
| 307 | + } catch (Exception e) { | |
| 306 | 308 | logger.error("未处理的异常 ", e); |
| 307 | 309 | dataSourceTransactionManager.rollback(transactionStatus); |
| 308 | 310 | } |
| ... | ... | @@ -316,7 +318,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 316 | 318 | if (param.getMediaServerId() == null) { |
| 317 | 319 | logger.warn("添加代理时MediaServerId 为null"); |
| 318 | 320 | return null; |
| 319 | - }else { | |
| 321 | + } else { | |
| 320 | 322 | mediaServerItem = mediaServerService.getOne(param.getMediaServerId()); |
| 321 | 323 | } |
| 322 | 324 | if (mediaServerItem == null) { |
| ... | ... | @@ -325,11 +327,11 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 325 | 327 | if (zlmServerFactory.isStreamReady(mediaServerItem, param.getApp(), param.getStream())) { |
| 326 | 328 | zlmresTfulUtils.closeStreams(mediaServerItem, param.getApp(), param.getStream()); |
| 327 | 329 | } |
| 328 | - if ("ffmpeg".equalsIgnoreCase(param.getType())){ | |
| 330 | + if ("ffmpeg".equalsIgnoreCase(param.getType())) { | |
| 329 | 331 | result = zlmresTfulUtils.addFFmpegSource(mediaServerItem, param.getSrcUrl().trim(), param.getDstUrl(), |
| 330 | 332 | param.getTimeoutMs() + "", param.isEnableAudio(), param.isEnableMp4(), |
| 331 | 333 | param.getFfmpegCmdKey()); |
| 332 | - }else { | |
| 334 | + } else { | |
| 333 | 335 | result = zlmresTfulUtils.addStreamProxy(mediaServerItem, param.getApp(), param.getStream(), param.getUrl().trim(), |
| 334 | 336 | param.isEnableAudio(), param.isEnableMp4(), param.getRtpType()); |
| 335 | 337 | } |
| ... | ... | @@ -338,12 +340,12 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 338 | 340 | if (result != null && result.getInteger("code") == 0) { |
| 339 | 341 | JSONObject data = result.getJSONObject("data"); |
| 340 | 342 | if (data == null) { |
| 341 | - logger.warn("[获取拉流代理的结果数据Data] 失败: {}", result ); | |
| 343 | + logger.warn("[获取拉流代理的结果数据Data] 失败: {}", result); | |
| 342 | 344 | return result; |
| 343 | 345 | } |
| 344 | 346 | String key = data.getString("key"); |
| 345 | 347 | if (key == null) { |
| 346 | - logger.warn("[获取拉流代理的结果数据Data中的KEY] 失败: {}", result ); | |
| 348 | + logger.warn("[获取拉流代理的结果数据Data中的KEY] 失败: {}", result); | |
| 347 | 349 | return result; |
| 348 | 350 | } |
| 349 | 351 | param.setStreamKey(key); |
| ... | ... | @@ -354,14 +356,14 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 354 | 356 | |
| 355 | 357 | @Override |
| 356 | 358 | public JSONObject removeStreamProxyFromZlm(StreamProxyItem param) { |
| 357 | - if (param ==null) { | |
| 359 | + if (param == null) { | |
| 358 | 360 | return null; |
| 359 | 361 | } |
| 360 | 362 | MediaServerItem mediaServerItem = mediaServerService.getOne(param.getMediaServerId()); |
| 361 | 363 | JSONObject result = null; |
| 362 | - if ("ffmpeg".equalsIgnoreCase(param.getType())){ | |
| 364 | + if ("ffmpeg".equalsIgnoreCase(param.getType())) { | |
| 363 | 365 | result = zlmresTfulUtils.delFFmpegSource(mediaServerItem, param.getStreamKey()); |
| 364 | - }else { | |
| 366 | + } else { | |
| 365 | 367 | result = zlmresTfulUtils.delStreamProxy(mediaServerItem, param.getStreamKey()); |
| 366 | 368 | } |
| 367 | 369 | return result; |
| ... | ... | @@ -374,6 +376,12 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 374 | 376 | |
| 375 | 377 | @Override |
| 376 | 378 | public void del(String app, String stream) { |
| 379 | + Object object = redisTemplate.opsForValue().get("tag:history:httpPort:time:" + stream); | |
| 380 | + if (Objects.nonNull(object)) { | |
| 381 | + | |
| 382 | + return; | |
| 383 | + } | |
| 384 | + stremProxyService1078.sendIORequestStop(stream); | |
| 377 | 385 | StreamProxyItem streamProxyItem = videoManagerStorager.queryStreamProxy(app, stream); |
| 378 | 386 | if (streamProxyItem != null) { |
| 379 | 387 | gbStreamService.sendCatalogMsg(streamProxyItem, CatalogEvent.DEL); |
| ... | ... | @@ -386,7 +394,13 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 386 | 394 | JSONObject jsonObject = removeStreamProxyFromZlm(streamProxyItem); |
| 387 | 395 | if (jsonObject != null && jsonObject.getInteger("code") == 0) { |
| 388 | 396 | logger.info("[移除代理]: 代理: {}/{}, 从zlm移除成功", app, stream); |
| 389 | - }else { | |
| 397 | + String sim = StringUtils.substringBeforeLast(stream, "-"); | |
| 398 | + String channel = StringUtils.substringAfterLast(stream, "-"); | |
| 399 | + Object port = redisTemplate.opsForValue().get("tag:history:port:" + stream); | |
| 400 | + Object httpPort = redisTemplate.opsForValue().get("tag:history:httpPort:" + stream); | |
| 401 | + | |
| 402 | + stremProxyService1078.sendIORequestStop(sim, channel, stream, (Integer) port, (Integer) httpPort); | |
| 403 | + } else { | |
| 390 | 404 | logger.info("[移除代理]: 代理: {}/{}, 从zlm移除失败", app, stream); |
| 391 | 405 | } |
| 392 | 406 | } |
| ... | ... | @@ -396,7 +410,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 396 | 410 | public boolean start(String app, String stream) { |
| 397 | 411 | boolean result = false; |
| 398 | 412 | StreamProxyItem streamProxy = videoManagerStorager.queryStreamProxy(app, stream); |
| 399 | - if (streamProxy != null && !streamProxy.isEnable() ) { | |
| 413 | + if (streamProxy != null && !streamProxy.isEnable()) { | |
| 400 | 414 | JSONObject jsonObject = addStreamProxyToZlm(streamProxy); |
| 401 | 415 | if (jsonObject == null) { |
| 402 | 416 | return false; |
| ... | ... | @@ -405,12 +419,14 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 405 | 419 | result = true; |
| 406 | 420 | streamProxy.setEnable(true); |
| 407 | 421 | updateStreamProxy(streamProxy); |
| 408 | - }else { | |
| 422 | + }else if(jsonObject.getInteger("code") == -1){ | |
| 423 | + redisTemplate.opsForValue().set("stream:status:"+stream,"1",30, TimeUnit.SECONDS); | |
| 424 | + } else { | |
| 409 | 425 | logger.info("启用代理失败: {}/{}->{}({})", app, stream, jsonObject.getString("msg"), |
| 410 | - streamProxy.getSrcUrl() == null? streamProxy.getUrl():streamProxy.getSrcUrl()); | |
| 426 | + streamProxy.getSrcUrl() == null ? streamProxy.getUrl() : streamProxy.getSrcUrl()); | |
| 411 | 427 | } |
| 412 | 428 | } else if (streamProxy != null && streamProxy.isEnable()) { |
| 413 | - return true ; | |
| 429 | + return true; | |
| 414 | 430 | } |
| 415 | 431 | return result; |
| 416 | 432 | } |
| ... | ... | @@ -434,11 +450,11 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 434 | 450 | JSONObject result = new JSONObject(); |
| 435 | 451 | JSONObject mediaServerConfigResuly = zlmresTfulUtils.getMediaServerConfig(mediaServerItem); |
| 436 | 452 | if (mediaServerConfigResuly != null && mediaServerConfigResuly.getInteger("code") == 0 |
| 437 | - && mediaServerConfigResuly.getJSONArray("data").size() > 0){ | |
| 453 | + && mediaServerConfigResuly.getJSONArray("data").size() > 0) { | |
| 438 | 454 | JSONObject mediaServerConfig = mediaServerConfigResuly.getJSONArray("data").getJSONObject(0); |
| 439 | 455 | |
| 440 | 456 | for (String key : mediaServerConfig.keySet()) { |
| 441 | - if (key.startsWith("ffmpeg.cmd")){ | |
| 457 | + if (key.startsWith("ffmpeg.cmd")) { | |
| 442 | 458 | result.put(key, mediaServerConfig.getString(key)); |
| 443 | 459 | } |
| 444 | 460 | } |
| ... | ... | @@ -474,7 +490,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 474 | 490 | // 设置为离线 |
| 475 | 491 | logger.info("恢复流代理失败" + streamProxyDto.getApp() + "/" + streamProxyDto.getStream()); |
| 476 | 492 | updateStatus(false, streamProxyDto.getApp(), streamProxyDto.getStream()); |
| 477 | - }else { | |
| 493 | + } else { | |
| 478 | 494 | updateStatus(true, streamProxyDto.getApp(), streamProxyDto.getStream()); |
| 479 | 495 | } |
| 480 | 496 | } |
| ... | ... | @@ -519,16 +535,16 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 519 | 535 | return streamProxyMapper.updateStatus(app, stream, status); |
| 520 | 536 | } |
| 521 | 537 | |
| 522 | - private void syncPullStream(String mediaServerId){ | |
| 538 | + private void syncPullStream(String mediaServerId) { | |
| 523 | 539 | MediaServerItem mediaServer = mediaServerService.getOne(mediaServerId); |
| 524 | 540 | if (mediaServer != null) { |
| 525 | 541 | List<OnStreamChangedHookParam> allPullStream = redisCatchStorage.getStreams(mediaServerId, "PULL"); |
| 526 | 542 | if (allPullStream.size() > 0) { |
| 527 | - zlmresTfulUtils.getMediaList(mediaServer, jsonObject->{ | |
| 543 | + zlmresTfulUtils.getMediaList(mediaServer, jsonObject -> { | |
| 528 | 544 | Map<String, StreamInfo> stringStreamInfoMap = new HashMap<>(); |
| 529 | 545 | if (jsonObject.getInteger("code") == 0) { |
| 530 | 546 | JSONArray data = jsonObject.getJSONArray("data"); |
| 531 | - if(data != null && data.size() > 0) { | |
| 547 | + if (data != null && data.size() > 0) { | |
| 532 | 548 | for (int i = 0; i < data.size(); i++) { |
| 533 | 549 | JSONObject streamJSONObj = data.getJSONObject(i); |
| 534 | 550 | if ("rtsp".equals(streamJSONObj.getString("schema"))) { |
| ... | ... | @@ -537,14 +553,14 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 537 | 553 | String stream = streamJSONObj.getString("stream"); |
| 538 | 554 | streamInfo.setApp(app); |
| 539 | 555 | streamInfo.setStream(stream); |
| 540 | - stringStreamInfoMap.put(app+stream, streamInfo); | |
| 556 | + stringStreamInfoMap.put(app + stream, streamInfo); | |
| 541 | 557 | } |
| 542 | 558 | } |
| 543 | 559 | } |
| 544 | 560 | } |
| 545 | 561 | if (stringStreamInfoMap.size() == 0) { |
| 546 | 562 | redisCatchStorage.removeStream(mediaServerId, "PULL"); |
| 547 | - }else { | |
| 563 | + } else { | |
| 548 | 564 | for (String key : stringStreamInfoMap.keySet()) { |
| 549 | 565 | StreamInfo streamInfo = stringStreamInfoMap.get(key); |
| 550 | 566 | if (stringStreamInfoMap.get(streamInfo.getApp() + streamInfo.getStream()) == null) { |
| ... | ... | @@ -575,7 +591,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 575 | 591 | |
| 576 | 592 | List<MediaServerItem> all = mediaServerService.getAllOnline(); |
| 577 | 593 | |
| 578 | - if (CollectionUtils.isEmpty(all)){ | |
| 594 | + if (CollectionUtils.isEmpty(all)) { | |
| 579 | 595 | return; |
| 580 | 596 | } |
| 581 | 597 | |
| ... | ... | @@ -583,7 +599,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 583 | 599 | |
| 584 | 600 | List<StreamProxyItem> list = videoManagerStorager.getStreamProxyListForEnable(true); |
| 585 | 601 | |
| 586 | - if (CollectionUtils.isEmpty(list)){ | |
| 602 | + if (CollectionUtils.isEmpty(list)) { | |
| 587 | 603 | return; |
| 588 | 604 | } |
| 589 | 605 | |
| ... | ... | @@ -594,7 +610,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 594 | 610 | // TODO 支持其他 schema |
| 595 | 611 | JSONObject mediaInfo = zlmresTfulUtils.isMediaOnline(mediaServerItem, streamProxyItem.getApp(), streamProxyItem.getStream(), "rtsp"); |
| 596 | 612 | |
| 597 | - if (mediaInfo == null){ | |
| 613 | + if (mediaInfo == null) { | |
| 598 | 614 | streamProxyItem.setStatus(false); |
| 599 | 615 | } else { |
| 600 | 616 | if (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")) { | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/StremProxyService1078Impl.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.service.impl; | |
| 2 | + | |
| 3 | +import com.genersoft.iot.vmp.service.StremProxyService1078; | |
| 4 | +import com.genersoft.iot.vmp.vmanager.jt1078.platform.ben.HttpClientPostEntity; | |
| 5 | +import com.genersoft.iot.vmp.vmanager.jt1078.platform.config.Jt1078ConfigBean; | |
| 6 | +import com.genersoft.iot.vmp.vmanager.jt1078.platform.handler.HttpClientUtil; | |
| 7 | +import org.apache.commons.collections4.CollectionUtils; | |
| 8 | +import org.apache.commons.lang3.StringUtils; | |
| 9 | +import org.slf4j.Logger; | |
| 10 | +import org.slf4j.LoggerFactory; | |
| 11 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 12 | +import org.springframework.data.redis.core.RedisTemplate; | |
| 13 | +import org.springframework.stereotype.Service; | |
| 14 | +import org.springframework.web.bind.annotation.PathVariable; | |
| 15 | + | |
| 16 | +import java.io.IOException; | |
| 17 | +import java.net.URISyntaxException; | |
| 18 | +import java.util.HashMap; | |
| 19 | +import java.util.List; | |
| 20 | +import java.util.Map; | |
| 21 | +import java.util.Objects; | |
| 22 | +import java.util.concurrent.TimeUnit; | |
| 23 | + | |
| 24 | +@Service | |
| 25 | +public class StremProxyService1078Impl implements StremProxyService1078 { | |
| 26 | + | |
| 27 | + @Autowired | |
| 28 | + private Jt1078ConfigBean jt1078ConfigBean; | |
| 29 | + | |
| 30 | + @Autowired | |
| 31 | + private HttpClientUtil httpClientUtil; | |
| 32 | + @Autowired | |
| 33 | + private RedisTemplate<Object, Object> redisTemplate; | |
| 34 | + | |
| 35 | + private static final Logger log = LoggerFactory.getLogger(StremProxyService1078Impl.class); | |
| 36 | + | |
| 37 | + | |
| 38 | + @Override | |
| 39 | + public Map<String, Object> sendIORequestStop(String sim, String channel, String stream, Integer port, Integer httpPort) { | |
| 40 | + Map<String, Object> resultMap = new HashMap<>(); | |
| 41 | + if (StringUtils.isBlank(sim)) { | |
| 42 | + resultMap.put("code", "-100"); | |
| 43 | + resultMap.put("message", "sim 不能为空"); | |
| 44 | + | |
| 45 | + return resultMap; | |
| 46 | + } | |
| 47 | + | |
| 48 | + if (StringUtils.isBlank(channel)) { | |
| 49 | + resultMap.put("code", "-100"); | |
| 50 | + resultMap.put("message", "channel 不能为空"); | |
| 51 | + | |
| 52 | + return resultMap; | |
| 53 | + } | |
| 54 | + | |
| 55 | + String msg = jt1078ConfigBean.formatMessageStop(sim, channel); | |
| 56 | + | |
| 57 | + | |
| 58 | + String url = null; | |
| 59 | + try { | |
| 60 | + url = StringUtils.replace(this.jt1078ConfigBean.getJt1078Url(), "{0}", this.jt1078ConfigBean.getJt1078SendPort()); | |
| 61 | + HttpClientPostEntity entity = httpClientUtil.doPost(url, msg, null); | |
| 62 | + | |
| 63 | + url = jt1078ConfigBean.formatStopPushURL(stream, port, httpPort); | |
| 64 | + httpClientUtil.doGet(url, null); | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + if (Objects.isNull(entity)) { | |
| 69 | + log.info("HttpClientPostEntity is null"); | |
| 70 | + } else { | |
| 71 | + log.info(entity.getResultStr()); | |
| 72 | + } | |
| 73 | + | |
| 74 | + | |
| 75 | + resultMap.put("code", "1"); | |
| 76 | + resultMap.put("message", "OK"); | |
| 77 | + | |
| 78 | + return resultMap; | |
| 79 | + } catch (URISyntaxException | IOException e) { | |
| 80 | + log.error("发送停止推流指令异常;[{}],[{}]", url, msg, e); | |
| 81 | + | |
| 82 | + resultMap.put("code", "-20"); | |
| 83 | + resultMap.put("message", "发送停止推流指令异常"); | |
| 84 | + return resultMap; | |
| 85 | + } | |
| 86 | + } | |
| 87 | + | |
| 88 | + @Override | |
| 89 | + public Map<String, Object> sendIORequestStop(String stream) { | |
| 90 | + String sim = StringUtils.substringBefore(stream, "-"); | |
| 91 | + String channel = StringUtils.substringAfterLast(stream, "-"); | |
| 92 | + | |
| 93 | + Object port = this.redisTemplate.opsForValue().get("tag:history:port:" + stream); | |
| 94 | + Object httpPort = this.redisTemplate.opsForValue().get("tag:history:httpPort:" + stream); | |
| 95 | + | |
| 96 | + return sendIORequestStop(sim, channel, stream, (Integer) port, (Integer) httpPort); | |
| 97 | + } | |
| 98 | +} | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/bean/StreamContent.java
src/main/java/com/genersoft/iot/vmp/vmanager/jt1078/platform/Jt1078OfCarController.java
| 1 | +// | |
| 2 | +// Source code recreated from a .class file by IntelliJ IDEA | |
| 3 | +// (powered by FernFlower decompiler) | |
| 4 | +// | |
| 5 | + | |
| 1 | 6 | package com.genersoft.iot.vmp.vmanager.jt1078.platform; |
| 2 | 7 | |
| 3 | 8 | import com.alibaba.fastjson2.JSON; |
| 9 | +import com.alibaba.fastjson2.JSONArray; | |
| 4 | 10 | import com.alibaba.fastjson2.JSONException; |
| 11 | +import com.alibaba.fastjson2.JSONObject; | |
| 5 | 12 | import com.genersoft.iot.vmp.conf.MediaConfig; |
| 6 | -import com.genersoft.iot.vmp.conf.UserSetting; | |
| 7 | -import com.genersoft.iot.vmp.conf.security.SecurityUtils; | |
| 13 | +import com.genersoft.iot.vmp.conf.StreamProxyTask; | |
| 14 | +import com.genersoft.iot.vmp.conf.exception.ControllerException; | |
| 8 | 15 | import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; |
| 9 | 16 | import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; |
| 10 | 17 | import com.genersoft.iot.vmp.service.IStreamPushService; |
| 18 | +import com.genersoft.iot.vmp.service.StremProxyService1078; | |
| 11 | 19 | import com.genersoft.iot.vmp.vmanager.bean.StreamContent; |
| 12 | 20 | import com.genersoft.iot.vmp.vmanager.jt1078.platform.ben.HttpClientPostEntity; |
| 13 | 21 | import com.genersoft.iot.vmp.vmanager.jt1078.platform.ben.TestEntity; |
| ... | ... | @@ -15,52 +23,51 @@ import com.genersoft.iot.vmp.vmanager.jt1078.platform.config.Jt1078ConfigBean; |
| 15 | 23 | import com.genersoft.iot.vmp.vmanager.jt1078.platform.config.RtspConfigBean; |
| 16 | 24 | import com.genersoft.iot.vmp.vmanager.jt1078.platform.config.TuohuaConfigBean; |
| 17 | 25 | import com.genersoft.iot.vmp.vmanager.jt1078.platform.handler.HttpClientUtil; |
| 18 | - | |
| 19 | 26 | import com.genersoft.iot.vmp.vmanager.streamProxy.StreamProxyController; |
| 20 | 27 | import com.genersoft.iot.vmp.vmanager.streamPush.StreamPushController; |
| 21 | -import com.sun.jna.platform.win32.Rasapi32Util; | |
| 22 | -import com.xiaoleilu.hutool.crypto.SecureUtil; | |
| 23 | -import com.xiaoleilu.hutool.crypto.asymmetric.KeyType; | |
| 24 | -import com.xiaoleilu.hutool.crypto.asymmetric.RSA; | |
| 28 | + | |
| 29 | +import java.io.ByteArrayOutputStream; | |
| 30 | +import java.io.IOException; | |
| 31 | +import java.net.URISyntaxException; | |
| 32 | +import java.security.Key; | |
| 33 | +import java.security.KeyFactory; | |
| 34 | +import java.security.spec.X509EncodedKeySpec; | |
| 35 | +import java.text.MessageFormat; | |
| 36 | +import java.util.ArrayList; | |
| 37 | +import java.util.Date; | |
| 38 | +import java.util.HashMap; | |
| 39 | +import java.util.Iterator; | |
| 40 | +import java.util.List; | |
| 41 | +import java.util.Map; | |
| 42 | +import java.util.Objects; | |
| 43 | +import java.util.concurrent.TimeUnit; | |
| 44 | +import javax.crypto.Cipher; | |
| 45 | +import javax.servlet.http.HttpServletRequest; | |
| 46 | + | |
| 25 | 47 | import org.apache.commons.collections4.CollectionUtils; |
| 48 | +import org.apache.commons.collections4.MapUtils; | |
| 26 | 49 | import org.apache.commons.lang3.RandomUtils; |
| 27 | 50 | import org.apache.commons.lang3.StringUtils; |
| 28 | - | |
| 29 | 51 | import org.apache.http.client.CookieStore; |
| 30 | - | |
| 31 | 52 | import org.apache.http.cookie.Cookie; |
| 32 | -import org.apache.logging.log4j.util.Base64Util; | |
| 33 | 53 | import org.jetbrains.annotations.Nullable; |
| 34 | 54 | import org.slf4j.Logger; |
| 35 | 55 | import org.slf4j.LoggerFactory; |
| 36 | 56 | import org.springframework.beans.factory.annotation.Autowired; |
| 57 | +import org.springframework.beans.factory.annotation.Value; | |
| 37 | 58 | import org.springframework.data.redis.core.RedisTemplate; |
| 38 | 59 | import org.springframework.util.Base64Utils; |
| 39 | -import org.springframework.web.bind.annotation.*; | |
| 60 | +import org.springframework.web.bind.annotation.GetMapping; | |
| 61 | +import org.springframework.web.bind.annotation.PathVariable; | |
| 62 | +import org.springframework.web.bind.annotation.PostMapping; | |
| 63 | +import org.springframework.web.bind.annotation.RequestBody; | |
| 64 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 65 | +import org.springframework.web.bind.annotation.RestController; | |
| 40 | 66 | |
| 41 | -import javax.crypto.Cipher; | |
| 42 | -import javax.servlet.http.HttpServletRequest; | |
| 43 | -import javax.xml.bind.DatatypeConverter; | |
| 44 | -import java.io.ByteArrayOutputStream; | |
| 45 | -import java.io.IOException; | |
| 46 | -import java.net.URISyntaxException; | |
| 47 | -import java.security.*; | |
| 48 | -import java.security.spec.InvalidKeySpecException; | |
| 49 | -import java.security.spec.X509EncodedKeySpec; | |
| 50 | -import java.text.MessageFormat; | |
| 51 | -import java.util.*; | |
| 52 | -import java.util.concurrent.TimeUnit; | |
| 53 | - | |
| 54 | -/** | |
| 55 | - * @author liujun | |
| 56 | - * @date 2024年10月21日 14:12 | |
| 57 | - */ | |
| 58 | 67 | @RestController |
| 59 | -@RequestMapping("/api/jt1078/query") | |
| 68 | +@RequestMapping({"/api/jt1078/query"}) | |
| 60 | 69 | public class Jt1078OfCarController { |
| 61 | 70 | private static final Logger log = LoggerFactory.getLogger(Jt1078OfCarController.class); |
| 62 | - | |
| 63 | - | |
| 64 | 71 | @Autowired |
| 65 | 72 | private HttpClientUtil httpClientUtil; |
| 66 | 73 | @Autowired |
| ... | ... | @@ -75,478 +82,500 @@ public class Jt1078OfCarController { |
| 75 | 82 | private StreamPushController streamPushController; |
| 76 | 83 | @Autowired |
| 77 | 84 | private StreamProxyController streamProxyController; |
| 78 | - | |
| 79 | 85 | @Autowired |
| 80 | 86 | private IStreamPushService streamPushService; |
| 81 | - | |
| 82 | 87 | private String jsessionid = null; |
| 83 | - | |
| 84 | 88 | @Autowired |
| 85 | 89 | private RedisTemplate<Object, Object> redisTemplate; |
| 86 | - | |
| 87 | - | |
| 90 | + @Autowired | |
| 91 | + private StremProxyService1078 stremProxyService1078; | |
| 88 | 92 | private static final long TIME_COUNT = 300000L; |
| 93 | + private Date tokenDate; | |
| 89 | 94 | |
| 95 | + @Value("${spring.profiles.active}") | |
| 96 | + private String profilesActive; | |
| 90 | 97 | |
| 91 | - private Date tokenDate; | |
| 92 | 98 | |
| 99 | + public Jt1078OfCarController() { | |
| 100 | + } | |
| 93 | 101 | |
| 94 | - @GetMapping("/company/tree") | |
| 102 | + @GetMapping({"/company/tree"}) | |
| 95 | 103 | public Map<String, Object> requestTreeOfCompany() { |
| 96 | - Map<String, Object> resultMap = new HashMap<>(); | |
| 104 | + Map<String, Object> resultMap = new HashMap(); | |
| 105 | + | |
| 97 | 106 | try { |
| 98 | 107 | resultMap.put("code", "1"); |
| 99 | - | |
| 100 | - List<HashMap<String, Object>> compList = new ArrayList<>(); | |
| 101 | - compList.add(tuohuaConfigBean.combationTree("100", "company1", "100", false, "新城市公交", "100", false, "span><img src='/metronic_v4.5.4/layui/icon/company1.png' class ='imageIcon' /></span><span>新城市公交</span>", | |
| 102 | - "<span><img src='/metronic_v4.5.4/layui/icon/company1.png' class ='imageIcon' /></span><span>浦东公交</span>", 2)); | |
| 103 | - | |
| 108 | + List<HashMap<String, Object>> compList = new ArrayList(); | |
| 109 | + compList.add(this.tuohuaConfigBean.combationTree("100", "company1", "100", false, "新城市公交", "100", false, "span><img src='/metronic_v4.5.4/layui/icon/company1.png' class ='imageIcon' /></span><span>新城市公交</span>", "<span><img src='/metronic_v4.5.4/layui/icon/company1.png' class ='imageIcon' /></span><span>浦东公交</span>", 2)); | |
| 104 | 110 | resultMap.put("code", "1"); |
| 105 | 111 | resultMap.put("result", compList); |
| 106 | - } catch (JSONException e) { | |
| 112 | + } catch (JSONException var3) { | |
| 107 | 113 | resultMap.put("code", "-100"); |
| 108 | - resultMap.put("message", "请求错误,请联系管理员"); | |
| 109 | - | |
| 114 | + resultMap.put("msg", "请求错误,请联系管理员"); | |
| 110 | 115 | } |
| 111 | 116 | |
| 112 | 117 | return resultMap; |
| 113 | 118 | } |
| 114 | 119 | |
| 115 | - @GetMapping("/car/tree/{companyId}") | |
| 120 | + @GetMapping({"/car/tree/{companyId}"}) | |
| 116 | 121 | public Map<String, Object> requestTreeOfCarByCompanyId(@PathVariable String companyId) { |
| 117 | - Map<String, Object> resultMap = new HashMap<>(); | |
| 122 | + Map<String, Object> resultMap = new HashMap(); | |
| 123 | + | |
| 118 | 124 | try { |
| 119 | - List<HashMap<String, Object>> linesCars = tuohuaConfigBean.requestOfLineAndCarAndCombationTree(httpClientUtil, companyId); | |
| 125 | + List<HashMap<String, Object>> linesCars = this.tuohuaConfigBean.requestOfLineAndCarAndCombationTree(this.httpClientUtil, companyId); | |
| 120 | 126 | resultMap.put("result", linesCars); |
| 121 | 127 | resultMap.put("code", "1"); |
| 122 | - } catch (Exception e) { | |
| 128 | + } catch (Exception var4) { | |
| 123 | 129 | resultMap.put("code", "-100"); |
| 124 | - resultMap.put("message", "请求错误,请联系管理员"); | |
| 130 | + resultMap.put("msg", "请求错误,请联系管理员"); | |
| 125 | 131 | } |
| 126 | 132 | |
| 127 | 133 | return resultMap; |
| 128 | 134 | } |
| 129 | 135 | |
| 130 | - @GetMapping("/car/sim/{zbh}") | |
| 136 | + @GetMapping({"/car/sim/{zbh}"}) | |
| 131 | 137 | public Map<String, Object> requestSimple(@PathVariable String zbh) { |
| 132 | - Map<String, Object> resultMap = new HashMap<>(); | |
| 138 | + Map<String, Object> resultMap = new HashMap(); | |
| 139 | + | |
| 133 | 140 | try { |
| 134 | - if (cookieTimeOut()) { | |
| 135 | - requestToken(); | |
| 141 | + if (this.cookieTimeOut()) { | |
| 142 | + this.requestToken(); | |
| 136 | 143 | } |
| 137 | - String url = MessageFormat.format(tuohuaConfigBean.getSimURL(), zbh); | |
| 138 | - HttpClientPostEntity clientPostEntity = httpClientUtil.doGet(url, jsessionid); | |
| 144 | + | |
| 145 | + String url = MessageFormat.format(this.tuohuaConfigBean.getSimURL(), zbh); | |
| 146 | + HttpClientPostEntity clientPostEntity = this.httpClientUtil.doGet(url, this.jsessionid); | |
| 139 | 147 | if (Objects.isNull(clientPostEntity)) { |
| 140 | 148 | resultMap.put("code", "-1"); |
| 141 | - resultMap.put("message", "请求错误,请联系管理员"); | |
| 149 | + resultMap.put("msg", "请求错误,请联系管理员"); | |
| 150 | + return resultMap; | |
| 151 | + } else { | |
| 152 | + HashMap<String, Object> hashMap = (HashMap) JSON.parseObject(clientPostEntity.getResultStr(), HashMap.class); | |
| 153 | + resultMap.put("code", "1"); | |
| 154 | + resultMap.put("result", hashMap.get("sim")); | |
| 142 | 155 | return resultMap; |
| 143 | 156 | } |
| 144 | - | |
| 145 | - HashMap<String, Object> hashMap = JSON.parseObject(clientPostEntity.getResultStr(), HashMap.class); | |
| 146 | - resultMap.put("code", "1"); | |
| 147 | - resultMap.put("result", hashMap.get("sim")); | |
| 148 | -// resultMap.put("result", JSON.parseArray(clientPostEntity.getResultStr(),HashMap.class)); | |
| 149 | - return resultMap; | |
| 150 | - } catch (URISyntaxException | IOException | JSONException e) { | |
| 157 | + } catch (IOException | JSONException | URISyntaxException var6) { | |
| 158 | + Exception e = var6; | |
| 151 | 159 | log.error("请求token异常", e); |
| 152 | 160 | resultMap.put("code", "-100"); |
| 153 | - resultMap.put("message", "请求错误,请联系管理员"); | |
| 154 | - jsessionid = null; | |
| 161 | + resultMap.put("msg", "请求错误,请联系管理员"); | |
| 162 | + this.jsessionid = null; | |
| 163 | + return resultMap; | |
| 155 | 164 | } |
| 156 | - return resultMap; | |
| 157 | 165 | } |
| 158 | 166 | |
| 159 | - @GetMapping("/send/request/io/{sim}/{channel}") | |
| 167 | + @GetMapping({"/send/request/io/{sim}/{channel}"}) | |
| 160 | 168 | public Map<String, Object> sendIORequest(@PathVariable String sim, @PathVariable String channel) { |
| 161 | - Map<String, Object> resultMap = new HashMap<>(); | |
| 169 | + Map<String, Object> resultMap = new HashMap(); | |
| 162 | 170 | if (StringUtils.isBlank(sim)) { |
| 163 | 171 | resultMap.put("code", "-100"); |
| 164 | - resultMap.put("message", "sim 不能为空"); | |
| 165 | - | |
| 172 | + resultMap.put("msg", "sim 不能为空"); | |
| 166 | 173 | return resultMap; |
| 167 | - } | |
| 168 | - | |
| 169 | - if (StringUtils.isBlank(channel)) { | |
| 174 | + } else if (StringUtils.isBlank(channel)) { | |
| 170 | 175 | resultMap.put("code", "-100"); |
| 171 | - resultMap.put("message", "channel 不能为空"); | |
| 172 | - | |
| 176 | + resultMap.put("msg", "channel 不能为空"); | |
| 173 | 177 | return resultMap; |
| 174 | - } | |
| 175 | - String msg = null; | |
| 176 | - | |
| 177 | - String stream = StringUtils.join(sim, "-", channel); | |
| 178 | - String url = StringUtils.replace(jt1078ConfigBean.getJt1078Url(), "{0}", jt1078ConfigBean.getJt1078SendPort()); | |
| 179 | - try { | |
| 180 | - StreamContent streamContent = getStreamContentPlayURL(StringUtils.join(stream)); | |
| 181 | - if (Objects.isNull(streamContent) || StringUtils.isBlank(streamContent.getWs_flv())) { | |
| 182 | - //List<StreamPushItem> streamPushItems = streamPushService.getPushList(StringUtils.join(sim, "-", channel)); | |
| 183 | - // int count = CollectionUtils.size(streamPushItems); | |
| 184 | - // if (count == 0) { | |
| 185 | - HttpClientPostEntity entity = createServerLister(stream); | |
| 186 | - if (Objects.isNull(entity)) { | |
| 187 | - resultMap.put("code", "-20"); | |
| 188 | - resultMap.put("message", "新建链接错误,请稍后再试"); | |
| 189 | - return resultMap; | |
| 190 | - } | |
| 191 | - | |
| 192 | - resultMap.put("port", entity.getPort()); | |
| 193 | - resultMap.put("httpPort", entity.getHttpPort()); | |
| 194 | - resultMap.put("stream", stream); | |
| 178 | + } else { | |
| 179 | + String msg = null; | |
| 180 | + String stream = StringUtils.join(new String[]{sim, "-", channel}); | |
| 181 | + String url = StringUtils.replace(this.jt1078ConfigBean.getJt1078Url(), "{0}", this.jt1078ConfigBean.getJt1078SendPort()); | |
| 182 | + | |
| 183 | + try { | |
| 184 | + StreamContent streamContent = this.getStreamContentPlayURL(StringUtils.join(new String[]{stream})); | |
| 185 | + if (Objects.isNull(streamContent) || StringUtils.isBlank(streamContent.getWs_flv())) { | |
| 186 | + HttpClientPostEntity entity = this.createServerLister(stream); | |
| 187 | + if (Objects.isNull(entity)) { | |
| 188 | + resultMap.put("code", "-20"); | |
| 189 | + resultMap.put("msg", "新建链接错误,请稍后再试"); | |
| 190 | + | |
| 191 | + return resultMap; | |
| 192 | + } | |
| 195 | 193 | |
| 196 | - redisTemplate.opsForValue().set("tag:history:port:" + stream, entity.getPort(), 2, TimeUnit.DAYS); | |
| 197 | - redisTemplate.opsForValue().set("tag:history:httpPort:" + stream, entity.getHttpPort(), 2, TimeUnit.DAYS); | |
| 198 | - redisTemplate.opsForValue().set("tag:history:httpPort:time:" + stream, new Date().getTime(), 1800, TimeUnit.SECONDS); | |
| 194 | + resultMap.put("port", entity.getPort()); | |
| 195 | + resultMap.put("httpPort", entity.getHttpPort()); | |
| 196 | + resultMap.put("stream", stream); | |
| 197 | + this.redisTemplate.opsForValue().set("tag:history:port:" + stream, entity.getPort(), 2L, TimeUnit.DAYS); | |
| 198 | + this.redisTemplate.opsForValue().set("tag:history:httpPort:" + stream, entity.getHttpPort(), 2L, TimeUnit.DAYS); | |
| 199 | + this.redisTemplate.opsForValue().set("tag:history:httpPort:time:" + stream, (new Date()).getTime(), StreamProxyTask.TIME_OUT, TimeUnit.SECONDS); | |
| 200 | + msg = this.jt1078ConfigBean.formatMessageId(sim, channel, this.rtspConfigBean, entity.getPort()); | |
| 201 | + entity = this.httpClientUtil.doPost(url, msg, (String) null); | |
| 202 | + Map<String, Object> resultMap1 = this.chooseEntity(entity, url, false); | |
| 203 | + if (Objects.nonNull(resultMap1)) { | |
| 204 | + return resultMap1; | |
| 205 | + } | |
| 199 | 206 | |
| 200 | - msg = jt1078ConfigBean.formatMessageId(sim, channel, rtspConfigBean, entity.getPort()); | |
| 207 | + log.info(entity.getResultStr()); | |
| 208 | + Thread.sleep(2000L); | |
| 209 | + this.createStreamProxy(sim + "-" + channel); | |
| 210 | + Map<String, Object> resultMap2 = this.getStreamContent(stream); | |
| 211 | + if (Objects.nonNull(resultMap2) && Objects.nonNull(resultMap2.get("code")) && !StringUtils.equals(resultMap2.get("code").toString(), "1")) { | |
| 212 | + return resultMap2; | |
| 213 | + } | |
| 201 | 214 | |
| 202 | - entity = httpClientUtil.doPost(url, msg, null); | |
| 203 | -// Map<String, Object> resultMap1 = chooseEntity(entity); | |
| 204 | -// if (Objects.nonNull(resultMap1)) { | |
| 205 | -// return resultMap1; | |
| 206 | -// } | |
| 207 | - log.info(entity.getResultStr()); | |
| 208 | - createStreamProxy(sim + "-" + channel); | |
| 215 | + streamContent = (StreamContent) resultMap2.get("streamContent"); | |
| 216 | + }else{ | |
| 217 | + resultMap.put("port", redisTemplate.opsForValue().get("tag:history:port:"+stream)); | |
| 218 | + resultMap.put("httpPort", redisTemplate.opsForValue().get("tag:history:httpPort:"+stream)); | |
| 219 | + resultMap.put("stream", stream); | |
| 220 | + } | |
| 209 | 221 | |
| 210 | - streamContent = getStreamContent(stream); | |
| 211 | - } | |
| 212 | - resultMap.put("code", "1"); | |
| 213 | - resultMap.put("message", "OK"); | |
| 214 | - resultMap.put("data", streamContent); | |
| 215 | 222 | |
| 216 | - return resultMap; | |
| 217 | - } catch (URISyntaxException | IOException | InterruptedException e) { | |
| 218 | - log.error("发送推流指令异常;[{}],[{}]", url, msg, e); | |
| 219 | 223 | |
| 220 | - resultMap.put("code", "-20"); | |
| 221 | - resultMap.put("message", "发送推流指令异常"); | |
| 222 | 224 | |
| 223 | - return resultMap; | |
| 225 | + resultMap.put("code", "1"); | |
| 226 | + resultMap.put("message", "OK"); | |
| 227 | + resultMap.put("data", streamContent); | |
| 228 | + return resultMap; | |
| 229 | + } catch (IOException | InterruptedException | URISyntaxException var11) { | |
| 230 | + Exception e = var11; | |
| 231 | + log.error("发送推流指令异常;[{}],[{}]", new Object[]{url, msg, e}); | |
| 232 | + resultMap.put("code", "-20"); | |
| 233 | + resultMap.put("msg", "发送推流指令异常"); | |
| 234 | + return resultMap; | |
| 235 | + } | |
| 224 | 236 | } |
| 225 | 237 | } |
| 226 | 238 | |
| 227 | - | |
| 228 | - @GetMapping("/send/stop/io/{sim}/{channel}/{stream}/{port}/{httpPort}") | |
| 239 | + @GetMapping({"/send/stop/io/{sim}/{channel}/{stream}/{port}/{httpPort}"}) | |
| 229 | 240 | public Map<String, Object> sendIORequestStop(@PathVariable String sim, @PathVariable String channel, @PathVariable String stream, @PathVariable Integer port, @PathVariable Integer httpPort) { |
| 230 | - Map<String, Object> resultMap = new HashMap<>(); | |
| 241 | + Map<String, Object> resultMap = new HashMap(); | |
| 231 | 242 | if (StringUtils.isBlank(sim)) { |
| 232 | 243 | resultMap.put("code", "-100"); |
| 233 | - resultMap.put("message", "sim 不能为空"); | |
| 234 | - | |
| 244 | + resultMap.put("msg", "sim 不能为空"); | |
| 235 | 245 | return resultMap; |
| 236 | - } | |
| 237 | - | |
| 238 | - if (StringUtils.isBlank(channel)) { | |
| 246 | + } else if (StringUtils.isBlank(channel)) { | |
| 239 | 247 | resultMap.put("code", "-100"); |
| 240 | - resultMap.put("message", "channel 不能为空"); | |
| 241 | - | |
| 248 | + resultMap.put("msg", "channel 不能为空"); | |
| 242 | 249 | return resultMap; |
| 243 | - } | |
| 244 | - | |
| 245 | - String msg = jt1078ConfigBean.formatMessageStop(sim, channel); | |
| 246 | - | |
| 247 | - | |
| 248 | - String url = jt1078ConfigBean.formatStopPushURL(stream, port, httpPort); | |
| 249 | - try { | |
| 250 | - streamProxyController.del(stream,stream); | |
| 251 | - | |
| 252 | - httpClientUtil.doGet(url, null); | |
| 253 | - | |
| 254 | - url = StringUtils.replace(jt1078ConfigBean.getJt1078Url(), "{0}", jt1078ConfigBean.getStopSendPort()); | |
| 255 | - List<StreamPushItem> streamPushItems = streamPushService.getPushList(stream); | |
| 256 | - int count = CollectionUtils.size(streamPushItems); | |
| 257 | - for (int i = 0; i < count; i++) { | |
| 258 | - StreamPushItem item = streamPushItems.get(i); | |
| 250 | + } else { | |
| 251 | + Map<String, Object> resultMap1 = this.stremProxyService1078.sendIORequestStop(sim, channel, stream, port, httpPort); | |
| 252 | + if (Objects.nonNull(resultMap1) && Objects.nonNull(resultMap1.get("code")) && !StringUtils.equals(resultMap1.get("code").toString(), "1")) { | |
| 253 | + return resultMap1; | |
| 254 | + } else { | |
| 259 | 255 | try { |
| 260 | - streamPushService.stop(item.getApp(), item.getStream()); | |
| 261 | - } catch (Exception e) { | |
| 262 | - log.error("推流停止失败,[{}]", item, e); | |
| 263 | - } | |
| 264 | - | |
| 265 | - } | |
| 256 | + this.streamProxyController.del(stream, stream); | |
| 257 | + List<StreamPushItem> streamPushItems = this.streamPushService.getPushList(stream); | |
| 258 | + int count = CollectionUtils.size(streamPushItems); | |
| 259 | + | |
| 260 | + for (int i = 0; i < count; ++i) { | |
| 261 | + StreamPushItem item = streamPushItems.get(i); | |
| 262 | + | |
| 263 | + try { | |
| 264 | + this.streamPushService.stop(item.getApp(), item.getStream()); | |
| 265 | + } catch (Exception var13) { | |
| 266 | + Exception e = var13; | |
| 267 | + log.error("推流停止失败,[{}]", item, e); | |
| 268 | + } | |
| 269 | + } | |
| 266 | 270 | |
| 267 | - HttpClientPostEntity entity = httpClientUtil.doPost(url, msg, null); | |
| 268 | - if (Objects.isNull(entity)) { | |
| 269 | - log.info("HttpClientPostEntity is null"); | |
| 270 | - } else { | |
| 271 | - log.info(entity.getResultStr()); | |
| 271 | + resultMap.put("code", "1"); | |
| 272 | + resultMap.put("message", "OK"); | |
| 273 | + return resultMap; | |
| 274 | + } catch (Exception var14) { | |
| 275 | + resultMap.put("code", "-20"); | |
| 276 | + resultMap.put("msg", "发送停止推流指令异常"); | |
| 277 | + return resultMap; | |
| 278 | + } | |
| 272 | 279 | } |
| 273 | - | |
| 274 | - | |
| 275 | - resultMap.put("code", "1"); | |
| 276 | - resultMap.put("message", "OK"); | |
| 277 | - | |
| 278 | - return resultMap; | |
| 279 | - } catch (URISyntaxException | IOException e) { | |
| 280 | - log.error("发送停止推流指令异常;[{}],[{}]", url, msg, e); | |
| 281 | - | |
| 282 | - resultMap.put("code", "-20"); | |
| 283 | - resultMap.put("message", "发送停止推流指令异常"); | |
| 284 | - return resultMap; | |
| 285 | 280 | } |
| 286 | 281 | } |
| 287 | 282 | |
| 288 | - @GetMapping("/history/list/{sim}/{channel}/{startTime}/{endTime}") | |
| 283 | + @GetMapping({"/history/list/{sim}/{channel}/{startTime}/{endTime}"}) | |
| 289 | 284 | public Map<String, Object> historyListOfSim(@PathVariable String sim, @PathVariable String channel, @PathVariable String startTime, @PathVariable String endTime) { |
| 290 | - Map<String, Object> resultMap = new HashMap<>(); | |
| 285 | + Map<String, Object> resultMap = new HashMap(); | |
| 291 | 286 | if (StringUtils.isBlank(sim)) { |
| 292 | 287 | resultMap.put("code", "-100"); |
| 293 | - resultMap.put("message", "sim 不能为空"); | |
| 294 | - | |
| 288 | + resultMap.put("msg", "sim 不能为空"); | |
| 295 | 289 | return resultMap; |
| 296 | - } | |
| 297 | - | |
| 298 | - if (StringUtils.isBlank(channel)) { | |
| 290 | + } else if (StringUtils.isBlank(channel)) { | |
| 299 | 291 | resultMap.put("code", "-100"); |
| 300 | - resultMap.put("message", "channel 不能为空"); | |
| 301 | - | |
| 292 | + resultMap.put("msg", "channel 不能为空"); | |
| 302 | 293 | return resultMap; |
| 303 | - } | |
| 304 | - | |
| 305 | - if (StringUtils.isBlank(startTime)) { | |
| 294 | + } else if (StringUtils.isBlank(startTime)) { | |
| 306 | 295 | resultMap.put("code", "-100"); |
| 307 | - resultMap.put("message", "开始时间不能为空"); | |
| 308 | - | |
| 296 | + resultMap.put("msg", "开始时间不能为空"); | |
| 309 | 297 | return resultMap; |
| 310 | - } | |
| 311 | - | |
| 312 | - if (StringUtils.isBlank(endTime)) { | |
| 298 | + } else if (StringUtils.isBlank(endTime)) { | |
| 313 | 299 | resultMap.put("code", "-100"); |
| 314 | - resultMap.put("message", "结束时间不能为空"); | |
| 315 | - | |
| 300 | + resultMap.put("msg", "结束时间不能为空"); | |
| 316 | 301 | return resultMap; |
| 317 | - } | |
| 318 | - | |
| 319 | - String url = StringUtils.replace(jt1078ConfigBean.getJt1078Url(), "{0}", jt1078ConfigBean.getHistoryListPort()); | |
| 320 | - startTime = formatTime(startTime); | |
| 321 | - endTime = formatTime(endTime); | |
| 322 | - | |
| 323 | - String msg = jt1078ConfigBean.formatMessageHistoryListRTSP(sim, channel, startTime, endTime); | |
| 324 | - | |
| 325 | - try { | |
| 302 | + } else { | |
| 303 | + String url = StringUtils.replace(this.jt1078ConfigBean.getJt1078Url(), "{0}", this.jt1078ConfigBean.getHistoryListPort()); | |
| 304 | + startTime = this.formatTime(startTime); | |
| 305 | + endTime = this.formatTime(endTime); | |
| 306 | + String msg = this.jt1078ConfigBean.formatMessageHistoryListRTSP(sim, channel, startTime, endTime); | |
| 326 | 307 | |
| 327 | - HttpClientPostEntity entity = httpClientUtil.doPost(url, msg, null); | |
| 308 | + try { | |
| 309 | + HttpClientPostEntity entity = this.httpClientUtil.doPost(url, msg, (String) null); | |
| 310 | + if (Objects.isNull(entity)) { | |
| 311 | + resultMap.put("code", "-1"); | |
| 312 | + resultMap.put("msg", "请求历史视频列表错误,请联系管理员"); | |
| 313 | + return resultMap; | |
| 314 | + } else { | |
| 315 | + Map<String, Object> resultMap1 = this.chooseEntity(entity, url, true); | |
| 316 | + if (Objects.nonNull(resultMap1)) { | |
| 317 | + return resultMap1; | |
| 318 | + } else { | |
| 319 | + HashMap<String, Object> hashMap = (HashMap) JSON.parseObject(entity.getResultStr(), HashMap.class); | |
| 320 | + if (MapUtils.isNotEmpty(hashMap) && Objects.nonNull(hashMap.get("data"))) { | |
| 321 | + JSONObject dataJO = (JSONObject) hashMap.get("data"); | |
| 322 | + if (Objects.nonNull(dataJO.get("items"))) { | |
| 323 | + JSONArray jsonArray = (JSONArray) dataJO.get("items"); | |
| 324 | + for (Object o : jsonArray) { | |
| 325 | + JSONObject jo = (JSONObject) o; | |
| 326 | + String startTimeStr = jo.getString("startTime"); | |
| 327 | + if(StringUtils.isEmpty(startTimeStr)){ | |
| 328 | + startTimeStr = StringUtils.join(String.valueOf(System.currentTimeMillis()), "-", String.valueOf(RandomUtils.nextInt(1, 1000))); | |
| 329 | + }else{ | |
| 330 | + startTimeStr = StringUtils.replace(startTimeStr,"-",""); | |
| 331 | + startTimeStr = StringUtils.replace(startTimeStr,":",""); | |
| 332 | + startTimeStr = StringUtils.replace(startTimeStr," ",""); | |
| 333 | + } | |
| 334 | + String channelMapping = StringUtils.join(new String[]{sim, "-", startTimeStr, "-", channel}); | |
| 335 | + jo.put("channelMapping", channelMapping); | |
| 336 | + } | |
| 337 | + } | |
| 338 | + } | |
| 339 | + resultMap.put("code", "1"); | |
| 328 | 340 | |
| 329 | - if (Objects.isNull(entity)) { | |
| 330 | - resultMap.put("code", "-1"); | |
| 331 | - resultMap.put("message", "请求历史视频列表错误,请联系管理员"); | |
| 341 | + resultMap.put("obj", hashMap); | |
| 342 | + return resultMap; | |
| 343 | + } | |
| 344 | + } | |
| 345 | + } catch (URISyntaxException var11) { | |
| 346 | + URISyntaxException e = var11; | |
| 347 | + log.error("发送获取历史视频指令异常;[{}],[{}]", new Object[]{url, msg, e}); | |
| 348 | + resultMap.put("code", "-20"); | |
| 349 | + resultMap.put("msg", "发送获取历史视频指令异常"); | |
| 350 | + return resultMap; | |
| 351 | + } catch (IOException var12) { | |
| 352 | + IOException e = var12; | |
| 353 | + log.error("发送获取历史视频指令异常;[{}],[{}]", new Object[]{url, msg, e}); | |
| 354 | + resultMap.put("code", "-20"); | |
| 355 | + resultMap.put("msg", "发送获取历史视频指令异常"); | |
| 332 | 356 | return resultMap; |
| 333 | 357 | } |
| 334 | - | |
| 335 | - Map<String, Object> resultMap1 = chooseEntity(entity,url); | |
| 336 | - if (Objects.nonNull(resultMap1)) { | |
| 337 | - return resultMap1; | |
| 338 | - } | |
| 339 | - | |
| 340 | - HashMap<String, Object> hashMap = JSON.parseObject(entity.getResultStr(), HashMap.class); | |
| 341 | - resultMap.put("code", "1"); | |
| 342 | - resultMap.put("obj", hashMap); | |
| 343 | - | |
| 344 | - return resultMap; | |
| 345 | - } catch (URISyntaxException e) { | |
| 346 | - log.error("发送获取历史视频指令异常;[{}],[{}]", url, msg, e); | |
| 347 | - | |
| 348 | - resultMap.put("code", "-20"); | |
| 349 | - resultMap.put("message", "发送获取历史视频指令异常"); | |
| 350 | - return resultMap; | |
| 351 | - } catch (IOException e) { | |
| 352 | - log.error("发送获取历史视频指令异常;[{}],[{}]", url, msg, e); | |
| 353 | - | |
| 354 | - resultMap.put("code", "-20"); | |
| 355 | - resultMap.put("message", "发送获取历史视频指令异常"); | |
| 356 | - | |
| 357 | - return resultMap; | |
| 358 | 358 | } |
| 359 | 359 | } |
| 360 | 360 | |
| 361 | - | |
| 362 | - @GetMapping("/send/request/io/history/{sim}/{channel}/{startTime}/{endTime}") | |
| 363 | - public Map<String, Object> sendIORequestOfHistory(@PathVariable String sim, @PathVariable String channel, @PathVariable String startTime, @PathVariable String endTime) { | |
| 364 | - Map<String, Object> resultMap = new HashMap<>(); | |
| 361 | + @GetMapping({"/send/request/io/history/{sim}/{channel}/{startTime}/{endTime}/{channelMapping}"}) | |
| 362 | + public Map<String, Object> sendIORequestOfHistory(@PathVariable String sim, @PathVariable String channel, @PathVariable String startTime, @PathVariable String endTime, @PathVariable String channelMapping) { | |
| 363 | + Map<String, Object> resultMap = new HashMap(); | |
| 365 | 364 | if (StringUtils.isBlank(sim)) { |
| 366 | 365 | resultMap.put("code", "-100"); |
| 367 | - resultMap.put("message", "sim 不能为空"); | |
| 368 | - | |
| 366 | + resultMap.put("msg", "sim 不能为空"); | |
| 369 | 367 | return resultMap; |
| 370 | - } | |
| 371 | - | |
| 372 | - if (StringUtils.isBlank(channel)) { | |
| 368 | + } else if (StringUtils.isBlank(channel)) { | |
| 373 | 369 | resultMap.put("code", "-100"); |
| 374 | - resultMap.put("message", "channel 不能为空"); | |
| 375 | - | |
| 370 | + resultMap.put("msg", "channel 不能为空"); | |
| 376 | 371 | return resultMap; |
| 377 | - } | |
| 378 | - | |
| 379 | - if (StringUtils.isBlank(startTime)) { | |
| 372 | + } else if (StringUtils.isBlank(startTime)) { | |
| 380 | 373 | resultMap.put("code", "-100"); |
| 381 | - resultMap.put("message", "开始时间不能为空"); | |
| 382 | - | |
| 374 | + resultMap.put("msg", "开始时间不能为空"); | |
| 383 | 375 | return resultMap; |
| 384 | - } | |
| 385 | - | |
| 386 | - if (StringUtils.isBlank(endTime)) { | |
| 376 | + } else if (StringUtils.isBlank(endTime)) { | |
| 387 | 377 | resultMap.put("code", "-100"); |
| 388 | - resultMap.put("message", "结束时间不能为空"); | |
| 389 | - | |
| 378 | + resultMap.put("msg", "结束时间不能为空"); | |
| 390 | 379 | return resultMap; |
| 391 | - } | |
| 392 | - startTime = formatTime(startTime); | |
| 393 | - endTime = formatTime(endTime); | |
| 394 | - | |
| 395 | - String channelMapping = StringUtils.join(sim, "-", String.valueOf(System.currentTimeMillis()), "-", String.valueOf(RandomUtils.nextInt(1, 1000))); | |
| 396 | - String key = StringUtils.join(sim, "-", channel); | |
| 397 | - redisTemplate.opsForValue().set(key, channelMapping, 1, TimeUnit.HOURS); | |
| 398 | - | |
| 399 | - String msg = null; | |
| 400 | - | |
| 401 | - log.info("msg:{}", msg); | |
| 402 | - String url = StringUtils.replace(jt1078ConfigBean.getJt1078Url(), "{0}", jt1078ConfigBean.getPlayHistoryPort()); | |
| 403 | - | |
| 404 | - try { | |
| 405 | - HttpClientPostEntity entity = createServerLister(channelMapping); | |
| 406 | - if (Objects.isNull(entity)) { | |
| 407 | - resultMap.put("code", "-20"); | |
| 408 | - resultMap.put("message", "新建链接错误,请稍后再试"); | |
| 380 | + } else { | |
| 381 | + StreamContent streamContent = this.getStreamContentPlayURL(StringUtils.join(new String[]{channelMapping})); | |
| 382 | + if(Objects.nonNull(streamContent) && StringUtils.isNotEmpty(streamContent.getWs_flv())){ | |
| 383 | + resultMap.put("code", "1"); | |
| 384 | + log.info("StreamContent:[{}]", streamContent); | |
| 385 | + resultMap.put("data", streamContent); | |
| 386 | + | |
| 387 | + resultMap.put("port", redisTemplate.opsForValue().get("tag:history:port:"+channelMapping)); | |
| 388 | + resultMap.put("httpPort", redisTemplate.opsForValue().get("tag:history:httpPort:"+channelMapping)); | |
| 389 | + resultMap.put("stream", channelMapping); | |
| 409 | 390 | return resultMap; |
| 410 | 391 | } |
| 392 | + startTime = this.formatTime(startTime); | |
| 393 | + endTime = this.formatTime(endTime); | |
| 411 | 394 | |
| 412 | - Map<String, Object> resultMap1 = chooseEntity(entity,url); | |
| 413 | - if (Objects.nonNull(resultMap1)) { | |
| 414 | - return resultMap1; | |
| 415 | - } | |
| 416 | - | |
| 417 | - resultMap.put("stream", channelMapping); | |
| 418 | - resultMap.put("port", entity.getPort()); | |
| 419 | - resultMap.put("httpPort", entity.getHttpPort()); | |
| 420 | - | |
| 421 | - redisTemplate.opsForValue().set("tag:history:port:" + channelMapping, entity.getPort(), 2, TimeUnit.DAYS); | |
| 422 | - redisTemplate.opsForValue().set("tag:history:httpPort:" + channelMapping, entity.getHttpPort(), 2, TimeUnit.DAYS); | |
| 423 | - redisTemplate.opsForValue().set("tag:history:httpPort:time:" + channelMapping, new Date().getTime(), 1800, TimeUnit.SECONDS); | |
| 424 | - | |
| 425 | - msg = jt1078ConfigBean.formatMessageHistoryPlayRTSP(sim, channel, startTime, endTime, rtspConfigBean, entity.getPort()); | |
| 426 | - boolean flag = false; | |
| 395 | + String key = StringUtils.join(new String[]{sim, "-", channel}); | |
| 396 | + this.redisTemplate.opsForValue().set(key, channelMapping, 1L, TimeUnit.HOURS); | |
| 397 | + String msg = null; | |
| 398 | + log.info("msg:{}", msg); | |
| 399 | + String url = StringUtils.replace(this.jt1078ConfigBean.getJt1078Url(), "{0}", this.jt1078ConfigBean.getPlayHistoryPort()); | |
| 427 | 400 | |
| 428 | - key = key + "-lock"; | |
| 429 | - int index = 0; | |
| 430 | - do { | |
| 431 | - index++; | |
| 401 | + try { | |
| 402 | + HttpClientPostEntity entity = this.createServerLister(channelMapping); | |
| 403 | + if (Objects.isNull(entity)) { | |
| 404 | + resultMap.put("code", "-20"); | |
| 405 | + resultMap.put("msg", "新建链接错误,请稍后再试"); | |
| 406 | + return resultMap; | |
| 407 | + } else { | |
| 408 | + this.chooseEntity(entity, url, false); | |
| 409 | + resultMap.put("stream", channelMapping); | |
| 410 | + resultMap.put("port", entity.getPort()); | |
| 411 | + resultMap.put("httpPort", entity.getHttpPort()); | |
| 412 | + this.redisTemplate.opsForValue().set("tag:history:port:" + channelMapping, entity.getPort(), 2L, TimeUnit.DAYS); | |
| 413 | + this.redisTemplate.opsForValue().set("tag:history:httpPort:" + channelMapping, entity.getHttpPort(), 2L, TimeUnit.DAYS); | |
| 414 | + this.redisTemplate.opsForValue().set("tag:history:httpPort:time:" + channelMapping, (new Date()).getTime(), StreamProxyTask.TIME_OUT, TimeUnit.SECONDS); | |
| 415 | + msg = this.jt1078ConfigBean.formatMessageHistoryPlayRTSP(sim, channel, startTime, endTime, this.rtspConfigBean, entity.getPort()); | |
| 432 | 416 | |
| 433 | - flag = redisTemplate.opsForValue().setIfAbsent(key, key, 100, TimeUnit.SECONDS); | |
| 434 | - if (flag) { | |
| 435 | 417 | log.info("获取推流"); |
| 436 | - entity = httpClientUtil.doPost(url, msg, null); | |
| 437 | - } | |
| 438 | - Thread.sleep(1000); | |
| 439 | - if (index > 100) { | |
| 440 | - break; | |
| 418 | + this.createStreamProxy(sim + "-" + channel); | |
| 419 | + entity = this.httpClientUtil.doPost(url, msg, (String) null); | |
| 420 | + Map<String, Object> resultMap2 = this.chooseEntity(entity, url, true); | |
| 421 | + if (Objects.nonNull(resultMap2)) { | |
| 422 | + return resultMap2; | |
| 423 | + } else { | |
| 424 | + log.info(entity.getResultStr()); | |
| 425 | + this.createStreamProxy(channelMapping); | |
| 426 | + resultMap.put("code", "1"); | |
| 427 | + Thread.sleep(2000L); | |
| 428 | + Map<String, Object> resultMap3 = this.getStreamContent(channelMapping); | |
| 429 | + if (Objects.nonNull(resultMap3) && Objects.nonNull(resultMap3.get("code")) && !StringUtils.equals(resultMap3.get("code").toString(), "1")) { | |
| 430 | + return resultMap3; | |
| 431 | + } else { | |
| 432 | + streamContent = (StreamContent) resultMap3.get("streamContent"); | |
| 433 | + if (Objects.isNull(streamContent)) { | |
| 434 | + resultMap.put("code", "-20"); | |
| 435 | + resultMap.put("msg", "新建链接错误,请稍后再试"); | |
| 436 | + return resultMap; | |
| 437 | + } else { | |
| 438 | + log.info("StreamContent:[{}]", streamContent); | |
| 439 | + resultMap.put("data", streamContent); | |
| 440 | + return resultMap; | |
| 441 | + } | |
| 442 | + } | |
| 443 | + } | |
| 441 | 444 | } |
| 442 | - } while (!flag); | |
| 443 | - | |
| 444 | - if (!flag) { | |
| 445 | + } catch (IOException | URISyntaxException var16) { | |
| 446 | + Exception e = var16; | |
| 447 | + log.error("发送推流指令异常;[{}],[{}]", new Object[]{url, msg, e}); | |
| 445 | 448 | resultMap.put("code", "-20"); |
| 446 | - resultMap.put("message", "发送推流指令错误,请稍后再试"); | |
| 449 | + resultMap.put("msg", "发送推流指令异常"); | |
| 447 | 450 | return resultMap; |
| 451 | + } catch (InterruptedException var17) { | |
| 452 | + InterruptedException e = var17; | |
| 453 | + throw new RuntimeException(e); | |
| 448 | 454 | } |
| 449 | - log.info(entity.getResultStr()); | |
| 450 | - createStreamProxy(channelMapping); | |
| 451 | - | |
| 452 | - resultMap.put("code", "1"); | |
| 453 | - resultMap.put("message", "OK"); | |
| 454 | - | |
| 455 | - Thread.sleep(10000); | |
| 456 | - | |
| 457 | - StreamContent streamContent = getStreamContent(channelMapping); | |
| 458 | - | |
| 459 | - log.info("StreamContent:[{}]", streamContent); | |
| 460 | - resultMap.put("data", streamContent); | |
| 461 | - | |
| 462 | - | |
| 463 | - return resultMap; | |
| 464 | - } catch (URISyntaxException | IOException e) { | |
| 465 | - log.error("发送推流指令异常;[{}],[{}]", url, msg, e); | |
| 466 | - | |
| 467 | - resultMap.put("code", "-20"); | |
| 468 | - resultMap.put("message", "发送推流指令异常"); | |
| 469 | - | |
| 470 | - return resultMap; | |
| 471 | - } catch (InterruptedException e) { | |
| 472 | - throw new RuntimeException(e); | |
| 473 | 455 | } |
| 474 | 456 | } |
| 475 | 457 | |
| 458 | + public Map<> | |
| 476 | 459 | |
| 477 | - @PostMapping("/test") | |
| 460 | + @PostMapping({"/test"}) | |
| 478 | 461 | public String test(@RequestBody TestEntity test) { |
| 479 | - | |
| 480 | 462 | return "OK"; |
| 481 | 463 | } |
| 482 | 464 | |
| 483 | - @GetMapping("/test1") | |
| 465 | + @GetMapping({"/test1"}) | |
| 484 | 466 | public String test1(HttpServletRequest request) throws URISyntaxException, IOException { |
| 485 | - jsessionid = StringUtils.join("JSESSIONID=", request.getParameter("jsessionid")); | |
| 467 | + this.jsessionid = StringUtils.join(new String[]{"JSESSIONID=", request.getParameter("jsessionid")}); | |
| 486 | 468 | return "OK"; |
| 487 | 469 | } |
| 488 | 470 | |
| 489 | 471 | @Nullable |
| 490 | - private StreamContent getStreamContent(String stream) throws InterruptedException { | |
| 472 | + private Map<String, Object> getStreamContent(String stream) throws InterruptedException { | |
| 491 | 473 | StreamContent streamContent = null; |
| 474 | + Map<String, Object> datas = new HashMap(); | |
| 492 | 475 | int index = 0; |
| 493 | - do { | |
| 494 | - index++; | |
| 495 | - streamContent = getStreamContentPlayURL(stream); | |
| 496 | 476 | |
| 477 | + Integer countTimeOut = 0; | |
| 478 | + | |
| 479 | + do { | |
| 480 | + ++index; | |
| 481 | + streamContent = this.getStreamContentPlayURL(stream); | |
| 497 | 482 | if (Objects.nonNull(streamContent) && StringUtils.isNotEmpty(streamContent.getWs_flv())) { |
| 498 | 483 | break; |
| 499 | 484 | } |
| 500 | - Thread.sleep(100); | |
| 501 | - } while (index < 600); | |
| 485 | + | |
| 486 | + Object valObj = redisTemplate.opsForValue().get("stream:status:" + stream); | |
| 487 | + if (Objects.nonNull(valObj) && StringUtils.equals(valObj.toString(), "1")) { | |
| 488 | + StreamProxyItem streamProxyItem = streamProxyController.one("schedule",stream); | |
| 489 | + if(Objects.nonNull(streamProxyItem) && StringUtils.isNotEmpty(streamProxyItem.getApp())){ | |
| 490 | + try { | |
| 491 | + streamProxyController.start("schedule", stream); | |
| 492 | + } catch (Exception e) { | |
| 493 | + log.error(e.getMessage()); | |
| 494 | + } | |
| 495 | + }else{ | |
| 496 | + createStreamProxy(stream); | |
| 497 | + } | |
| 498 | + | |
| 499 | + | |
| 500 | + }else{ | |
| 501 | + Object val = this.redisTemplate.opsForValue().get("timeout:" + stream); | |
| 502 | + if (Objects.nonNull(val) && StringUtils.equals(val.toString(), "1")) { | |
| 503 | + | |
| 504 | + countTimeOut++; | |
| 505 | + try { | |
| 506 | + streamProxyController.start("schedule", stream); | |
| 507 | + } catch (Exception e) { | |
| 508 | + log.error(e.getMessage()); | |
| 509 | + } | |
| 510 | + } | |
| 511 | + } | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + Thread.sleep(1000L); | |
| 516 | + log.info("===============>" + index); | |
| 517 | + } while (index < 20); | |
| 518 | + | |
| 519 | + if (countTimeOut > 0) { | |
| 520 | + datas.put("code", "301"); | |
| 521 | + datas.put("msg", "获取摄像头视频数据失败,请稍后再试"); | |
| 522 | + return datas; | |
| 523 | + } | |
| 524 | + | |
| 525 | + log.info("===============>" + index); | |
| 526 | + if (Objects.isNull(streamContent)) { | |
| 527 | + streamContent = new StreamContent(); | |
| 528 | + streamContent.setWs_flv(StringUtils.replace(this.jt1078ConfigBean.getWs(), "{stream}", stream)); | |
| 529 | + streamContent.setWss_flv(StringUtils.replace(this.jt1078ConfigBean.getWss(), "{stream}", stream)); | |
| 530 | + } | |
| 502 | 531 | |
| 503 | 532 | log.info("StreamContent:[{}]", streamContent); |
| 504 | - return streamContent; | |
| 533 | + datas.put("code", "1"); | |
| 534 | + datas.put("streamContent", streamContent); | |
| 535 | + return datas; | |
| 505 | 536 | } |
| 506 | 537 | |
| 507 | 538 | private StreamContent getStreamContentPlayURL(String stream) { |
| 508 | 539 | try { |
| 509 | - return streamPushController.getPlayUrl("schedule", stream, mediaConfig.getId()); | |
| 510 | - } catch (com.genersoft.iot.vmp.conf.exception.ControllerException e) { | |
| 511 | - log.debug("获取播放地址失败:[{}],[{}]", stream, mediaConfig.getId()); | |
| 540 | + return this.streamPushController.getPlayUrl("schedule", stream, this.mediaConfig.getId()); | |
| 541 | + } catch (ControllerException var3) { | |
| 542 | + log.debug("获取播放地址失败:[{}],[{}]", stream, this.mediaConfig.getId()); | |
| 543 | + return null; | |
| 512 | 544 | } |
| 513 | - return null; | |
| 514 | 545 | } |
| 515 | 546 | |
| 516 | 547 | private void requestToken() throws URISyntaxException, IOException { |
| 517 | 548 | HttpClientPostEntity entity = this.httpClientUtil.doGet(this.tuohuaConfigBean.getPageURL(), (String) null); |
| 518 | - if (!Objects.isNull(entity)) { | |
| 519 | - if (!Objects.isNull(entity) && !Objects.isNull(entity.getResultStr())) { | |
| 520 | - HashMap<String, String> resultMap = (HashMap) JSON.parseObject(entity.getResultStr(), HashMap.class); | |
| 521 | - log.info("获取key:[{}]", resultMap.get("publickey")); | |
| 522 | - Map<String, String> params = new HashMap(); | |
| 523 | - params.put("userName", encryptByPublicKey(this.tuohuaConfigBean.getUserName(), resultMap.get("publickey"))); | |
| 524 | - params.put("password", encryptByPublicKey(this.tuohuaConfigBean.getPassword(), resultMap.get("publickey"))); | |
| 525 | - HttpClientPostEntity postEntity = this.httpClientUtil.doPost(this.tuohuaConfigBean.getLoginURL(), params, (String) null); | |
| 526 | - if (Objects.nonNull(postEntity)) { | |
| 527 | - CookieStore tokenCookieStore = null; | |
| 528 | - tokenCookieStore = postEntity.getCookieStore(); | |
| 529 | - if (Objects.nonNull(tokenCookieStore)) { | |
| 530 | - List<Cookie> cookies = tokenCookieStore.getCookies(); | |
| 531 | - if (CollectionUtils.isNotEmpty(cookies)) { | |
| 532 | - Iterator var7 = cookies.iterator(); | |
| 533 | - | |
| 534 | - while (var7.hasNext()) { | |
| 535 | - Cookie cookie = (Cookie) var7.next(); | |
| 536 | - if (StringUtils.equalsIgnoreCase("jsessionid", cookie.getName()) && StringUtils.isNotBlank(cookie.getValue())) { | |
| 537 | - this.jsessionid = StringUtils.join(new String[]{"JSESSIONID=", cookie.getValue()}); | |
| 538 | - break; | |
| 539 | - } | |
| 549 | + if (!Objects.isNull(entity) && !Objects.isNull(entity) && !Objects.isNull(entity.getResultStr())) { | |
| 550 | + HashMap<String, String> resultMap = (HashMap) JSON.parseObject(entity.getResultStr(), HashMap.class); | |
| 551 | + log.info("获取key:[{}]", resultMap.get("publickey")); | |
| 552 | + Map<String, String> params = new HashMap(); | |
| 553 | + params.put("userName", encryptByPublicKey(this.tuohuaConfigBean.getUserName(), (String) resultMap.get("publickey"))); | |
| 554 | + params.put("password", encryptByPublicKey(this.tuohuaConfigBean.getPassword(), (String) resultMap.get("publickey"))); | |
| 555 | + HttpClientPostEntity postEntity = this.httpClientUtil.doPost(this.tuohuaConfigBean.getLoginURL(), params, (String) null); | |
| 556 | + if (Objects.nonNull(postEntity)) { | |
| 557 | + CookieStore tokenCookieStore = null; | |
| 558 | + tokenCookieStore = postEntity.getCookieStore(); | |
| 559 | + if (Objects.nonNull(tokenCookieStore)) { | |
| 560 | + List<Cookie> cookies = tokenCookieStore.getCookies(); | |
| 561 | + if (CollectionUtils.isNotEmpty(cookies)) { | |
| 562 | + Iterator var7 = cookies.iterator(); | |
| 563 | + | |
| 564 | + while (var7.hasNext()) { | |
| 565 | + Cookie cookie = (Cookie) var7.next(); | |
| 566 | + if (StringUtils.equalsIgnoreCase("jsessionid", cookie.getName()) && StringUtils.isNotBlank(cookie.getValue())) { | |
| 567 | + this.jsessionid = StringUtils.join(new String[]{"JSESSIONID=", cookie.getValue()}); | |
| 568 | + break; | |
| 540 | 569 | } |
| 541 | 570 | } |
| 542 | 571 | } |
| 543 | - | |
| 544 | - this.tokenDate = new Date(); | |
| 545 | - log.info("获取token:[{}]", this.jsessionid); | |
| 546 | 572 | } |
| 547 | 573 | |
| 574 | + this.tokenDate = new Date(); | |
| 575 | + log.info("获取token:[{}]", this.jsessionid); | |
| 548 | 576 | } |
| 549 | 577 | } |
| 578 | + | |
| 550 | 579 | } |
| 551 | 580 | |
| 552 | 581 | public static String encryptByPublicKey(String data, String publicKey) { |
| ... | ... | @@ -579,12 +608,13 @@ public class Jt1078OfCarController { |
| 579 | 608 | out.close(); |
| 580 | 609 | String var15 = new String(Base64Utils.encode(encryptedData)); |
| 581 | 610 | return var15; |
| 582 | - } catch (Exception var19) { | |
| 611 | + } catch (Exception var18) { | |
| 612 | + Exception var19 = var18; | |
| 583 | 613 | log.error("RSA 异常", var19); |
| 614 | + return null; | |
| 584 | 615 | } finally { |
| 585 | - | |
| 616 | + ; | |
| 586 | 617 | } |
| 587 | - return null; | |
| 588 | 618 | } |
| 589 | 619 | |
| 590 | 620 | private boolean cookieTimeOut() { |
| ... | ... | @@ -603,85 +633,93 @@ public class Jt1078OfCarController { |
| 603 | 633 | } |
| 604 | 634 | |
| 605 | 635 | private HttpClientPostEntity createServerLister(String channelMapping) throws URISyntaxException, IOException { |
| 606 | - Integer port = RandomUtils.nextInt(jt1078ConfigBean.getStart1078Port(), jt1078ConfigBean.getEnd1078Port()); | |
| 607 | - Integer httPort = RandomUtils.nextInt(jt1078ConfigBean.getStart1078Port(), jt1078ConfigBean.getEnd1078Port()); | |
| 636 | + Integer port = RandomUtils.nextInt(this.jt1078ConfigBean.getStart1078Port(), this.jt1078ConfigBean.getEnd1078Port()); | |
| 637 | + Integer httPort = RandomUtils.nextInt(this.jt1078ConfigBean.getStart1078Port(), this.jt1078ConfigBean.getEnd1078Port()); | |
| 638 | + String url; | |
| 608 | 639 | if (!Objects.equals(port, httPort) && Objects.nonNull(port)) { |
| 609 | -// Integer port = 1078; | |
| 610 | -// Integer httPort = 3333; | |
| 611 | - | |
| 612 | - String key = "jt1078:server:port:" + port; | |
| 640 | + url = "jt1078:server:port:" + port; | |
| 613 | 641 | String httpKey = "jt1078:server:httpport:" + httPort; |
| 614 | 642 | int index = 0; |
| 615 | - while (redisTemplate.hasKey(key) || redisTemplate.hasKey(httpKey)) { | |
| 616 | - port = RandomUtils.nextInt(jt1078ConfigBean.getStart1078Port(), jt1078ConfigBean.getEnd1078Port()); | |
| 617 | - httPort = RandomUtils.nextInt(jt1078ConfigBean.getStart1078Port(), jt1078ConfigBean.getEnd1078Port()); | |
| 618 | - key = "jt1078:server:port:" + port; | |
| 619 | - httpKey = "jt1078:server:httpport:" + httPort; | |
| 620 | 643 | |
| 644 | + while (this.redisTemplate.hasKey(url) || this.redisTemplate.hasKey(httpKey)) { | |
| 645 | + port = RandomUtils.nextInt(this.jt1078ConfigBean.getStart1078Port(), this.jt1078ConfigBean.getEnd1078Port()); | |
| 646 | + httPort = RandomUtils.nextInt(this.jt1078ConfigBean.getStart1078Port(), this.jt1078ConfigBean.getEnd1078Port()); | |
| 647 | + url = "jt1078:server:port:" + port; | |
| 648 | + httpKey = "jt1078:server:httpport:" + httPort; | |
| 621 | 649 | if (index > 1000) { |
| 622 | 650 | break; |
| 623 | 651 | } |
| 624 | 652 | } |
| 625 | 653 | |
| 626 | - redisTemplate.opsForValue().set(key, 1, 2, TimeUnit.DAYS); | |
| 627 | - redisTemplate.opsForValue().set(httpKey, 1, 2, TimeUnit.DAYS); | |
| 654 | + this.redisTemplate.opsForValue().set(url, 1, 2L, TimeUnit.DAYS); | |
| 655 | + this.redisTemplate.opsForValue().set(httpKey, 1, 2L, TimeUnit.DAYS); | |
| 628 | 656 | } else { |
| 629 | 657 | port = 1078; |
| 630 | 658 | httPort = 3333; |
| 631 | 659 | } |
| 632 | 660 | |
| 633 | - String url = jt1078ConfigBean.formatPushURL(channelMapping, port, httPort); | |
| 661 | + url = this.jt1078ConfigBean.formatPushURL(channelMapping, port, httPort); | |
| 634 | 662 | |
| 635 | - HttpClientPostEntity httpClientPostEntity = httpClientUtil.doGet(url, null); | |
| 636 | - if (Objects.isNull(httpClientPostEntity)) { | |
| 663 | + try { | |
| 664 | + HttpClientPostEntity httpClientPostEntity = this.httpClientUtil.doGet(url, (String) null); | |
| 665 | + if (Objects.isNull(httpClientPostEntity)) { | |
| 666 | + return null; | |
| 667 | + } else { | |
| 668 | + httpClientPostEntity.setHttpPort(httPort); | |
| 669 | + httpClientPostEntity.setPort(port); | |
| 670 | + return httpClientPostEntity; | |
| 671 | + } | |
| 672 | + } catch (Exception var7) { | |
| 673 | + Exception e = var7; | |
| 674 | + log.error("url:[{}]", url, e); | |
| 637 | 675 | return null; |
| 638 | 676 | } |
| 639 | -// HttpClientPostEntity httpClientPostEntity = new HttpClientPostEntity(); | |
| 640 | - httpClientPostEntity.setHttpPort(httPort); | |
| 641 | - httpClientPostEntity.setPort(port); | |
| 642 | - | |
| 643 | - return httpClientPostEntity; | |
| 644 | 677 | } |
| 645 | 678 | |
| 646 | - private Map<String, Object> chooseEntity(HttpClientPostEntity entity,String url) { | |
| 647 | - Map<String, Object> result = new HashMap<>(); | |
| 679 | + private Map<String, Object> chooseEntity(HttpClientPostEntity entity, String url, boolean flag) { | |
| 680 | + Map<String, Object> result = new HashMap(); | |
| 648 | 681 | if (Objects.isNull(entity)) { |
| 649 | 682 | result.put("code", "301"); |
| 650 | 683 | result.put("msg", "下发指令异常"); |
| 651 | 684 | return result; |
| 652 | - } | |
| 653 | - try { | |
| 654 | - Map<String, Object> rsultMap = JSON.parseObject(entity.getResultStr(), HashMap.class); | |
| 655 | - if (Objects.equals(rsultMap.get("code"), "4000") || Objects.equals(rsultMap.get("code"), 4000)) { | |
| 656 | - result.put("code", "304"); | |
| 657 | - result.put("msg", "离线的客户端(请检查设备是否注册或者鉴权"); | |
| 658 | - return result; | |
| 659 | - } | |
| 685 | + } else { | |
| 686 | + try { | |
| 687 | + Map<String, Object> rsultMap = (Map) JSON.parseObject(entity.getResultStr(), HashMap.class); | |
| 688 | + if (Objects.equals(rsultMap.get("code"), "4000") || Objects.equals(rsultMap.get("code"), 4000)) { | |
| 689 | + result.put("code", "304"); | |
| 690 | + result.put("msg", "离线的客户端(请检查设备是否注册或者鉴权"); | |
| 691 | + return result; | |
| 692 | + } | |
| 660 | 693 | |
| 661 | - if (Objects.nonNull(rsultMap.get("success")) && StringUtils.equalsAnyIgnoreCase(String.valueOf(rsultMap.get("success")), "true")) { | |
| 662 | - return null; | |
| 663 | - } else if (StringUtils.isNoneBlank(rsultMap.get("msg") + "")) { | |
| 664 | - result.put("code", "304"); | |
| 665 | - result.put("msg", rsultMap.get("msg")); | |
| 666 | - return result; | |
| 667 | - } | |
| 668 | - }catch (Exception e){ | |
| 669 | - log.error("entity.getResultStr():{{}}",entity.getResultStr(),e); | |
| 670 | - } | |
| 694 | + if (flag) { | |
| 695 | + if (Objects.nonNull(rsultMap.get("success")) && StringUtils.equalsAnyIgnoreCase(String.valueOf(rsultMap.get("success")), new CharSequence[]{"true"})) { | |
| 696 | + return null; | |
| 697 | + } | |
| 671 | 698 | |
| 672 | - return null; | |
| 699 | + if (StringUtils.isNoneBlank(new CharSequence[]{rsultMap.get("msg") + ""})) { | |
| 700 | + result.put("code", "304"); | |
| 701 | + result.put("msg", rsultMap.get("msg")); | |
| 702 | + return result; | |
| 703 | + } | |
| 704 | + } | |
| 705 | + } catch (Exception var6) { | |
| 706 | + Exception e = var6; | |
| 707 | + log.error("entity.getResultStr():{{}}", entity.getResultStr(), e.getMessage()); | |
| 708 | + } | |
| 673 | 709 | |
| 710 | + return null; | |
| 711 | + } | |
| 674 | 712 | } |
| 675 | 713 | |
| 676 | 714 | private void createStreamProxy(String stream) { |
| 677 | - String url = StringUtils.replace(jt1078ConfigBean.getGetURL(), "{stream}", stream); | |
| 715 | + String url = StringUtils.replace(this.jt1078ConfigBean.getGetURL(), "{stream}", stream); | |
| 678 | 716 | StreamProxyItem item = new StreamProxyItem(); |
| 679 | 717 | item.setApp("schedule"); |
| 680 | 718 | item.setEnable(true); |
| 681 | 719 | item.setEnableAudio(true); |
| 682 | 720 | item.setRtpType("default"); |
| 683 | 721 | item.setStream(stream); |
| 684 | - item.setMediaServerId(mediaConfig.getId()); | |
| 722 | + item.setMediaServerId(this.mediaConfig.getId()); | |
| 685 | 723 | item.setUrl(url); |
| 686 | 724 | item.setFfmpegCmdKey("ffmpeg.cmd"); |
| 687 | 725 | item.setEnable(true); |
| ... | ... | @@ -689,10 +727,7 @@ public class Jt1078OfCarController { |
| 689 | 727 | item.setEnableMp4(false); |
| 690 | 728 | item.setEnableRemoveNoneReader(false); |
| 691 | 729 | item.setEnableDisableNoneReader(false); |
| 692 | - | |
| 693 | - streamProxyController.save(item); | |
| 694 | - | |
| 730 | + item.setName(stream); | |
| 731 | + this.streamProxyController.save(item); | |
| 695 | 732 | } |
| 696 | - | |
| 697 | - | |
| 698 | 733 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/jt1078/platform/config/Jt1078ConfigBean.java
| 1 | -package com.genersoft.iot.vmp.vmanager.jt1078.platform.config; | |
| 2 | - | |
| 3 | -import org.apache.commons.lang3.StringUtils; | |
| 4 | -import org.springframework.beans.factory.annotation.Value; | |
| 5 | -import org.springframework.stereotype.Component; | |
| 6 | - | |
| 7 | -import java.util.Objects; | |
| 8 | - | |
| 9 | -/** | |
| 10 | - * @author liujun | |
| 11 | - * @date 2024年10月23日 13:38 | |
| 12 | - */ | |
| 13 | -@Component | |
| 14 | -public class Jt1078ConfigBean { | |
| 15 | - @Value("${tuohua.bsth.jt1078.url}") | |
| 16 | - private String jt1078Url; | |
| 17 | - @Value("${tuohua.bsth.jt1078.sendPort}") | |
| 18 | - private String jt1078SendPort; | |
| 19 | - @Value("${tuohua.bsth.jt1078.stopSendPort}") | |
| 20 | - private String stopSendPort; | |
| 21 | - @Value("${tuohua.bsth.jt1078.historyListPort}") | |
| 22 | - private String historyListPort; | |
| 23 | - @Value("${tuohua.bsth.jt1078.playHistoryPort}") | |
| 24 | - private String playHistoryPort; | |
| 25 | - | |
| 26 | - @Value("${tuohua.bsth.jt1078.ports}") | |
| 27 | - private String portsOf1078; | |
| 28 | - | |
| 29 | - @Value("${tuohua.bsth.jt1078.pushURL}") | |
| 30 | - private String pushURL; | |
| 31 | - @Value("${tuohua.bsth.jt1078.stopPushURL}") | |
| 32 | - private String stopPUshURL; | |
| 33 | - | |
| 34 | - private Integer start1078Port; | |
| 35 | - private Integer end1078Port; | |
| 36 | - @Value("${tuohua.bsth.jt1078.get.url}") | |
| 37 | - private String getURL; | |
| 38 | - | |
| 39 | - | |
| 40 | - private static final String SEND_IO_MESSAGE_RTSP = "{ \"messageId\": 37121, \"properties\": 0, \"clientId\": \"{clientId}\", \"serialNo\": \"1\", \"ip\": \"{ip}\", \"tcpPort\": \"{tcpPort}\", \"udpPort\": \"{udpPort}\", \"channelNo\": \"{channelNo}\", \"mediaType\": \"1\", \"streamType\": \"1\"}"; | |
| 41 | - private static final String SEND_IO_MESSAGE_RTSP_STOP = "{\"messageId\": 37122,\"properties\": 0,\"clientId\": \"{clientId}\",\"serialNo\": \"1\",\"channelNo\": \"{channelNo}\",\"command\": \"0\",\"closeType\": \"0\",\"streamType\": \"1\"}"; | |
| 42 | - private static final String SEND_IO_HISTORY_RTSP = "{\"msgid\":37381,\"clientId\":\"{clientId}\",\"startTime\":\"{startTime}\",\"endTime\":\"{endTime}\",\"mediaType\":0,\"streamType\":0,\"storageType\":0,\"channelId\":{channelNo}}"; | |
| 43 | - private static final String SEND_IO_PLAY_RTSP = "{\"ip\":\"{ip}\",\"tcpPort\":{tcpPort},\"udpPort\":{udpPort},\"channelNo\":\"{channelNo}\",\"mediaType\":0,\"streamType\":0,\"storageType\":0,\"playbackType\":0,\"playbackSpeed\":1,\"startTime\":\"{startTime}\",\"endTime\":\"{endTime}\",\"clientId\":\"{sim}\",\"messageId\":37377}"; | |
| 44 | - | |
| 45 | - public String formatMessageId(String sim, String channel, RtspConfigBean configBean,Integer port) { | |
| 46 | - String msg = StringUtils.replace(SEND_IO_MESSAGE_RTSP, "{clientId}", sim); | |
| 47 | - msg = StringUtils.replace(msg, "{tcpPort}", port+""); | |
| 48 | - msg = StringUtils.replace(msg, "{udpPort}", port+""); | |
| 49 | - msg = StringUtils.replace(msg, "{channelNo}", channel); | |
| 50 | - return StringUtils.replace(msg, "{ip}", configBean.getRtspIp()); | |
| 51 | - } | |
| 52 | - | |
| 53 | - public String formatMessageStop(String sim, String channel) { | |
| 54 | - String msg = StringUtils.replace(SEND_IO_MESSAGE_RTSP_STOP, "{clientId}", sim); | |
| 55 | - return StringUtils.replace(msg, "{channelNo}", channel); | |
| 56 | - } | |
| 57 | - | |
| 58 | - public String formatMessageHistoryListRTSP(String sim, String channel, String startTime, String endTime) { | |
| 59 | - String msg = StringUtils.replace(SEND_IO_HISTORY_RTSP, "{clientId}", sim); | |
| 60 | - msg = StringUtils.replace(msg, "{startTime}", startTime); | |
| 61 | - msg = StringUtils.replace(msg, "{endTime}", endTime); | |
| 62 | - return StringUtils.replace(msg, "{channelNo}", channel); | |
| 63 | - } | |
| 64 | - | |
| 65 | - public String formatMessageHistoryPlayRTSP(String sim, String channel, String startTime, String endTime, RtspConfigBean configBean,Integer port) { | |
| 66 | - String msg = StringUtils.replace(SEND_IO_PLAY_RTSP, "{clientId}", sim); | |
| 67 | - msg = StringUtils.replace(msg, "{startTime}", startTime); | |
| 68 | - msg = StringUtils.replace(msg, "{endTime}", endTime); | |
| 69 | - msg = StringUtils.replace(msg, "{channelNo}", channel); | |
| 70 | - msg = StringUtils.replace(msg, "{tcpPort}", port+""); | |
| 71 | - msg = StringUtils.replace(msg, "{udpPort}", port+""); | |
| 72 | - msg = StringUtils.replace(msg, "{sim}", sim); | |
| 73 | - return StringUtils.replace(msg, "{ip}", configBean.getRtspIp()); | |
| 74 | - } | |
| 75 | - | |
| 76 | - public String formatPushURL(String pushKey, int port, int httpPort) { | |
| 77 | - String msg = StringUtils.replace(pushURL, "{pushKey}", pushKey); | |
| 78 | - msg = StringUtils.replace(msg, "{port}", String.valueOf(port)); | |
| 79 | - return StringUtils.replace(msg, "{httpPort}", String.valueOf(httpPort)); | |
| 80 | - } | |
| 81 | - | |
| 82 | - public String formatStopPushURL(String pushKey, int port, int httpPort) { | |
| 83 | - String msg = StringUtils.replace(stopPUshURL, "{pushKey}", pushKey); | |
| 84 | - msg = StringUtils.replace(msg, "{port}", String.valueOf(port)); | |
| 85 | - return StringUtils.replace(msg, "{httpPort}", String.valueOf(httpPort)); | |
| 86 | - } | |
| 87 | - | |
| 88 | - public String getJt1078Url() { | |
| 89 | - return jt1078Url; | |
| 90 | - } | |
| 91 | - | |
| 92 | - public String getJt1078SendPort() { | |
| 93 | - return jt1078SendPort; | |
| 94 | - } | |
| 95 | - | |
| 96 | - public String getStopSendPort() { | |
| 97 | - return stopSendPort; | |
| 98 | - } | |
| 99 | - | |
| 100 | - public String getHistoryListPort() { | |
| 101 | - return historyListPort; | |
| 102 | - } | |
| 103 | - | |
| 104 | - public String getPlayHistoryPort() { | |
| 105 | - return playHistoryPort; | |
| 106 | - } | |
| 107 | - | |
| 108 | - public String getPushURL() { | |
| 109 | - return pushURL; | |
| 110 | - } | |
| 111 | - | |
| 112 | - public Integer getStart1078Port() { | |
| 113 | - if (Objects.isNull(start1078Port)) { | |
| 114 | - start1078Port = Integer.parseInt(StringUtils.substringBefore(portsOf1078, ",")); | |
| 115 | - } | |
| 116 | - return start1078Port; | |
| 117 | - } | |
| 118 | - | |
| 119 | - public Integer getEnd1078Port() { | |
| 120 | - if (Objects.isNull(end1078Port)) { | |
| 121 | - end1078Port = Integer.parseInt(StringUtils.substringAfter(portsOf1078, ",")); | |
| 122 | - } | |
| 123 | - return end1078Port; | |
| 124 | - } | |
| 125 | - | |
| 126 | - public String getStopPUshURL() { | |
| 127 | - return stopPUshURL; | |
| 128 | - } | |
| 129 | - | |
| 130 | - public String getGetURL() { | |
| 131 | - return getURL; | |
| 132 | - } | |
| 133 | -} | |
| 1 | +package com.genersoft.iot.vmp.vmanager.jt1078.platform.config; import com.genersoft.iot.vmp.vmanager.jt1078.platform.config.RtspConfigBean; import java.util.Objects; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class Jt1078ConfigBean { @Value("${tuohua.bsth.jt1078.url}") private String jt1078Url; @Value("${tuohua.bsth.jt1078.sendPort}") private String jt1078SendPort; @Value("${tuohua.bsth.jt1078.stopSendPort}") private String stopSendPort; @Value("${tuohua.bsth.jt1078.historyListPort}") private String historyListPort; @Value("${tuohua.bsth.jt1078.playHistoryPort}") private String playHistoryPort; @Value("${tuohua.bsth.jt1078.ports}") private String portsOf1078; @Value("${tuohua.bsth.jt1078.pushURL}") private String pushURL; @Value("${tuohua.bsth.jt1078.stopPushURL}") private String stopPUshURL; private Integer start1078Port; private Integer end1078Port; @Value("${tuohua.bsth.jt1078.get.url}") private String getURL; @Value("${tuohua.bsth.jt1078.addPortVal}") private Integer addPort; @Value("${tuohua.bsth.jt1078.ws}") private String ws; @Value("${tuohua.bsth.jt1078.wss}") private String wss; private static final String SEND_IO_MESSAGE_RTSP = "{ \"messageId\": 37121, \"properties\": 0, \"clientId\": \"{clientId}\", \"serialNo\": \"1\", \"ip\": \"{ip}\", \"tcpPort\": \"{tcpPort}\", \"udpPort\": \"{udpPort}\", \"channelNo\": \"{channelNo}\", \"mediaType\": \"1\", \"streamType\": \"1\"}"; private static final String SEND_IO_MESSAGE_RTSP_STOP = "{\"messageId\": 37122,\"properties\": 0,\"clientId\": \"{clientId}\",\"serialNo\": \"1\",\"channelNo\": \"{channelNo}\",\"command\": \"0\",\"closeType\": \"0\",\"streamType\": \"1\"}"; private static final String SEND_IO_HISTORY_RTSP = "{\"msgid\":37381,\"clientId\":\"{clientId}\",\"startTime\":\"{startTime}\",\"endTime\":\"{endTime}\",\"mediaType\":0,\"streamType\":0,\"storageType\":0,\"channelId\":{channelNo}}"; private static final String SEND_IO_PLAY_RTSP = "{\"ip\":\"{ip}\",\"tcpPort\":{tcpPort},\"udpPort\":{udpPort},\"channelNo\":\"{channelNo}\",\"mediaType\":0,\"streamType\":0,\"storageType\":0,\"playbackType\":0,\"playbackSpeed\":1,\"startTime\":\"{startTime}\",\"endTime\":\"{endTime}\",\"clientId\":\"{sim}\",\"messageId\":37377}"; public String formatMessageId(String sim, String channel, RtspConfigBean configBean, Integer port) { String msg = StringUtils.replace("{ \"messageId\": 37121, \"properties\": 0, \"clientId\": \"{clientId}\", \"serialNo\": \"1\", \"ip\": \"{ip}\", \"tcpPort\": \"{tcpPort}\", \"udpPort\": \"{udpPort}\", \"channelNo\": \"{channelNo}\", \"mediaType\": \"1\", \"streamType\": \"1\"}", "{clientId}", sim); msg = StringUtils.replace(msg, "{tcpPort}", (port.intValue() + getAddPort().intValue()) + ""); msg = StringUtils.replace(msg, "{udpPort}", (port.intValue() + getAddPort().intValue()) + ""); msg = StringUtils.replace(msg, "{channelNo}", channel); return StringUtils.replace(msg, "{ip}", configBean.getRtspIp()); } public String formatMessageStop(String sim, String channel) { String msg = StringUtils.replace("{\"messageId\": 37122,\"properties\": 0,\"clientId\": \"{clientId}\",\"serialNo\": \"1\",\"channelNo\": \"{channelNo}\",\"command\": \"0\",\"closeType\": \"0\",\"streamType\": \"1\"}", "{clientId}", sim); return StringUtils.replace(msg, "{channelNo}", channel); } public String formatMessageHistoryListRTSP(String sim, String channel, String startTime, String endTime) { String msg = StringUtils.replace("{\"msgid\":37381,\"clientId\":\"{clientId}\",\"startTime\":\"{startTime}\",\"endTime\":\"{endTime}\",\"mediaType\":0,\"streamType\":0,\"storageType\":0,\"channelId\":{channelNo}}", "{clientId}", sim); msg = StringUtils.replace(msg, "{startTime}", startTime); msg = StringUtils.replace(msg, "{endTime}", endTime); return StringUtils.replace(msg, "{channelNo}", channel); } public String formatMessageHistoryPlayRTSP(String sim, String channel, String startTime, String endTime, RtspConfigBean configBean, Integer port) { String msg = StringUtils.replace("{\"ip\":\"{ip}\",\"tcpPort\":{tcpPort},\"udpPort\":{udpPort},\"channelNo\":\"{channelNo}\",\"mediaType\":0,\"streamType\":0,\"storageType\":0,\"playbackType\":0,\"playbackSpeed\":1,\"startTime\":\"{startTime}\",\"endTime\":\"{endTime}\",\"clientId\":\"{sim}\",\"messageId\":37377}", "{clientId}", sim); msg = StringUtils.replace(msg, "{startTime}", startTime); msg = StringUtils.replace(msg, "{endTime}", endTime); msg = StringUtils.replace(msg, "{channelNo}", channel); msg = StringUtils.replace(msg, "{tcpPort}", (port.intValue() + getAddPort().intValue()) + ""); msg = StringUtils.replace(msg, "{udpPort}", (port.intValue() + getAddPort().intValue()) + ""); msg = StringUtils.replace(msg, "{sim}", sim); return StringUtils.replace(msg, "{ip}", configBean.getRtspIp()); } public String formatPushURL(String pushKey, int port, int httpPort) { String msg = StringUtils.replace(this.pushURL, "{pushKey}", pushKey); msg = StringUtils.replace(msg, "{port}", String.valueOf(port)); return StringUtils.replace(msg, "{httpPort}", String.valueOf(httpPort)); } public String formatStopPushURL(String pushKey, int port, int httpPort) { String msg = StringUtils.replace(this.stopPUshURL, "{pushKey}", pushKey); msg = StringUtils.replace(msg, "{port}", String.valueOf(port)); return StringUtils.replace(msg, "{httpPort}", String.valueOf(httpPort)); } public String getJt1078Url() { return this.jt1078Url; } public String getJt1078SendPort() { return this.jt1078SendPort; } public String getStopSendPort() { return this.stopSendPort; } public String getHistoryListPort() { return this.historyListPort; } public String getPlayHistoryPort() { return this.playHistoryPort; } public String getPushURL() { return this.pushURL; } public Integer getStart1078Port() { if (Objects.isNull(this.start1078Port)) this.start1078Port = Integer.valueOf(Integer.parseInt(StringUtils.substringBefore(this.portsOf1078, ","))); return this.start1078Port; } public Integer getEnd1078Port() { if (Objects.isNull(this.end1078Port)) this.end1078Port = Integer.valueOf(Integer.parseInt(StringUtils.substringAfter(this.portsOf1078, ","))); return this.end1078Port; } public String getStopPUshURL() { return this.stopPUshURL; } public String getGetURL() { return this.getURL; } public Integer getAddPort() { return this.addPort; } public String getWs() { return this.ws; } public String getWss() { return this.wss; } } | |
| 134 | 2 | \ No newline at end of file | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/jt1078/platform/config/TuohuaConfigBean.java
| ... | ... | @@ -6,7 +6,9 @@ import com.genersoft.iot.vmp.vmanager.jt1078.platform.handler.HttpClientUtil; |
| 6 | 6 | import org.apache.commons.collections4.CollectionUtils; |
| 7 | 7 | import org.apache.commons.lang3.RandomUtils; |
| 8 | 8 | import org.apache.commons.lang3.StringUtils; |
| 9 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 9 | 10 | import org.springframework.beans.factory.annotation.Value; |
| 11 | +import org.springframework.data.redis.core.RedisTemplate; | |
| 10 | 12 | import org.springframework.stereotype.Component; |
| 11 | 13 | |
| 12 | 14 | import java.security.MessageDigest; |
| ... | ... | @@ -44,6 +46,12 @@ public class TuohuaConfigBean { |
| 44 | 46 | @Value("${tuohua.bsth.login.rest.password}") |
| 45 | 47 | private String restPassword; |
| 46 | 48 | |
| 49 | + @Value("${spring.profiles.active}") | |
| 50 | + private String profileActive; | |
| 51 | + | |
| 52 | + @Autowired | |
| 53 | + private RedisTemplate redisTemplate; | |
| 54 | + | |
| 47 | 55 | |
| 48 | 56 | public String getBaseURL() { |
| 49 | 57 | return baseURL; |
| ... | ... | @@ -86,6 +94,7 @@ public class TuohuaConfigBean { |
| 86 | 94 | private final String LINE_URL = "/line/company/{companyId}?timestamp={timestamp}&nonce={nonce}&password={password}&sign={sign}"; |
| 87 | 95 | //private final String LINE_URL = "/line/all?timestamp={timestamp}&nonce={nonce}&password={password}&sign={sign}"; |
| 88 | 96 | private final String CAR_URL = "/car/company/{companyId}?timestamp={timestamp}&nonce={nonce}&password={password}&sign={sign}"; |
| 97 | + private final String GPS_URL = "//gps/all?timestamp={timestamp}&nonce={nonce}&password={password}&sign={sign}"; | |
| 89 | 98 | |
| 90 | 99 | public String requestLine(HttpClientUtil httpClientUtil, String companyId) throws Exception { |
| 91 | 100 | String nonce = random(5); |
| ... | ... | @@ -114,9 +123,27 @@ public class TuohuaConfigBean { |
| 114 | 123 | return Objects.isNull(postEntity) ? null : postEntity.getResultStr(); |
| 115 | 124 | } |
| 116 | 125 | |
| 126 | + public List<HashMap> requestGPS(HttpClientUtil httpClientUtil) throws Exception { | |
| 127 | + String nonce = random(6); | |
| 128 | + String timestamp = String.valueOf(new Date().getTime()); | |
| 129 | + Map<String, String> map = new HashMap<>(); | |
| 130 | + map.put("timestamp", timestamp); | |
| 131 | + map.put("nonce", nonce); | |
| 132 | + map.put("password", getRestPassword()); | |
| 133 | + String sign = getSHA1(map); | |
| 134 | + String url = StringUtils.join(getBaseURL(), formatURL(GPS_URL, map, sign)); | |
| 135 | + HttpClientPostEntity postEntity = httpClientUtil.doGet(url, null); | |
| 136 | + if (Objects.isNull(postEntity) || StringUtils.isEmpty(postEntity.getResultStr())) { | |
| 137 | + return null; | |
| 138 | + } | |
| 139 | + return (List<HashMap>) JSON.parseArray(postEntity.getResultStr(), HashMap.class); | |
| 140 | + | |
| 141 | + } | |
| 142 | + | |
| 117 | 143 | public List<HashMap<String, Object>> requestOfLineAndCarAndCombationTree(HttpClientUtil httpClientUtil, String companyId) throws Exception { |
| 118 | 144 | String lineJson = requestLine(httpClientUtil, companyId); |
| 119 | 145 | String carJson = requestCars(httpClientUtil, companyId); |
| 146 | +// String carJson = redisTemplate.opsForValue().get("test:car").toString(); | |
| 120 | 147 | |
| 121 | 148 | |
| 122 | 149 | List<HashMap> linesJsonList = null; |
| ... | ... | @@ -126,6 +153,7 @@ public class TuohuaConfigBean { |
| 126 | 153 | linesSize = CollectionUtils.size(linesJsonList); |
| 127 | 154 | } |
| 128 | 155 | |
| 156 | + List<HashMap> gpsList = requestGPS(httpClientUtil); | |
| 129 | 157 | List<HashMap> carJsonList = null; |
| 130 | 158 | int carsJsonSize = 0; |
| 131 | 159 | if (StringUtils.isNoneBlank(carJson)) { |
| ... | ... | @@ -140,13 +168,15 @@ public class TuohuaConfigBean { |
| 140 | 168 | if (linesSize > 0) { |
| 141 | 169 | List<HashMap<String, Object>> lines = linesJsonList.stream().map(hashMap -> { |
| 142 | 170 | String code = convertStr(hashMap.get("lineCode")); |
| 143 | - HashMap<String, Object> map = combationTree(code, convertStr(hashMap.get("line")), code, false, convertStr(hashMap.get("name")), code, false, | |
| 171 | + String name = convertStr(hashMap.get("name")); | |
| 172 | + | |
| 173 | + HashMap<String, Object> map = combationTree(code, convertStr(hashMap.get("line")), code, false, name, code, false, | |
| 144 | 174 | "<span><img src='/metronic_v4.5.4/layui/icon/line.png' class ='imageIcon' /></span><span>" + convertStr(hashMap.get("name")) + "</span>", |
| 145 | 175 | "<span><img src='/metronic_v4.5.4/layui/icon/line.png' class ='imageIcon' /></span><span>" + convertStr(hashMap.get("name")) + "</span>", 201); |
| 146 | 176 | if (carsSize > 0) { |
| 147 | 177 | List<HashMap> carList = carJsonListFinal.stream().filter(c -> Objects.nonNull(c.get("lineCode")) && StringUtils.equals(convertStr(c.get("lineCode")), code)).map(ch -> { |
| 148 | 178 | ch.put("used", "1"); |
| 149 | - return combatioinCarTree(ch); | |
| 179 | + return combatioinCarTree(ch,gpsList); | |
| 150 | 180 | }).collect(Collectors.toList()); |
| 151 | 181 | |
| 152 | 182 | map.put("children", carList); |
| ... | ... | @@ -158,7 +188,7 @@ public class TuohuaConfigBean { |
| 158 | 188 | } |
| 159 | 189 | |
| 160 | 190 | if (carsSize > 0) { |
| 161 | - List<HashMap<String, Object>> cars = carJsonList.stream().filter(c -> !Objects.equals(convertStr(c.get("used")), "1")).map(c -> combatioinCarTree(c)).collect(Collectors.toList()); | |
| 191 | + List<HashMap<String, Object>> cars = carJsonList.stream().filter(c -> !Objects.equals(convertStr(c.get("used")), "1")).map(c -> combatioinCarTree(c,gpsList)).collect(Collectors.toList()); | |
| 162 | 192 | returnData.addAll(cars); |
| 163 | 193 | } |
| 164 | 194 | return returnData; |
| ... | ... | @@ -211,15 +241,31 @@ public class TuohuaConfigBean { |
| 211 | 241 | return result; |
| 212 | 242 | } |
| 213 | 243 | |
| 214 | - private HashMap<String, Object> combatioinCarTree(HashMap ch) { | |
| 244 | + | |
| 245 | + private HashMap<String, Object> combatioinCarTree(HashMap ch, List<HashMap> gpsList) { | |
| 215 | 246 | String code = convertStr(ch.get("nbbm")); |
| 216 | - HashMap<String, Object> hashMap = combationTree(code, "bus1", code, false, code, code, false, "<span><img src='/metronic_v4.5.4/layui/icon/bus1.png' class ='imageIcon' /></span><span>" + code + "</span>", | |
| 247 | + String sim = convertStr(ch.get("sim")); | |
| 248 | + String name = code; | |
| 249 | + | |
| 250 | + Optional<HashMap> optional = gpsList.stream().filter(g -> Objects.nonNull(g) && Objects.nonNull(g.get("deviceId")) && | |
| 251 | + Objects.nonNull(ch.get("equipmentCode")) && Objects.equals(g.get("deviceId").toString(), ch.get("equipmentCode").toString())).findFirst(); | |
| 252 | + if (StringUtils.isEmpty(sim) || !optional.isPresent() || Objects.isNull(optional.get().get("abnormalStatus")) || StringUtils.equalsIgnoreCase("offline", optional.get().get("abnormalStatus").toString())) { | |
| 253 | + name = "<del>" + name + "</del>"; | |
| 254 | + } | |
| 255 | + | |
| 256 | + HashMap<String, Object> hashMap = combationTree(code, "bus1", code, false, name, code, false, "<span><img src='/metronic_v4.5.4/layui/icon/bus1.png' class ='imageIcon' /></span><span>" + code + "</span>", | |
| 217 | 257 | "<span><img src='/metronic_v4.5.4/layui/icon/bus1.png' class ='imageIcon' /></span><span>" + code + "</span>", 301); |
| 218 | 258 | hashMap.put("sim", formatSim(convertStr(ch.get("sim")))); |
| 219 | -// hashMap.put("sim","013800138999"); | |
| 259 | + | |
| 260 | + if (StringUtils.equals(profileActive, "local")) { | |
| 261 | +// hashMap.put("sim","123456789011"); | |
| 262 | + hashMap.put("sim", "122223333444"); | |
| 263 | + } | |
| 264 | +// | |
| 220 | 265 | return hashMap; |
| 221 | 266 | } |
| 222 | 267 | |
| 268 | + | |
| 223 | 269 | private String random(Integer count) { |
| 224 | 270 | StringBuilder builder = new StringBuilder(); |
| 225 | 271 | for (int i = 0; i < count; i++) { |
| ... | ... | @@ -253,7 +299,7 @@ public class TuohuaConfigBean { |
| 253 | 299 | StringBuilder builder = new StringBuilder(); |
| 254 | 300 | boolean flag = true; |
| 255 | 301 | for (int i = 0; i < length; i++) { |
| 256 | - char val = chars[i]; | |
| 302 | + char val = chars[i]; | |
| 257 | 303 | if (flag && val == '0') { |
| 258 | 304 | continue; |
| 259 | 305 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/jt1078/platform/handler/HttpClientUtil.java
| ... | ... | @@ -16,6 +16,8 @@ import org.apache.http.impl.client.BasicCookieStore; |
| 16 | 16 | import org.apache.http.impl.client.DefaultHttpClient; |
| 17 | 17 | import org.apache.http.impl.cookie.BasicClientCookie; |
| 18 | 18 | import org.apache.http.message.BasicNameValuePair; |
| 19 | +import org.apache.http.params.BasicHttpParams; | |
| 20 | +import org.apache.http.params.HttpConnectionParams; | |
| 19 | 21 | import org.apache.http.util.EntityUtils; |
| 20 | 22 | import org.jetbrains.annotations.NotNull; |
| 21 | 23 | import org.slf4j.Logger; |
| ... | ... | @@ -37,7 +39,7 @@ public class HttpClientUtil { |
| 37 | 39 | |
| 38 | 40 | public HttpClientPostEntity doPost(String url, Map<String, String> params, String jsessionid) throws URISyntaxException, IOException { |
| 39 | 41 | // 创建Httpclient对象 |
| 40 | - DefaultHttpClient httpclient = new DefaultHttpClient(); | |
| 42 | + DefaultHttpClient httpclient = getHttpClient(); | |
| 41 | 43 | // 定义请求的参数 |
| 42 | 44 | CookieStore cookieStore1 = combationCookie(jsessionid); |
| 43 | 45 | httpclient.setCookieStore(cookieStore1); |
| ... | ... | @@ -75,7 +77,7 @@ public class HttpClientUtil { |
| 75 | 77 | |
| 76 | 78 | public HttpClientPostEntity doPost(String url, String requestBody, String jsessionid) throws URISyntaxException, IOException { |
| 77 | 79 | // 创建Httpclient对象 |
| 78 | - DefaultHttpClient httpclient = new DefaultHttpClient(); | |
| 80 | + DefaultHttpClient httpclient = getHttpClient(); | |
| 79 | 81 | // 定义请求的参数 |
| 80 | 82 | CookieStore cookieStore1 = combationCookie( jsessionid); |
| 81 | 83 | |
| ... | ... | @@ -129,7 +131,7 @@ public class HttpClientUtil { |
| 129 | 131 | |
| 130 | 132 | public HttpClientPostEntity doGet(String url, String jsessionid) throws URISyntaxException, IOException { |
| 131 | 133 | // 创建Httpclient对象 |
| 132 | - DefaultHttpClient httpclient = new DefaultHttpClient(); | |
| 134 | + DefaultHttpClient httpclient = getHttpClient(); | |
| 133 | 135 | // 定义请求的参数 |
| 134 | 136 | CookieStore cookieStore1 = combationCookie(jsessionid); |
| 135 | 137 | // |
| ... | ... | @@ -174,4 +176,17 @@ public class HttpClientUtil { |
| 174 | 176 | log.info("url:{};requestBody:{};response data:{}",url,requestBody,result); |
| 175 | 177 | return postEntity; |
| 176 | 178 | } |
| 179 | + | |
| 180 | + | |
| 181 | + /** | |
| 182 | + * 获取 HttpClient,主要是封装了超时设置 | |
| 183 | + * @return | |
| 184 | + */ | |
| 185 | + public DefaultHttpClient getHttpClient(){ | |
| 186 | + BasicHttpParams httpParams = new BasicHttpParams(); | |
| 187 | + HttpConnectionParams.setConnectionTimeout(httpParams, 5000); | |
| 188 | + HttpConnectionParams.setSoTimeout(httpParams, 15000); | |
| 189 | + DefaultHttpClient client = new DefaultHttpClient(httpParams); | |
| 190 | + return client; | |
| 191 | + } | |
| 177 | 192 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java
| ... | ... | @@ -22,12 +22,14 @@ import io.swagger.v3.oas.annotations.tags.Tag; |
| 22 | 22 | import org.slf4j.Logger; |
| 23 | 23 | import org.slf4j.LoggerFactory; |
| 24 | 24 | import org.springframework.beans.factory.annotation.Autowired; |
| 25 | +import org.springframework.data.redis.core.RedisTemplate; | |
| 25 | 26 | import org.springframework.stereotype.Controller; |
| 26 | 27 | import org.springframework.util.ObjectUtils; |
| 27 | 28 | import org.springframework.web.bind.annotation.*; |
| 28 | 29 | import org.springframework.web.context.request.async.DeferredResult; |
| 29 | 30 | |
| 30 | 31 | import java.util.UUID; |
| 32 | +import java.util.concurrent.TimeUnit; | |
| 31 | 33 | |
| 32 | 34 | @SuppressWarnings("rawtypes") |
| 33 | 35 | /** |
| ... | ... | @@ -52,6 +54,8 @@ public class StreamProxyController { |
| 52 | 54 | |
| 53 | 55 | @Autowired |
| 54 | 56 | private UserSetting userSetting; |
| 57 | + @Autowired | |
| 58 | + private RedisTemplate redisTemplate; | |
| 55 | 59 | |
| 56 | 60 | |
| 57 | 61 | @Operation(summary = "分页查询流代理", security = @SecurityRequirement(name = JwtUtils.HEADER)) |
| ... | ... | @@ -127,6 +131,7 @@ public class StreamProxyController { |
| 127 | 131 | requestMessage.setData(WVPResult.fail(code, msg)); |
| 128 | 132 | } |
| 129 | 133 | resultHolder.invokeAllResult(requestMessage); |
| 134 | + redisTemplate.opsForValue().set("timeout:"+param.getStream(),"1",30, TimeUnit.SECONDS); | |
| 130 | 135 | }); |
| 131 | 136 | return result; |
| 132 | 137 | } | ... | ... |
src/main/resources/application-local.yml
| ... | ... | @@ -13,11 +13,11 @@ spring: |
| 13 | 13 | # REDIS数据库配置 |
| 14 | 14 | redis: |
| 15 | 15 | # [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1 |
| 16 | - host: 192.168.169.100 | |
| 16 | + host: 192.168.168.124 | |
| 17 | 17 | # [必须修改] 端口号 |
| 18 | 18 | port: 6379 |
| 19 | 19 | # [可选] 数据库 DB |
| 20 | - database: 8 | |
| 20 | + database: 10 | |
| 21 | 21 | # [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接 |
| 22 | 22 | # password: guzijian |
| 23 | 23 | # [可选] 超时时间 |
| ... | ... | @@ -42,7 +42,7 @@ spring: |
| 42 | 42 | max-lifetime: 1200000 # 是池中连接关闭后的最长生命周期(以毫秒为单位) |
| 43 | 43 | #[可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口 |
| 44 | 44 | server: |
| 45 | - port: 18080 | |
| 45 | + port: 28080 | |
| 46 | 46 | # [可选] HTTPS配置, 默认不开启 |
| 47 | 47 | ssl: |
| 48 | 48 | # [可选] 是否开启HTTPS访问 |
| ... | ... | @@ -133,6 +133,7 @@ tuohua: |
| 133 | 133 | login: |
| 134 | 134 | pageURL: http://192.169.1.92:9088/user/login/jCryptionKey |
| 135 | 135 | url: http://192.169.1.92:9088/user/login |
| 136 | + | |
| 136 | 137 | userName: yuanxiaohu |
| 137 | 138 | password: Yxiaohu1.0 |
| 138 | 139 | rest: |
| ... | ... | @@ -142,16 +143,17 @@ tuohua: |
| 142 | 143 | url: |
| 143 | 144 | company: http://192.169.1.92:9088/video/tree |
| 144 | 145 | car: http://192.169.1.92:9088/video/tree/carNo/{0} |
| 145 | - sim: http://192.169.1.92:9088/video//tree/caNO/sim/{0} | |
| 146 | + sim: http://192.169.1.92:9088/video/tree/caNO/sim/{0} | |
| 146 | 147 | wvp28181: |
| 147 | 148 | rtsp: |
| 148 | - tcpPort: 1078 | |
| 149 | - udpPort: 1078 | |
| 149 | + tcpPort: 11078 | |
| 150 | + udpPort: 11078 | |
| 150 | 151 | historyTcpPort: 9999 |
| 151 | 152 | historyUdpPort: 9999 |
| 152 | 153 | ip : 61.169.120.202 |
| 153 | 154 | jt1078: |
| 154 | 155 | ports: 9100,9600 |
| 156 | + addPortVal: 30000 | |
| 155 | 157 | pushURL: http://192.169.1.92:3333/new/server/{pushKey}/{port}/{httpPort} |
| 156 | 158 | stopPushURL: http://192.169.1.92:3333/stop/channel/{pushKey}/{port}/{httpPort} |
| 157 | 159 | url: http://192.168.168.241:8100/device/{0} |
| ... | ... | @@ -159,6 +161,8 @@ tuohua: |
| 159 | 161 | playHistoryPort: 9201 |
| 160 | 162 | sendPort: 9101 |
| 161 | 163 | stopSendPort: 9102 |
| 164 | + ws: ws://192.168.169.100:1091/schedule/{stream}.live.flv | |
| 165 | + wss: wss://192.168.169.100:443/schedule/{stream}.live.flv | |
| 162 | 166 | get: |
| 163 | 167 | url: http://192.169.1.92:3333/video/{stream}.flv |
| 164 | 168 | playURL: /play/wasm/ws%3A%2F%2F{ip}%3A{port}%2Fschedule%2F{sim}-{channel}.live.flv%3FcallId%{publickey} | ... | ... |
src/main/resources/application-localDev.yml
No preview for this file type
web_src/config/index.js
web_src/package.json
| ... | ... | @@ -9,6 +9,9 @@ |
| 9 | 9 | "start": "npm run dev", |
| 10 | 10 | "build": "node build/build.js" |
| 11 | 11 | }, |
| 12 | + "resolutions": { | |
| 13 | + "lodash": "4.17.21" | |
| 14 | + }, | |
| 12 | 15 | "dependencies": { |
| 13 | 16 | "@liveqing/liveplayer": "^2.7.10", |
| 14 | 17 | "axios": "^0.24.0", |
| ... | ... | @@ -28,12 +31,13 @@ |
| 28 | 31 | "vue-contextmenujs": "^1.3.13", |
| 29 | 32 | "vue-cookies": "^1.8.3", |
| 30 | 33 | "vue-giant-tree": "^0.1.5", |
| 34 | + "vue-hot-reload-api": "^2.3.4", | |
| 31 | 35 | "vue-router": "^3.1.6", |
| 32 | 36 | "vue-ztree-2.0": "^1.0.4" |
| 33 | 37 | }, |
| 34 | 38 | "devDependencies": { |
| 35 | 39 | "autoprefixer": "^7.1.2", |
| 36 | - "babel-core": "^6.22.1", | |
| 40 | + "babel-core": "^6.26.3", | |
| 37 | 41 | "babel-helper-vue-jsx-merge-props": "^2.0.3", |
| 38 | 42 | "babel-loader": "^7.1.1", |
| 39 | 43 | "babel-plugin-syntax-jsx": "^6.18.0", |
| ... | ... | @@ -48,6 +52,7 @@ |
| 48 | 52 | "file-loader": "^1.1.4", |
| 49 | 53 | "friendly-errors-webpack-plugin": "^1.6.1", |
| 50 | 54 | "html-webpack-plugin": "^2.30.1", |
| 55 | + "i": "^0.3.7", | |
| 51 | 56 | "node-notifier": "^5.1.2", |
| 52 | 57 | "optimize-css-assets-webpack-plugin": "^3.2.0", |
| 53 | 58 | "ora": "^1.2.0", | ... | ... |
web_src/src/components/DeviceList1078.vue
0 → 100644
| 1 | +<template> | |
| 2 | + <div id="devicePosition" style="width:100vw; height: 91vh"> | |
| 3 | + | |
| 4 | + <el-container v-loading="loading" style="height: 91vh;" element-loading-text="拼命加载中"> | |
| 5 | + <el-aside width="300px" style="background-color: #ffffff"> | |
| 6 | + <div class="device-tree-main-box"> | |
| 7 | + <div id="DeviceTree" style="width: 100%;height: 100%; background-color: #FFFFFF; overflow: auto"> | |
| 8 | + <el-container> | |
| 9 | + <el-header>设备列表</el-header> | |
| 10 | + <el-main style="background-color: #ffffff;"> | |
| 11 | + <tree :nodes="nodes" @onClick="onClick" @onCheck="onCheck" @onExpand="onExpand" @onCreated="handleCreated" :props="defaultProps"/> | |
| 12 | + </el-main> | |
| 13 | + </el-container> | |
| 14 | + </div> | |
| 15 | + </div> | |
| 16 | + </el-aside> | |
| 17 | + <el-container> | |
| 18 | + | |
| 19 | + <el-header height="5vh" style="text-align: left;font-size: 17px;line-height:5vh;width:90%"> | |
| 20 | + 分屏: | |
| 21 | + <i class="el-icon-full-screen btn" :class="{active:spilt==1}" @click="spiltClickFun(1)"/> | |
| 22 | + <i class="el-icon-menu btn" :class="{active:spilt==4}" @click="spiltClickFun(4)"/> | |
| 23 | + <i class="el-icon-s-grid btn" :class="{active:spilt==9}" @click="spiltClickFun(9)"/> | |
| 24 | + | |
| 25 | + <button style="margin-left: 15px;" @click="openViewDIalog()">历史数据</button> | |
| 26 | + <button style="margin-left: 15px;" @click="OneClickPlayback()">一键播放车辆视频</button> | |
| 27 | + </el-header> | |
| 28 | + | |
| 29 | + | |
| 30 | + <el-main style="padding: 0;"> | |
| 31 | + <div style="width: 99%;height: 85vh;display: flex;flex-wrap: wrap;background-color: #000;"> | |
| 32 | + <div v-for="i in spilt" :key="i" class="play-box" | |
| 33 | + :style="liveStyle" :class="{redborder:playerIdx == (i-1)}" | |
| 34 | + @click="playerIdx = (i-1)"> | |
| 35 | + <div v-if="!videoUrl[i-1]" style="color: #ffffff;font-size: 30px;font-weight: bold;">{{ i }}</div> | |
| 36 | + <player ref="player" v-else :videoUrl="videoUrl[i-1]" fluent autoplay @screenshot="shot" | |
| 37 | + @destroy="destroy"/> | |
| 38 | + </div> | |
| 39 | + </div> | |
| 40 | + </el-main> | |
| 41 | + </el-container> | |
| 42 | + </el-container> | |
| 43 | + | |
| 44 | + | |
| 45 | + <el-dialog title="历史视频播放" top="0" :close-on-click-modal="false" :visible.sync="showVideoDialog" | |
| 46 | + v-if="showVideoDialog" width="800px" :close-delay="5000" :fullscreen="true" :show-close="false"> | |
| 47 | + <el-container v-loading="loading" style="height: 88vh;" element-loading-text="拼命加载中"> | |
| 48 | + | |
| 49 | + <div style="width:100%;display: flex;flex-direction: column;justify-content: space-between;"> | |
| 50 | + <div style="width: 90%;text-align:left;margin-bottom:5px;margin-left: 25px;"> | |
| 51 | + <el-date-picker size="smaill" v-model="startTime" type="datetime" style="width:220px" value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期时间" /> | |
| 52 | + <el-date-picker size="smaill" v-model="endTime" type="datetime" style="width:220px" value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期时间" /> | |
| 53 | + | |
| 54 | + <button @click="searchHitoryList()">搜索</button> | |
| 55 | + <button @click="download()">下载播放视频</button> | |
| 56 | + <button @click="close()">关闭窗口</button> | |
| 57 | + </div> | |
| 58 | + | |
| 59 | + <div style="width: 100%;display:flex;flex-direction:row; justify-content:space-between;"> | |
| 60 | + <div style="width:20%" v-html="historyPlayListHtml" @click="playHistoryItem"> | |
| 61 | + | |
| 62 | + </div> | |
| 63 | + <div style="width: 78%;"> | |
| 64 | + <div style="width: 95%;height: 80vh;display: flex;flex-wrap: wrap;background-color: #000;"> | |
| 65 | + <div v-if="!videoUrl[0]" style="color: #ffffff;font-size: 30px;font-weight: bold;"></div> | |
| 66 | + <player ref="player" v-else :videoUrl="videoUrl[0]" fluent autoplay @screenshot="shot" | |
| 67 | + @destroy="destroy"/> | |
| 68 | + </div> | |
| 69 | + </div> | |
| 70 | + </div> | |
| 71 | + </div> | |
| 72 | + </el-container> | |
| 73 | + </el-dialog> | |
| 74 | + | |
| 75 | + </div> | |
| 76 | +</template> | |
| 77 | + | |
| 78 | +<script> | |
| 79 | +import tree from "vue-giant-tree"; | |
| 80 | +import uiHeader from "../layout/UiHeader.vue"; | |
| 81 | +import player from './common/jessibuca.vue' | |
| 82 | +import DeviceTree from './common/DeviceTree.vue' | |
| 83 | +import { isEmpty } from "ol/extent"; | |
| 84 | + | |
| 85 | + | |
| 86 | +export default { | |
| 87 | + name: "live", | |
| 88 | + components: { | |
| 89 | + uiHeader, player, DeviceTree,tree | |
| 90 | + }, | |
| 91 | + data() { | |
| 92 | + return { | |
| 93 | + videoUrl: [''], | |
| 94 | + videoUrlHistory: "", | |
| 95 | + spilt: 1,//分屏 | |
| 96 | + playerIdx: 0,//激活播放器 | |
| 97 | + | |
| 98 | + updateLooper: 0, //数据刷新轮训标志 | |
| 99 | + count: 15, | |
| 100 | + historyLoadingFlag:true, | |
| 101 | + total: 0, | |
| 102 | + startTime:'', | |
| 103 | + endTime:'', | |
| 104 | + //channel | |
| 105 | + loading: false, | |
| 106 | + device: null, | |
| 107 | + nodes:[], | |
| 108 | + carPlayTimer:null, | |
| 109 | + ztreeObj:null, | |
| 110 | + ztreeNode:null, | |
| 111 | + fullscreenLoading:true, | |
| 112 | + fullscreenLoadingStyle:'', | |
| 113 | + showVideoDialog:false, | |
| 114 | + historyPlayListHtml:'', | |
| 115 | + hisotoryPlayFlag:false, | |
| 116 | + downloadURL:null, | |
| 117 | + port:-1, | |
| 118 | + httpPort:-1, | |
| 119 | + stream:"", | |
| 120 | + sim:"", | |
| 121 | + channel:"", | |
| 122 | + setting: { | |
| 123 | + callback: { | |
| 124 | + beforeExpand: this.beforeExpand | |
| 125 | + }, | |
| 126 | + check: { | |
| 127 | + enable: false, | |
| 128 | + }, | |
| 129 | + edit: { | |
| 130 | + enable: false, | |
| 131 | + } | |
| 132 | + }, | |
| 133 | + defaultProps: { | |
| 134 | + children: 'children', | |
| 135 | + label: 'title', | |
| 136 | + name: 'title', | |
| 137 | + isLeaf: 'spread', | |
| 138 | + nameIsHTML: true, | |
| 139 | + view: { | |
| 140 | + nameIsHTML: true | |
| 141 | + } | |
| 142 | + } | |
| 143 | + }; | |
| 144 | + }, | |
| 145 | + | |
| 146 | + mounted() { | |
| 147 | + let that = this; | |
| 148 | + that.initTreeData(); | |
| 149 | + }, | |
| 150 | + created() { | |
| 151 | + this.checkPlayByParam() | |
| 152 | + }, | |
| 153 | + | |
| 154 | + computed: { | |
| 155 | + liveStyle() { | |
| 156 | + let style = {width: '100%', height: '100%'} | |
| 157 | + switch (this.spilt) { | |
| 158 | + case 4: | |
| 159 | + style = {width: '49%', height: '49%'} | |
| 160 | + break | |
| 161 | + case 9: | |
| 162 | + style = {width: '32%', height: '32%'} | |
| 163 | + break | |
| 164 | + } | |
| 165 | + this.$nextTick(() => { | |
| 166 | + for (let i = 0; i < this.spilt; i++) { | |
| 167 | + const player = this.$refs.player | |
| 168 | + player && player[i] && player[i].updatePlayerDomSize() | |
| 169 | + } | |
| 170 | + }) | |
| 171 | + return style | |
| 172 | + } | |
| 173 | + }, | |
| 174 | + watch: { | |
| 175 | + spilt(newValue) { | |
| 176 | + console.log("切换画幅;" + newValue) | |
| 177 | + let that = this | |
| 178 | + for (let i = 1; i <= newValue; i++) { | |
| 179 | + if (!that.$refs['player' + i]) { | |
| 180 | + continue | |
| 181 | + } | |
| 182 | + this.$nextTick(() => { | |
| 183 | + if (that.$refs['player' + i] instanceof Array) { | |
| 184 | + that.$refs['player' + i][0].resize() | |
| 185 | + } else { | |
| 186 | + that.$refs['player' + i].resize() | |
| 187 | + } | |
| 188 | + }) | |
| 189 | + | |
| 190 | + } | |
| 191 | + window.localStorage.setItem('split', newValue) | |
| 192 | + }, | |
| 193 | + '$route.fullPath': 'checkPlayByParam' | |
| 194 | + }, | |
| 195 | + destroyed() { | |
| 196 | + this.sendIORequestStop(this.sim,this.channel); | |
| 197 | + clearTimeout(this.updateLooper); | |
| 198 | + if(!this.isEmpty(this.carPlayTimer)){ | |
| 199 | + console.log("bbbbbbbbbbbbbbb"); | |
| 200 | + | |
| 201 | + clearTimeout(this.carPlayTimer); | |
| 202 | + } | |
| 203 | + }, | |
| 204 | + methods: { | |
| 205 | + destroy(idx) { | |
| 206 | + console.log(idx); | |
| 207 | + this.clear(idx.substring(idx.length - 1)) | |
| 208 | + }, | |
| 209 | + treeChannelClick(device, data, isCatalog) { | |
| 210 | + if (data.channelId && !isCatalog) { | |
| 211 | + if (device.online === 0) { | |
| 212 | + this.$message.error('设备离线!不允许点播'); | |
| 213 | + this.closeLoading(); | |
| 214 | + return false; | |
| 215 | + }else { | |
| 216 | + let pageObj = this; | |
| 217 | + | |
| 218 | + pageObj.sendDevicePush(data); | |
| 219 | + | |
| 220 | + } | |
| 221 | + } | |
| 222 | + }, | |
| 223 | + contextMenuEvent: function (device, event, data, isCatalog) { | |
| 224 | + | |
| 225 | + }, | |
| 226 | + //通知设备上传媒体流 | |
| 227 | + sendDevicePush: function (itemData,fun) { | |
| 228 | + // if (itemData.status === 0) { | |
| 229 | + // this.$message.error('设备离线!'); | |
| 230 | + // return | |
| 231 | + // } | |
| 232 | + this.save(itemData) | |
| 233 | + let deviceId = itemData.deviceId; | |
| 234 | + // this.isLoging = true; | |
| 235 | + let channelId = itemData.channelId; | |
| 236 | + | |
| 237 | + if(this.isEmpty(deviceId)){ | |
| 238 | + this.$message.error("没有获取到sim卡,请检查设备是否接入"); | |
| 239 | + this.closeLoading(); | |
| 240 | + if(fun){ | |
| 241 | + fun(); | |
| 242 | + } | |
| 243 | + return; | |
| 244 | + } | |
| 245 | + | |
| 246 | + | |
| 247 | + console.log("通知设备推流1:" + deviceId + " : " + channelId); | |
| 248 | + let idxTmp = this.playerIdx | |
| 249 | + let that = this; | |
| 250 | + this.loading = true | |
| 251 | + | |
| 252 | + this.$axios({ | |
| 253 | + method: 'get', | |
| 254 | + url: '/api/jt1078/query/send/request/io/' + deviceId + '/' + channelId | |
| 255 | + }).then(function (res) { | |
| 256 | + | |
| 257 | + if (res.data.code === 0 && res.data.data && (res.data.data.code ==="1" || res.data.data.code==1) ) { | |
| 258 | + let videoUrl; | |
| 259 | + that.port=res.data.data.port; | |
| 260 | + that.httpPort = res.data.data.httpPort; | |
| 261 | + that.stream = res.data.data.stream; | |
| 262 | + console.log(that.httpPort); | |
| 263 | + console.log(that.port); | |
| 264 | + console.log(res.data); | |
| 265 | + | |
| 266 | + console.log("===========================>"); | |
| 267 | + | |
| 268 | + | |
| 269 | + if(res.data.data.data){ | |
| 270 | + this.downloadURL.value = res.data.data.data.flv; | |
| 271 | + if (location.protocol === "https:") { | |
| 272 | + videoUrl = res.data.data.data.wss_flv; | |
| 273 | + } else { | |
| 274 | + videoUrl = res.data.data.data.ws_flv; | |
| 275 | + } | |
| 276 | + console.log(videoUrl); | |
| 277 | + | |
| 278 | + itemData.playUrl = videoUrl; | |
| 279 | + that.setPlayUrl(videoUrl, idxTmp); | |
| 280 | + } | |
| 281 | + | |
| 282 | + }else { | |
| 283 | + if(!that.isEmpty(res.data.data) && !that.isEmpty( res.data.data.msg)){ | |
| 284 | + that.$message.error(res.data.data.msg); | |
| 285 | + }else{ | |
| 286 | + | |
| 287 | + that.$message.error(res.data.msg); | |
| 288 | + } | |
| 289 | + | |
| 290 | + } | |
| 291 | + | |
| 292 | + if(fun){ | |
| 293 | + | |
| 294 | + fun(); | |
| 295 | + } | |
| 296 | + }).catch(function (e) { | |
| 297 | + if(fun){ | |
| 298 | + console.log("fun-------------------->2"); | |
| 299 | + fun(); | |
| 300 | + } | |
| 301 | + }).finally(() => { | |
| 302 | + this.closeLoading(); | |
| 303 | + }); | |
| 304 | + | |
| 305 | + | |
| 306 | + }, | |
| 307 | + setPlayUrl(url, idx) { | |
| 308 | + | |
| 309 | + this.$set(this.videoUrl, idx, url) | |
| 310 | + let _this = this | |
| 311 | + setTimeout(() => { | |
| 312 | + window.localStorage.setItem('videoUrl', JSON.stringify(_this.videoUrl)) | |
| 313 | + }, 100) | |
| 314 | + | |
| 315 | + }, | |
| 316 | + checkPlayByParam() { | |
| 317 | + let {deviceId, channelId} = this.$route.query | |
| 318 | + if (deviceId && channelId) { | |
| 319 | + this.sendDevicePush({deviceId, channelId}) | |
| 320 | + } | |
| 321 | + }, | |
| 322 | + shot(e) { | |
| 323 | + // console.log(e) | |
| 324 | + // send({code:'image',data:e}) | |
| 325 | + var base64ToBlob = function (code) { | |
| 326 | + let parts = code.split(';base64,'); | |
| 327 | + let contentType = parts[0].split(':')[1]; | |
| 328 | + let raw = window.atob(parts[1]); | |
| 329 | + let rawLength = raw.length; | |
| 330 | + let uInt8Array = new Uint8Array(rawLength); | |
| 331 | + for (let i = 0; i < rawLength; ++i) { | |
| 332 | + uInt8Array[i] = raw.charCodeAt(i); | |
| 333 | + } | |
| 334 | + return new Blob([uInt8Array], { | |
| 335 | + type: contentType | |
| 336 | + }); | |
| 337 | + }; | |
| 338 | + let aLink = document.createElement('a'); | |
| 339 | + let blob = base64ToBlob(e); //new Blob([content]); | |
| 340 | + let evt = document.createEvent("HTMLEvents"); | |
| 341 | + evt.initEvent("click", true, true); //initEvent 不加后两个参数在FF下会报错 事件类型,是否冒泡,是否阻止浏览器的默认行为 | |
| 342 | + aLink.download = '截图'; | |
| 343 | + aLink.href = URL.createObjectURL(blob); | |
| 344 | + aLink.click(); | |
| 345 | + }, | |
| 346 | + save(item) { | |
| 347 | + let dataStr = window.localStorage.getItem('playData') || '[]' | |
| 348 | + let data = JSON.parse(dataStr); | |
| 349 | + data[this.playerIdx] = item | |
| 350 | + window.localStorage.setItem('playData', JSON.stringify(data)) | |
| 351 | + }, | |
| 352 | + clear(idx) { | |
| 353 | + let dataStr = window.localStorage.getItem('playData') || '[]' | |
| 354 | + let data = JSON.parse(dataStr); | |
| 355 | + data[idx - 1] = null; | |
| 356 | + console.log(data); | |
| 357 | + window.localStorage.setItem('playData', JSON.stringify(data)) | |
| 358 | + }, | |
| 359 | + initTreeData(){ | |
| 360 | + this.showLoading(); | |
| 361 | + this.$axios({ | |
| 362 | + method: 'get', | |
| 363 | + url:`/api/jt1078/query/company/tree`, | |
| 364 | + }).then((res) => { | |
| 365 | + if(res && res.data && res.data.data){ | |
| 366 | + if(res.data.data.code == 1){ | |
| 367 | + let data = res.data.data.result; | |
| 368 | + this.initDate(this.nodes,data); | |
| 369 | + }else if(res.data.data.message){ | |
| 370 | + this.$message.error(res.data.data.message); | |
| 371 | + } | |
| 372 | + }else{ | |
| 373 | + this.$message.error("请求错误,请刷新再试"); | |
| 374 | + } | |
| 375 | + | |
| 376 | + this.closeLoading(); | |
| 377 | + | |
| 378 | + | |
| 379 | + }); | |
| 380 | + }, | |
| 381 | + | |
| 382 | + initDate(nodes,datas){ | |
| 383 | + if(nodes && datas){ | |
| 384 | + let len = datas.length; | |
| 385 | + for (let i = 0; i < len; i++) { | |
| 386 | + if(null == datas[i].id || undefined == datas[i].id || "" == datas[i].id){ | |
| 387 | + continue; | |
| 388 | + } | |
| 389 | + let node = this.combationNodeValue(datas[i].name,datas[i].id,datas[i].type,true,datas[i].sim) | |
| 390 | + | |
| 391 | + nodes.push(node); | |
| 392 | + if(datas[i].children){ | |
| 393 | + node.children = []; | |
| 394 | + this.initDate(node.children,datas[i].children); | |
| 395 | + } | |
| 396 | + } | |
| 397 | + } | |
| 398 | + }, | |
| 399 | + combationNodeValue(name,id,type,isParent,sim){ | |
| 400 | + if(this.isEmpty(sim)){ | |
| 401 | + sim = ""; | |
| 402 | + } | |
| 403 | + | |
| 404 | + return { | |
| 405 | + name: name, | |
| 406 | + id: id, | |
| 407 | + sim:sim, | |
| 408 | + type: type, | |
| 409 | + isParent: isParent, | |
| 410 | + | |
| 411 | + } | |
| 412 | + }, | |
| 413 | + onClick(evt, treeId, treeNode) { | |
| 414 | + this.combationChildNode(treeNode); | |
| 415 | + }, | |
| 416 | + onCheck(evt, treeId, treeNode) { | |
| 417 | + | |
| 418 | + }, | |
| 419 | + beforeExpand(treeId, treeNode) { | |
| 420 | + | |
| 421 | + return true; | |
| 422 | + }, | |
| 423 | + onExpand(evt, treeId, treeNode) { | |
| 424 | + this.combationChildNode(treeNode); | |
| 425 | + }, | |
| 426 | + handleCreated(ztreeObj) { | |
| 427 | + this.ztreeObj = ztreeObj; | |
| 428 | + this.ztreeObj.setting.view.nameIsHTML=true; | |
| 429 | + | |
| 430 | + }, | |
| 431 | + | |
| 432 | + combationChildNode(treeNo){ | |
| 433 | + this.ztreeNode = treeNo; | |
| 434 | + if(treeNo.seachChild && (treeNo.seachChild == 'true')){ | |
| 435 | + return; | |
| 436 | + } | |
| 437 | + console.log(treeNo.type); | |
| 438 | + | |
| 439 | + this.showLoading(); | |
| 440 | + if(treeNo.type == 401 || treeNo.type == '401'){ | |
| 441 | + let device = new Object(); | |
| 442 | + if(this.isEmpty(treeNo.online)){ | |
| 443 | + treeNo.online = 1; | |
| 444 | + } | |
| 445 | + device.online = treeNo.online; | |
| 446 | + | |
| 447 | + if(this.spilt == 1){ | |
| 448 | + this.videoUrl=[] | |
| 449 | + } | |
| 450 | + | |
| 451 | + let pageObj = this; | |
| 452 | + | |
| 453 | + if(!this.isEmpty(this.sim) && !this.channel && this.sim != treeNo.sim && this.channel != treeNo.id){ | |
| 454 | + let data = new Object(); | |
| 455 | + data.channelId =treeNo.id; | |
| 456 | + data.sim = treeNo.sim; | |
| 457 | + data.deviceId = treeNo.sim; | |
| 458 | + this.sim = treeNo.sim; | |
| 459 | + this.channel = treeNo.id; | |
| 460 | + console.log("stop"); | |
| 461 | + | |
| 462 | + this.sendIORequestStop(data.sim,data.channelId,function(){ | |
| 463 | + | |
| 464 | + let flag = pageObj.treeChannelClick(device,data,false); | |
| 465 | + if(false == flag){ | |
| 466 | + treeNo.online = 0; | |
| 467 | + } | |
| 468 | + }); | |
| 469 | + }else{ | |
| 470 | + let data = new Object(); | |
| 471 | + data.channelId =treeNo.id; | |
| 472 | + data.sim = treeNo.sim; | |
| 473 | + data.deviceId = treeNo.sim; | |
| 474 | + this.sim = treeNo.sim; | |
| 475 | + this.channel = treeNo.id; | |
| 476 | + | |
| 477 | + let flag = pageObj.treeChannelClick(device,data,false); | |
| 478 | + if(false == flag){ | |
| 479 | + treeNo.online = 0; | |
| 480 | + } | |
| 481 | + } | |
| 482 | + }else if(treeNo.type ==301 || treeNo.type=='301'){ | |
| 483 | + this.addChannel(treeNo); | |
| 484 | + this.channel = null; | |
| 485 | + }else if(treeNo.type==2|| treeNo.type=='2') { | |
| 486 | + this.requestChildNode(treeNo); | |
| 487 | + this.sim = null; | |
| 488 | + this.channel = null; | |
| 489 | + }else{ | |
| 490 | + this.closeLoading(); | |
| 491 | + } | |
| 492 | + | |
| 493 | + }, | |
| 494 | + addChannel(treeNo){ | |
| 495 | + let labels=['ADAS','DSM','路况','司机','整车前','中门','倒车','前门客流','后面客流']; | |
| 496 | + let children=[]; | |
| 497 | + let len = labels.length; | |
| 498 | + let i = 0; | |
| 499 | + | |
| 500 | + let pageObj = this; | |
| 501 | + for(;i<len;i++){ | |
| 502 | + let node = this.combationNodeValue(labels[i],i+1,401,false); | |
| 503 | + node.sim = treeNo.sim; | |
| 504 | + node.zbh = treeNo.name; | |
| 505 | + node.id=i+1; | |
| 506 | + children.push(node); | |
| 507 | + } | |
| 508 | + this.ztreeObj.addNodes(treeNo,0,children,true); | |
| 509 | + treeNo.seachChild='true'; | |
| 510 | + | |
| 511 | + pageObj.sim = treeNo.sim; | |
| 512 | + | |
| 513 | + this.closeLoading(); | |
| 514 | + | |
| 515 | + }, | |
| 516 | + requestChildNode(treeNo){ | |
| 517 | + | |
| 518 | + if(treeNo.spread==='false' || !treeNo.spread){ | |
| 519 | + let id = treeNo.id; | |
| 520 | + let that = this; | |
| 521 | + this.$axios({ | |
| 522 | + method: 'get', | |
| 523 | + url:`/api/jt1078/query/car/tree/`+id, | |
| 524 | + }).then((res) => { | |
| 525 | + | |
| 526 | + if(res && res.data && res.data.data){ | |
| 527 | + if(res.data.data.code == 1){ | |
| 528 | + let children =[]; | |
| 529 | + this.initDate(children,res.data.data.result); | |
| 530 | + | |
| 531 | + this.ztreeObj.addNodes(treeNo,-1,children,true); | |
| 532 | + treeNo.seachChild='true'; | |
| 533 | + | |
| 534 | + this.carPlayTimer = setTimeout(function(){ | |
| 535 | + that.requestChildNode1(); | |
| 536 | + },15000); | |
| 537 | + | |
| 538 | + }else if(res.data.data.message){ | |
| 539 | + this.$message.error(res.data.data.message); | |
| 540 | + } | |
| 541 | + }else{ | |
| 542 | + this.$message.error("请求错误,请刷新再试"); | |
| 543 | + } | |
| 544 | + | |
| 545 | + this.closeLoading(); | |
| 546 | + }) | |
| 547 | + } | |
| 548 | + }, | |
| 549 | + requestChildNode1(treeNo){ | |
| 550 | + let that = this; | |
| 551 | + this.$axios({ | |
| 552 | + method: 'get', | |
| 553 | + url:`/api/jt1078/query/car/tree/`+100, | |
| 554 | + }).then((res) => { | |
| 555 | + | |
| 556 | + if(res && res.data && res.data.data){ | |
| 557 | + if(res.data.data.code == 1){ | |
| 558 | + this.refreshRequestRefresh(res.data.data.result); | |
| 559 | + | |
| 560 | + }else if(res.data.data.message){ | |
| 561 | + this.$message.error(res.data.data.message); | |
| 562 | + } | |
| 563 | + }else{ | |
| 564 | + this.$message.error("请求错误,请刷新再试"); | |
| 565 | + } | |
| 566 | + }) | |
| 567 | + }, | |
| 568 | + | |
| 569 | + refreshRequestRefresh(nodes){ | |
| 570 | + if(nodes){ | |
| 571 | + let length = nodes.length; | |
| 572 | + for(let i=0;i<length;i++){ | |
| 573 | + let findNode = this.ztreeObj.getNodeByParam("id",nodes[i].id+"",null); | |
| 574 | + if(findNode){ | |
| 575 | + findNode.name = nodes[i].name; | |
| 576 | + if(findNode.type==301 || findNode.type=='301'){ | |
| 577 | + findNode.name = nodes[i].name; | |
| 578 | + }else{ | |
| 579 | + findNode.name = nodes[i].name; | |
| 580 | + } | |
| 581 | + this.ztreeObj.updateNode(findNode); | |
| 582 | + | |
| 583 | + if(nodes[i].children){ | |
| 584 | + this.refreshRequestRefresh(nodes[i].children); | |
| 585 | + } | |
| 586 | + } | |
| 587 | + | |
| 588 | + | |
| 589 | + } | |
| 590 | + } | |
| 591 | + }, | |
| 592 | + showLoading(){ | |
| 593 | + | |
| 594 | + | |
| 595 | + this.loading = true; | |
| 596 | + this.fullscreenLoading = true; | |
| 597 | + // this.fullscreenLoadingStyle ='display:block'; | |
| 598 | + }, | |
| 599 | + closeLoading(){ | |
| 600 | + this.loading = false; | |
| 601 | + //this.fullscreenLoadingStyle ='display:none'; | |
| 602 | + this.fullscreenLoading = false; | |
| 603 | + console.log("已经关闭"); | |
| 604 | + | |
| 605 | + | |
| 606 | + }, | |
| 607 | + sendIORequestStop(sim,channel,fun){ | |
| 608 | + if(this.isEmpty(sim) || this.isEmpty(channel)){ | |
| 609 | + console.log("sim:"+sim+";channel:"+channel); | |
| 610 | + if(fun){ | |
| 611 | + fun(); | |
| 612 | + } | |
| 613 | + return; | |
| 614 | + } | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + this.videoUrl=['']; | |
| 619 | + this.$axios({ | |
| 620 | + method: 'get', | |
| 621 | + url:`/api/jt1078/query/send/stop/io/`+sim+"/"+channel+"/"+this.stream+"/"+this.port+"/"+this.httpPort+"/", | |
| 622 | + }).then((res) => { | |
| 623 | + console.log(res); | |
| 624 | + if(fun){ | |
| 625 | + fun(); | |
| 626 | + } | |
| 627 | + }); | |
| 628 | + }, | |
| 629 | + isEmpty(val){ | |
| 630 | + return null == val || undefined == val || "" == val; | |
| 631 | + }, | |
| 632 | + openViewDIalog(){ | |
| 633 | + | |
| 634 | + if(this.isEmpty(this.sim)){ | |
| 635 | + this.$message.error('请选择车辆'); | |
| 636 | + return; | |
| 637 | + } | |
| 638 | + | |
| 639 | + if(this.isEmpty(this.channel)){ | |
| 640 | + | |
| 641 | + this.$message.error('请选择通道'); | |
| 642 | + return; | |
| 643 | + } | |
| 644 | + this.showLoading(); | |
| 645 | + let pageObj =this; | |
| 646 | + this.videoUrl=['']; | |
| 647 | + | |
| 648 | + | |
| 649 | + pageObj.showVideoDialog = true; | |
| 650 | + pageObj.closeLoading(); | |
| 651 | + | |
| 652 | + | |
| 653 | + }, | |
| 654 | + close() { | |
| 655 | + let pageObj = this; | |
| 656 | + this.showLoading(); | |
| 657 | + if(this.hisotoryPlayFlag){ | |
| 658 | + this.sendIORequestStop(this.sim,this.channel,function(){ | |
| 659 | + pageObj.showVideoDialog = false; | |
| 660 | + pageObj.videoUrl=['']; | |
| 661 | + pageObj.closeLoading(); | |
| 662 | + console.log("关闭弹窗"); | |
| 663 | + }); | |
| 664 | + }else{ | |
| 665 | + pageObj.showVideoDialog = false; | |
| 666 | + pageObj.closeLoading(); | |
| 667 | + } | |
| 668 | + }, | |
| 669 | + searchHitoryList(){ | |
| 670 | + if(this.isEmpty(this.sim)){ | |
| 671 | + this.$message.error('请选择车辆'); | |
| 672 | + return; | |
| 673 | + } | |
| 674 | + | |
| 675 | + if(this.isEmpty(this.channel)){ | |
| 676 | + this.$message.error('请选择通道'); | |
| 677 | + return; | |
| 678 | + } | |
| 679 | + | |
| 680 | + if(this.isEmpty(this.startTime)){ | |
| 681 | + this.$message.error('请选择开始时间'); | |
| 682 | + return; | |
| 683 | + } | |
| 684 | + | |
| 685 | + if(this.isEmpty(this.endTime)){ | |
| 686 | + this.$message.error('请选择结束时间'); | |
| 687 | + return; | |
| 688 | + } | |
| 689 | + | |
| 690 | + this.showLoading(); | |
| 691 | + | |
| 692 | + let pageObj = this; | |
| 693 | + this.$axios({ | |
| 694 | + method: 'get', | |
| 695 | + url: '/api/jt1078/query/history/list/' + this.sim + '/' + this.channel+"/"+this.startTime+"/"+this.endTime | |
| 696 | + }).then(function (res) { | |
| 697 | + | |
| 698 | + | |
| 699 | + if(res &&res.data && res.data.data && res.data.data.obj && res.data.data.code==1 && res.data.data.obj.data && res.data.data.obj.data.items){ | |
| 700 | + let length = res.data.data.obj.data.items.length; | |
| 701 | + let html = "<div class='historyListDiv'><ul>"; | |
| 702 | + for (let i = 0; i < length; i++) { | |
| 703 | + let item = res.data.data.obj.data.items[i]; | |
| 704 | + if(item.channelNo === pageObj.channel){ | |
| 705 | + let title = item.startTime+"——"+item.endTime; | |
| 706 | + html+="<li class='historyListLi' click='playHistoryItem()' startTime = '"+item.startTime+"' endTime='"+item.endTime+"' streamType='"+item.streamType+"' title='"+title+"' channelMapping='"+item.channelMapping+"'>"+title+"</li>"; | |
| 707 | + } | |
| 708 | + } | |
| 709 | + pageObj.historyPlayListHtml = html+"</ul></div>"; | |
| 710 | + pageObj.closeLoading(); | |
| 711 | + }else if(res && res.data && res.data.data && res.data.data.msg){ | |
| 712 | + pageObj.$message.error(res.data.data.msg); | |
| 713 | + pageObj.closeLoading(); | |
| 714 | + }else{ | |
| 715 | + pageObj.closeLoading(); | |
| 716 | + } | |
| 717 | + }); | |
| 718 | + }, | |
| 719 | + playHistoryItem(e){ | |
| 720 | + if(this.isEmpty(this.sim)){ | |
| 721 | + this.$message.error('请选择车辆'); | |
| 722 | + return; | |
| 723 | + } | |
| 724 | + | |
| 725 | + if(this.isEmpty(this.channel)){ | |
| 726 | + this.$message.error('请选择通道'); | |
| 727 | + return; | |
| 728 | + } | |
| 729 | + | |
| 730 | + if(this.isEmpty(this.startTime)){ | |
| 731 | + this.$message.error('请选择开始时间'); | |
| 732 | + return; | |
| 733 | + } | |
| 734 | + | |
| 735 | + if(this.isEmpty(this.endTime)){ | |
| 736 | + this.$message.error('请选择结束时间'); | |
| 737 | + return; | |
| 738 | + } | |
| 739 | + | |
| 740 | + let pageObj = this; | |
| 741 | + this.showLoading(); | |
| 742 | + | |
| 743 | + this.videoUrl =[]; | |
| 744 | + | |
| 745 | + | |
| 746 | + pageObj.$axios({ | |
| 747 | + method: 'get', | |
| 748 | + url: '/api/jt1078/query/send/request/io/history/' + pageObj.sim + '/' + pageObj.channel+"/"+e.target.getAttribute('startTime')+"/"+e.target.getAttribute('endTime')+"/"+e.target.getAttribute('channelMapping') | |
| 749 | + }).then(function (res) { | |
| 750 | + console.log(res); | |
| 751 | + | |
| 752 | + if (res.data && res.data.data && res.data.data.data) { | |
| 753 | + let videoUrl1; | |
| 754 | + if (location.protocol === "https:") { | |
| 755 | + videoUrl1 = res.data.data.data.wss_flv; | |
| 756 | + } else { | |
| 757 | + videoUrl1 = res.data.data.data.ws_flv; | |
| 758 | + } | |
| 759 | + pageObj.port=res.data.data.port; | |
| 760 | + pageObj.httpPort = res.data.data.httpPort; | |
| 761 | + pageObj.stream = res.data.data.stream; | |
| 762 | + pageObj.videoUrlHistory = videoUrl1; | |
| 763 | + | |
| 764 | + let itemData = new Object(); | |
| 765 | + itemData.deviceId = pageObj.sim; | |
| 766 | + // this.isLoging = true; | |
| 767 | + itemData.channelId= pageObj.channel; | |
| 768 | + itemData.playUrl = videoUrl1; | |
| 769 | + console.log(pageObj.playerIdx); | |
| 770 | + | |
| 771 | + pageObj.setPlayUrl(videoUrl1, 0); | |
| 772 | + pageObj.hisotoryPlayFlag = true; | |
| 773 | + // pageObj.$nextTick(() => { | |
| 774 | + // pageObj.createdPlay(); | |
| 775 | + // pageObj.closeLoading(); | |
| 776 | + // }) | |
| 777 | + } else if(res.data.data && res.data.data.msg){ | |
| 778 | + pageObj.$message.error(res.data.data.msg); | |
| 779 | + } else if(res.data.msg){ | |
| 780 | + pageObj.$message.error(res.data.msg); | |
| 781 | + }else if(res.msg){ | |
| 782 | + pageObj.$message.error(res.msg); | |
| 783 | + } | |
| 784 | + pageObj.closeLoading(); | |
| 785 | + }); | |
| 786 | + | |
| 787 | + }, | |
| 788 | + createdPlay() { | |
| 789 | + if (flvjs.isSupported()) { | |
| 790 | + // var videoDom = document.getElementById('myVideo') | |
| 791 | + console.log(this.videoUrlHistory); | |
| 792 | + let videoDom = this.$refs.myVideo | |
| 793 | + // 创建一个播放器实例 | |
| 794 | + var player = flvjs.createPlayer({ | |
| 795 | + type: 'flv', // 媒体类型,默认是 flv, | |
| 796 | + isLive: false, // 是否是直播流 | |
| 797 | + url: this.videoUrlHistory // 流地址 | |
| 798 | + }, { | |
| 799 | + // 其他的配置项可以根据项目实际情况参考 api 去配置 | |
| 800 | + autoCleanupMinBackwardDuration: true, // 清除缓存 对 SourceBuffer 进行自动清理 | |
| 801 | + }) | |
| 802 | + player.attachMediaElement(videoDom) | |
| 803 | + player.load() | |
| 804 | + player.play() | |
| 805 | + this.player = player | |
| 806 | + } | |
| 807 | + }, | |
| 808 | + OneClickPlayback(){ | |
| 809 | + if(this.isEmpty(this.sim)){ | |
| 810 | + this.$message.error('请选择车辆'); | |
| 811 | + return; | |
| 812 | + } | |
| 813 | + this.spilt = 9; | |
| 814 | + | |
| 815 | + for(let i=0;i<9;i++){ | |
| 816 | + let item = new Object(); | |
| 817 | + item.deviceId = this.sim; | |
| 818 | + item.channelId = 1+i; | |
| 819 | + this.playerIdx=i; | |
| 820 | + this.sendDevicePush(item); | |
| 821 | + } | |
| 822 | + | |
| 823 | + | |
| 824 | + }, | |
| 825 | + spiltClickFun(val){ | |
| 826 | + this.spilt = val; | |
| 827 | + if(val-1 < this.playerIdx){ | |
| 828 | + this.playerIdx = val-1; | |
| 829 | + } | |
| 830 | + }, | |
| 831 | + download(){ | |
| 832 | + if(this.isEmpty(this.downloadURL) || this.isEmpty(this.downloadURL.value)){ | |
| 833 | + return; | |
| 834 | + } | |
| 835 | + window.open(this.downloadURL.value,"_download"); | |
| 836 | + } | |
| 837 | + } | |
| 838 | +}; | |
| 839 | + | |
| 840 | + | |
| 841 | +</script> | |
| 842 | + | |
| 843 | +<style> | |
| 844 | +.device-tree-main-box{ | |
| 845 | + text-align: left; | |
| 846 | +} | |
| 847 | +.btn { | |
| 848 | + margin: 0 10px; | |
| 849 | + | |
| 850 | +} | |
| 851 | + | |
| 852 | +.btn:hover { | |
| 853 | + color: #409EFF; | |
| 854 | +} | |
| 855 | + | |
| 856 | +.btn.active { | |
| 857 | + color: #409EFF; | |
| 858 | + | |
| 859 | +} | |
| 860 | + | |
| 861 | +.redborder { | |
| 862 | + border: 2px solid red !important; | |
| 863 | +} | |
| 864 | + | |
| 865 | +.play-box { | |
| 866 | + background-color: #000000; | |
| 867 | + border: 2px solid #505050; | |
| 868 | + display: flex; | |
| 869 | + align-items: center; | |
| 870 | + justify-content: center; | |
| 871 | +} | |
| 872 | +.historyListLi{ | |
| 873 | + width: 97%; | |
| 874 | + white-space: nowrap; | |
| 875 | + text-overflow: ellipsis; | |
| 876 | + cursor: pointer; | |
| 877 | + padding: 3px; | |
| 878 | + margin-bottom: 6px; | |
| 879 | + border: 1px solid #000000; | |
| 880 | +} | |
| 881 | +.historyListDiv{ | |
| 882 | + height:80vh; | |
| 883 | + width:100%; | |
| 884 | + overflow-y:auto; | |
| 885 | + overflow-x:hidden; | |
| 886 | +} | |
| 887 | +</style> | |
| 888 | +<style> | |
| 889 | +.videoList { | |
| 890 | + display: flex; | |
| 891 | + flex-wrap: wrap; | |
| 892 | + align-content: flex-start; | |
| 893 | +} | |
| 894 | + | |
| 895 | +.video-item { | |
| 896 | + position: relative; | |
| 897 | + width: 15rem; | |
| 898 | + height: 10rem; | |
| 899 | + margin-right: 1rem; | |
| 900 | + background-color: #000000; | |
| 901 | +} | |
| 902 | + | |
| 903 | +.video-item-img { | |
| 904 | + position: absolute; | |
| 905 | + top: 0; | |
| 906 | + bottom: 0; | |
| 907 | + left: 0; | |
| 908 | + right: 0; | |
| 909 | + margin: auto; | |
| 910 | + width: 100%; | |
| 911 | + height: 100%; | |
| 912 | +} | |
| 913 | + | |
| 914 | +.video-item-img:after { | |
| 915 | + content: ""; | |
| 916 | + display: inline-block; | |
| 917 | + position: absolute; | |
| 918 | + z-index: 2; | |
| 919 | + top: 0; | |
| 920 | + bottom: 0; | |
| 921 | + left: 0; | |
| 922 | + right: 0; | |
| 923 | + margin: auto; | |
| 924 | + width: 3rem; | |
| 925 | + height: 3rem; | |
| 926 | + background-image: url("../assets/loading.png"); | |
| 927 | + background-size: cover; | |
| 928 | + background-color: #000000; | |
| 929 | +} | |
| 930 | + | |
| 931 | +.video-item-title { | |
| 932 | + position: absolute; | |
| 933 | + bottom: 0; | |
| 934 | + color: #000000; | |
| 935 | + background-color: #ffffff; | |
| 936 | + line-height: 1.5rem; | |
| 937 | + padding: 0.3rem; | |
| 938 | + width: 14.4rem; | |
| 939 | +} | |
| 940 | + | |
| 941 | +.baidumap { | |
| 942 | + width: 100%; | |
| 943 | + height: 100%; | |
| 944 | + border: none; | |
| 945 | + position: absolute; | |
| 946 | + left: 0; | |
| 947 | + top: 0; | |
| 948 | + right: 0; | |
| 949 | + bottom: 0; | |
| 950 | + margin: auto; | |
| 951 | +} | |
| 952 | + | |
| 953 | +/* 去除百度地图版权那行字 和 百度logo */ | |
| 954 | +.baidumap > .BMap_cpyCtrl { | |
| 955 | + display: none !important; | |
| 956 | +} | |
| 957 | + | |
| 958 | +.baidumap > .anchorBL { | |
| 959 | + display: none !important; | |
| 960 | +} | |
| 961 | +</style> | |
| 0 | 962 | \ No newline at end of file | ... | ... |
web_src/src/components/common/DeviceTree1078.vue
0 → 100644
| 1 | +<template> | |
| 2 | + <div id="DeviceTree" style="width: 100%;height: 100%; background-color: #FFFFFF; overflow: auto"> | |
| 3 | + <el-container> | |
| 4 | + <el-header>设备列表</el-header> | |
| 5 | + <el-main style="background-color: #ffffff;"> | |
| 6 | + <div class="device-tree-main-box"> | |
| 7 | + <el-tree ref="gdTree" :props="defaultProps" :load="loadNode" lazy @node-click="handleNodeClick"@node-contextmenu="handleContextMenu" node-key="id" style="min-width: 100%; display:inline-block !important;"> | |
| 8 | + <span class="custom-tree-node" slot-scope="{ node, data }" style="width: 100%"> | |
| 9 | + <span v-if="node.data.type === 0 && node.data.online" title="在线设备" class="device-online iconfont icon-jiedianleizhukongzhongxin2"></span> | |
| 10 | + <span v-if="node.data.type === 0 && !node.data.online " title="离线设备" class="device-offline iconfont icon-jiedianleizhukongzhongxin2"></span> | |
| 11 | + <span v-if="node.data.type === 2 && node.data.online" title="目录" class="device-online iconfont icon-jiedianleilianjipingtai"></span> | |
| 12 | + <span v-if="node.data.type === 2 && !node.data.online" title="目录" class="device-offline iconfont icon-jiedianleilianjipingtai"></span> | |
| 13 | + <span v-if="node.data.type === 3 && node.data.online " title="在线通道" class="device-online iconfont icon-shebeileijiankongdian"></span> | |
| 14 | + <span v-if="node.data.type === 3 && !node.data.online" title="在线通道" class="device-offline iconfont icon-shebeileijiankongdian"></span> | |
| 15 | + <span v-if="node.data.type === 4 && node.data.online " title="在线通道-球机" class="device-online iconfont icon-shebeileiqiuji"></span> | |
| 16 | + <span v-if="node.data.type === 4 && !node.data.online" title="在线通道-球机" class="device-offline iconfont icon-shebeileiqiuji"></span> | |
| 17 | + <span v-if="node.data.type === 5 && node.data.online " title="在线通道-半球" class="device-online iconfont icon-shebeileibanqiu"></span> | |
| 18 | + <span v-if="node.data.type === 5 && !node.data.online" title="在线通道-半球" class="device-offline iconfont icon-shebeileibanqiu"></span> | |
| 19 | + <span v-if="node.data.type === 6 && node.data.online " title="在线通道-枪机" class="device-online iconfont icon-shebeileiqiangjitongdao"></span> | |
| 20 | + <span v-if="node.data.type === 6 && !node.data.online" title="在线通道-枪机" class="device-offline iconfont icon-shebeileiqiangjitongdao"></span> | |
| 21 | + <span v-if="node.data.online" style="padding-left: 1px" class="device-online">{{ node.label }}</span> | |
| 22 | + <span v-if="!node.data.online" style="padding-left: 1px" class="device-offline">{{ node.label }}</span> | |
| 23 | + <span> | |
| 24 | + <i v-if="node.data.hasGPS && node.data.online" style="color: #9d9d9d" class="device-online iconfont icon-dizhi"></i> | |
| 25 | + <i v-if="node.data.hasGPS && !node.data.online" style="color: #9d9d9d" class="device-offline iconfont icon-dizhi"></i> | |
| 26 | + </span> | |
| 27 | + </span> | |
| 28 | + </el-tree> | |
| 29 | + </div> | |
| 30 | + </el-main> | |
| 31 | + </el-container> | |
| 32 | + </div> | |
| 33 | +</template> | |
| 34 | + | |
| 35 | +<script> | |
| 36 | +import DeviceService from "../service/DeviceService1078.js"; | |
| 37 | + | |
| 38 | +export default { | |
| 39 | + name: 'DeviceTree', | |
| 40 | + data() { | |
| 41 | + return { | |
| 42 | + deviceService: new DeviceService(), | |
| 43 | + defaultProps: { | |
| 44 | + children: 'children', | |
| 45 | + label: 'name', | |
| 46 | + isLeaf: 'isLeaf' | |
| 47 | + } | |
| 48 | + }; | |
| 49 | + }, | |
| 50 | + props: ['device', 'onlyCatalog', 'clickEvent', 'contextMenuEvent'], | |
| 51 | + methods: { | |
| 52 | + handleNodeClick(data,node,element) { | |
| 53 | + let deviceNode = this.$refs.gdTree.getNode(data.userData.deviceId) | |
| 54 | + if(typeof (this.clickEvent) == "function") { | |
| 55 | + this.clickEvent(deviceNode.data.userData, data.userData, data.type === 2) | |
| 56 | + } | |
| 57 | + }, | |
| 58 | + handleContextMenu(event,data,node,element) { | |
| 59 | + console.log("右键点击事件") | |
| 60 | + let deviceNode = this.$refs.gdTree.getNode(data.userData.deviceId) | |
| 61 | + if(typeof (this.contextMenuEvent) == "function") { | |
| 62 | + this.contextMenuEvent(deviceNode.data.userData, event, data.userData, data.type === 2) | |
| 63 | + } | |
| 64 | + }, | |
| 65 | + loadNode: function(node, resolve){ | |
| 66 | + console.log(this.device) | |
| 67 | + if (node.level === 0) { | |
| 68 | + if (this.device) { | |
| 69 | + let node = { | |
| 70 | + name: this.device.name || this.device.deviceId, | |
| 71 | + isLeaf: false, | |
| 72 | + id: this.device.deviceId, | |
| 73 | + type: this.device.online, | |
| 74 | + online: this.device.online === 1, | |
| 75 | + userData: this.device | |
| 76 | + } | |
| 77 | + resolve([node]) | |
| 78 | + }else { | |
| 79 | + this.deviceService.getAllDeviceList((data)=>{ | |
| 80 | + console.log(data) | |
| 81 | + if (data.length > 0) { | |
| 82 | + let nodeList = [] | |
| 83 | + for (let i = 0; i < data.length; i++) { | |
| 84 | + console.log(data[i].name) | |
| 85 | + let node = { | |
| 86 | + name: data[i].name || data[i].deviceId, | |
| 87 | + isLeaf: false, | |
| 88 | + id: data[i].deviceId, | |
| 89 | + type: data[i].online, | |
| 90 | + online: data[i].online === 1, | |
| 91 | + userData: data[i] | |
| 92 | + } | |
| 93 | + nodeList.push(node); | |
| 94 | + } | |
| 95 | + resolve(nodeList) | |
| 96 | + }else { | |
| 97 | + resolve([]) | |
| 98 | + } | |
| 99 | + }, (list)=>{ | |
| 100 | + console.log("设备加载完成") | |
| 101 | + }, (error)=>{ | |
| 102 | + | |
| 103 | + }) | |
| 104 | + } | |
| 105 | + }else { | |
| 106 | + let channelArray = [] | |
| 107 | + | |
| 108 | + this.deviceService.getTree(node.data.userData.deviceId, node.data.id, this.onlyCatalog, catalogData =>{ | |
| 109 | + console.log(catalogData) | |
| 110 | + channelArray = channelArray.concat(catalogData) | |
| 111 | + this.channelDataHandler(channelArray, resolve) | |
| 112 | + },(endCatalogData) => { | |
| 113 | + | |
| 114 | + }) | |
| 115 | + } | |
| 116 | + | |
| 117 | + }, | |
| 118 | + channelDataHandler: function (data, resolve) { | |
| 119 | + if (data.length > 0) { | |
| 120 | + let nodeList = [] | |
| 121 | + for (let i = 0; i <data.length; i++) { | |
| 122 | + let item = data[i]; | |
| 123 | + let type = 3; | |
| 124 | + if (item.id.length <= 10) { | |
| 125 | + type = 2; | |
| 126 | + }else { | |
| 127 | + if (item.id.length > 14) { | |
| 128 | + let channelType = item.id.substring(10, 13) | |
| 129 | + console.log("channelType: " + channelType) | |
| 130 | + if (channelType === '215' || channelType === '216') { | |
| 131 | + type = 2; | |
| 132 | + } | |
| 133 | + console.log(type) | |
| 134 | + if (item.basicData.ptzType === 1 ) { // 1-球机;2-半球;3-固定枪机;4-遥控枪机 | |
| 135 | + type = 4; | |
| 136 | + }else if (item.basicData.ptzType === 2) { | |
| 137 | + type = 5; | |
| 138 | + }else if (item.basicData.ptzType === 3 || item.basicData.ptzType === 4) { | |
| 139 | + type = 6; | |
| 140 | + } | |
| 141 | + }else { | |
| 142 | + if (item.basicData.subCount > 0 || item.basicData.parental === 1) { | |
| 143 | + type = 2; | |
| 144 | + } | |
| 145 | + } | |
| 146 | + } | |
| 147 | + let node = { | |
| 148 | + name: item.name || item.basicData.channelId, | |
| 149 | + isLeaf: type !== 2, | |
| 150 | + id: item.id, | |
| 151 | + deviceId: item.deviceId, | |
| 152 | + type: type, | |
| 153 | + online: item.basicData.status === 1, | |
| 154 | + hasGPS: item.basicData.longitude*item.basicData.latitude !== 0, | |
| 155 | + userData: item.basicData | |
| 156 | + } | |
| 157 | + nodeList.push(node); | |
| 158 | + } | |
| 159 | + resolve(nodeList) | |
| 160 | + }else { | |
| 161 | + resolve([]) | |
| 162 | + } | |
| 163 | + }, | |
| 164 | + reset: function (){ | |
| 165 | + this.$forceUpdate(); | |
| 166 | + } | |
| 167 | + }, | |
| 168 | + destroyed() { | |
| 169 | + // if (this.jessibuca) { | |
| 170 | + // this.jessibuca.destroy(); | |
| 171 | + // } | |
| 172 | + // this.playing = false; | |
| 173 | + // this.loaded = false; | |
| 174 | + // this.performance = ""; | |
| 175 | + }, | |
| 176 | +} | |
| 177 | +</script> | |
| 178 | + | |
| 179 | +<style> | |
| 180 | +.device-tree-main-box{ | |
| 181 | + text-align: left; | |
| 182 | +} | |
| 183 | +.device-online{ | |
| 184 | + color: #252525; | |
| 185 | +} | |
| 186 | +.device-offline{ | |
| 187 | + color: #727272; | |
| 188 | +} | |
| 189 | +</style> | ... | ... |
web_src/src/components/common/h265web.vue
0 → 100644
| 1 | +<template> | |
| 2 | + <div ref="container" @dblclick="fullscreenSwich" style="width:100%;height:100%;background-color: #000000;margin:0 auto;"> | |
| 3 | + <div class="buttons-box" id="buttonsBox"> | |
| 4 | + <div class="buttons-box-left"> | |
| 5 | + <i v-if="!playing" class="iconfont icon-play jessibuca-btn" @click="playBtnClick"></i> | |
| 6 | + <i v-if="playing" class="iconfont icon-pause jessibuca-btn" @click="pause"></i> | |
| 7 | + <i class="iconfont icon-stop jessibuca-btn" @click="destroy"></i> | |
| 8 | + <i v-if="isNotMute" class="iconfont icon-audio-high jessibuca-btn" @click="mute()"></i> | |
| 9 | + <i v-if="!isNotMute" class="iconfont icon-audio-mute jessibuca-btn" @click="cancelMute()"></i> | |
| 10 | + </div> | |
| 11 | + <div class="buttons-box-right"> | |
| 12 | + <span class="jessibuca-btn">{{ kBps }} kb/s</span> | |
| 13 | + <!-- <i class="iconfont icon-file-record1 jessibuca-btn"></i>--> | |
| 14 | + <!-- <i class="iconfont icon-xiangqing2 jessibuca-btn" ></i>--> | |
| 15 | + <i class="iconfont icon-camera1196054easyiconnet jessibuca-btn" @click="jessibuca.screenshot('截图','png',0.5)" | |
| 16 | + style="font-size: 1rem !important"></i> | |
| 17 | + <i class="iconfont icon-shuaxin11 jessibuca-btn" @click="playBtnClick"></i> | |
| 18 | + <i v-if="!fullscreen" class="iconfont icon-weibiaoti10 jessibuca-btn" @click="fullscreenSwich"></i> | |
| 19 | + <i v-if="fullscreen" class="iconfont icon-weibiaoti11 jessibuca-btn" @click="fullscreenSwich"></i> | |
| 20 | + </div> | |
| 21 | + </div> | |
| 22 | + </div> | |
| 23 | +</template> | |
| 24 | + | |
| 25 | +<script> | |
| 26 | +let jessibucaPlayer = {}; | |
| 27 | +export default { | |
| 28 | + name: 'jessibuca', | |
| 29 | + data() { | |
| 30 | + return { | |
| 31 | + playing: false, | |
| 32 | + isNotMute: false, | |
| 33 | + quieting: false, | |
| 34 | + fullscreen: false, | |
| 35 | + loaded: false, // mute | |
| 36 | + speed: 0, | |
| 37 | + performance: "", // 工作情况 | |
| 38 | + kBps: 0, | |
| 39 | + btnDom: null, | |
| 40 | + videoInfo: null, | |
| 41 | + volume: 1, | |
| 42 | + rotate: 0, | |
| 43 | + vod: true, // 点播 | |
| 44 | + forceNoOffscreen: false, | |
| 45 | + }; | |
| 46 | + }, | |
| 47 | + props: ['videoUrl', 'error', 'hasAudio', 'height'], | |
| 48 | + mounted() { | |
| 49 | + window.onerror = (msg) => { | |
| 50 | + // console.error(msg) | |
| 51 | + }; | |
| 52 | + console.log(this._uid) | |
| 53 | + let paramUrl = decodeURIComponent(this.$route.params.url) | |
| 54 | + this.$nextTick(() => { | |
| 55 | + this.updatePlayerDomSize() | |
| 56 | + window.onresize = () => { | |
| 57 | + this.updatePlayerDomSize() | |
| 58 | + } | |
| 59 | + if (typeof (this.videoUrl) == "undefined") { | |
| 60 | + this.videoUrl = paramUrl; | |
| 61 | + } | |
| 62 | + this.btnDom = document.getElementById("buttonsBox"); | |
| 63 | + console.log("初始化时的地址为: " + this.videoUrl) | |
| 64 | + this.play(this.videoUrl) | |
| 65 | + }) | |
| 66 | + }, | |
| 67 | + watch: { | |
| 68 | + videoUrl(newData, oldData) { | |
| 69 | + this.play(newData) | |
| 70 | + }, | |
| 71 | + immediate: true | |
| 72 | + }, | |
| 73 | + methods: { | |
| 74 | + updatePlayerDomSize() { | |
| 75 | + let dom = this.$refs.container; | |
| 76 | + let width = dom.parentNode.clientWidth | |
| 77 | + let height = (9 / 16) * width | |
| 78 | + | |
| 79 | + const clientHeight = Math.min(document.body.clientHeight, document.documentElement.clientHeight) | |
| 80 | + if (height > clientHeight) { | |
| 81 | + height = clientHeight | |
| 82 | + width = (16 / 9) * height | |
| 83 | + } | |
| 84 | + | |
| 85 | + dom.style.width = width + 'px'; | |
| 86 | + dom.style.height = height + "px"; | |
| 87 | + }, | |
| 88 | + create() { | |
| 89 | + let options = {}; | |
| 90 | + console.log("hasAudio " + this.hasAudio) | |
| 91 | + | |
| 92 | + jessibucaPlayer[this._uid] = new window.Jessibuca(Object.assign( | |
| 93 | + { | |
| 94 | + container: this.$refs.container, | |
| 95 | + videoBuffer: 0.2, // 最大缓冲时长,单位秒 | |
| 96 | + isResize: true, | |
| 97 | + decoder: "static/js/jessibuca/decoder.js", | |
| 98 | + useMSE: false, | |
| 99 | + showBandwidth: false, | |
| 100 | + isFlv: true, | |
| 101 | + // text: "WVP-PRO", | |
| 102 | + // background: "static/images/zlm-logo.png", | |
| 103 | + loadingText: "加载中", | |
| 104 | + hasAudio: typeof (this.hasAudio) == "undefined" ? true : this.hasAudio, | |
| 105 | + debug: false, | |
| 106 | + supportDblclickFullscreen: false, // 是否支持屏幕的双击事件,触发全屏,取消全屏事件。 | |
| 107 | + operateBtns: { | |
| 108 | + fullscreen: false, | |
| 109 | + screenshot: false, | |
| 110 | + play: false, | |
| 111 | + audio: false, | |
| 112 | + recorder: false, | |
| 113 | + }, | |
| 114 | + record: "record", | |
| 115 | + vod: this.vod, | |
| 116 | + forceNoOffscreen: this.forceNoOffscreen, | |
| 117 | + isNotMute: this.isNotMute, | |
| 118 | + }, | |
| 119 | + options | |
| 120 | + )); | |
| 121 | + let jessibuca = jessibucaPlayer[this._uid]; | |
| 122 | + let _this = this; | |
| 123 | + jessibuca.on("load", function () { | |
| 124 | + console.log("on load init"); | |
| 125 | + }); | |
| 126 | + | |
| 127 | + jessibuca.on("log", function (msg) { | |
| 128 | + console.log("on log", msg); | |
| 129 | + }); | |
| 130 | + jessibuca.on("record", function (msg) { | |
| 131 | + console.log("on record:", msg); | |
| 132 | + }); | |
| 133 | + jessibuca.on("pause", function () { | |
| 134 | + _this.playing = false; | |
| 135 | + }); | |
| 136 | + jessibuca.on("play", function () { | |
| 137 | + _this.playing = true; | |
| 138 | + }); | |
| 139 | + jessibuca.on("fullscreen", function (msg) { | |
| 140 | + console.log("on fullscreen", msg); | |
| 141 | + _this.fullscreen = msg | |
| 142 | + }); | |
| 143 | + | |
| 144 | + jessibuca.on("mute", function (msg) { | |
| 145 | + console.log("on mute", msg); | |
| 146 | + _this.isNotMute = !msg; | |
| 147 | + }); | |
| 148 | + jessibuca.on("audioInfo", function (msg) { | |
| 149 | + // console.log("audioInfo", msg); | |
| 150 | + }); | |
| 151 | + | |
| 152 | + jessibuca.on("videoInfo", function (msg) { | |
| 153 | + // this.videoInfo = msg; | |
| 154 | + console.log("videoInfo", msg); | |
| 155 | + | |
| 156 | + }); | |
| 157 | + | |
| 158 | + jessibuca.on("bps", function (bps) { | |
| 159 | + // console.log('bps', bps); | |
| 160 | + | |
| 161 | + }); | |
| 162 | + let _ts = 0; | |
| 163 | + jessibuca.on("timeUpdate", function (ts) { | |
| 164 | + // console.log('timeUpdate,old,new,timestamp', _ts, ts, ts - _ts); | |
| 165 | + _ts = ts; | |
| 166 | + }); | |
| 167 | + | |
| 168 | + jessibuca.on("videoInfo", function (info) { | |
| 169 | + console.log("videoInfo", info); | |
| 170 | + }); | |
| 171 | + | |
| 172 | + jessibuca.on("error", function (error) { | |
| 173 | + console.log("error", error); | |
| 174 | + }); | |
| 175 | + | |
| 176 | + jessibuca.on("timeout", function () { | |
| 177 | + console.log("timeout"); | |
| 178 | + }); | |
| 179 | + | |
| 180 | + jessibuca.on('start', function () { | |
| 181 | + console.log('start'); | |
| 182 | + }) | |
| 183 | + | |
| 184 | + jessibuca.on("performance", function (performance) { | |
| 185 | + let show = "卡顿"; | |
| 186 | + if (performance === 2) { | |
| 187 | + show = "非常流畅"; | |
| 188 | + } else if (performance === 1) { | |
| 189 | + show = "流畅"; | |
| 190 | + } | |
| 191 | + _this.performance = show; | |
| 192 | + }); | |
| 193 | + jessibuca.on('buffer', function (buffer) { | |
| 194 | + // console.log('buffer', buffer); | |
| 195 | + }) | |
| 196 | + | |
| 197 | + jessibuca.on('stats', function (stats) { | |
| 198 | + // console.log('stats', stats); | |
| 199 | + }) | |
| 200 | + | |
| 201 | + jessibuca.on('kBps', function (kBps) { | |
| 202 | + _this.kBps = Math.round(kBps); | |
| 203 | + }); | |
| 204 | + | |
| 205 | + // 显示时间戳 PTS | |
| 206 | + jessibuca.on('videoFrame', function () { | |
| 207 | + | |
| 208 | + }) | |
| 209 | + | |
| 210 | + // | |
| 211 | + jessibuca.on('metadata', function () { | |
| 212 | + | |
| 213 | + }); | |
| 214 | + }, | |
| 215 | + playBtnClick: function (event) { | |
| 216 | + this.play(this.videoUrl) | |
| 217 | + }, | |
| 218 | + play: function (url) { | |
| 219 | + console.log(url) | |
| 220 | + if (jessibucaPlayer[this._uid]) { | |
| 221 | + this.destroy(); | |
| 222 | + } | |
| 223 | + this.create(); | |
| 224 | + jessibucaPlayer[this._uid].on("play", () => { | |
| 225 | + this.playing = true; | |
| 226 | + this.loaded = true; | |
| 227 | + this.quieting = jessibuca.quieting; | |
| 228 | + }); | |
| 229 | + if (jessibucaPlayer[this._uid].hasLoaded()) { | |
| 230 | + jessibucaPlayer[this._uid].play(url); | |
| 231 | + } else { | |
| 232 | + jessibucaPlayer[this._uid].on("load", () => { | |
| 233 | + console.log("load 播放") | |
| 234 | + jessibucaPlayer[this._uid].play(url); | |
| 235 | + }); | |
| 236 | + } | |
| 237 | + }, | |
| 238 | + pause: function () { | |
| 239 | + if (jessibucaPlayer[this._uid]) { | |
| 240 | + jessibucaPlayer[this._uid].pause(); | |
| 241 | + } | |
| 242 | + this.playing = false; | |
| 243 | + this.err = ""; | |
| 244 | + this.performance = ""; | |
| 245 | + }, | |
| 246 | + mute: function () { | |
| 247 | + if (jessibucaPlayer[this._uid]) { | |
| 248 | + jessibucaPlayer[this._uid].mute(); | |
| 249 | + } | |
| 250 | + }, | |
| 251 | + cancelMute: function () { | |
| 252 | + if (jessibucaPlayer[this._uid]) { | |
| 253 | + jessibucaPlayer[this._uid].cancelMute(); | |
| 254 | + } | |
| 255 | + }, | |
| 256 | + destroy: function () { | |
| 257 | + if (jessibucaPlayer[this._uid]) { | |
| 258 | + jessibucaPlayer[this._uid].destroy(); | |
| 259 | + } | |
| 260 | + if (document.getElementById("buttonsBox") == null) { | |
| 261 | + this.$refs.container.appendChild(this.btnDom) | |
| 262 | + } | |
| 263 | + jessibucaPlayer[this._uid] = null; | |
| 264 | + this.playing = false; | |
| 265 | + this.err = ""; | |
| 266 | + this.performance = ""; | |
| 267 | + | |
| 268 | + }, | |
| 269 | + eventcallbacK: function (type, message) { | |
| 270 | + // console.log("player 事件回调") | |
| 271 | + // console.log(type) | |
| 272 | + // console.log(message) | |
| 273 | + }, | |
| 274 | + fullscreenSwich: function () { | |
| 275 | + let isFull = this.isFullscreen() | |
| 276 | + jessibucaPlayer[this._uid].setFullscreen(!isFull) | |
| 277 | + this.fullscreen = !isFull; | |
| 278 | + }, | |
| 279 | + isFullscreen: function () { | |
| 280 | + return document.fullscreenElement || | |
| 281 | + document.msFullscreenElement || | |
| 282 | + document.mozFullScreenElement || | |
| 283 | + document.webkitFullscreenElement || false; | |
| 284 | + } | |
| 285 | + }, | |
| 286 | + destroyed() { | |
| 287 | + if (jessibucaPlayer[this._uid]) { | |
| 288 | + jessibucaPlayer[this._uid].destroy(); | |
| 289 | + } | |
| 290 | + this.playing = false; | |
| 291 | + this.loaded = false; | |
| 292 | + this.performance = ""; | |
| 293 | + }, | |
| 294 | +} | |
| 295 | +</script> | |
| 296 | + | |
| 297 | +<style> | |
| 298 | +.buttons-box { | |
| 299 | + width: 100%; | |
| 300 | + height: 28px; | |
| 301 | + background-color: rgba(43, 51, 63, 0.7); | |
| 302 | + position: absolute; | |
| 303 | + display: -webkit-box; | |
| 304 | + display: -ms-flexbox; | |
| 305 | + display: flex; | |
| 306 | + left: 0; | |
| 307 | + bottom: 0; | |
| 308 | + user-select: none; | |
| 309 | + z-index: 10; | |
| 310 | +} | |
| 311 | + | |
| 312 | +.jessibuca-btn { | |
| 313 | + width: 20px; | |
| 314 | + color: rgb(255, 255, 255); | |
| 315 | + line-height: 27px; | |
| 316 | + margin: 0px 10px; | |
| 317 | + padding: 0px 2px; | |
| 318 | + cursor: pointer; | |
| 319 | + text-align: center; | |
| 320 | + font-size: 0.8rem !important; | |
| 321 | +} | |
| 322 | + | |
| 323 | +.buttons-box-right { | |
| 324 | + position: absolute; | |
| 325 | + right: 0; | |
| 326 | +} | |
| 327 | +</style> | ... | ... |
web_src/src/components/service/DeviceService1078.js
0 → 100644
| 1 | +import axios from 'axios'; | |
| 2 | + | |
| 3 | +class DeviceService{ | |
| 4 | + | |
| 5 | + constructor() { | |
| 6 | + this.$axios = axios; | |
| 7 | + } | |
| 8 | + | |
| 9 | + getDeviceList(currentPage, count, callback, errorCallback){ | |
| 10 | + this.$axios({ | |
| 11 | + method: 'get', | |
| 12 | + url:`/api/jt1078/query/company/tree`, | |
| 13 | + params: { | |
| 14 | + page: currentPage, | |
| 15 | + count: count | |
| 16 | + } | |
| 17 | + }).then((res) => { | |
| 18 | + if (typeof (callback) == "function") callback(res.data) | |
| 19 | + }).catch((error) => { | |
| 20 | + console.log(error); | |
| 21 | + if (typeof (errorCallback) == "function") errorCallback(error) | |
| 22 | + }); | |
| 23 | + } | |
| 24 | + | |
| 25 | + getDevice(deviceId, callback, errorCallback){ | |
| 26 | + this.$axios({ | |
| 27 | + method: 'get', | |
| 28 | + url:`/api/device/query/devices/${deviceId}`, | |
| 29 | + }).then((res) => { | |
| 30 | + if (typeof (callback) == "function") callback(res.data) | |
| 31 | + }).catch((error) => { | |
| 32 | + console.log(error); | |
| 33 | + if (typeof (errorCallback) == "function") errorCallback(error) | |
| 34 | + }); | |
| 35 | + } | |
| 36 | + | |
| 37 | + getAllDeviceList(callback,endCallback, errorCallback) { | |
| 38 | + let currentPage = 1; | |
| 39 | + let count = 100; | |
| 40 | + let deviceList = [] | |
| 41 | + this.getAllDeviceListIteration(deviceList, currentPage, count, callback, endCallback, errorCallback) | |
| 42 | + } | |
| 43 | + | |
| 44 | + getAllDeviceListIteration(deviceList, currentPage, count, callback, endCallback, errorCallback) { | |
| 45 | + this.getDeviceList(currentPage, count, (data) => { | |
| 46 | + if (data.code === 0 && data.data.list) { | |
| 47 | + if (typeof (callback) == "function") callback(data.data.list) | |
| 48 | + deviceList = deviceList.concat(data.data.list); | |
| 49 | + if (deviceList.length < data.data.total) { | |
| 50 | + currentPage ++ | |
| 51 | + this.getAllDeviceListIteration(deviceList, currentPage, count, callback, endCallback, errorCallback) | |
| 52 | + }else { | |
| 53 | + if (typeof (endCallback) == "function") endCallback(deviceList) | |
| 54 | + } | |
| 55 | + } | |
| 56 | + }, errorCallback) | |
| 57 | + } | |
| 58 | + | |
| 59 | + | |
| 60 | + getAllChannel(isCatalog, catalogUnderDevice, deviceId, callback, endCallback, errorCallback) { | |
| 61 | + let currentPage = 1; | |
| 62 | + let count = 100; | |
| 63 | + let catalogList = [] | |
| 64 | + this.getAllChannelIteration(isCatalog, catalogUnderDevice, deviceId, catalogList, currentPage, count, callback, endCallback, errorCallback) | |
| 65 | + } | |
| 66 | + | |
| 67 | + getAllChannelIteration(isCatalog, catalogUnderDevice, deviceId, catalogList, currentPage, count, callback, endCallback, errorCallback) { | |
| 68 | + this.getChanel(isCatalog, catalogUnderDevice, deviceId, currentPage, count, (data) => { | |
| 69 | + if (data.list) { | |
| 70 | + if (typeof (callback) == "function") callback(data.list) | |
| 71 | + catalogList = catalogList.concat(data.list); | |
| 72 | + if (catalogList.length < data.total) { | |
| 73 | + currentPage ++ | |
| 74 | + this.getAllChannelIteration(isCatalog,catalogUnderDevice, deviceId, catalogList, currentPage, count, callback, errorCallback) | |
| 75 | + }else { | |
| 76 | + console.log(1) | |
| 77 | + if (typeof (endCallback) == "function") endCallback(catalogList) | |
| 78 | + } | |
| 79 | + } | |
| 80 | + }, errorCallback) | |
| 81 | + } | |
| 82 | + getChanel(isCatalog, catalogUnderDevice, deviceId, currentPage, count, callback, errorCallback) { | |
| 83 | + this.$axios({ | |
| 84 | + method: 'get', | |
| 85 | + url: `/api/device/query/devices/${deviceId}/channels`, | |
| 86 | + params:{ | |
| 87 | + page: currentPage, | |
| 88 | + count: count, | |
| 89 | + query: "", | |
| 90 | + online: "", | |
| 91 | + channelType: isCatalog, | |
| 92 | + catalogUnderDevice: catalogUnderDevice | |
| 93 | + } | |
| 94 | + }).then((res) =>{ | |
| 95 | + if (typeof (callback) == "function") callback(res.data) | |
| 96 | + }).catch(errorCallback); | |
| 97 | + } | |
| 98 | + | |
| 99 | + | |
| 100 | + getAllSubChannel(isCatalog, deviceId, channelId, callback, endCallback, errorCallback) { | |
| 101 | + let currentPage = 1; | |
| 102 | + let count = 100; | |
| 103 | + let catalogList = [] | |
| 104 | + this.getAllSubChannelIteration(isCatalog, deviceId, channelId, catalogList, currentPage, count, callback, endCallback, errorCallback) | |
| 105 | + } | |
| 106 | + | |
| 107 | + getAllSubChannelIteration(isCatalog, deviceId,channelId, catalogList, currentPage, count, callback, endCallback, errorCallback) { | |
| 108 | + this.getSubChannel(isCatalog, deviceId, channelId, currentPage, count, (data) => { | |
| 109 | + if (data.list) { | |
| 110 | + if (typeof (callback) == "function") callback(data.list) | |
| 111 | + catalogList = catalogList.concat(data.list); | |
| 112 | + if (catalogList.length < data.total) { | |
| 113 | + currentPage ++ | |
| 114 | + this.getAllSubChannelIteration(isCatalog, deviceId, channelId, catalogList, currentPage, count, callback, endCallback, errorCallback) | |
| 115 | + }else { | |
| 116 | + if (typeof (endCallback) == "function") endCallback(catalogList) | |
| 117 | + } | |
| 118 | + } | |
| 119 | + }, errorCallback) | |
| 120 | + } | |
| 121 | + getSubChannel(isCatalog, deviceId, channelId, currentPage, count, callback, errorCallback) { | |
| 122 | + this.$axios({ | |
| 123 | + method: 'get', | |
| 124 | + url: `/api/device/query/sub_channels/${deviceId}/${channelId}/channels`, | |
| 125 | + params:{ | |
| 126 | + page: currentPage, | |
| 127 | + count: count, | |
| 128 | + query: "", | |
| 129 | + online: "", | |
| 130 | + channelType: isCatalog | |
| 131 | + } | |
| 132 | + }).then((res) =>{ | |
| 133 | + if (typeof (callback) == "function") callback(res.data) | |
| 134 | + }).catch(errorCallback); | |
| 135 | + } | |
| 136 | + | |
| 137 | + getTree(deviceId, parentId, onlyCatalog, callback, endCallback, errorCallback) { | |
| 138 | + let currentPage = 1; | |
| 139 | + let count = 100; | |
| 140 | + let catalogList = [] | |
| 141 | + this.getTreeIteration(deviceId, parentId, onlyCatalog, catalogList, currentPage, count, callback, endCallback, errorCallback) | |
| 142 | + } | |
| 143 | + | |
| 144 | + getTreeIteration(deviceId, parentId, onlyCatalog, catalogList, currentPage, count, callback, endCallback, errorCallback) { | |
| 145 | + this.getTreeInfo(deviceId, parentId, onlyCatalog, currentPage, count, (data) => { | |
| 146 | + if (data.code === 0 && data.data.list) { | |
| 147 | + if (typeof (callback) == "function") callback(data.data.list) | |
| 148 | + catalogList = catalogList.concat(data.data.list); | |
| 149 | + if (catalogList.length < data.data.total) { | |
| 150 | + currentPage ++ | |
| 151 | + this.getTreeIteration(deviceId, parentId, onlyCatalog, catalogList, currentPage, count, callback, endCallback, errorCallback) | |
| 152 | + }else { | |
| 153 | + if (typeof (endCallback) == "function") endCallback(catalogList) | |
| 154 | + } | |
| 155 | + } | |
| 156 | + }, errorCallback) | |
| 157 | + } | |
| 158 | + getTreeInfo(deviceId, parentId, onlyCatalog, currentPage, count, callback, errorCallback) { | |
| 159 | + if (onlyCatalog == null || typeof onlyCatalog === "undefined") { | |
| 160 | + onlyCatalog = false; | |
| 161 | + } | |
| 162 | + this.$axios({ | |
| 163 | + method: 'get', | |
| 164 | + url: `/api/device/query/tree/${deviceId}`, | |
| 165 | + params:{ | |
| 166 | + page: currentPage, | |
| 167 | + count: count, | |
| 168 | + parentId: parentId, | |
| 169 | + onlyCatalog: onlyCatalog | |
| 170 | + } | |
| 171 | + }).then((res) =>{ | |
| 172 | + if (typeof (callback) == "function") callback(res.data) | |
| 173 | + }).catch(errorCallback); | |
| 174 | + } | |
| 175 | +} | |
| 176 | + | |
| 177 | +export default DeviceService; | ... | ... |
web_src/src/layout/UiHeader.vue
| ... | ... | @@ -6,7 +6,7 @@ |
| 6 | 6 | |
| 7 | 7 | <el-menu-item index="/console">控制台</el-menu-item> |
| 8 | 8 | |
| 9 | - <el-menu-item index="/deviceList1078">1078设备</el-menu-item> | |
| 9 | + <el-menu-item index="/deviceList1078">设备列表</el-menu-item> | |
| 10 | 10 | |
| 11 | 11 | <el-menu-item v-if="editUser" index="/userManager">用户管理</el-menu-item> |
| 12 | 12 | ... | ... |
web_src/static/js/config.js
web_src/utils/waterMark.js
| ... | ... | @@ -27,8 +27,8 @@ export default function watermark(element, config) { |
| 27 | 27 | start_y: 0, // y轴起始位置 |
| 28 | 28 | space_x: 100, // x轴间距 |
| 29 | 29 | space_y: 50, // y轴间距 |
| 30 | - width: 210, // 宽度 | |
| 31 | - height: 80, // 长度 | |
| 30 | + width: 610, // 宽度 | |
| 31 | + height: 380, // 长度 | |
| 32 | 32 | fontSize: 20, // 字体 |
| 33 | 33 | color: '#aaa', // 字色 |
| 34 | 34 | alpha: 0.4, // 透明度 | ... | ... |