Commit 3d83775468dc9dd69a52332ba566f7e07e931325

Authored by panlinlin
1 parent 00e61d9a

存储部分使用sqlite代替redis

Showing 30 changed files with 932 additions and 955 deletions
... ... @@ -99,6 +99,13 @@
99 99 <version>8.0.22</version>
100 100 </dependency>
101 101  
  102 + <!-- 添加sqlite-jdbc数据库驱动 -->
  103 + <dependency>
  104 + <groupId>org.xerial</groupId>
  105 + <artifactId>sqlite-jdbc</artifactId>
  106 + <version>3.32.3.2</version>
  107 + </dependency>
  108 +
102 109 <!--Mybatis -->
103 110 <dependency>
104 111 <groupId>org.mybatis</groupId>
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
... ... @@ -138,16 +138,25 @@ public class SipLayer implements SipListener {
138 138 // TODO Auto-generated catch block
139 139 e.printStackTrace();
140 140 }
  141 + if (evt.getResponse() != null && sipSubscribe.getOkSubscribesSize() > 0 ) {
  142 + CallIdHeader callIdHeader = (CallIdHeader)evt.getResponse().getHeader(CallIdHeader.NAME);
  143 + if (callIdHeader != null) {
  144 + SipSubscribe.Event subscribe = sipSubscribe.getOkSubscribe(callIdHeader.getCallId());
  145 + if (subscribe != null) {
  146 + subscribe.response(evt);
  147 + }
  148 + }
  149 + }
141 150 // } else if (status == Response.TRYING) {
142 151 // trying不会回复
143 152 } else if ((status >= 100) && (status < 200)) {
144 153 // 增加其它无需回复的响应,如101、180等
145 154 } else {
146 155 logger.warn("接收到失败的response响应!status:" + status + ",message:" + response.getReasonPhrase()/* .getContent().toString()*/);
147   - if (evt.getResponse() != null && sipSubscribe.getSize() > 0 ) {
  156 + if (evt.getResponse() != null && sipSubscribe.getErrorSubscribesSize() > 0 ) {
148 157 CallIdHeader callIdHeader = (CallIdHeader)evt.getResponse().getHeader(CallIdHeader.NAME);
149 158 if (callIdHeader != null) {
150   - SipSubscribe.Event subscribe = sipSubscribe.getSubscribe(callIdHeader.getCallId());
  159 + SipSubscribe.Event subscribe = sipSubscribe.getErrorSubscribe(callIdHeader.getCallId());
151 160 if (subscribe != null) {
152 161 subscribe.response(evt);
153 162 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
1 1 package com.genersoft.iot.vmp.gb28181.bean;
2 2  
3 3  
  4 +import java.util.Date;
4 5 import java.util.List;
5 6 import java.util.Map;
6 7  
7 8 public class Device {
8 9  
9 10 /**
  11 + * 数据库存储ID
  12 + */
  13 + private int id;
  14 +
  15 + /**
10 16 * 设备Id
11 17 */
12 18 private String deviceId;
... ... @@ -55,14 +61,24 @@ public class Device {
55 61 */
56 62 private int online;
57 63  
  64 +
58 65 /**
59   - * 通道列表
  66 + * 注册时间
60 67 */
61   -// private Map<String,DeviceChannel> channelMap;
  68 + private Long registerTimeMillis;
62 69  
  70 + /**
  71 + * 通道个数
  72 + */
63 73 private int channelCount;
64 74  
65   - private List<String> channelList;
  75 + public int getId() {
  76 + return id;
  77 + }
  78 +
  79 + public void setId(int id) {
  80 + this.id = id;
  81 + }
66 82  
67 83 public String getDeviceId() {
68 84 return deviceId;
... ... @@ -144,11 +160,11 @@ public class Device {
144 160 this.channelCount = channelCount;
145 161 }
146 162  
147   - public List<String> getChannelList() {
148   - return channelList;
  163 + public Long getRegisterTimeMillis() {
  164 + return registerTimeMillis;
149 165 }
150 166  
151   - public void setChannelList(List<String> channelList) {
152   - this.channelList = channelList;
  167 + public void setRegisterTimeMillis(Long registerTimeMillis) {
  168 + this.registerTimeMillis = registerTimeMillis;
153 169 }
154 170 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
... ... @@ -2,10 +2,17 @@ package com.genersoft.iot.vmp.gb28181.bean;
2 2  
3 3 public class DeviceChannel {
4 4  
  5 +
  6 +
5 7 /**
6 8 * 通道id
7 9 */
8 10 private String channelId;
  11 +
  12 + /**
  13 + * 设备id
  14 + */
  15 + private String deviceId;
9 16  
10 17 /**
11 18 * 通道名
... ... @@ -146,13 +153,15 @@ public class DeviceChannel {
146 153 /**
147 154 * 是否含有音频
148 155 */
149   - private boolean hasAudio;
  156 + private boolean hasAudio;
150 157  
151   - /**
152   - * 是否正在播放
153   - */
154   - private boolean play;
  158 + public String getDeviceId() {
  159 + return deviceId;
  160 + }
155 161  
  162 + public void setDeviceId(String deviceId) {
  163 + this.deviceId = deviceId;
  164 + }
156 165  
157 166 public void setPTZType(int PTZType) {
158 167 this.PTZType = PTZType;
... ... @@ -387,14 +396,6 @@ public class DeviceChannel {
387 396 this.hasAudio = hasAudio;
388 397 }
389 398  
390   - public boolean isPlay() {
391   - return play;
392   - }
393   -
394   - public void setPlay(boolean play) {
395   - this.play = play;
396   - }
397   -
398 399 public String getStreamId() {
399 400 return streamId;
400 401 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/event/SipSubscribe.java
... ... @@ -17,21 +17,34 @@ public class SipSubscribe {
17 17  
18 18 private final static Logger logger = LoggerFactory.getLogger(SipSubscribe.class);
19 19  
20   - private Map<String, SipSubscribe.Event> allSubscribes = new ConcurrentHashMap<>();
  20 + private Map<String, SipSubscribe.Event> errorSubscribes = new ConcurrentHashMap<>();
  21 +
  22 + private Map<String, SipSubscribe.Event> okSubscribes = new ConcurrentHashMap<>();
21 23  
22 24 public interface Event {
23 25 void response(ResponseEvent event);
24 26 }
25 27  
26   - public void addSubscribe(String key, SipSubscribe.Event event) {
27   - allSubscribes.put(key, event);
  28 + public void addErrorSubscribe(String key, SipSubscribe.Event event) {
  29 + errorSubscribes.put(key, event);
  30 + }
  31 +
  32 + public void addOkSubscribe(String key, SipSubscribe.Event event) {
  33 + okSubscribes.put(key, event);
28 34 }
29 35  
30   - public SipSubscribe.Event getSubscribe(String key) {
31   - return allSubscribes.get(key);
  36 + public SipSubscribe.Event getErrorSubscribe(String key) {
  37 + return errorSubscribes.get(key);
32 38 }
33 39  
34   - public int getSize(){
35   - return allSubscribes.size();
  40 + public SipSubscribe.Event getOkSubscribe(String key) {
  41 + return okSubscribes.get(key);
  42 + }
  43 +
  44 + public int getErrorSubscribesSize(){
  45 + return errorSubscribes.size();
  46 + }
  47 + public int getOkSubscribesSize(){
  48 + return okSubscribes.size();
36 49 }
37 50 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
... ... @@ -4,13 +4,10 @@ import javax.sip.RequestEvent;
4 4 import javax.sip.ResponseEvent;
5 5 import javax.sip.SipProvider;
6 6 import javax.sip.header.CSeqHeader;
7   -import javax.sip.header.CallIdHeader;
8   -import javax.sip.header.Header;
9 7 import javax.sip.message.Request;
10 8 import javax.sip.message.Response;
11 9  
12   -import com.alibaba.fastjson.JSON;
13   -import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
  10 +import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
14 11 import org.slf4j.Logger;
15 12 import org.slf4j.LoggerFactory;
16 13 import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -59,6 +56,9 @@ public class SIPProcessorFactory {
59 56  
60 57 @Autowired
61 58 private IVideoManagerStorager storager;
  59 +
  60 + @Autowired
  61 + private IRedisCatchStorage redisCatchStorage;
62 62  
63 63 @Autowired
64 64 private EventPublisher publisher;
... ... @@ -143,6 +143,7 @@ public class SIPProcessorFactory {
143 143 processor.setOffLineDetector(offLineDetector);
144 144 processor.setCmder(cmder);
145 145 processor.setStorager(storager);
  146 + processor.setRedisCatchStorage(redisCatchStorage);
146 147 return processor;
147 148 } else {
148 149 return new OtherRequestProcessor();
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
... ... @@ -25,6 +25,8 @@ public class DeferredResultHolder {
25 25  
26 26 public static final String CALLBACK_CMD_PlAY = "CALLBACK_PLAY";
27 27  
  28 + public static final String CALLBACK_CMD_STOP = "CALLBACK_STOP";
  29 +
28 30 private Map<String, DeferredResult> map = new ConcurrentHashMap<String, DeferredResult>();
29 31  
30 32 public void put(String key, DeferredResult result) {
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
... ... @@ -101,8 +101,9 @@ public interface ISIPCommander {
101 101 *
102 102 * @param ssrc ssrc
103 103 */
  104 + void streamByeCmd(String ssrc, SipSubscribe.Event okEvent);
104 105 void streamByeCmd(String ssrc);
105   -
  106 +
106 107 /**
107 108 * 语音广播
108 109 *
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
1 1 package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl;
2 2  
3 3 import java.text.ParseException;
  4 +import java.util.UUID;
4 5 import java.util.regex.Matcher;
5 6 import java.util.regex.Pattern;
6 7  
... ... @@ -12,11 +13,13 @@ import javax.sip.header.ViaHeader;
12 13 import javax.sip.message.Request;
13 14  
14 15 import com.alibaba.fastjson.JSONObject;
  16 +import com.genersoft.iot.vmp.common.StreamInfo;
15 17 import com.genersoft.iot.vmp.conf.MediaServerConfig;
16 18 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
17 19 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
18 20 import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
19 21 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
  22 +import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
20 23 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
21 24 import org.slf4j.Logger;
22 25 import org.slf4j.LoggerFactory;
... ... @@ -53,6 +56,9 @@ public class SIPCommander implements ISIPCommander {
53 56  
54 57 @Autowired
55 58 private IVideoManagerStorager storager;
  59 +
  60 + @Autowired
  61 + private IRedisCatchStorage redisCatchStorage;
56 62  
57 63 @Autowired
58 64 @Qualifier(value="tcpSipProvider")
... ... @@ -229,7 +235,7 @@ public class SIPCommander implements ISIPCommander {
229 235  
230 236 Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag");
231 237  
232   - transmitRequest(device, request, null);
  238 + transmitRequest(device, request);
233 239 return true;
234 240 } catch (SipException | ParseException | InvalidArgumentException e) {
235 241 e.printStackTrace();
... ... @@ -264,7 +270,7 @@ public class SIPCommander implements ISIPCommander {
264 270 ptzXml.append("</Control>\r\n");
265 271  
266 272 Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag");
267   - transmitRequest(device, request, null);
  273 + transmitRequest(device, request);
268 274 return true;
269 275 } catch (SipException | ParseException | InvalidArgumentException e) {
270 276 e.printStackTrace();
... ... @@ -291,7 +297,7 @@ public class SIPCommander implements ISIPCommander {
291 297 streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
292 298 }
293 299 String streamMode = device.getStreamMode().toUpperCase();
294   - MediaServerConfig mediaInfo = storager.getMediaInfo();
  300 + MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
295 301 if (mediaInfo == null) {
296 302 logger.warn("点播时发现ZLM尚未连接...");
297 303 return;
... ... @@ -344,6 +350,9 @@ public class SIPCommander implements ISIPCommander {
344 350 }
345 351 content.append("y="+ssrc+"\r\n");//ssrc
346 352  
  353 +// String fromTag = UUID.randomUUID().toString();
  354 +// Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, fromTag, null, ssrc);
  355 +
347 356 Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "live", null, ssrc);
348 357  
349 358 ClientTransaction transaction = transmitRequest(device, request, errorEvent);
... ... @@ -372,7 +381,7 @@ public class SIPCommander implements ISIPCommander {
372 381 public void playbackStreamCmd(Device device, String channelId, String startTime, String endTime, ZLMHttpHookSubscribe.Event event
373 382 , SipSubscribe.Event errorEvent) {
374 383 try {
375   - MediaServerConfig mediaInfo = storager.getMediaInfo();
  384 + MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
376 385 String ssrc = streamSession.createPlayBackSsrc();
377 386 String streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
378 387 // 添加订阅
... ... @@ -457,17 +466,28 @@ public class SIPCommander implements ISIPCommander {
457 466 e.printStackTrace();
458 467 }
459 468 }
460   -
  469 +
  470 +
  471 +
461 472 /**
462 473 * 视频流停止
463 474 *
464 475 */
465 476 @Override
466   - public void streamByeCmd(String streamId) {
  477 + public void streamByeCmd(String ssrc) {
  478 + streamByeCmd(ssrc, null);
  479 + }
  480 + @Override
  481 + public void streamByeCmd(String streamId, SipSubscribe.Event okEvent) {
467 482  
468 483 try {
469 484 ClientTransaction transaction = streamSession.get(streamId);
  485 + // 服务重启后
470 486 if (transaction == null) {
  487 + StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
  488 + if (streamInfo != null) {
  489 +
  490 + }
471 491 return;
472 492 }
473 493  
... ... @@ -475,6 +495,9 @@ public class SIPCommander implements ISIPCommander {
475 495 if (dialog == null) {
476 496 return;
477 497 }
  498 +
  499 +
  500 +
478 501 Request byeRequest = dialog.createRequest(Request.BYE);
479 502 SipURI byeURI = (SipURI) byeRequest.getRequestURI();
480 503 String vh = transaction.getRequest().getHeader(ViaHeader.NAME).toString();
... ... @@ -491,7 +514,14 @@ public class SIPCommander implements ISIPCommander {
491 514 } else if("UDP".equals(protocol)) {
492 515 clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest);
493 516 }
  517 +
  518 + CallIdHeader callIdHeader = (CallIdHeader) byeRequest.getHeader(CallIdHeader.NAME);
  519 + if (okEvent != null) {
  520 + sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent);
  521 + }
  522 +
494 523 dialog.sendRequest(clientTransaction);
  524 +
495 525 streamSession.remove(streamId);
496 526 zlmrtpServerFactory.closeRTPServer(streamId);
497 527 } catch (TransactionDoesNotExistException e) {
... ... @@ -612,7 +642,7 @@ public class SIPCommander implements ISIPCommander {
612 642  
613 643 Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), "ViaDeviceInfoBranch", "FromDeviceInfoTag", "ToDeviceInfoTag");
614 644  
615   - transmitRequest(device, request, null);
  645 + transmitRequest(device, request);
616 646  
617 647 } catch (SipException | ParseException | InvalidArgumentException e) {
618 648 e.printStackTrace();
... ... @@ -676,7 +706,7 @@ public class SIPCommander implements ISIPCommander {
676 706 Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), "ViaRecordInfoBranch", "FromRecordInfoTag", null);
677 707  
678 708  
679   - transmitRequest(device, request, null);
  709 + transmitRequest(device, request);
680 710 } catch (SipException | ParseException | InvalidArgumentException e) {
681 711 e.printStackTrace();
682 712 return false;
... ... @@ -727,8 +757,16 @@ public class SIPCommander implements ISIPCommander {
727 757 // TODO Auto-generated method stub
728 758 return false;
729 759 }
730   -
  760 +
  761 + private ClientTransaction transmitRequest(Device device, Request request) throws SipException {
  762 + return transmitRequest(device, request, null, null);
  763 + }
  764 +
731 765 private ClientTransaction transmitRequest(Device device, Request request, SipSubscribe.Event errorEvent) throws SipException {
  766 + return transmitRequest(device, request, errorEvent, null);
  767 + }
  768 +
  769 + private ClientTransaction transmitRequest(Device device, Request request, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws SipException {
732 770 ClientTransaction clientTransaction = null;
733 771 if("TCP".equals(device.getTransport())) {
734 772 clientTransaction = tcpSipProvider.getNewClientTransaction(request);
... ... @@ -736,10 +774,14 @@ public class SIPCommander implements ISIPCommander {
736 774 clientTransaction = udpSipProvider.getNewClientTransaction(request);
737 775 }
738 776  
739   - // 添加订阅
  777 + CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME);
  778 + // 添加错误订阅
740 779 if (errorEvent != null) {
741   - CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME);
742   - sipSubscribe.addSubscribe(callIdHeader.getCallId(), errorEvent);
  780 + sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), errorEvent);
  781 + }
  782 + // 添加订阅
  783 + if (okEvent != null) {
  784 + sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent);
743 785 }
744 786  
745 787 clientTransaction.sendRequest();
... ... @@ -747,6 +789,8 @@ public class SIPCommander implements ISIPCommander {
747 789 }
748 790  
749 791  
  792 +
  793 +
750 794 @Override
751 795 public void closeRTPServer(Device device, String channelId) {
752 796 if (rtpEnable) {
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
... ... @@ -10,6 +10,7 @@ import javax.sip.SipException;
10 10 import javax.sip.message.Request;
11 11 import javax.sip.message.Response;
12 12  
  13 +import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
13 14 import org.dom4j.Document;
14 15 import org.dom4j.DocumentException;
15 16 import org.dom4j.Element;
... ... @@ -48,6 +49,8 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
48 49  
49 50 private IVideoManagerStorager storager;
50 51  
  52 + private IRedisCatchStorage redisCatchStorage;
  53 +
51 54 private EventPublisher publisher;
52 55  
53 56 private RedisUtil redis;
... ... @@ -451,9 +454,9 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
451 454 String NotifyType =XmlUtil.getText(rootElement, "NotifyType");
452 455 if (NotifyType.equals("121")){
453 456 logger.info("媒体播放完毕,通知关流");
454   - StreamInfo streamInfo = storager.queryPlaybackByDevice(deviceId, "*");
  457 + StreamInfo streamInfo = redisCatchStorage.queryPlaybackByDevice(deviceId, "*");
455 458 if (streamInfo != null) {
456   - storager.stopPlayback(streamInfo);
  459 + redisCatchStorage.stopPlayback(streamInfo);
457 460 cmder.streamByeCmd(streamInfo.getStreamId());
458 461 }
459 462 }
... ... @@ -507,4 +510,11 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
507 510 this.offLineDetector = offLineDetector;
508 511 }
509 512  
  513 + public IRedisCatchStorage getRedisCatchStorage() {
  514 + return redisCatchStorage;
  515 + }
  516 +
  517 + public void setRedisCatchStorage(IRedisCatchStorage redisCatchStorage) {
  518 + this.redisCatchStorage = redisCatchStorage;
  519 + }
510 520 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java
... ... @@ -141,9 +141,15 @@ public class RegisterRequestProcessor extends SIPRequestAbstractProcessor {
141 141 // 下发catelog查询目录
142 142 if (registerFlag == 1 && device != null) {
143 143 logger.info("注册成功! deviceId:" + device.getDeviceId());
  144 + boolean exists = storager.exists(device.getDeviceId());
  145 + device.setRegisterTimeMillis(System.currentTimeMillis());
144 146 storager.updateDevice(device);
145 147 publisher.onlineEventPublish(device.getDeviceId(), VideoManagerConstants.EVENT_ONLINE_REGISTER);
146   - handler.onRegister(device);
  148 +
  149 + // 只有第一次注册才更新通道
  150 + if (!exists) {
  151 + handler.onRegister(device);
  152 + }
147 153 } else if (registerFlag == 2) {
148 154 logger.info("注销成功! deviceId:" + device.getDeviceId());
149 155 publisher.outlineEventPublish(device.getDeviceId(), VideoManagerConstants.EVENT_OUTLINE_UNREGISTER);
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHTTPProxyController.java
... ... @@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.media.zlm;
2 2  
3 3 import com.alibaba.fastjson.JSONObject;
4 4 import com.genersoft.iot.vmp.conf.MediaServerConfig;
  5 +import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
5 6 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
6 7 import org.slf4j.Logger;
7 8 import org.slf4j.LoggerFactory;
... ... @@ -29,6 +30,9 @@ public class ZLMHTTPProxyController {
29 30 @Autowired
30 31 private IVideoManagerStorager storager;
31 32  
  33 + @Autowired
  34 + private IRedisCatchStorage redisCatchStorage;
  35 +
32 36 @Value("${media.port}")
33 37 private int mediaHttpPort;
34 38  
... ... @@ -36,10 +40,10 @@ public class ZLMHTTPProxyController {
36 40 @RequestMapping(value = "/**/**/**", produces = "application/json;charset=UTF-8")
37 41 public Object proxy(HttpServletRequest request, HttpServletResponse response){
38 42  
39   - if (storager.getMediaInfo() == null) {
  43 + if (redisCatchStorage.getMediaInfo() == null) {
40 44 return "未接入流媒体";
41 45 }
42   - MediaServerConfig mediaInfo = storager.getMediaInfo();
  46 + MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
43 47 String requestURI = String.format("http://%s:%s%s?%s&%s",
44 48 mediaInfo.getLocalIP(),
45 49 mediaHttpPort,
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
... ... @@ -11,6 +11,7 @@ import com.alibaba.fastjson.JSONArray;
11 11 import com.genersoft.iot.vmp.common.StreamInfo;
12 12 import com.genersoft.iot.vmp.conf.MediaServerConfig;
13 13 import com.genersoft.iot.vmp.gb28181.bean.Device;
  14 +import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
14 15 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
15 16 import com.genersoft.iot.vmp.utils.IpUtil;
16 17 import com.genersoft.iot.vmp.vmanager.service.IPlayService;
... ... @@ -53,6 +54,9 @@ public class ZLMHttpHookListener {
53 54 private IVideoManagerStorager storager;
54 55  
55 56 @Autowired
  57 + private IRedisCatchStorage redisCatchStorage;
  58 +
  59 + @Autowired
56 60 private ZLMRESTfulUtils zlmresTfulUtils;
57 61  
58 62 @Autowired
... ... @@ -249,13 +253,13 @@ public class ZLMHttpHookListener {
249 253 String app = json.getString("app");
250 254 String streamId = json.getString("stream");
251 255 boolean regist = json.getBoolean("regist");
252   - StreamInfo streamInfo = storager.queryPlayByStreamId(streamId);
  256 + StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
253 257 if ("rtp".equals(app) && !regist ) {
254 258 if (streamInfo!=null){
255   - storager.stopPlay(streamInfo);
  259 + redisCatchStorage.stopPlay(streamInfo);
256 260 }else{
257   - streamInfo = storager.queryPlaybackByStreamId(streamId);
258   - storager.stopPlayback(streamInfo);
  261 + streamInfo = redisCatchStorage.queryPlaybackByStreamId(streamId);
  262 + redisCatchStorage.stopPlayback(streamInfo);
259 263 }
260 264 }
261 265  
... ... @@ -281,12 +285,12 @@ public class ZLMHttpHookListener {
281 285 String streamId = json.getString("stream");
282 286  
283 287 cmder.streamByeCmd(streamId);
284   - StreamInfo streamInfo = storager.queryPlayByStreamId(streamId);
  288 + StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
285 289 if (streamInfo!=null){
286   - storager.stopPlay(streamInfo);
  290 + redisCatchStorage.stopPlay(streamInfo);
287 291 }else{
288   - streamInfo = storager.queryPlaybackByStreamId(streamId);
289   - storager.stopPlayback(streamInfo);
  292 + streamInfo = redisCatchStorage.queryPlaybackByStreamId(streamId);
  293 + redisCatchStorage.stopPlayback(streamInfo);
290 294 }
291 295  
292 296 JSONObject ret = new JSONObject();
... ... @@ -311,7 +315,7 @@ public class ZLMHttpHookListener {
311 315 if (autoApplyPlay) {
312 316 String app = json.getString("app");
313 317 String streamId = json.getString("stream");
314   - StreamInfo streamInfo = storager.queryPlayByStreamId(streamId);
  318 + StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
315 319 if ("rtp".equals(app) && streamId.indexOf("gb_play") > -1 && streamInfo == null) {
316 320 String[] s = streamId.split("_");
317 321 if (s.length == 4) {
... ... @@ -355,7 +359,7 @@ public class ZLMHttpHookListener {
355 359 // MediaServerConfig mediaServerConfig = mediaServerConfigs.get(0);
356 360 MediaServerConfig mediaServerConfig = JSON.toJavaObject(json, MediaServerConfig.class);
357 361 mediaServerConfig.setLocalIP(mediaIp);
358   - storager.updateMediaInfo(mediaServerConfig);
  362 + redisCatchStorage.updateMediaInfo(mediaServerConfig);
359 363 // TODO Auto-generated method stub
360 364  
361 365 JSONObject ret = new JSONObject();
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
... ... @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
4 4 import com.alibaba.fastjson.JSONArray;
5 5 import com.alibaba.fastjson.JSONObject;
6 6 import com.genersoft.iot.vmp.conf.MediaServerConfig;
  7 +import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
7 8 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
8 9 import okhttp3.*;
9 10 import org.slf4j.Logger;
... ... @@ -30,6 +31,9 @@ public class ZLMRunner implements CommandLineRunner {
30 31 @Autowired
31 32 private IVideoManagerStorager storager;
32 33  
  34 + @Autowired
  35 + private IRedisCatchStorage redisCatchStorage;
  36 +
33 37 @Value("${media.ip}")
34 38 private String mediaIp;
35 39  
... ... @@ -69,7 +73,7 @@ public class ZLMRunner implements CommandLineRunner {
69 73 logger.info("zlm接入成功...");
70 74 if (autoConfig) saveZLMConfig();
71 75 mediaServerConfig = getMediaServerConfig();
72   - storager.updateMediaInfo(mediaServerConfig);
  76 + redisCatchStorage.updateMediaInfo(mediaServerConfig);
73 77 }
74 78 }
75 79  
... ...
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java 0 → 100644
  1 +package com.genersoft.iot.vmp.storager;
  2 +
  3 +import com.genersoft.iot.vmp.common.StreamInfo;
  4 +import com.genersoft.iot.vmp.conf.MediaServerConfig;
  5 +
  6 +import java.util.Map;
  7 +
  8 +public interface IRedisCatchStorage {
  9 +
  10 + /**
  11 + * 开始播放时将流存入
  12 + *
  13 + * @param stream 流信息
  14 + * @return
  15 + */
  16 + boolean startPlay(StreamInfo stream);
  17 +
  18 +
  19 + /**
  20 + * 停止播放时删除
  21 + *
  22 + * @return
  23 + */
  24 + boolean stopPlay(StreamInfo streamInfo);
  25 +
  26 + /**
  27 + * 查询播放列表
  28 + * @return
  29 + */
  30 + StreamInfo queryPlay(StreamInfo streamInfo);
  31 +
  32 + StreamInfo queryPlayByStreamId(String steamId);
  33 +
  34 + StreamInfo queryPlaybackByStreamId(String steamId);
  35 +
  36 + StreamInfo queryPlayByDevice(String deviceId, String code);
  37 +
  38 + /**
  39 + * 更新流媒体信息
  40 + * @param mediaServerConfig
  41 + * @return
  42 + */
  43 + boolean updateMediaInfo(MediaServerConfig mediaServerConfig);
  44 +
  45 + /**
  46 + * 获取流媒体信息
  47 + * @return
  48 + */
  49 + MediaServerConfig getMediaInfo();
  50 +
  51 + Map<String, StreamInfo> queryPlayByDeviceId(String deviceId);
  52 +
  53 + boolean startPlayback(StreamInfo stream);
  54 +
  55 + boolean stopPlayback(StreamInfo streamInfo);
  56 +
  57 + StreamInfo queryPlaybackByDevice(String deviceId, String code);
  58 +}
... ...
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
... ... @@ -17,19 +17,6 @@ import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
17 17 */
18 18 public interface IVideoManagerStorager {
19 19  
20   - /**
21   - * 更新流媒体信息
22   - * @param mediaServerConfig
23   - * @return
24   - */
25   - public boolean updateMediaInfo(MediaServerConfig mediaServerConfig);
26   -
27   - /**
28   - * 获取流媒体信息
29   - * @return
30   - */
31   - public MediaServerConfig getMediaInfo();
32   -
33 20 /**
34 21 * 根据设备ID判断设备是否存在
35 22 *
... ... @@ -106,10 +93,9 @@ public interface IVideoManagerStorager {
106 93 /**
107 94 * 获取多个设备
108 95 *
109   - * @param deviceIds 设备ID数组
110 96 * @return List<Device> 设备对象数组
111 97 */
112   - public List<Device> queryVideoDeviceList(String[] deviceIds);
  98 + public List<Device> queryVideoDeviceList();
113 99  
114 100 /**
115 101 * 删除设备
... ... @@ -135,27 +121,6 @@ public interface IVideoManagerStorager {
135 121 */
136 122 public boolean outline(String deviceId);
137 123  
138   - /**
139   - * 开始播放时将流存入
140   - *
141   - * @param stream 流信息
142   - * @return
143   - */
144   - public boolean startPlay(StreamInfo stream);
145   -
146   - /**
147   - * 停止播放时删除
148   - *
149   - * @return
150   - */
151   - public boolean stopPlay(StreamInfo streamInfo);
152   -
153   - /**
154   - * 查找视频流
155   - *
156   - * @return
157   - */
158   - public StreamInfo queryPlay(StreamInfo streamInfo);
159 124  
160 125 /**
161 126 * 查询子设备
... ... @@ -168,10 +133,6 @@ public interface IVideoManagerStorager {
168 133 */
169 134 PageResult querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, String online, int page, int count);
170 135  
171   - /**
172   - * 更新缓存
173   - */
174   - public void updateCatch();
175 136  
176 137 /**
177 138 * 清空通道
... ... @@ -179,17 +140,4 @@ public interface IVideoManagerStorager {
179 140 */
180 141 void cleanChannelsForDevice(String deviceId);
181 142  
182   - StreamInfo queryPlayByStreamId(String streamId);
183   -
184   - StreamInfo queryPlayByDevice(String deviceId, String code);
185   -
186   - Map<String, StreamInfo> queryPlayByDeviceId(String deviceId);
187   -
188   - boolean startPlayback(StreamInfo streamInfo);
189   -
190   - boolean stopPlayback(StreamInfo streamInfo);
191   -
192   - StreamInfo queryPlaybackByDevice(String deviceId, String channelId);
193   -
194   - StreamInfo queryPlaybackByStreamId(String streamId);
195 143 }
... ...
src/main/java/com/genersoft/iot/vmp/storager/VideoManagerStoragerFactory.java deleted 100644 → 0
1   -package com.genersoft.iot.vmp.storager;
2   -
3   -import org.springframework.beans.factory.annotation.Autowired;
4   -import org.springframework.context.annotation.Bean;
5   -import org.springframework.stereotype.Component;
6   -
7   -import com.genersoft.iot.vmp.conf.VManagerConfig;
8   -
9   -/**
10   - * @Description:视频设备数据存储工厂,根据存储策略,返回对应的存储器
11   - * @author: swwheihei
12   - * @date: 2020年5月6日 下午2:15:16
13   - */
14   -@Component
15   -public class VideoManagerStoragerFactory {
16   -
17   - @Autowired
18   - private VManagerConfig vmConfig;
19   -
20   - @Autowired
21   - private IVideoManagerStorager jdbcStorager;
22   -
23   - @Autowired
24   - private IVideoManagerStorager redisStorager;
25   -
26   - @Bean("storager")
27   - public IVideoManagerStorager getStorager() {
28   - if ("redis".equals(vmConfig.getDatabase().toLowerCase())) {
29   - return redisStorager;
30   - } else if ("jdbc".equals(vmConfig.getDatabase().toLowerCase())) {
31   - return jdbcStorager;
32   - }
33   - return redisStorager;
34   - }
35   -
36   -}
src/main/java/com/genersoft/iot/vmp/storager/VodeoMannagerTask.java
... ... @@ -8,10 +8,10 @@ import org.springframework.stereotype.Component;
8 8 public class VodeoMannagerTask implements CommandLineRunner {
9 9  
10 10 @Autowired
11   - private IVideoManagerStorager storager;
  11 + private IVideoManagerStorager redisStorager;
12 12  
13 13 @Override
14 14 public void run(String... strings) throws Exception {
15   - storager.updateCatch();
  15 + redisStorager.updateCatch();
16 16 }
17 17 }
... ...
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java 0 → 100644
  1 +package com.genersoft.iot.vmp.storager.dao;
  2 +
  3 +import com.genersoft.iot.vmp.common.PageResult;
  4 +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +import java.util.List;
  8 +
  9 +@Mapper
  10 +public interface DeviceChannelMapper {
  11 + int update(DeviceChannel channel);
  12 +
  13 + List<DeviceChannel> queryChannelsByDeviceId(String deviceId);
  14 +
  15 + List<DeviceChannel> queryChannelsByDeviceId(String deviceId, String parentChannelId);
  16 +
  17 + DeviceChannel queryChannel(String deviceId, String channelId);
  18 +
  19 + int cleanChannelsByDeviceId(String deviceId);
  20 +}
... ...
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java 0 → 100644
  1 +package com.genersoft.iot.vmp.storager.dao;
  2 +
  3 +import com.genersoft.iot.vmp.gb28181.bean.Device;
  4 +import org.apache.ibatis.annotations.Insert;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +import org.apache.ibatis.annotations.Select;
  7 +
  8 +import java.util.List;
  9 +
  10 +@Mapper
  11 +public interface DeviceMapper {
  12 +
  13 + @Select("SELECT * FROM device WHERE deviceId = #{deviceId}")
  14 + Device getDeviceByDeviceId(String deviceId);
  15 +
  16 + @Insert("SELECT * FROM device WHERE deviceId = #{deviceId}")
  17 + int add(Device device);
  18 +
  19 + int update(Device device);
  20 +
  21 + List<Device> getDevices();
  22 +
  23 + int del(String deviceId);
  24 +}
... ...
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java 0 → 100644
  1 +package com.genersoft.iot.vmp.storager.impl;
  2 +
  3 +import com.genersoft.iot.vmp.common.StreamInfo;
  4 +import com.genersoft.iot.vmp.common.VideoManagerConstants;
  5 +import com.genersoft.iot.vmp.conf.MediaServerConfig;
  6 +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
  7 +import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
  8 +import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper;
  9 +import com.genersoft.iot.vmp.storager.dao.DeviceMapper;
  10 +import com.genersoft.iot.vmp.utils.redis.RedisUtil;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.stereotype.Component;
  13 +
  14 +import java.util.HashMap;
  15 +import java.util.HashSet;
  16 +import java.util.List;
  17 +import java.util.Map;
  18 +
  19 +@Component
  20 +public class RedisCatchStorageImpl implements IRedisCatchStorage {
  21 +
  22 + @Autowired
  23 + private RedisUtil redis;
  24 +
  25 + @Autowired
  26 + private DeviceMapper deviceMapper;
  27 +
  28 + @Autowired
  29 + private DeviceChannelMapper deviceChannelMapper;
  30 +
  31 +
  32 + /**
  33 + * 开始播放时将流存入redis
  34 + *
  35 + * @return
  36 + */
  37 + @Override
  38 + public boolean startPlay(StreamInfo stream) {
  39 + return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, stream.getStreamId(),stream.getDeviceID(), stream.getCahnnelId()),
  40 + stream);
  41 + }
  42 +
  43 + /**
  44 + * 停止播放时从redis删除
  45 + *
  46 + * @return
  47 + */
  48 + @Override
  49 + public boolean stopPlay(StreamInfo streamInfo) {
  50 + if (streamInfo == null) return false;
  51 + DeviceChannel deviceChannel = deviceChannelMapper.queryChannel(streamInfo.getDeviceID(), streamInfo.getCahnnelId());
  52 + if (deviceChannel != null) {
  53 + deviceChannel.setStreamId(null);
  54 + deviceChannel.setPlay(false);
  55 + deviceChannel.setDeviceId(streamInfo.getDeviceID());
  56 + deviceChannelMapper.update(deviceChannel);
  57 + }
  58 + return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
  59 + streamInfo.getStreamId(),
  60 + streamInfo.getDeviceID(),
  61 + streamInfo.getCahnnelId()));
  62 + }
  63 +
  64 + /**
  65 + * 查询播放列表
  66 + * @return
  67 + */
  68 + @Override
  69 + public StreamInfo queryPlay(StreamInfo streamInfo) {
  70 + return (StreamInfo)redis.get(String.format("%S_%s_%s_%s",
  71 + VideoManagerConstants.PLAYER_PREFIX,
  72 + streamInfo.getStreamId(),
  73 + streamInfo.getDeviceID(),
  74 + streamInfo.getCahnnelId()));
  75 + }
  76 + @Override
  77 + public StreamInfo queryPlayByStreamId(String steamId) {
  78 + List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, steamId));
  79 + if (playLeys == null || playLeys.size() == 0) return null;
  80 + return (StreamInfo)redis.get(playLeys.get(0).toString());
  81 + }
  82 +
  83 + @Override
  84 + public StreamInfo queryPlaybackByStreamId(String steamId) {
  85 + List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAY_BLACK_PREFIX, steamId));
  86 + if (playLeys == null || playLeys.size() == 0) return null;
  87 + return (StreamInfo)redis.get(playLeys.get(0).toString());
  88 + }
  89 +
  90 + @Override
  91 + public StreamInfo queryPlayByDevice(String deviceId, String code) {
  92 +// List<Object> playLeys = redis.keys(String.format("%S_*_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
  93 + List<Object> playLeys = redis.scan(String.format("%S_*_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
  94 + deviceId,
  95 + code));
  96 + if (playLeys == null || playLeys.size() == 0) return null;
  97 + return (StreamInfo)redis.get(playLeys.get(0).toString());
  98 + }
  99 +
  100 + /**
  101 + * 更新流媒体信息
  102 + * @param mediaServerConfig
  103 + * @return
  104 + */
  105 + @Override
  106 + public boolean updateMediaInfo(MediaServerConfig mediaServerConfig) {
  107 + return redis.set(VideoManagerConstants.MEDIA_SERVER_PREFIX,mediaServerConfig);
  108 + }
  109 +
  110 + /**
  111 + * 获取流媒体信息
  112 + * @return
  113 + */
  114 + @Override
  115 + public MediaServerConfig getMediaInfo() {
  116 + return (MediaServerConfig)redis.get(VideoManagerConstants.MEDIA_SERVER_PREFIX);
  117 + }
  118 +
  119 + @Override
  120 + public Map<String, StreamInfo> queryPlayByDeviceId(String deviceId) {
  121 + Map<String, StreamInfo> streamInfos = new HashMap<>();
  122 +// List<Object> playLeys = redis.keys(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId));
  123 + List<Object> players = redis.scan(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId));
  124 + if (players.size() == 0) return streamInfos;
  125 + for (int i = 0; i < players.size(); i++) {
  126 + String key = (String) players.get(i);
  127 + StreamInfo streamInfo = (StreamInfo)redis.get(key);
  128 + streamInfos.put(streamInfo.getDeviceID() + "_" + streamInfo.getCahnnelId(), streamInfo);
  129 + }
  130 + return streamInfos;
  131 + }
  132 +
  133 +
  134 + @Override
  135 + public boolean startPlayback(StreamInfo stream) {
  136 + return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, stream.getStreamId(),stream.getDeviceID(), stream.getCahnnelId()),
  137 + stream);
  138 + }
  139 +
  140 +
  141 + @Override
  142 + public boolean stopPlayback(StreamInfo streamInfo) {
  143 + if (streamInfo == null) return false;
  144 + DeviceChannel deviceChannel = deviceChannelMapper.queryChannel(streamInfo.getDeviceID(), streamInfo.getCahnnelId());
  145 + if (deviceChannel != null) {
  146 + deviceChannel.setStreamId(null);
  147 + deviceChannel.setPlay(false);
  148 + deviceChannel.setDeviceId(streamInfo.getDeviceID());
  149 + deviceChannelMapper.update(deviceChannel);
  150 + }
  151 + return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
  152 + streamInfo.getStreamId(),
  153 + streamInfo.getDeviceID(),
  154 + streamInfo.getCahnnelId()));
  155 + }
  156 +
  157 + @Override
  158 + public StreamInfo queryPlaybackByDevice(String deviceId, String code) {
  159 + String format = String.format("%S_*_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
  160 + deviceId,
  161 + code);
  162 + List<Object> playLeys = redis.scan(String.format("%S_*_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
  163 + deviceId,
  164 + code));
  165 + if (playLeys == null || playLeys.size() == 0) {
  166 + playLeys = redis.scan(String.format("%S_*_*_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
  167 + deviceId));
  168 + }
  169 + if (playLeys == null || playLeys.size() == 0) return null;
  170 + return (StreamInfo)redis.get(playLeys.get(0).toString());
  171 + }
  172 +}
... ...
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java 0 → 100644
  1 +package com.genersoft.iot.vmp.storager.impl;
  2 +
  3 +import java.util.*;
  4 +
  5 +import com.genersoft.iot.vmp.common.PageResult;
  6 +import com.genersoft.iot.vmp.common.StreamInfo;
  7 +import com.genersoft.iot.vmp.conf.MediaServerConfig;
  8 +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
  9 +import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper;
  10 +import com.genersoft.iot.vmp.storager.dao.DeviceMapper;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.stereotype.Component;
  13 +
  14 +import com.genersoft.iot.vmp.common.VideoManagerConstants;
  15 +import com.genersoft.iot.vmp.gb28181.bean.Device;
  16 +import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
  17 +import com.genersoft.iot.vmp.utils.redis.RedisUtil;
  18 +import org.springframework.util.StringUtils;
  19 +
  20 +/**
  21 + * @Description:视频设备数据存储-jdbc实现
  22 + * @author: swwheihei
  23 + * @date: 2020年5月6日 下午2:31:42
  24 + */
  25 +@Component
  26 +public class VideoManagerStoragerImpl implements IVideoManagerStorager {
  27 +
  28 + @Autowired
  29 + private DeviceMapper deviceMapper;
  30 +
  31 + @Autowired
  32 + private DeviceChannelMapper deviceChannelMapper;
  33 +
  34 +
  35 + /**
  36 + * 根据设备ID判断设备是否存在
  37 + *
  38 + * @param deviceId 设备ID
  39 + * @return true:存在 false:不存在
  40 + */
  41 + @Override
  42 + public boolean exists(String deviceId) {
  43 + return deviceMapper.getDeviceByDeviceId(deviceId) != null;
  44 + }
  45 +
  46 + /**
  47 + * 视频设备创建
  48 + *
  49 + * @param device 设备对象
  50 + * @return true:创建成功 false:创建失败
  51 + */
  52 + @Override
  53 + public boolean create(Device device) {
  54 + return deviceMapper.add(device) > 0;
  55 + }
  56 +
  57 +
  58 +
  59 + /**
  60 + * 视频设备更新
  61 + *
  62 + * @param device 设备对象
  63 + * @return true:更新成功 false:更新失败
  64 + */
  65 + @Override
  66 + public boolean updateDevice(Device device) {
  67 +// if (deviceMap.get(device.getDeviceId()) == null) {
  68 +// deviceMap.put(device.getDeviceId(), new HashMap<String, HashSet<String>>());
  69 +// }
  70 + // 更新device中的通道数量
  71 +// device.setChannelCount(deviceMap.get(device.getDeviceId()).size());
  72 + int result = deviceMapper.update(device);
  73 + // 存储device
  74 + return result > 0;
  75 +
  76 +
  77 + }
  78 +
  79 + @Override
  80 + public void updateChannel(String deviceId, DeviceChannel channel) {
  81 + String channelId = channel.getChannelId();
  82 + channel.setDeviceId(deviceId);
  83 + deviceChannelMapper.update(channel);
  84 +
  85 +// HashMap<String, HashSet<String>> channelMap = deviceMap.get(deviceId);
  86 +// if (channelMap == null) return;
  87 +// // 作为父设备, 确定自己的子节点数
  88 +// if (channelMap.get(channelId) == null) {
  89 +// channelMap.put(channelId, new HashSet<String>());
  90 +// }else if (channelMap.get(channelId).size() > 0) {
  91 +// channel.setSubCount(channelMap.get(channelId).size());
  92 +// }
  93 +//
  94 +// // 存储通道
  95 +// redis.set(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
  96 +// "_" + channel.getChannelId() +
  97 +// "_" + (channel.getStatus() == 1 ? "on":"off") +
  98 +// "_" + (channelMap.get(channelId).size() > 0)+
  99 +// "_" + (StringUtils.isEmpty(channel.getParentId())?null:channel.getParentId()),
  100 +// channel);
  101 +// // 更新device中的通道数量
  102 +// Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
  103 +// device.setChannelCount(deviceMap.get(deviceId).size());
  104 +// redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
  105 +//
  106 +//
  107 +// // 如果有父设备,更新父设备内子节点数
  108 +// String parentId = channel.getParentId();
  109 +// if (!StringUtils.isEmpty(parentId) && !parentId.equals(deviceId)) {
  110 +//
  111 +// if (channelMap.get(parentId) == null) {
  112 +// channelMap.put(parentId, new HashSet<String>());
  113 +// }
  114 +// channelMap.get(parentId).add(channelId);
  115 +//
  116 +// DeviceChannel deviceChannel = queryChannel(deviceId, parentId);
  117 +// if (deviceChannel != null) {
  118 +// deviceChannel.setSubCount(channelMap.get(parentId).size());
  119 +// redis.set(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
  120 +// "_" + deviceChannel.getChannelId() +
  121 +// "_" + (deviceChannel.getStatus() == 1 ? "on":"off") +
  122 +// "_" + (channelMap.get(deviceChannel.getChannelId()).size() > 0)+
  123 +// "_" + (StringUtils.isEmpty(deviceChannel.getParentId())?null:deviceChannel.getParentId()),
  124 +// deviceChannel);
  125 +//
  126 +// }
  127 +// }
  128 +
  129 + }
  130 +
  131 + /**
  132 + * 获取设备
  133 + *
  134 + * @param deviceId 设备ID
  135 + * @return Device 设备对象
  136 + */
  137 + @Override
  138 + public Device queryVideoDevice(String deviceId) {
  139 + return deviceMapper.getDeviceByDeviceId(deviceId);
  140 + }
  141 +
  142 + @Override
  143 + public PageResult queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, String online, int page, int count) {
  144 + // 获取到所有正在播放的流
  145 + List<DeviceChannel> result = new ArrayList<>();
  146 + PageResult pageResult = new PageResult<DeviceChannel>();
  147 +
  148 + deviceChannelMapper.queryChannelsByDeviceId(deviceId);
  149 +// String queryContent = "*";
  150 +// if (!StringUtils.isEmpty(query)) queryContent = String.format("*%S*",query);
  151 +// String queryHasSubChannel = "*";
  152 +// if (hasSubChannel != null) queryHasSubChannel = hasSubChannel?"true":"false";
  153 +// String queryOnline = "*";
  154 +// if (!StringUtils.isEmpty(online)) queryOnline = online;
  155 +// String queryStr = VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
  156 +// "_" + queryContent + // 搜索编号和名称
  157 +// "_" + queryOnline + // 搜索是否在线
  158 +// "_" + queryHasSubChannel + // 搜索是否含有子节点
  159 +// "_" + "*";
  160 +// List<Object> deviceChannelList = redis.scan(queryStr);
  161 +// //对查询结果排序,避免出现通道排列顺序乱序的情况
  162 +// Collections.sort(deviceChannelList,new Comparator<Object>(){
  163 +// @Override
  164 +// public int compare(Object o1, Object o2) {
  165 +// return o1.toString().compareToIgnoreCase(o2.toString());
  166 +// }
  167 +// });
  168 +// pageResult.setPage(page);
  169 +// pageResult.setCount(count);
  170 +// pageResult.setTotal(deviceChannelList.size());
  171 +// int maxCount = (page + 1 ) * count;
  172 +// if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
  173 +// for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) {
  174 +// DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i));
  175 +// StreamInfo streamInfo = stringStreamInfoMap.get(deviceId + "_" + deviceChannel.getChannelId());
  176 +// deviceChannel.setPlay(streamInfo != null);
  177 +// if (streamInfo != null) deviceChannel.setStreamId(streamInfo.getStreamId());
  178 +// result.add(deviceChannel);
  179 +// }
  180 +// pageResult.setData(result);
  181 +// }
  182 +
  183 + return pageResult;
  184 + }
  185 +
  186 +
  187 +
  188 + @Override
  189 + public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) {
  190 +// List<DeviceChannel> result = new ArrayList<>();
  191 +//// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
  192 +// List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
  193 +//
  194 +// if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
  195 +// for (int i = 0; i < deviceChannelList.size(); i++) {
  196 +// result.add((DeviceChannel)redis.get((String) deviceChannelList.get(i)));
  197 +// }
  198 +// }
  199 + return deviceChannelMapper.queryChannelsByDeviceId(deviceId);
  200 + }
  201 +
  202 + @Override
  203 + public PageResult querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, String online, int page, int count) {
  204 +
  205 + deviceChannelMapper.queryChannelsByDeviceId(deviceId, parentChannelId);
  206 +
  207 +// List<DeviceChannel> allDeviceChannels = new ArrayList<>();
  208 +// String queryContent = "*";
  209 +// if (!StringUtils.isEmpty(query)) queryContent = String.format("*%S*",query);
  210 +// String queryHasSubChannel = "*";
  211 +// if (hasSubChannel != null) queryHasSubChannel = hasSubChannel?"true":"false";
  212 +// String queryOnline = "*";
  213 +// if (!StringUtils.isEmpty(online)) queryOnline = online;
  214 +// String queryStr = VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
  215 +// "_" + queryContent + // 搜索编号和名称
  216 +// "_" + queryOnline + // 搜索是否在线
  217 +// "_" + queryHasSubChannel + // 搜索是否含有子节点
  218 +// "_" + parentChannelId;
  219 +//
  220 +//// List<Object> deviceChannelList = redis.keys(queryStr);
  221 +// List<Object> deviceChannelList = redis.scan(queryStr);
  222 +//
  223 +// if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
  224 +// for (int i = 0; i < deviceChannelList.size(); i++) {
  225 +// DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i));
  226 +// if (deviceChannel.getParentId() != null && deviceChannel.getParentId().equals(parentChannelId)) {
  227 +// allDeviceChannels.add(deviceChannel);
  228 +// }
  229 +// }
  230 +// }
  231 +// int maxCount = (page + 1 ) * count;
  232 + PageResult pageResult = new PageResult<DeviceChannel>();
  233 +// pageResult.setPage(page);
  234 +// pageResult.setCount(count);
  235 +// pageResult.setTotal(allDeviceChannels.size());
  236 +//
  237 +// if (allDeviceChannels.size() > 0) {
  238 +// pageResult.setData(allDeviceChannels.subList(
  239 +// page * count, pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal()
  240 +// ));
  241 +// }
  242 + return pageResult;
  243 + }
  244 +
  245 + public List<DeviceChannel> querySubChannels(String deviceId, String parentChannelId) {
  246 + List<DeviceChannel> allDeviceChannels = new ArrayList<>();
  247 +// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
  248 +// List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
  249 +//
  250 +// if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
  251 +// for (int i = 0; i < deviceChannelList.size(); i++) {
  252 +// DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i));
  253 +// if (deviceChannel.getParentId() != null && deviceChannel.getParentId().equals(parentChannelId)) {
  254 +// allDeviceChannels.add(deviceChannel);
  255 +// }
  256 +// }
  257 +// }
  258 +
  259 + return allDeviceChannels;
  260 + }
  261 +
  262 + @Override
  263 + public DeviceChannel queryChannel(String deviceId, String channelId) {
  264 + DeviceChannel deviceChannel = null;
  265 + return deviceChannelMapper.queryChannel(deviceId, channelId);
  266 +//// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
  267 +// List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
  268 +// "_" + channelId + "*");
  269 +// if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
  270 +// deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(0));
  271 +// }
  272 +// return deviceChannel;
  273 + }
  274 +
  275 +
  276 + /**
  277 + * 获取多个设备
  278 + *
  279 + * @param deviceIds 设备ID数组
  280 + * @return List<Device> 设备对象数组
  281 + */
  282 + @Override
  283 + public PageResult<Device> queryVideoDeviceList(String[] deviceIds, int page, int count) {
  284 + List<Device> devices = new ArrayList<>();
  285 + PageResult pageResult = new PageResult<Device>();
  286 +// pageResult.setPage(page);
  287 +// pageResult.setCount(count);
  288 +// Device device = null;
  289 +//
  290 +// if (deviceIds == null || deviceIds.length == 0) {
  291 +//
  292 +//// List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
  293 +// List<Object> deviceIdList = redis.scan(VideoManagerConstants.DEVICE_PREFIX+"*");
  294 +// pageResult.setTotal(deviceIdList.size());
  295 +// int maxCount = (page + 1)* count;
  296 +// for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) {
  297 +// // devices.add((Device)redis.get((String)deviceIdList.get(i)));
  298 +// device =(Device)redis.get((String)deviceIdList.get(i));
  299 +// if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
  300 +// // outline(device.getDeviceId());
  301 +// }
  302 +// devices.add(device);
  303 +// }
  304 +// } else {
  305 +// for (int i = 0; i < deviceIds.length; i++) {
  306 +// // devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]));
  307 +// device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]);
  308 +// if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
  309 +// // outline(device.getDeviceId());
  310 +// }
  311 +// devices.add(device);
  312 +// }
  313 +// }
  314 +// pageResult.setData(devices);
  315 + return pageResult;
  316 + }
  317 +
  318 + /**
  319 + * 获取多个设备
  320 + *
  321 + * @return List<Device> 设备对象数组
  322 + */
  323 + @Override
  324 + public List<Device> queryVideoDeviceList() {
  325 +
  326 +// if (deviceIds == null || deviceIds.length == 0) {
  327 +//// List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
  328 +// List<Object> deviceIdList = redis.scan(VideoManagerConstants.DEVICE_PREFIX+"*");
  329 +// for (int i = 0; i < deviceIdList.size(); i++) {
  330 +// device =(Device)redis.get((String)deviceIdList.get(i));
  331 +// if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
  332 +// outline(device.getDeviceId());
  333 +// }
  334 +// devices.add(device);
  335 +// }
  336 +// } else {
  337 +// for (int i = 0; i < deviceIds.length; i++) {
  338 +// device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]);
  339 +// if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
  340 +// outline(device.getDeviceId());
  341 +// }
  342 +// devices.add(device);
  343 +// }
  344 +// }
  345 +
  346 + List<Device> deviceList = deviceMapper.getDevices();
  347 + return deviceList;
  348 + }
  349 +
  350 + /**
  351 + * 删除设备
  352 + *
  353 + * @param deviceId 设备ID
  354 + * @return true:删除成功 false:删除失败
  355 + */
  356 + @Override
  357 + public boolean delete(String deviceId) {
  358 + int result = deviceMapper.del(deviceId);
  359 +
  360 + return result > 0;
  361 + }
  362 +
  363 + /**
  364 + * 更新设备在线
  365 + *
  366 + * @param deviceId 设备ID
  367 + * @return true:更新成功 false:更新失败
  368 + */
  369 + @Override
  370 + public boolean online(String deviceId) {
  371 + Device device = deviceMapper.getDeviceByDeviceId(deviceId);
  372 + device.setOnline(1);
  373 + return deviceMapper.update(device) > 0;
  374 + }
  375 +
  376 + /**
  377 + * 更新设备离线
  378 + *
  379 + * @param deviceId 设备ID
  380 + * @return true:更新成功 false:更新失败
  381 + */
  382 + @Override
  383 + public boolean outline(String deviceId) {
  384 +// Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
  385 +// if (device == null) return false;
  386 +// device.setOnline(0);
  387 +// return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
  388 +
  389 + Device device = deviceMapper.getDeviceByDeviceId(deviceId);
  390 + device.setOnline(0);
  391 + return deviceMapper.update(device) > 0;
  392 + }
  393 +
  394 +
  395 + @Override
  396 + public void cleanChannelsForDevice(String deviceId) {
  397 + int result = deviceChannelMapper.cleanChannelsByDeviceId(deviceId);
  398 + }
  399 +
  400 +
  401 +}
... ...
src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java deleted 100644 → 0
1   -package com.genersoft.iot.vmp.storager.jdbc;
2   -
3   -import java.util.List;
4   -import java.util.Map;
5   -
6   -import com.genersoft.iot.vmp.common.PageResult;
7   -import com.genersoft.iot.vmp.common.StreamInfo;
8   -import com.genersoft.iot.vmp.conf.MediaServerConfig;
9   -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
10   -import org.springframework.stereotype.Component;
11   -import org.springframework.stereotype.Service;
12   -
13   -import com.genersoft.iot.vmp.common.VideoManagerConstants;
14   -import com.genersoft.iot.vmp.gb28181.bean.Device;
15   -import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
16   -
17   -/**
18   - * @Description:视频设备数据存储-jdbc实现
19   - * @author: swwheihei
20   - * @date: 2020年5月6日 下午2:28:12
21   - */
22   -@Component("jdbcStorager")
23   -public class VideoManagerJdbcStoragerImpl implements IVideoManagerStorager {
24   -
25   - @Override
26   - public boolean updateMediaInfo(MediaServerConfig mediaServerConfig) {
27   - return false;
28   - }
29   -
30   - @Override
31   - public MediaServerConfig getMediaInfo() {
32   - return null;
33   - }
34   -
35   - /**
36   - * 根据设备ID判断设备是否存在
37   - *
38   - * @param deviceId 设备ID
39   - * @return true:存在 false:不存在
40   - */
41   - @Override
42   - public boolean exists(String deviceId) {
43   - // TODO Auto-generated method stub
44   - return false;
45   - }
46   -
47   - /**
48   - * 视频设备创建
49   - *
50   - * @param device 设备对象
51   - * @return true:创建成功 false:创建失败
52   - */
53   - @Override
54   - public boolean create(Device device) {
55   - // TODO Auto-generated method stub
56   - return false;
57   - }
58   -
59   - @Override
60   - public boolean updateDevice(Device device) {
61   - return false;
62   - }
63   -
64   - @Override
65   - public void updateChannel(String deviceId, DeviceChannel channel) {
66   -
67   - }
68   -
69   -
70   - /**
71   - * 获取设备
72   - *
73   - * @param deviceId 设备ID
74   - * @return Device 设备对象
75   - */
76   - @Override
77   - public Device queryVideoDevice(String deviceId) {
78   - // TODO Auto-generated method stub
79   - return null;
80   - }
81   -
82   - @Override
83   - public PageResult queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, String online, int page, int count) {
84   - return null;
85   - }
86   -
87   -
88   - @Override
89   - public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) {
90   - return null;
91   - }
92   -
93   - @Override
94   - public DeviceChannel queryChannel(String deviceId, String channelId) {
95   - return null;
96   - }
97   -
98   - @Override
99   - public PageResult<Device> queryVideoDeviceList(String[] deviceIds, int page, int count) {
100   - return null;
101   - }
102   -
103   - /**
104   - * 获取多个设备
105   - *
106   - * @param deviceIds 设备ID数组
107   - * @return List<Device> 设备对象数组
108   - */
109   - @Override
110   - public List<Device> queryVideoDeviceList(String[] deviceIds) {
111   - // TODO Auto-generated method stub
112   - return null;
113   - }
114   -
115   - /**
116   - * 删除设备
117   - *
118   - * @param deviceId 设备ID
119   - * @return true:删除成功 false:删除失败
120   - */
121   - @Override
122   - public boolean delete(String deviceId) {
123   - // TODO Auto-generated method stub
124   - return false;
125   - }
126   -
127   - /**
128   - * 更新设备在线
129   - *
130   - * @param deviceId 设备ID
131   - * @return true:更新成功 false:更新失败
132   - */
133   - @Override
134   - public boolean online(String deviceId) {
135   - // TODO Auto-generated method stub
136   - return false;
137   - }
138   -
139   - /**
140   - * 更新设备离线
141   - *
142   - * @param deviceId 设备ID
143   - * @return true:更新成功 false:更新失败
144   - */
145   - @Override
146   - public boolean outline(String deviceId) {
147   - // TODO Auto-generated method stub
148   - return false;
149   - }
150   -
151   - @Override
152   - public boolean stopPlay(StreamInfo streamInfo) {
153   - return false;
154   - }
155   -
156   - @Override
157   - public StreamInfo queryPlay(StreamInfo streamInfo) {
158   - return null;
159   - }
160   -
161   - @Override
162   - public PageResult querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, String online, int page, int count) {
163   - return null;
164   - }
165   -
166   - @Override
167   - public void updateCatch() {
168   - System.out.println("##################");
169   - }
170   -
171   - @Override
172   - public void cleanChannelsForDevice(String deviceId) {
173   -
174   - }
175   -
176   - @Override
177   - public boolean startPlay(StreamInfo stream) {
178   - return false;
179   - }
180   -
181   -
182   - @Override
183   - public StreamInfo queryPlayByDevice(String deviceId, String code) {
184   - return null;
185   - }
186   -
187   - @Override
188   - public Map<String, StreamInfo> queryPlayByDeviceId(String deviceId) {
189   -
190   - return null;
191   - }
192   -
193   - @Override
194   - public boolean startPlayback(StreamInfo streamInfo) {
195   - return false;
196   - }
197   -
198   - @Override
199   - public boolean stopPlayback(StreamInfo streamInfo) {
200   - return false;
201   - }
202   -
203   - @Override
204   - public StreamInfo queryPlaybackByDevice(String deviceId, String channelId) {
205   - return null;
206   - }
207   -
208   - @Override
209   - public StreamInfo queryPlayByStreamId(String streamId) {
210   - return null;
211   - }
212   -
213   - @Override
214   - public StreamInfo queryPlaybackByStreamId(String streamId) {
215   - return null;
216   - }
217   -}
src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java deleted 100644 → 0
1   -package com.genersoft.iot.vmp.storager.redis;
2   -
3   -import java.util.*;
4   -
5   -import com.alibaba.fastjson.JSON;
6   -import com.alibaba.fastjson.JSONObject;
7   -import com.genersoft.iot.vmp.common.PageResult;
8   -import com.genersoft.iot.vmp.common.StreamInfo;
9   -import com.genersoft.iot.vmp.conf.MediaServerConfig;
10   -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
11   -import org.springframework.beans.factory.annotation.Autowired;
12   -import org.springframework.stereotype.Component;
13   -
14   -import com.genersoft.iot.vmp.common.VideoManagerConstants;
15   -import com.genersoft.iot.vmp.gb28181.bean.Device;
16   -import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
17   -import com.genersoft.iot.vmp.utils.redis.RedisUtil;
18   -import org.springframework.util.StringUtils;
19   -
20   -/**
21   - * @Description:视频设备数据存储-redis实现
22   - * @author: swwheihei
23   - * @date: 2020年5月6日 下午2:31:42
24   - */
25   -@Component("redisStorager")
26   -public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager {
27   -
28   - @Autowired
29   - private RedisUtil redis;
30   -
31   - private HashMap<String, HashMap<String, HashSet<String>>> deviceMap = new HashMap<>();
32   -
33   -
34   - /**
35   - * 根据设备ID判断设备是否存在
36   - *
37   - * @param deviceId 设备ID
38   - * @return true:存在 false:不存在
39   - */
40   - @Override
41   - public boolean exists(String deviceId) {
42   - return redis.hasKey(VideoManagerConstants.DEVICE_PREFIX+deviceId);
43   - }
44   -
45   - /**
46   - * 视频设备创建
47   - *
48   - * @param device 设备对象
49   - * @return true:创建成功 false:创建失败
50   - */
51   - @Override
52   - public boolean create(Device device) {
53   - return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
54   - }
55   -
56   -
57   -
58   - /**
59   - * 视频设备更新
60   - *
61   - * @param device 设备对象
62   - * @return true:更新成功 false:更新失败
63   - */
64   - @Override
65   - public boolean updateDevice(Device device) {
66   - if (deviceMap.get(device.getDeviceId()) == null) {
67   - deviceMap.put(device.getDeviceId(), new HashMap<String, HashSet<String>>());
68   - }
69   - // 更新device中的通道数量
70   - device.setChannelCount(deviceMap.get(device.getDeviceId()).size());
71   - // 存储device
72   - return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
73   -
74   -
75   - }
76   -
77   - @Override
78   - public void updateChannel(String deviceId, DeviceChannel channel) {
79   - String channelId = channel.getChannelId();
80   - HashMap<String, HashSet<String>> channelMap = deviceMap.get(deviceId);
81   - if (channelMap == null) return;
82   - // 作为父设备, 确定自己的子节点数
83   - if (channelMap.get(channelId) == null) {
84   - channelMap.put(channelId, new HashSet<String>());
85   - }else if (channelMap.get(channelId).size() > 0) {
86   - channel.setSubCount(channelMap.get(channelId).size());
87   - }
88   -
89   - // 存储通道
90   - redis.set(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
91   - "_" + channel.getChannelId() +
92   - "_" + (channel.getStatus() == 1 ? "on":"off") +
93   - "_" + (channelMap.get(channelId).size() > 0)+
94   - "_" + (StringUtils.isEmpty(channel.getParentId())?null:channel.getParentId()),
95   - channel);
96   - // 更新device中的通道数量
97   - Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
98   - device.setChannelCount(deviceMap.get(deviceId).size());
99   - redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
100   -
101   -
102   - // 如果有父设备,更新父设备内子节点数
103   - String parentId = channel.getParentId();
104   - if (!StringUtils.isEmpty(parentId) && !parentId.equals(deviceId)) {
105   -
106   - if (channelMap.get(parentId) == null) {
107   - channelMap.put(parentId, new HashSet<String>());
108   - }
109   - channelMap.get(parentId).add(channelId);
110   -
111   - DeviceChannel deviceChannel = queryChannel(deviceId, parentId);
112   - if (deviceChannel != null) {
113   - deviceChannel.setSubCount(channelMap.get(parentId).size());
114   - redis.set(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
115   - "_" + deviceChannel.getChannelId() +
116   - "_" + (deviceChannel.getStatus() == 1 ? "on":"off") +
117   - "_" + (channelMap.get(deviceChannel.getChannelId()).size() > 0)+
118   - "_" + (StringUtils.isEmpty(deviceChannel.getParentId())?null:deviceChannel.getParentId()),
119   - deviceChannel);
120   -
121   - }
122   - }
123   -
124   - }
125   -
126   - /**
127   - * 获取设备
128   - *
129   - * @param deviceId 设备ID
130   - * @return Device 设备对象
131   - */
132   - @Override
133   - public Device queryVideoDevice(String deviceId) {
134   - return (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
135   - }
136   -
137   - @Override
138   - public PageResult queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, String online, int page, int count) {
139   - // 获取到所有正在播放的流
140   - Map<String, StreamInfo> stringStreamInfoMap = queryPlayByDeviceId(deviceId);
141   - List<DeviceChannel> result = new ArrayList<>();
142   - PageResult pageResult = new PageResult<DeviceChannel>();
143   - String queryContent = "*";
144   - if (!StringUtils.isEmpty(query)) queryContent = String.format("*%S*",query);
145   - String queryHasSubChannel = "*";
146   - if (hasSubChannel != null) queryHasSubChannel = hasSubChannel?"true":"false";
147   - String queryOnline = "*";
148   - if (!StringUtils.isEmpty(online)) queryOnline = online;
149   - String queryStr = VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
150   - "_" + queryContent + // 搜索编号和名称
151   - "_" + queryOnline + // 搜索是否在线
152   - "_" + queryHasSubChannel + // 搜索是否含有子节点
153   - "_" + "*";
154   - List<Object> deviceChannelList = redis.scan(queryStr);
155   - //对查询结果排序,避免出现通道排列顺序乱序的情况
156   - Collections.sort(deviceChannelList,new Comparator<Object>(){
157   - @Override
158   - public int compare(Object o1, Object o2) {
159   - return o1.toString().compareToIgnoreCase(o2.toString());
160   - }
161   - });
162   - pageResult.setPage(page);
163   - pageResult.setCount(count);
164   - pageResult.setTotal(deviceChannelList.size());
165   - int maxCount = (page + 1 ) * count;
166   - if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
167   - for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) {
168   - DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i));
169   - StreamInfo streamInfo = stringStreamInfoMap.get(deviceId + "_" + deviceChannel.getChannelId());
170   - deviceChannel.setPlay(streamInfo != null);
171   - if (streamInfo != null) deviceChannel.setStreamId(streamInfo.getStreamId());
172   - result.add(deviceChannel);
173   - }
174   - pageResult.setData(result);
175   - }
176   -
177   - return pageResult;
178   - }
179   -
180   -
181   -
182   - @Override
183   - public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) {
184   - List<DeviceChannel> result = new ArrayList<>();
185   -// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
186   - List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
187   -
188   - if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
189   - for (int i = 0; i < deviceChannelList.size(); i++) {
190   - result.add((DeviceChannel)redis.get((String) deviceChannelList.get(i)));
191   - }
192   - }
193   - return result;
194   - }
195   -
196   - @Override
197   - public PageResult querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, String online, int page, int count) {
198   - List<DeviceChannel> allDeviceChannels = new ArrayList<>();
199   - String queryContent = "*";
200   - if (!StringUtils.isEmpty(query)) queryContent = String.format("*%S*",query);
201   - String queryHasSubChannel = "*";
202   - if (hasSubChannel != null) queryHasSubChannel = hasSubChannel?"true":"false";
203   - String queryOnline = "*";
204   - if (!StringUtils.isEmpty(online)) queryOnline = online;
205   - String queryStr = VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
206   - "_" + queryContent + // 搜索编号和名称
207   - "_" + queryOnline + // 搜索是否在线
208   - "_" + queryHasSubChannel + // 搜索是否含有子节点
209   - "_" + parentChannelId;
210   -
211   -// List<Object> deviceChannelList = redis.keys(queryStr);
212   - List<Object> deviceChannelList = redis.scan(queryStr);
213   -
214   - if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
215   - for (int i = 0; i < deviceChannelList.size(); i++) {
216   - DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i));
217   - if (deviceChannel.getParentId() != null && deviceChannel.getParentId().equals(parentChannelId)) {
218   - allDeviceChannels.add(deviceChannel);
219   - }
220   - }
221   - }
222   - int maxCount = (page + 1 ) * count;
223   - PageResult pageResult = new PageResult<DeviceChannel>();
224   - pageResult.setPage(page);
225   - pageResult.setCount(count);
226   - pageResult.setTotal(allDeviceChannels.size());
227   -
228   - if (allDeviceChannels.size() > 0) {
229   - pageResult.setData(allDeviceChannels.subList(
230   - page * count, pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal()
231   - ));
232   - }
233   - return pageResult;
234   - }
235   -
236   - public List<DeviceChannel> querySubChannels(String deviceId, String parentChannelId) {
237   - List<DeviceChannel> allDeviceChannels = new ArrayList<>();
238   -// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
239   - List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
240   -
241   - if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
242   - for (int i = 0; i < deviceChannelList.size(); i++) {
243   - DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i));
244   - if (deviceChannel.getParentId() != null && deviceChannel.getParentId().equals(parentChannelId)) {
245   - allDeviceChannels.add(deviceChannel);
246   - }
247   - }
248   - }
249   -
250   - return allDeviceChannels;
251   - }
252   -
253   - @Override
254   - public DeviceChannel queryChannel(String deviceId, String channelId) {
255   - DeviceChannel deviceChannel = null;
256   -// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
257   - List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
258   - "_" + channelId + "*");
259   - if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
260   - deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(0));
261   - }
262   - return deviceChannel;
263   - }
264   -
265   -
266   - /**
267   - * 获取多个设备
268   - *
269   - * @param deviceIds 设备ID数组
270   - * @return List<Device> 设备对象数组
271   - */
272   - @Override
273   - public PageResult<Device> queryVideoDeviceList(String[] deviceIds, int page, int count) {
274   - List<Device> devices = new ArrayList<>();
275   - PageResult pageResult = new PageResult<Device>();
276   - pageResult.setPage(page);
277   - pageResult.setCount(count);
278   - Device device = null;
279   -
280   - if (deviceIds == null || deviceIds.length == 0) {
281   -
282   -// List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
283   - List<Object> deviceIdList = redis.scan(VideoManagerConstants.DEVICE_PREFIX+"*");
284   - pageResult.setTotal(deviceIdList.size());
285   - int maxCount = (page + 1)* count;
286   - for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) {
287   - // devices.add((Device)redis.get((String)deviceIdList.get(i)));
288   - device =(Device)redis.get((String)deviceIdList.get(i));
289   - if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
290   - // outline(device.getDeviceId());
291   - }
292   - devices.add(device);
293   - }
294   - } else {
295   - for (int i = 0; i < deviceIds.length; i++) {
296   - // devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]));
297   - device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]);
298   - if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
299   - // outline(device.getDeviceId());
300   - }
301   - devices.add(device);
302   - }
303   - }
304   - pageResult.setData(devices);
305   - return pageResult;
306   - }
307   -
308   - /**
309   - * 获取多个设备
310   - *
311   - * @param deviceIds 设备ID数组
312   - * @return List<Device> 设备对象数组
313   - */
314   - @Override
315   - public List<Device> queryVideoDeviceList(String[] deviceIds) {
316   - List<Device> devices = new ArrayList<>();
317   - Device device = null;
318   -
319   - if (deviceIds == null || deviceIds.length == 0) {
320   -// List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
321   - List<Object> deviceIdList = redis.scan(VideoManagerConstants.DEVICE_PREFIX+"*");
322   - for (int i = 0; i < deviceIdList.size(); i++) {
323   - device =(Device)redis.get((String)deviceIdList.get(i));
324   - if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
325   - outline(device.getDeviceId());
326   - }
327   - devices.add(device);
328   - }
329   - } else {
330   - for (int i = 0; i < deviceIds.length; i++) {
331   - device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]);
332   - if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
333   - outline(device.getDeviceId());
334   - }
335   - devices.add(device);
336   - }
337   - }
338   - return devices;
339   - }
340   -
341   - /**
342   - * 删除设备
343   - *
344   - * @param deviceId 设备ID
345   - * @return true:删除成功 false:删除失败
346   - */
347   - @Override
348   - public boolean delete(String deviceId) {
349   - return redis.del(VideoManagerConstants.DEVICE_PREFIX+deviceId);
350   - }
351   -
352   - /**
353   - * 更新设备在线
354   - *
355   - * @param deviceId 设备ID
356   - * @return true:更新成功 false:更新失败
357   - */
358   - @Override
359   - public boolean online(String deviceId) {
360   - Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
361   - device.setOnline(1);
362   - return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
363   - }
364   -
365   - /**
366   - * 更新设备离线
367   - *
368   - * @param deviceId 设备ID
369   - * @return true:更新成功 false:更新失败
370   - */
371   - @Override
372   - public boolean outline(String deviceId) {
373   - Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
374   - if (device == null) return false;
375   - device.setOnline(0);
376   - return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
377   - }
378   -
379   - /**
380   - * 开始播放时将流存入redis
381   - *
382   - * @return
383   - */
384   - @Override
385   - public boolean startPlay(StreamInfo stream) {
386   - return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, stream.getStreamId(),stream.getDeviceID(), stream.getCahnnelId()),
387   - stream);
388   - }
389   -
390   - /**
391   - * 停止播放时从redis删除
392   - *
393   - * @return
394   - */
395   - @Override
396   - public boolean stopPlay(StreamInfo streamInfo) {
397   - if (streamInfo == null) return false;
398   - DeviceChannel deviceChannel = queryChannel(streamInfo.getDeviceID(), streamInfo.getCahnnelId());
399   - if (deviceChannel != null) {
400   - deviceChannel.setStreamId(null);
401   - deviceChannel.setPlay(false);
402   - updateChannel(streamInfo.getDeviceID(), deviceChannel);
403   - }
404   - return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
405   - streamInfo.getStreamId(),
406   - streamInfo.getDeviceID(),
407   - streamInfo.getCahnnelId()));
408   - }
409   -
410   - /**
411   - * 查询播放列表
412   - * @return
413   - */
414   - @Override
415   - public StreamInfo queryPlay(StreamInfo streamInfo) {
416   - return (StreamInfo)redis.get(String.format("%S_%s_%s_%s",
417   - VideoManagerConstants.PLAYER_PREFIX,
418   - streamInfo.getStreamId(),
419   - streamInfo.getDeviceID(),
420   - streamInfo.getCahnnelId()));
421   - }
422   - @Override
423   - public StreamInfo queryPlayByStreamId(String steamId) {
424   - List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, steamId));
425   - if (playLeys == null || playLeys.size() == 0) return null;
426   - return (StreamInfo)redis.get(playLeys.get(0).toString());
427   - }
428   -
429   - @Override
430   - public StreamInfo queryPlaybackByStreamId(String steamId) {
431   - List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAY_BLACK_PREFIX, steamId));
432   - if (playLeys == null || playLeys.size() == 0) return null;
433   - return (StreamInfo)redis.get(playLeys.get(0).toString());
434   - }
435   -
436   - @Override
437   - public StreamInfo queryPlayByDevice(String deviceId, String code) {
438   -// List<Object> playLeys = redis.keys(String.format("%S_*_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
439   - List<Object> playLeys = redis.scan(String.format("%S_*_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
440   - deviceId,
441   - code));
442   - if (playLeys == null || playLeys.size() == 0) return null;
443   - return (StreamInfo)redis.get(playLeys.get(0).toString());
444   - }
445   -
446   - /**
447   - * 更新流媒体信息
448   - * @param mediaServerConfig
449   - * @return
450   - */
451   - @Override
452   - public boolean updateMediaInfo(MediaServerConfig mediaServerConfig) {
453   - return redis.set(VideoManagerConstants.MEDIA_SERVER_PREFIX,mediaServerConfig);
454   - }
455   -
456   - /**
457   - * 获取流媒体信息
458   - * @return
459   - */
460   - @Override
461   - public MediaServerConfig getMediaInfo() {
462   - return (MediaServerConfig)redis.get(VideoManagerConstants.MEDIA_SERVER_PREFIX);
463   - }
464   -
465   - @Override
466   - public void updateCatch() {
467   - deviceMap = new HashMap<>();
468   - // 更新设备
469   - List<Device> devices = queryVideoDeviceList(null);
470   - if (devices == null && devices.size() == 0) return;
471   - for (Device device : devices) {
472   - // 更新设备下的通道
473   - HashMap<String, HashSet<String>> channelMap = new HashMap<String, HashSet<String>>();
474   - List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX +
475   - device.getDeviceId() + "_" + "*");
476   - if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
477   - for (int i = 0; i < deviceChannelList.size(); i++) {
478   - String key = (String)deviceChannelList.get(i);
479   - String[] s = key.split("_");
480   - String channelId = s[3];
481   - HashSet<String> subChannel = channelMap.get(channelId);
482   - if (subChannel == null) {
483   - subChannel = new HashSet<>();
484   - }
485   - System.out.println(key);
486   - if (s.length == 6 && !"null".equals(s[5])) {
487   - subChannel.add(s[5]);
488   - }
489   - channelMap.put(channelId, subChannel);
490   - }
491   - }
492   - deviceMap.put(device.getDeviceId(),channelMap);
493   - }
494   - System.out.println();
495   - }
496   -
497   - @Override
498   - public void cleanChannelsForDevice(String deviceId) {
499   - List<DeviceChannel> result = new ArrayList<>();
500   -// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
501   - List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
502   - if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
503   - for (int i = 0; i < deviceChannelList.size(); i++) {
504   - redis.del((String)deviceChannelList.get(i));
505   - }
506   - }
507   - }
508   -
509   - @Override
510   - public Map<String, StreamInfo> queryPlayByDeviceId(String deviceId) {
511   - Map<String, StreamInfo> streamInfos = new HashMap<>();
512   -// List<Object> playLeys = redis.keys(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId));
513   - List<Object> playLeys = redis.scan(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId));
514   - if (playLeys.size() == 0) return streamInfos;
515   - for (int i = 0; i < playLeys.size(); i++) {
516   - String key = (String) playLeys.get(i);
517   - StreamInfo streamInfo = (StreamInfo)redis.get(key);
518   - streamInfos.put(streamInfo.getDeviceID() + "_" + streamInfo.getCahnnelId(), streamInfo);
519   - }
520   - return streamInfos;
521   - }
522   -
523   -
524   - @Override
525   - public boolean startPlayback(StreamInfo stream) {
526   - return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, stream.getStreamId(),stream.getDeviceID(), stream.getCahnnelId()),
527   - stream);
528   - }
529   -
530   -
531   - @Override
532   - public boolean stopPlayback(StreamInfo streamInfo) {
533   - if (streamInfo == null) return false;
534   - DeviceChannel deviceChannel = queryChannel(streamInfo.getDeviceID(), streamInfo.getCahnnelId());
535   - if (deviceChannel != null) {
536   - deviceChannel.setStreamId(null);
537   - deviceChannel.setPlay(false);
538   - updateChannel(streamInfo.getDeviceID(), deviceChannel);
539   - }
540   - return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
541   - streamInfo.getStreamId(),
542   - streamInfo.getDeviceID(),
543   - streamInfo.getCahnnelId()));
544   - }
545   -
546   - @Override
547   - public StreamInfo queryPlaybackByDevice(String deviceId, String code) {
548   - String format = String.format("%S_*_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
549   - deviceId,
550   - code);
551   - List<Object> playLeys = redis.scan(String.format("%S_*_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
552   - deviceId,
553   - code));
554   - if (playLeys == null || playLeys.size() == 0) {
555   - playLeys = redis.scan(String.format("%S_*_*_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
556   - deviceId));
557   - }
558   - if (playLeys == null || playLeys.size() == 0) return null;
559   - return (StreamInfo)redis.get(playLeys.get(0).toString());
560   - }
561   -}
src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java
... ... @@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
8 8 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
9 9 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
10 10 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
  11 +import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
11 12 import com.genersoft.iot.vmp.vmanager.service.IPlayService;
12 13 import org.slf4j.Logger;
13 14 import org.slf4j.LoggerFactory;
... ... @@ -46,6 +47,9 @@ public class PlayController {
46 47 private IVideoManagerStorager storager;
47 48  
48 49 @Autowired
  50 + private IRedisCatchStorage redisCatchStorage;
  51 +
  52 + @Autowired
49 53 private ZLMRESTfulUtils zlmresTfulUtils;
50 54  
51 55 @Autowired
... ... @@ -60,7 +64,7 @@ public class PlayController {
60 64  
61 65  
62 66 Device device = storager.queryVideoDevice(deviceId);
63   - StreamInfo streamInfo = storager.queryPlayByDevice(deviceId, channelId);
  67 + StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
64 68  
65 69 UUID uuid = UUID.randomUUID();
66 70 DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>();
... ... @@ -89,7 +93,7 @@ public class PlayController {
89 93 msg.setData(JSON.toJSONString(streamInfo));
90 94 resultHolder.invokeResult(msg);
91 95 } else {
92   - storager.stopPlay(streamInfo);
  96 + redisCatchStorage.stopPlay(streamInfo);
93 97 cmder.playStreamCmd(device, channelId, (JSONObject response) -> {
94 98 logger.info("收到订阅消息: " + response.toJSONString());
95 99 playService.onPublishHandlerForPlay(response, deviceId, channelId, uuid.toString());
... ... @@ -117,25 +121,59 @@ public class PlayController {
117 121 }
118 122  
119 123 @PostMapping("/play/{streamId}/stop")
120   - public ResponseEntity<String> playStop(@PathVariable String streamId) {
121   -
122   - cmder.streamByeCmd(streamId);
123   - StreamInfo streamInfo = storager.queryPlayByStreamId(streamId);
124   - if (streamInfo == null)
125   - return new ResponseEntity<String>("streamId not found", HttpStatus.OK);
126   - storager.stopPlay(streamInfo);
127   - if (logger.isDebugEnabled()) {
128   - logger.debug(String.format("设备预览停止API调用,streamId:%s", streamId));
129   - }
  124 + public DeferredResult<ResponseEntity<String>> playStop(@PathVariable String streamId) {
  125 +
  126 + logger.debug(String.format("设备预览/回放停止API调用,streamId:%s", streamId));
  127 +
  128 + UUID uuid = UUID.randomUUID();
  129 + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>();
  130 +
  131 + // 录像查询以channelId作为deviceId查询
  132 + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_STOP + uuid, result);
  133 +
  134 + cmder.streamByeCmd(streamId, event -> {
  135 + StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
  136 + if (streamInfo == null) {
  137 + RequestMessage msg = new RequestMessage();
  138 + msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
  139 + msg.setData("streamId not found");
  140 + resultHolder.invokeResult(msg);
  141 + redisCatchStorage.stopPlay(streamInfo);
  142 + }
  143 +
  144 + RequestMessage msg = new RequestMessage();
  145 + msg.setId(DeferredResultHolder.CALLBACK_CMD_STOP + uuid);
  146 + Response response = event.getResponse();
  147 + msg.setData(String.format("success"));
  148 + resultHolder.invokeResult(msg);
  149 + });
  150 +
  151 +
130 152  
131 153 if (streamId != null) {
132 154 JSONObject json = new JSONObject();
133 155 json.put("streamId", streamId);
134   - return new ResponseEntity<String>(json.toString(), HttpStatus.OK);
  156 + RequestMessage msg = new RequestMessage();
  157 + msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
  158 + msg.setData(json.toString());
  159 + resultHolder.invokeResult(msg);
135 160 } else {
136   - logger.warn("设备预览停止API调用失败!");
137   - return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
  161 + logger.warn("设备预览/回放停止API调用失败!");
  162 + RequestMessage msg = new RequestMessage();
  163 + msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
  164 + msg.setData("streamId null");
  165 + resultHolder.invokeResult(msg);
138 166 }
  167 +
  168 + // 超时处理
  169 + result.onTimeout(()->{
  170 + logger.warn(String.format("设备预览/回放停止超时,streamId:%s ", streamId));
  171 + RequestMessage msg = new RequestMessage();
  172 + msg.setId(DeferredResultHolder.CALLBACK_CMD_STOP + uuid);
  173 + msg.setData("Timeout");
  174 + resultHolder.invokeResult(msg);
  175 + });
  176 + return result;
139 177 }
140 178  
141 179 /**
... ... @@ -145,7 +183,7 @@ public class PlayController {
145 183 */
146 184 @PostMapping("/play/{streamId}/convert")
147 185 public ResponseEntity<String> playConvert(@PathVariable String streamId) {
148   - StreamInfo streamInfo = storager.queryPlayByStreamId(streamId);
  186 + StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
149 187 if (streamInfo == null) {
150 188 logger.warn("视频转码API调用失败!, 视频流已经停止!");
151 189 return new ResponseEntity<String>("未找到视频流信息, 视频流可能已经停止", HttpStatus.OK);
... ... @@ -155,7 +193,7 @@ public class PlayController {
155 193 logger.warn("视频转码API调用失败!, 视频流已停止推流!");
156 194 return new ResponseEntity<String>("推流信息在流媒体中不存在, 视频流可能已停止推流", HttpStatus.OK);
157 195 } else {
158   - MediaServerConfig mediaInfo = storager.getMediaInfo();
  196 + MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
159 197 String dstUrl = String.format("rtmp://%s:%s/convert/%s", "127.0.0.1", mediaInfo.getRtmpPort(),
160 198 streamId );
161 199 String srcUrl = String.format("rtsp://%s:%s/rtp/%s", "127.0.0.1", mediaInfo.getRtspPort(), streamId);
... ...
src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java
... ... @@ -6,6 +6,7 @@ import com.genersoft.iot.vmp.common.StreamInfo;
6 6 import com.genersoft.iot.vmp.conf.MediaServerConfig;
7 7 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
8 8 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
  9 +import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
9 10 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
10 11 import com.genersoft.iot.vmp.vmanager.play.PlayController;
11 12 import com.genersoft.iot.vmp.vmanager.service.IPlayService;
... ... @@ -25,6 +26,9 @@ public class PlayServiceImpl implements IPlayService {
25 26 private IVideoManagerStorager storager;
26 27  
27 28 @Autowired
  29 + private IRedisCatchStorage redisCatchStorage;
  30 +
  31 + @Autowired
28 32 private DeferredResultHolder resultHolder;
29 33  
30 34 @Override
... ... @@ -33,7 +37,7 @@ public class PlayServiceImpl implements IPlayService {
33 37 msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
34 38 StreamInfo streamInfo = onPublishHandler(resonse, deviceId, channelId, uuid);
35 39 if (streamInfo != null) {
36   - storager.startPlay(streamInfo);
  40 + redisCatchStorage.startPlay(streamInfo);
37 41 msg.setData(JSON.toJSONString(streamInfo));
38 42 resultHolder.invokeResult(msg);
39 43 } else {
... ... @@ -49,7 +53,7 @@ public class PlayServiceImpl implements IPlayService {
49 53 msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
50 54 StreamInfo streamInfo = onPublishHandler(resonse, deviceId, channelId, uuid);
51 55 if (streamInfo != null) {
52   - storager.startPlayback(streamInfo);
  56 + redisCatchStorage.startPlayback(streamInfo);
53 57 msg.setData(JSON.toJSONString(streamInfo));
54 58 resultHolder.invokeResult(msg);
55 59 } else {
... ... @@ -65,7 +69,7 @@ public class PlayServiceImpl implements IPlayService {
65 69 streamInfo.setStreamId(streamId);
66 70 streamInfo.setDeviceID(deviceId);
67 71 streamInfo.setCahnnelId(channelId);
68   - MediaServerConfig mediaServerConfig = storager.getMediaInfo();
  72 + MediaServerConfig mediaServerConfig = redisCatchStorage.getMediaInfo();
69 73  
70 74 streamInfo.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaServerConfig.getWanIp(), mediaServerConfig.getHttpPort(), streamId));
71 75 streamInfo.setWs_flv(String.format("ws://%s:%s/rtp/%s.flv", mediaServerConfig.getWanIp(), mediaServerConfig.getHttpPort(), streamId));
... ...
src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java
... ... @@ -65,7 +65,7 @@ public class ApiDeviceController {
65 65 JSONObject result = new JSONObject();
66 66 List<Device> devices;
67 67 if (start == null || limit ==null) {
68   - devices = storager.queryVideoDeviceList(null);
  68 + devices = storager.queryVideoDeviceList();
69 69 result.put("DeviceCount", devices.size());
70 70 }else {
71 71 PageResult<Device> deviceList = storager.queryVideoDeviceList(null, start/limit, limit);
... ...
src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java
... ... @@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.gb28181.bean.Device;
8 8 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
9 9 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
10 10 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
  11 +import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
11 12 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
12 13 import com.genersoft.iot.vmp.vmanager.play.PlayController;
13 14 import org.slf4j.Logger;
... ... @@ -35,6 +36,9 @@ public class ApiStreamController {
35 36 @Autowired
36 37 private IVideoManagerStorager storager;
37 38  
  39 + @Autowired
  40 + private IRedisCatchStorage redisCatchStorage;
  41 +
38 42 private boolean closeWaitRTPInfo = false;
39 43  
40 44  
... ... @@ -158,14 +162,14 @@ public class ApiStreamController {
158 162  
159 163 ){
160 164  
161   - StreamInfo streamInfo = storager.queryPlayByDevice(serial, code);
  165 + StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(serial, code);
162 166 if (streamInfo == null) {
163 167 JSONObject result = new JSONObject();
164 168 result.put("error","未找到流信息");
165 169 return result;
166 170 }
167 171 cmder.streamByeCmd(streamInfo.getStreamId());
168   - storager.stopPlay(streamInfo);
  172 + redisCatchStorage.stopPlay(streamInfo);
169 173 return null;
170 174 }
171 175  
... ...
src/main/resources/wvp.sqlite 0 → 100644
No preview for this file type
web_src/src/components/channelList.vue
... ... @@ -104,7 +104,7 @@ export default {
104 104  
105 105 mounted() {
106 106 this.initData();
107   - this.updateLooper = setInterval(this.initData, 10000);
  107 + this.updateLooper = setInterval(this.initData, 1000);
108 108 },
109 109 destroyed() {
110 110 this.$destroy('videojs');
... ...