diff --git a/pom.xml b/pom.xml index dba80cf3a..299611b25 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ com.genersoft wvp + 1.1.0 web video platform @@ -46,15 +47,11 @@ spring-context - + - org.springframework.data - spring-data-redis - - - redis.clients - jedis - 3.3.0 + org.xerial + sqlite-jdbc + 3.32.3.2 diff --git a/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java b/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java index 990f003bd..21e4203e4 100644 --- a/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java +++ b/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java @@ -5,8 +5,10 @@ import java.util.logging.LogManager; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; +import tk.mybatis.spring.annotation.MapperScan; @SpringBootApplication +@MapperScan("com.genersoft.iot.vmp") public class VManageBootstrap extends LogManager { public static void main(String[] args) { SpringApplication.run(VManageBootstrap.class, args); diff --git a/src/main/java/com/genersoft/iot/vmp/common/PageResult.java b/src/main/java/com/genersoft/iot/vmp/common/PageResult.java deleted file mode 100644 index 6d7c89e6c..000000000 --- a/src/main/java/com/genersoft/iot/vmp/common/PageResult.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.genersoft.iot.vmp.common; - - -import java.util.List; - -public class PageResult { - - private int page; - private int count; - private int total; - - private List data; - - public List getData() { - return data; - } - - public int getPage() { - return page; - } - - public void setPage(int page) { - this.page = page; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getTotal() { - return total; - } - - public void setTotal(int total) { - this.total = total; - } - - public void setData(List data) { - this.data = data; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java index 1dd3a8545..12097b134 100644 --- a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java +++ b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java @@ -5,8 +5,8 @@ import com.alibaba.fastjson.JSONArray; public class StreamInfo { private String ssrc; - private String deviceID; - private String cahnnelId; + private String deviceId; + private String channelId; private String flv; private String ws_flv; private String rtmp; @@ -22,20 +22,20 @@ public class StreamInfo { this.ssrc = ssrc; } - public String getDeviceID() { - return deviceID; + public String getDeviceId() { + return deviceId; } - public void setDeviceID(String deviceID) { - this.deviceID = deviceID; + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; } - public String getCahnnelId() { - return cahnnelId; + public String getChannelId() { + return channelId; } - public void setCahnnelId(String cahnnelId) { - this.cahnnelId = cahnnelId; + public void setChannelId(String channelId) { + this.channelId = channelId; } public String getFlv() { diff --git a/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java deleted file mode 100644 index 47d2a02b8..000000000 --- a/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.genersoft.iot.vmp.conf; - -import org.springframework.cache.annotation.CachingConfigurerSupport; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.listener.RedisMessageListenerContainer; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -import com.alibaba.fastjson.parser.ParserConfig; -import com.genersoft.iot.vmp.utils.redis.FastJsonRedisSerializer; - -/** - * @Description:Redis中间件配置类,使用spring-data-redis集成,自动从application.yml中加载redis配置 - * @author: swwheihei - * @date: 2019年5月30日 上午10:58:25 - * - */ -@Configuration -public class RedisConfig extends CachingConfigurerSupport { - - @Bean("redisTemplate") - public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { - RedisTemplate template = new RedisTemplate<>(); - template.setConnectionFactory(redisConnectionFactory); - // 使用fastjson进行序列化处理,提高解析效率 - FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class); - // value值的序列化采用fastJsonRedisSerializer - template.setValueSerializer(serializer); - template.setHashValueSerializer(serializer); - // key的序列化采用StringRedisSerializer - template.setKeySerializer(new StringRedisSerializer()); - template.setHashKeySerializer(new StringRedisSerializer()); - template.setConnectionFactory(redisConnectionFactory); - // 使用fastjson时需设置此项,否则会报异常not support type - ParserConfig.getGlobalInstance().setAutoTypeSupport(true); - return template; - } - - /** - * redis消息监听器容器 可以添加多个监听不同话题的redis监听器,只需要把消息监听器和相应的消息订阅处理器绑定,该消息监听器 - * 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理 - * - * @param connectionFactory - * @param listenerAdapter - * @return - */ - @Bean - RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { - - RedisMessageListenerContainer container = new RedisMessageListenerContainer(); - container.setConnectionFactory(connectionFactory); - return container; - } - -} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java index de52ac694..15b1053d8 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java @@ -1,13 +1,19 @@ package com.genersoft.iot.vmp.gb28181.bean; +import java.sql.Date; import java.util.List; import java.util.Map; public class Device { /** - * 设备Id + * 设备id + */ + private int id; + + /** + * 设备国标Id */ private String deviceId; @@ -48,7 +54,11 @@ public class Device { /** * wan地址 */ - private Host host; + private String ip; + + private int port; + + private String address; /** * 在线 @@ -56,13 +66,19 @@ public class Device { private int online; /** - * 通道列表 + * 子节点数 */ -// private Map channelMap; - private int channelCount; - private List channelList; + private Date loginTime; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } public String getDeviceId() { return deviceId; @@ -120,12 +136,28 @@ public class Device { this.streamMode = streamMode; } - public Host getHost() { - return host; + public String getIp() { + return ip; } - public void setHost(Host host) { - this.host = host; + public void setIp(String ip) { + this.ip = ip; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; } public int getOnline() { @@ -144,11 +176,11 @@ public class Device { this.channelCount = channelCount; } - public List getChannelList() { - return channelList; + public Date getLoginTime() { + return loginTime; } - public void setChannelList(List channelList) { - this.channelList = channelList; + public void setLoginTime(Date loginTime) { + this.loginTime = loginTime; } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java index 810feabdd..85d1fdcb0 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java @@ -5,7 +5,17 @@ public class DeviceChannel { /** * 通道id */ + private int id; + + /** + * 通道国标id + */ private String channelId; + + /** + * 所属设备的国标id + */ + private String deviceId; /** * 通道名 @@ -138,20 +148,16 @@ public class DeviceChannel { */ private int subCount; - /** - * 流唯一编号,存在表示正在直播 - */ - private String ssrc; - /** * 是否含有音频 */ private boolean hasAudio; /** - * 是否正在播放 + * 有流则说明正在直播 */ - private boolean play; + private String ssrc; + public void setPTZType(int PTZType) { @@ -175,6 +181,8 @@ public class DeviceChannel { } } + + public String getChannelId() { return channelId; } @@ -183,6 +191,14 @@ public class DeviceChannel { this.channelId = channelId; } + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + public String getName() { return name; } @@ -379,12 +395,12 @@ public class DeviceChannel { this.subCount = subCount; } - public String getSsrc() { - return ssrc; + public int getId() { + return id; } - public void setSsrc(String ssrc) { - this.ssrc = ssrc; + public void setId(int id) { + this.id = id; } public boolean isHasAudio() { @@ -395,11 +411,11 @@ public class DeviceChannel { this.hasAudio = hasAudio; } - public boolean isPlay() { - return play; + public String getSsrc() { + return ssrc; } - public void setPlay(boolean play) { - this.play = play; + public void setSsrc(String ssrc) { + this.ssrc = ssrc; } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Host.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Host.java deleted file mode 100644 index 1b1456042..000000000 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Host.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.genersoft.iot.vmp.gb28181.bean; - - - -public class Host { - - private String ip; - private int port; - private String address; - - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public int getPort() { - return port; - } - - public void setPort(int port) { - this.port = port; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceOffLineDetector.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceOffLineDetector.java index 60998ea35..f076e4b12 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceOffLineDetector.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceOffLineDetector.java @@ -4,7 +4,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.genersoft.iot.vmp.common.VideoManagerConstants; -import com.genersoft.iot.vmp.utils.redis.RedisUtil; /** * @Description:设备离在线状态检测器,用于检测设备状态 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceStatusManager.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceStatusManager.java new file mode 100644 index 000000000..c3d8d3c4f --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceStatusManager.java @@ -0,0 +1,10 @@ +package com.genersoft.iot.vmp.gb28181.event; + +import com.genersoft.iot.vmp.gb28181.bean.Device; +import org.springframework.stereotype.Component; + +@Component +public class DeviceStatusManager { + + private Device +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java index 4adc8fba9..01110db1f 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java @@ -7,8 +7,7 @@ import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; import com.genersoft.iot.vmp.common.VideoManagerConstants; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.utils.redis.RedisUtil; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; /** * @Description: 离线事件监听器,监听到离线后,修改设备离在线状态。 设备离线有两个来源: @@ -23,7 +22,7 @@ public class OfflineEventListener implements ApplicationListener { private final static Logger logger = LoggerFactory.getLogger(OfflineEventListener.class); @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; @Autowired private RedisUtil redis; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java index ec7ff8862..fd6bb07a4 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java @@ -7,8 +7,7 @@ import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; import com.genersoft.iot.vmp.common.VideoManagerConstants; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.utils.redis.RedisUtil; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; /** * @Description: 在线事件监听器,监听到离线后,修改设备离在线状态。 设备在线有两个来源: @@ -23,7 +22,7 @@ public class OnlineEventListener implements ApplicationListener { private final static Logger logger = LoggerFactory.getLogger(OnlineEventListener.class); @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; @Autowired private RedisUtil redis; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java index 73fb474d6..209eae2cc 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java @@ -7,11 +7,9 @@ import javax.sip.header.CSeqHeader; import javax.sip.message.Request; import javax.sip.message.Response; -import com.alibaba.fastjson.JSON; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import com.genersoft.iot.vmp.conf.SipConfig; @@ -34,9 +32,8 @@ import com.genersoft.iot.vmp.gb28181.transmit.response.impl.ByeResponseProcessor import com.genersoft.iot.vmp.gb28181.transmit.response.impl.CancelResponseProcessor; import com.genersoft.iot.vmp.gb28181.transmit.response.impl.InviteResponseProcessor; import com.genersoft.iot.vmp.gb28181.transmit.response.impl.OtherResponseProcessor; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; import com.genersoft.iot.vmp.utils.SpringBeanFactory; -import com.genersoft.iot.vmp.utils.redis.RedisUtil; /** * @Description:TODO(这里用一句话描述这个类的作用) @@ -55,7 +52,7 @@ public class SIPProcessorFactory { private RegisterLogicHandler handler; @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; @Autowired private EventPublisher publisher; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java index 2233ee055..a8e1eae97 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java @@ -18,7 +18,6 @@ import org.springframework.stereotype.Component; import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.bean.Host; /** * @Description:摄像头命令request创造器 TODO 冗余代码太多待优化 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java index 42657a608..9fab4a69c 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java @@ -8,19 +8,17 @@ import javax.sip.ClientTransaction; import javax.sip.Dialog; import javax.sip.InvalidArgumentException; import javax.sip.SipException; -import javax.sip.SipFactory; import javax.sip.SipProvider; import javax.sip.TransactionDoesNotExistException; import javax.sip.address.SipURI; import javax.sip.header.ViaHeader; import javax.sip.message.Request; -import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.MediaServerConfig; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.media.zlm.ZLMUtils; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; @@ -51,7 +49,7 @@ public class SIPCommander implements ISIPCommander { private VideoStreamSessionManager streamSession; @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; @Autowired @Qualifier(value="tcpSipProvider") diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java index 06afc3527..9fa38f165 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java @@ -16,7 +16,6 @@ import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.gb28181.bean.Device; @@ -31,8 +30,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor; import com.genersoft.iot.vmp.gb28181.utils.DateUtil; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.utils.redis.RedisUtil; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; import org.springframework.util.StringUtils; import com.genersoft.iot.vmp.common.StreamInfo; /** @@ -46,7 +44,7 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { private SIPCommander cmder; - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; private EventPublisher publisher; @@ -451,7 +449,7 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { this.cmder = cmder; } - public void setStorager(IVideoManagerStorager storager) { + public void setStorager(VideoManagerStoragerServiceImpl storager) { this.storager = storager; } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java index 276127f25..f93d6b4c0 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java @@ -23,10 +23,9 @@ import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.gb28181.auth.DigestServerAuthenticationHelper; import com.genersoft.iot.vmp.gb28181.auth.RegisterLogicHandler; import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.bean.Host; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; import gov.nist.javax.sip.address.AddressImpl; import gov.nist.javax.sip.address.SipUri; @@ -43,7 +42,7 @@ public class RegisterRequestProcessor extends SIPRequestAbstractProcessor { private RegisterLogicHandler handler; - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; private EventPublisher publisher; @@ -160,7 +159,7 @@ public class RegisterRequestProcessor extends SIPRequestAbstractProcessor { this.handler = handler; } - public void setVideoManagerStorager(IVideoManagerStorager storager) { + public void setVideoManagerStorager(VideoManagerStoragerServiceImpl storager) { this.storager = storager; } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHTTPProxyController.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHTTPProxyController.java index 4b2cabd41..ffc35a233 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHTTPProxyController.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHTTPProxyController.java @@ -1,21 +1,15 @@ package com.genersoft.iot.vmp.media.zlm; -import com.alibaba.fastjson.JSONObject; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpRequest; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.util.Enumeration; @RestController @RequestMapping("/zlm") @@ -25,7 +19,7 @@ public class ZLMHTTPProxyController { private final static Logger logger = LoggerFactory.getLogger(ZLMHTTPProxyController.class); @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; @ResponseBody diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java index 0c450a741..04bf6d5b7 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java @@ -2,15 +2,11 @@ package com.genersoft.iot.vmp.media.zlm; import java.math.BigInteger; import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.MediaServerConfig; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.utils.IpUtil; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -44,7 +40,7 @@ public class ZLMHttpHookListener { private SIPCommander cmder; @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; @Autowired private ZLMRESTfulUtils zlmresTfulUtils; diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java index fc519dae2..bdaf85b80 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java @@ -4,8 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.conf.MediaServerConfig; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import okhttp3.*; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -15,9 +14,6 @@ import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; @@ -28,7 +24,7 @@ public class ZLMRunner implements CommandLineRunner { private final static Logger logger = LoggerFactory.getLogger(ZLMRunner.class); @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; @Value("${media.ip}") private String mediaIp; diff --git a/src/main/java/com/genersoft/iot/vmp/storager/VideoManagerStoragerFactory.java b/src/main/java/com/genersoft/iot/vmp/storager/VideoManagerStoragerFactory.java deleted file mode 100644 index 70bdad761..000000000 --- a/src/main/java/com/genersoft/iot/vmp/storager/VideoManagerStoragerFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.genersoft.iot.vmp.storager; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.stereotype.Component; - -import com.genersoft.iot.vmp.conf.VManagerConfig; - -/** - * @Description:视频设备数据存储工厂,根据存储策略,返回对应的存储器 - * @author: swwheihei - * @date: 2020年5月6日 下午2:15:16 - */ -@Component -public class VideoManagerStoragerFactory { - - @Autowired - private VManagerConfig vmConfig; - - @Autowired - private IVideoManagerStorager jdbcStorager; - - @Autowired - private IVideoManagerStorager redisStorager; - - @Bean("storager") - public IVideoManagerStorager getStorager() { - if ("redis".equals(vmConfig.getDatabase().toLowerCase())) { - return redisStorager; - } else if ("jdbc".equals(vmConfig.getDatabase().toLowerCase())) { - return jdbcStorager; - } - return redisStorager; - } - -} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/VideoManagerStoragerMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/VideoManagerStoragerMapper.java new file mode 100644 index 000000000..43d363849 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/storager/VideoManagerStoragerMapper.java @@ -0,0 +1,199 @@ +package com.genersoft.iot.vmp.storager; + +import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.gb28181.bean.Device; +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; +import com.github.pagehelper.PageInfo; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @Description:视频设备数据存储接口 + * @author: panll + * @date: 2020年11月15日 11:48:03 + */ +@Mapper +@Repository +public interface VideoManagerStoragerMapper { + + + /** + * 根据设备ID判断设备是否存在 + * + * @param deviceId 设备ID + * @return true:存在 false:不存在 + */ + @Select("SELECT count(1) FROM device WHERE deviceId == #{deviceId}") + public int exists(String deviceId); + + /** + * 视频设备创建 + * + * @param device 设备对象 + * @return true:创建成功 false:创建失败 + */ + @Insert("INSERT INTO device (deviceId, name, manufacturer, model, firmware, transport, streamMode, " + + "ip, port, address, online) " + + "VALUES (#{deviceId} , #{name}, #{manufacturer}, #{model}, #{firmware}, #{transport}, " + + "#{streamMode}, #{ip}, #{port}, #{address}, #{online})") + public int addDevice(Device device); + + /** + * 视频设备更新 + * + * @param device 设备对象 + * @return true:创建成功 false:创建失败 + */ + @Update("UPDATE device SET name = #{name}, manufacturer = #{manufacturer}, model = #{model}, " + + "firmware = #{firmware},transport = #{transport}, streamMode = #{streamMode} WHERE deviceId = #{deviceId} ") + public int updateDevice(Device device); + + /** + * 视频设备删除 + * + * @param deviceId 设备id + */ + @Delete("DELETE FROM device WHERE deviceId = #{deviceId} ") + public int deleteDevice(String deviceId); + + /** + * 添加设备通道 + * + * @param channel + * @return + */ + @Insert("INSERT INTO channel (channelId, deviceId, name, manufacturer, model, owner, civilCode, block, " + + "address, parental, parentId, safetyWay, registerWay, certNum, certifiable, errCode, endTime, " + + "secrecy, ipAddress, port, password, PTZType, status, longitude, latitude, subCount, hasAudio) " + + "VALUES (#{channelId} ,#{deviceId} , #{name}, #{manufacturer}, #{model}, #{owner}, #{civilCode},#{block}, " + + "#{address}, #{parental}, #{parentId}, #{safetyWay}, #{registerWay}, #{certNum}, #{certifiable}, #{errCode}" + + ", #{endTime}, #{secrecy}, #{ipAddress}, #{port}, #{password}, #{PTZType}, #{status}, #{longitude}, #{latitude}, " + + "#{hasAudio})") + public int addChannel(DeviceChannel channel); + + + /** + * 获取设备 + * + * @param deviceId 设备ID + * @return DShadow 设备对象 + */ + @Select("SELECT de.*, (SELECT count(1) FROM channel WHERE deviceId == de.deviceId) as channelCount FROM device de WHERE deviceId == #{deviceId}") + public Device queryVideoDevice(String deviceId); + + /** + * 分页获取设备 + * + * @return DShadow 设备对象 + */ + @Select("SELECT de.*, (SELECT count(1) FROM channel WHERE deviceId == de.deviceId) as channelCount FROM device de") + public List queryVideoDevices(); + + + /** + * 获取某个设备的通道列表 + * + * @param deviceId 设备ID + * @return + */ + @Select("") + public List queryChannelsByDeviceId(String deviceId ,String parentChannelId, String query, String online); + + /** + * 获取某个通道 + * @param deviceId 设备ID + * @param channelId 通道ID + */ + @Select("SELECT" + + "ch.*, st.ssrc" + + "FROM" + + "channel ch" + + "WHERE" + + "ch.deviceId == #{deviceId }" + + "AND ch.channelId = #{ channelId }" + + "INNER JOIN streamInfo st ON ch.deviceId == st.deviceId AND ch.channelId == st.channelId ") + public DeviceChannel queryChannel(String deviceId, String channelId); + + + /** + * 更新设备在线/离线 + * + * @param deviceId 设备ID + * @return true:更新成功 false:更新失败 + */ + @Update("UPDATE device SET online = #{online} WHERE deviceId = #{deviceId} ") + public int online(String deviceId, int online); + + + /** + * 清空通道 + * @param deviceId + */ + @Delete("DELETE FROM channel WHERE deviceId = #{deviceId} ") + void cleanChannelsForDevice(String deviceId); + + /** + * 更新通道 + * @param deviceId + */ + @Update("UPDATE device SET name = #{name}," + + " name = #{name} " + + " manufacture = #{manufacture} " + + " model = #{model} " + + " owner = #{owner} " + + " civilCode = #{civilCode} " + + " block = #{block} " + + " address = #{address} " + + " parentId = #{parentId} " + + " safetyWay = #{safetyWay} " + + " registerWay = #{registerWay} " + + " certNum = #{certNum} " + + " certifiable = #{certifiable} " + + " errCode = #{errCode} " + + " endTime = #{endTime} " + + " secrecy = #{secrecy} " + + " ipAddress = #{ipAddress} " + + " port = #{port} " + + " password = #{password} " + + " PTZType = #{PTZType} " + + " status = #{status} " + + " longitude = #{longitude} " + + " latitude = #{latitude} " + + " hasAudio = #{hasAudio} " + + "WHERE deviceId = #{deviceId} and channelId = #{channel.channelId}") + void updateChannel(String deviceId, DeviceChannel channel); + + /** + * 通过ssrc查询流信息 + * @param ssrc 流唯一标识 + * @return + */ + @Select("SELECT * FROM streamInfo WHERE ssrc == #{ssrc}") + StreamInfo queryPlayBySSRC(String ssrc); + + /** + * 通过设备信息和通道信息查询流信息 + * @param deviceId 设备ID + * @param channelId 通道ID + * @return + */ + @Select("SELECT * FROM streamInfo WHERE deviceId == #{deviceId} and channelId = #{channelId}") + StreamInfo queryPlayBydeviceIdAndChannelId(String deviceId, String channelId); + + + @Insert("INSERT INTO streamInfo (ssrc, deviceId, channelId, flv, ws_flv, rtmp, hls, rtsp, tracks )" + + "VALUES (#{ssrc} ,#{deviceId} , #{channelId}, #{flv}, #{ws_flv}, #{rtmp}, #{hls}, #{rtsp} ,#{tracks}) ") + int addStreamInfo(StreamInfo streamInfo); + + @Delete("DELETE FROM streamInfo WHERE ssrc = #{streamInfo.ssrc} ") + int deleteStreamInfo(StreamInfo streamInfo); +} + diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java b/src/main/java/com/genersoft/iot/vmp/storager/VideoManagerStoragerService.java similarity index 67% rename from src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java rename to src/main/java/com/genersoft/iot/vmp/storager/VideoManagerStoragerService.java index fdf4bc33f..29abe40c3 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/VideoManagerStoragerService.java @@ -1,194 +1,187 @@ -package com.genersoft.iot.vmp.storager; - -import java.util.List; -import java.util.Map; - -import com.alibaba.fastjson.JSONObject; -import com.genersoft.iot.vmp.common.PageResult; -import com.genersoft.iot.vmp.common.StreamInfo; -import com.genersoft.iot.vmp.conf.MediaServerConfig; -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; - -/** - * @Description:视频设备数据存储接口 - * @author: swwheihei - * @date: 2020年5月6日 下午2:14:31 - */ -public interface IVideoManagerStorager { - - /** - * 更新流媒体信息 - * @param mediaServerConfig - * @return - */ - public boolean updateMediaInfo(MediaServerConfig mediaServerConfig); - - /** - * 获取流媒体信息 - * @return - */ - public MediaServerConfig getMediaInfo(); - - /** - * 根据设备ID判断设备是否存在 - * - * @param deviceId 设备ID - * @return true:存在 false:不存在 - */ - public boolean exists(String deviceId); - - /** - * 视频设备创建 - * - * @param device 设备对象 - * @return true:创建成功 false:创建失败 - */ - public boolean create(Device device); - - /** - * 视频设备更新 - * - * @param device 设备对象 - * @return true:创建成功 false:创建失败 - */ - public boolean updateDevice(Device device); - - /** - * 添加设备通道 - * - * @param deviceId 设备id - * @param channel 通道 - */ - public void updateChannel(String deviceId, DeviceChannel channel); - - /** - * 获取设备 - * - * @param deviceId 设备ID - * @return DShadow 设备对象 - */ - public Device queryVideoDevice(String deviceId); - - /** - * 获取某个设备的通道列表 - * - * @param deviceId 设备ID - * @param page 分页 当前页 - * @param count 每页数量 - * @return - */ - public PageResult queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, String online, int page, int count); - - /** - * 获取某个设备的通道列表 - * - * @param deviceId 设备ID - * @return - */ - public List queryChannelsByDeviceId(String deviceId); - /** - * 获取某个设备的通道 - * @param deviceId 设备ID - * @param channelId 通道ID - */ - public DeviceChannel queryChannel(String deviceId, String channelId); - - /** - * 获取多个设备 - * - * @param deviceIds 设备ID数组 - * @return List 设备对象数组 - */ - public PageResult queryVideoDeviceList(String[] deviceIds, int page, int count); - - /** - * 获取多个设备 - * - * @param deviceIds 设备ID数组 - * @return List 设备对象数组 - */ - public List queryVideoDeviceList(String[] deviceIds); - - /** - * 删除设备 - * - * @param deviceId 设备ID - * @return true:删除成功 false:删除失败 - */ - public boolean delete(String deviceId); - - /** - * 更新设备在线 - * - * @param deviceId 设备ID - * @return true:更新成功 false:更新失败 - */ - public boolean online(String deviceId); - - /** - * 更新设备离线 - * - * @param deviceId 设备ID - * @return true:更新成功 false:更新失败 - */ - public boolean outline(String deviceId); - - /** - * 开始播放时将流存入 - * - * @param stream 流信息 - * @return - */ - public boolean startPlay(StreamInfo stream); - - /** - * 停止播放时删除 - * - * @return - */ - public boolean stopPlay(StreamInfo streamInfo); - - /** - * 查找视频流 - * - * @return - */ - public StreamInfo queryPlay(StreamInfo streamInfo); - - /** - * 查询子设备 - * - * @param deviceId - * @param channelId - * @param page - * @param count - * @return - */ - PageResult querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, String online, int page, int count); - - /** - * 更新缓存 - */ - public void updateCatch(); - - /** - * 清空通道 - * @param deviceId - */ - void cleanChannelsForDevice(String deviceId); - - StreamInfo queryPlayBySSRC(String ssrc); - - StreamInfo queryPlayByDevice(String deviceId, String code); - - Map queryPlayByDeviceId(String deviceId); - - boolean startPlayback(StreamInfo streamInfo); - - boolean stopPlayback(StreamInfo streamInfo); - - StreamInfo queryPlaybackByDevice(String deviceId, String channelId); - - StreamInfo queryPlaybackBySSRC(String ssrc); -} +package com.genersoft.iot.vmp.storager; + +import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.conf.MediaServerConfig; +import com.genersoft.iot.vmp.gb28181.bean.Device; +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; +import com.github.pagehelper.PageInfo; + +import java.util.List; +import java.util.Map; + +/** + * @Description:视频设备数据存储接口 + * @author: panll + * @date: 2020年11月15日 11:48:03 + */ +public interface VideoManagerStoragerService { + + /** + * 更新流媒体信息 + * + * @param mediaServerConfig + * @return + */ + public boolean updateMediaInfo(MediaServerConfig mediaServerConfig); + + /** + * 获取流媒体信息 + * @return + */ + public MediaServerConfig getMediaInfo(); + + + /** + * 根据设备ID判断设备是否存在 + * + * @param deviceId 设备ID + * @return true:存在 false:不存在 + */ + public boolean exists(String deviceId); + + /** + * 视频设备创建 + * + * @param device 设备对象 + * @return true:创建成功 false:创建失败 + */ + public boolean create(Device device); + + /** + * 视频设备更新 + * + * @param device 设备对象 + * @return true:创建成功 false:创建失败 + */ + public boolean updateDevice(Device device); + + /** + * 添加设备通道 + * + * @param deviceId 设备id + * @param channel 通道 + */ + public void updateChannel(String deviceId, DeviceChannel channel); + + /** + * 获取设备 + * + * @param deviceId 设备ID + * @return DShadow 设备对象 + */ + public Device queryVideoDevice(String deviceId); + + /** + * 获取某个设备的通道列表 + * + * @param deviceId + * @param parentChannelId + * @param query + * @param online + * @param page + * @param count + * @return + */ + public PageInfo queryChannelsByDeviceId(String deviceId, String parentChannelId, String query, String online, int page, int count); + + + /** + * 查询设备下的所有通道 + * @param deviceId + * @param parentChannelId + * @param query + * @param online + * @return + */ + public List queryChannelAllByDeviceId(String deviceId, String parentChannelId, String query, String online); + + + /** + * 获取某个的通道 + * + * @param deviceId 设备ID + * @param channelId 通道ID + */ + public DeviceChannel queryChannel(String deviceId, String channelId); + + /** + * 获取多个设备 + * + * @return List 设备对象数组 + */ + public PageInfo queryVideoDeviceList( int page, int count); + + /** + * 获取多个设备 + * + * @return List 设备对象数组 + */ + public List queryVideoDeviceList(); + + /** + * 删除设备 + * + * @param deviceId 设备ID + * @return true:删除成功 false:删除失败 + */ + public boolean delete(String deviceId); + + /** + * 更新设备在线 + * + * @param deviceId 设备ID + * @return true:更新成功 false:更新失败 + */ + public boolean online(String deviceId); + + /** + * 更新设备离线 + * + * @param deviceId 设备ID + * @return true:更新成功 false:更新失败 + */ + public boolean outline(String deviceId); + + /** + * 开始播放时将流存入 + * + * @param stream 流信息 + * @return + */ + public boolean startPlay(StreamInfo stream); + + /** + * 停止播放时删除 + * + * @return + */ + public boolean stopPlay(StreamInfo streamInfo); + + /** + * 查找视频流 + * + * @return + */ + public StreamInfo queryPlay(StreamInfo streamInfo); + + /** + * 清空通道 + * + * @param deviceId + */ + void cleanChannelsForDevice(String deviceId); + + StreamInfo queryPlayBySSRC(String ssrc); + + StreamInfo queryPlayByDevice(String deviceId, String code); + + Map queryPlayByDeviceId(String deviceId); + + boolean startPlayback(StreamInfo streamInfo); + + boolean stopPlayback(StreamInfo streamInfo); + + StreamInfo queryPlaybackByDevice(String deviceId, String channelId); + + StreamInfo queryPlaybackBySSRC(String ssrc); +} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/VideoManagerStoragerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/VideoManagerStoragerServiceImpl.java new file mode 100644 index 000000000..7aa277ea8 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/storager/VideoManagerStoragerServiceImpl.java @@ -0,0 +1,179 @@ +package com.genersoft.iot.vmp.storager; + +import java.util.List; +import java.util.Map; + +import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.conf.MediaServerConfig; +import com.genersoft.iot.vmp.gb28181.bean.Device; +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @Description:视频设备数据存储接口 + * @author: panll + * @date: 2020年11月15日 11:48:03 + */ +@Service +public class VideoManagerStoragerServiceImpl implements VideoManagerStoragerService{ + + @Autowired + private VideoManagerStoragerMapper storageMapper; + + private MediaServerConfig mediaServerConfig; + + @Override + public boolean updateMediaInfo(MediaServerConfig mediaServerConfig) { + if (mediaServerConfig != null) { + this.mediaServerConfig = mediaServerConfig; + return true; + }else { + return false; + } + } + + @Override + public MediaServerConfig getMediaInfo() { + return mediaServerConfig; + } + + @Override + public boolean exists(String deviceId) { + return storageMapper.queryVideoDevice(deviceId) != null; + } + + @Override + public boolean create(Device device) { + return storageMapper.addDevice(device) > 0; + } + + @Override + public boolean updateDevice(Device device) { + return storageMapper.updateDevice(device) > 0; + } + + @Override + public void updateChannel(String deviceId, DeviceChannel channel) { + if (storageMapper.queryChannel(deviceId, channel.getChannelId()) != null) { + storageMapper.updateChannel(deviceId, channel); + }else { + channel.setDeviceId(deviceId); + storageMapper.addChannel(channel); + } + + } + + @Override + public Device queryVideoDevice(String deviceId) { + return storageMapper.queryVideoDevice(deviceId); + } + + @Override + public PageInfo queryChannelsByDeviceId(String deviceId, String parentChannelId, String query, String online, int page, int count) { + PageHelper.startPage(page,count); + return new PageInfo<>(storageMapper.queryChannelsByDeviceId(deviceId, parentChannelId, query, online)); + } + + @Override + public List queryChannelAllByDeviceId(String deviceId, String parentChannelId, String query, String online) { + return storageMapper.queryChannelsByDeviceId(deviceId, parentChannelId, query, online); + } + + + @Override + public DeviceChannel queryChannel(String deviceId, String channelId) { + return storageMapper.queryChannel(deviceId, channelId); + } + + @Override + public PageInfo queryVideoDeviceList(int page, int count) { + + PageHelper.startPage(page,count); + PageInfo pageInfo = new PageInfo<>(storageMapper.queryVideoDevices()); + return pageInfo; + } + + @Override + public List queryVideoDeviceList() { + return storageMapper.queryVideoDevices(); + } + + @Override + public boolean delete(String deviceId) { + return storageMapper.deleteDevice(deviceId) > 0; + } + + @Override + public boolean online(String deviceId) { + return storageMapper.online(deviceId, 1) > 0; + } + + @Override + public boolean outline(String deviceId) { + return storageMapper.online(deviceId, 0) > 0; + } + + @Override + public boolean startPlay(StreamInfo streamInfo) { + return storageMapper.addStreamInfo(streamInfo) > 0; + } + + @Override + public boolean stopPlay(StreamInfo streamInfo) { + return storageMapper.deleteStreamInfo(streamInfo) > 0; + } + + @Override + public StreamInfo queryPlay(StreamInfo streamInfo) { + StreamInfo result = null; + if (streamInfo.getSsrc() != null) { + result = storageMapper.queryPlayBySSRC(streamInfo.getSsrc()); + }else { + result = storageMapper.queryPlayBydeviceIdAndChannelId(streamInfo.getDeviceId(), streamInfo.getChannelId()); + } + return result; + } + + @Override + public void cleanChannelsForDevice(String deviceId) { + + } + + @Override + public StreamInfo queryPlayBySSRC(String ssrc) { + return null; + } + + @Override + public StreamInfo queryPlayByDevice(String deviceId, String code) { + return null; + } + + @Override + public Map queryPlayByDeviceId(String deviceId) { + return null; + } + + @Override + public boolean startPlayback(StreamInfo streamInfo) { + return false; + } + + @Override + public boolean stopPlayback(StreamInfo streamInfo) { + return false; + } + + @Override + public StreamInfo queryPlaybackByDevice(String deviceId, String channelId) { + return null; + } + + @Override + public StreamInfo queryPlaybackBySSRC(String ssrc) { + return null; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/VodeoMannagerTask.java b/src/main/java/com/genersoft/iot/vmp/storager/VodeoMannagerTask.java deleted file mode 100644 index c96e4bb0a..000000000 --- a/src/main/java/com/genersoft/iot/vmp/storager/VodeoMannagerTask.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.genersoft.iot.vmp.storager; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.stereotype.Component; - -@Component -public class VodeoMannagerTask implements CommandLineRunner { - - @Autowired - private IVideoManagerStorager storager; - - @Override - public void run(String... strings) throws Exception { - storager.updateCatch(); - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java deleted file mode 100644 index 75b9c929f..000000000 --- a/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.genersoft.iot.vmp.storager.jdbc; - -import java.util.List; -import java.util.Map; - -import com.genersoft.iot.vmp.common.PageResult; -import com.genersoft.iot.vmp.common.StreamInfo; -import com.genersoft.iot.vmp.conf.MediaServerConfig; -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; - -import com.genersoft.iot.vmp.common.VideoManagerConstants; -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; - -/** - * @Description:视频设备数据存储-jdbc实现 - * @author: swwheihei - * @date: 2020年5月6日 下午2:28:12 - */ -@Component("jdbcStorager") -public class VideoManagerJdbcStoragerImpl implements IVideoManagerStorager { - - @Override - public boolean updateMediaInfo(MediaServerConfig mediaServerConfig) { - return false; - } - - @Override - public MediaServerConfig getMediaInfo() { - return null; - } - - /** - * 根据设备ID判断设备是否存在 - * - * @param deviceId 设备ID - * @return true:存在 false:不存在 - */ - @Override - public boolean exists(String deviceId) { - // TODO Auto-generated method stub - return false; - } - - /** - * 视频设备创建 - * - * @param device 设备对象 - * @return true:创建成功 false:创建失败 - */ - @Override - public boolean create(Device device) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean updateDevice(Device device) { - return false; - } - - @Override - public void updateChannel(String deviceId, DeviceChannel channel) { - - } - - - /** - * 获取设备 - * - * @param deviceId 设备ID - * @return Device 设备对象 - */ - @Override - public Device queryVideoDevice(String deviceId) { - // TODO Auto-generated method stub - return null; - } - - @Override - public PageResult queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, String online, int page, int count) { - return null; - } - - - @Override - public List queryChannelsByDeviceId(String deviceId) { - return null; - } - - @Override - public DeviceChannel queryChannel(String deviceId, String channelId) { - return null; - } - - @Override - public PageResult queryVideoDeviceList(String[] deviceIds, int page, int count) { - return null; - } - - /** - * 获取多个设备 - * - * @param deviceIds 设备ID数组 - * @return List 设备对象数组 - */ - @Override - public List queryVideoDeviceList(String[] deviceIds) { - // TODO Auto-generated method stub - return null; - } - - /** - * 删除设备 - * - * @param deviceId 设备ID - * @return true:删除成功 false:删除失败 - */ - @Override - public boolean delete(String deviceId) { - // TODO Auto-generated method stub - return false; - } - - /** - * 更新设备在线 - * - * @param deviceId 设备ID - * @return true:更新成功 false:更新失败 - */ - @Override - public boolean online(String deviceId) { - // TODO Auto-generated method stub - return false; - } - - /** - * 更新设备离线 - * - * @param deviceId 设备ID - * @return true:更新成功 false:更新失败 - */ - @Override - public boolean outline(String deviceId) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean stopPlay(StreamInfo streamInfo) { - return false; - } - - @Override - public StreamInfo queryPlay(StreamInfo streamInfo) { - return null; - } - - @Override - public PageResult querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, String online, int page, int count) { - return null; - } - - @Override - public void updateCatch() { - System.out.println("##################"); - } - - @Override - public void cleanChannelsForDevice(String deviceId) { - - } - - @Override - public boolean startPlay(StreamInfo stream) { - return false; - } - - @Override - public StreamInfo queryPlayBySSRC(String ssrc) { - return null; - } - - @Override - public StreamInfo queryPlayByDevice(String deviceId, String code) { - return null; - } - - @Override - public Map queryPlayByDeviceId(String deviceId) { - - return null; - } - - @Override - public boolean startPlayback(StreamInfo streamInfo) { - return false; - } - - @Override - public boolean stopPlayback(StreamInfo streamInfo) { - return false; - } - - @Override - public StreamInfo queryPlaybackByDevice(String deviceId, String channelId) { - return null; - } - - @Override - public StreamInfo queryPlaybackBySSRC(String ssrc) { - return null; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java deleted file mode 100644 index b013c6067..000000000 --- a/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java +++ /dev/null @@ -1,560 +0,0 @@ -package com.genersoft.iot.vmp.storager.redis; - -import java.util.*; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.genersoft.iot.vmp.common.PageResult; -import com.genersoft.iot.vmp.common.StreamInfo; -import com.genersoft.iot.vmp.conf.MediaServerConfig; -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.genersoft.iot.vmp.common.VideoManagerConstants; -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.utils.redis.RedisUtil; -import org.springframework.util.StringUtils; - -/** - * @Description:视频设备数据存储-redis实现 - * @author: swwheihei - * @date: 2020年5月6日 下午2:31:42 - */ -@Component("redisStorager") -public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager { - - @Autowired - private RedisUtil redis; - - private HashMap>> deviceMap = new HashMap<>(); - - - /** - * 根据设备ID判断设备是否存在 - * - * @param deviceId 设备ID - * @return true:存在 false:不存在 - */ - @Override - public boolean exists(String deviceId) { - return redis.hasKey(VideoManagerConstants.DEVICE_PREFIX+deviceId); - } - - /** - * 视频设备创建 - * - * @param device 设备对象 - * @return true:创建成功 false:创建失败 - */ - @Override - public boolean create(Device device) { - return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device); - } - - - - /** - * 视频设备更新 - * - * @param device 设备对象 - * @return true:更新成功 false:更新失败 - */ - @Override - public boolean updateDevice(Device device) { - if (deviceMap.get(device.getDeviceId()) == null) { - deviceMap.put(device.getDeviceId(), new HashMap>()); - } - // 更新device中的通道数量 - device.setChannelCount(deviceMap.get(device.getDeviceId()).size()); - // 存储device - return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device); - - - } - - @Override - public void updateChannel(String deviceId, DeviceChannel channel) { - String channelId = channel.getChannelId(); - HashMap> channelMap = deviceMap.get(deviceId); - if (channelMap == null) return; - // 作为父设备, 确定自己的子节点数 - if (channelMap.get(channelId) == null) { - channelMap.put(channelId, new HashSet()); - }else if (channelMap.get(channelId).size() > 0) { - channel.setSubCount(channelMap.get(channelId).size()); - } - - // 存储通道 - redis.set(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + - "_" + channel.getChannelId() + - "_" + (channel.getStatus() == 1 ? "on":"off") + - "_" + (channelMap.get(channelId).size() > 0)+ - "_" + (StringUtils.isEmpty(channel.getParentId())?null:channel.getParentId()), - channel); - // 更新device中的通道数量 - Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId); - device.setChannelCount(deviceMap.get(deviceId).size()); - redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device); - - - // 如果有父设备,更新父设备内子节点数 - String parentId = channel.getParentId(); - if (!StringUtils.isEmpty(parentId) && !parentId.equals(deviceId)) { - - if (channelMap.get(parentId) == null) { - channelMap.put(parentId, new HashSet()); - } - channelMap.get(parentId).add(channelId); - - DeviceChannel deviceChannel = queryChannel(deviceId, parentId); - if (deviceChannel != null) { - deviceChannel.setSubCount(channelMap.get(parentId).size()); - redis.set(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + - "_" + deviceChannel.getChannelId() + - "_" + (deviceChannel.getStatus() == 1 ? "on":"off") + - "_" + (channelMap.get(deviceChannel.getChannelId()).size() > 0)+ - "_" + (StringUtils.isEmpty(deviceChannel.getParentId())?null:deviceChannel.getParentId()), - deviceChannel); - - } - } - - } - - /** - * 获取设备 - * - * @param deviceId 设备ID - * @return Device 设备对象 - */ - @Override - public Device queryVideoDevice(String deviceId) { - return (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId); - } - - @Override - public PageResult queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, String online, int page, int count) { - // 获取到所有正在播放的流 - Map stringStreamInfoMap = queryPlayByDeviceId(deviceId); - List result = new ArrayList<>(); - PageResult pageResult = new PageResult(); - String queryContent = "*"; - if (!StringUtils.isEmpty(query)) queryContent = String.format("*%S*",query); - String queryHasSubChannel = "*"; - if (hasSubChannel != null) queryHasSubChannel = hasSubChannel?"true":"false"; - String queryOnline = "*"; - if (!StringUtils.isEmpty(online)) queryOnline = online; - String queryStr = VideoManagerConstants.CACHEKEY_PREFIX + deviceId + - "_" + queryContent + // 搜索编号和名称 - "_" + queryOnline + // 搜索是否在线 - "_" + queryHasSubChannel + // 搜索是否含有子节点 - "_" + "*"; -// List deviceChannelList = redis.keys(queryStr); - List deviceChannelList = redis.scan(queryStr); - //对查询结果排序,避免出现通道排列顺序乱序的情况 - Collections.sort(deviceChannelList,new Comparator(){ - @Override - public int compare(Object o1, Object o2) { - return o1.toString().compareToIgnoreCase(o2.toString()); - } - }); - pageResult.setPage(page); - pageResult.setCount(count); - pageResult.setTotal(deviceChannelList.size()); - int maxCount = (page + 1 ) * count; - if (deviceChannelList != null && deviceChannelList.size() > 0 ) { - for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) { - DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i)); - StreamInfo streamInfo = stringStreamInfoMap.get(deviceId + "_" + deviceChannel.getChannelId()); - deviceChannel.setPlay(streamInfo != null); - if (streamInfo != null) deviceChannel.setSsrc(streamInfo.getSsrc()); - result.add(deviceChannel); - } - pageResult.setData(result); - } - - return pageResult; - } - - - - @Override - public List queryChannelsByDeviceId(String deviceId) { - List result = new ArrayList<>(); -// List deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*"); - List deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*"); - - if (deviceChannelList != null && deviceChannelList.size() > 0 ) { - for (int i = 0; i < deviceChannelList.size(); i++) { - result.add((DeviceChannel)redis.get((String) deviceChannelList.get(i))); - } - } - return result; - } - - @Override - public PageResult querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, String online, int page, int count) { - List allDeviceChannels = new ArrayList<>(); - String queryContent = "*"; - if (!StringUtils.isEmpty(query)) queryContent = String.format("*%S*",query); - String queryHasSubChannel = "*"; - if (hasSubChannel != null) queryHasSubChannel = hasSubChannel?"true":"false"; - String queryOnline = "*"; - if (!StringUtils.isEmpty(online)) queryOnline = online; - String queryStr = VideoManagerConstants.CACHEKEY_PREFIX + deviceId + - "_" + queryContent + // 搜索编号和名称 - "_" + queryOnline + // 搜索是否在线 - "_" + queryHasSubChannel + // 搜索是否含有子节点 - "_" + parentChannelId; - -// List deviceChannelList = redis.keys(queryStr); - List deviceChannelList = redis.scan(queryStr); - - if (deviceChannelList != null && deviceChannelList.size() > 0 ) { - for (int i = 0; i < deviceChannelList.size(); i++) { - DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i)); - if (deviceChannel.getParentId() != null && deviceChannel.getParentId().equals(parentChannelId)) { - allDeviceChannels.add(deviceChannel); - } - } - } - int maxCount = (page + 1 ) * count; - PageResult pageResult = new PageResult(); - pageResult.setPage(page); - pageResult.setCount(count); - pageResult.setTotal(allDeviceChannels.size()); - - if (allDeviceChannels.size() > 0) { - pageResult.setData(allDeviceChannels.subList( - page * count, pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() - )); - } - return pageResult; - } - - public List querySubChannels(String deviceId, String parentChannelId) { - List allDeviceChannels = new ArrayList<>(); -// List deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*"); - List deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*"); - - if (deviceChannelList != null && deviceChannelList.size() > 0 ) { - for (int i = 0; i < deviceChannelList.size(); i++) { - DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i)); - if (deviceChannel.getParentId() != null && deviceChannel.getParentId().equals(parentChannelId)) { - allDeviceChannels.add(deviceChannel); - } - } - } - - return allDeviceChannels; - } - - @Override - public DeviceChannel queryChannel(String deviceId, String channelId) { - DeviceChannel deviceChannel = null; -// List deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + - List deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + - "_" + channelId + "*"); - if (deviceChannelList != null && deviceChannelList.size() > 0 ) { - deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(0)); - } - return deviceChannel; - } - - - /** - * 获取多个设备 - * - * @param deviceIds 设备ID数组 - * @return List 设备对象数组 - */ - @Override - public PageResult queryVideoDeviceList(String[] deviceIds, int page, int count) { - List devices = new ArrayList<>(); - PageResult pageResult = new PageResult(); - pageResult.setPage(page); - pageResult.setCount(count); - Device device = null; - - if (deviceIds == null || deviceIds.length == 0) { - -// List deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*"); - List deviceIdList = redis.scan(VideoManagerConstants.DEVICE_PREFIX+"*"); - pageResult.setTotal(deviceIdList.size()); - int maxCount = (page + 1)* count; - for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) { - // devices.add((Device)redis.get((String)deviceIdList.get(i))); - device =(Device)redis.get((String)deviceIdList.get(i)); - if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){ - // outline(device.getDeviceId()); - } - devices.add(device); - } - } else { - for (int i = 0; i < deviceIds.length; i++) { - // devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i])); - device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]); - if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){ - // outline(device.getDeviceId()); - } - devices.add(device); - } - } - pageResult.setData(devices); - return pageResult; - } - - /** - * 获取多个设备 - * - * @param deviceIds 设备ID数组 - * @return List 设备对象数组 - */ - @Override - public List queryVideoDeviceList(String[] deviceIds) { - List devices = new ArrayList<>(); - Device device = null; - - if (deviceIds == null || deviceIds.length == 0) { -// List deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*"); - List deviceIdList = redis.scan(VideoManagerConstants.DEVICE_PREFIX+"*"); - for (int i = 0; i < deviceIdList.size(); i++) { - device =(Device)redis.get((String)deviceIdList.get(i)); - if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){ - outline(device.getDeviceId()); - } - devices.add(device); - } - } else { - for (int i = 0; i < deviceIds.length; i++) { - device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]); - if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){ - outline(device.getDeviceId()); - } - devices.add(device); - } - } - return devices; - } - - /** - * 删除设备 - * - * @param deviceId 设备ID - * @return true:删除成功 false:删除失败 - */ - @Override - public boolean delete(String deviceId) { - return redis.del(VideoManagerConstants.DEVICE_PREFIX+deviceId); - } - - /** - * 更新设备在线 - * - * @param deviceId 设备ID - * @return true:更新成功 false:更新失败 - */ - @Override - public boolean online(String deviceId) { - Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId); - device.setOnline(1); - return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device); - } - - /** - * 更新设备离线 - * - * @param deviceId 设备ID - * @return true:更新成功 false:更新失败 - */ - @Override - public boolean outline(String deviceId) { - Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId); - if (device == null) return false; - device.setOnline(0); - return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device); - } - - /** - * 开始播放时将流存入redis - * - * @return - */ - @Override - public boolean startPlay(StreamInfo stream) { - return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, stream.getSsrc(),stream.getDeviceID(), stream.getCahnnelId()), - stream); - } - - /** - * 停止播放时从redis删除 - * - * @return - */ - @Override - public boolean stopPlay(StreamInfo streamInfo) { - if (streamInfo == null) return false; - DeviceChannel deviceChannel = queryChannel(streamInfo.getDeviceID(), streamInfo.getCahnnelId()); - if (deviceChannel != null) { - deviceChannel.setSsrc(null); - deviceChannel.setPlay(false); - updateChannel(streamInfo.getDeviceID(), deviceChannel); - } - return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, - streamInfo.getSsrc(), - streamInfo.getDeviceID(), - streamInfo.getCahnnelId())); - } - - /** - * 查询播放列表 - * @return - */ - @Override - public StreamInfo queryPlay(StreamInfo streamInfo) { - return (StreamInfo)redis.get(String.format("%S_%s_%s_%s", - VideoManagerConstants.PLAYER_PREFIX, - streamInfo.getSsrc(), - streamInfo.getDeviceID(), - streamInfo.getCahnnelId())); - } - @Override - public StreamInfo queryPlayBySSRC(String ssrc) { -// List playLeys = redis.keys(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, ssrc)); - List playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, ssrc)); - if (playLeys == null || playLeys.size() == 0) return null; - return (StreamInfo)redis.get(playLeys.get(0).toString()); - } - - @Override - public StreamInfo queryPlaybackBySSRC(String ssrc) { -// List playLeys = redis.keys(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, ssrc)); - List playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAY_BLACK_PREFIX, ssrc)); - if (playLeys == null || playLeys.size() == 0) return null; - return (StreamInfo)redis.get(playLeys.get(0).toString()); - } - - @Override - public StreamInfo queryPlayByDevice(String deviceId, String code) { -// List playLeys = redis.keys(String.format("%S_*_%s_%s", VideoManagerConstants.PLAYER_PREFIX, - List playLeys = redis.scan(String.format("%S_*_%s_%s", VideoManagerConstants.PLAYER_PREFIX, - deviceId, - code)); - if (playLeys == null || playLeys.size() == 0) return null; - return (StreamInfo)redis.get(playLeys.get(0).toString()); - } - - /** - * 更新流媒体信息 - * @param mediaServerConfig - * @return - */ - @Override - public boolean updateMediaInfo(MediaServerConfig mediaServerConfig) { - return redis.set(VideoManagerConstants.MEDIA_SERVER_PREFIX,mediaServerConfig); - } - - /** - * 获取流媒体信息 - * @return - */ - @Override - public MediaServerConfig getMediaInfo() { - return (MediaServerConfig)redis.get(VideoManagerConstants.MEDIA_SERVER_PREFIX); - } - - @Override - public void updateCatch() { - deviceMap = new HashMap<>(); - // 更新设备 - List devices = queryVideoDeviceList(null); - if (devices == null && devices.size() == 0) return; - for (Device device : devices) { - // 更新设备下的通道 - HashMap> channelMap = new HashMap>(); - List deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + - device.getDeviceId() + "_" + "*"); - if (deviceChannelList != null && deviceChannelList.size() > 0 ) { - for (int i = 0; i < deviceChannelList.size(); i++) { - String key = (String)deviceChannelList.get(i); - String[] s = key.split("_"); - String channelId = s[3]; - HashSet subChannel = channelMap.get(channelId); - if (subChannel == null) { - subChannel = new HashSet<>(); - } - System.out.println(key); - if (s.length == 6 && !"null".equals(s[5])) { - subChannel.add(s[5]); - } - channelMap.put(channelId, subChannel); - } - } - deviceMap.put(device.getDeviceId(),channelMap); - } - System.out.println(); - } - - @Override - public void cleanChannelsForDevice(String deviceId) { - List result = new ArrayList<>(); -// List deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*"); - List deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*"); - if (deviceChannelList != null && deviceChannelList.size() > 0 ) { - for (int i = 0; i < deviceChannelList.size(); i++) { - redis.del((String)deviceChannelList.get(i)); - } - } - } - - @Override - public Map queryPlayByDeviceId(String deviceId) { - Map streamInfos = new HashMap<>(); -// List playLeys = redis.keys(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId)); - List playLeys = redis.scan(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId)); - if (playLeys.size() == 0) return streamInfos; - for (int i = 0; i < playLeys.size(); i++) { - String key = (String) playLeys.get(i); - StreamInfo streamInfo = (StreamInfo)redis.get(key); - streamInfos.put(streamInfo.getDeviceID() + "_" + streamInfo.getCahnnelId(), streamInfo); - } - return streamInfos; - } - - - @Override - public boolean startPlayback(StreamInfo stream) { - return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, stream.getSsrc(),stream.getDeviceID(), stream.getCahnnelId()), - stream); - } - - - @Override - public boolean stopPlayback(StreamInfo streamInfo) { - if (streamInfo == null) return false; - DeviceChannel deviceChannel = queryChannel(streamInfo.getDeviceID(), streamInfo.getCahnnelId()); - if (deviceChannel != null) { - deviceChannel.setSsrc(null); - deviceChannel.setPlay(false); - updateChannel(streamInfo.getDeviceID(), deviceChannel); - } - return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, - streamInfo.getSsrc(), - streamInfo.getDeviceID(), - streamInfo.getCahnnelId())); - } - - @Override - public StreamInfo queryPlaybackByDevice(String deviceId, String code) { - String format = String.format("%S_*_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, - deviceId, - code); - List playLeys = redis.scan(String.format("%S_*_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, - deviceId, - code)); - if (playLeys == null || playLeys.size() == 0) return null; - return (StreamInfo)redis.get(playLeys.get(0).toString()); - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/redis/FastJsonRedisSerializer.java b/src/main/java/com/genersoft/iot/vmp/utils/redis/FastJsonRedisSerializer.java deleted file mode 100644 index 411f96228..000000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/redis/FastJsonRedisSerializer.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.genersoft.iot.vmp.utils.redis; - -import java.nio.charset.Charset; - -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.SerializationException; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.serializer.SerializerFeature; - -/** - * @Description:使用fastjson实现redis的序列化 - * @author: swwheihei - * @date: 2020年5月6日 下午8:40:11 - */ -public class FastJsonRedisSerializer implements RedisSerializer { - - public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); - - private Class clazz; - - public FastJsonRedisSerializer(Class clazz) { - super(); - this.clazz = clazz; - } - - @Override - public byte[] serialize(T t) throws SerializationException { - if (t == null) { - return new byte[0]; - } - return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); - } - - @Override - public T deserialize(byte[] bytes) throws SerializationException { - if (bytes == null || bytes.length <= 0) { - return null; - } - String str = new String(bytes, DEFAULT_CHARSET); - return (T) JSON.parseObject(str, clazz); - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java b/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java deleted file mode 100644 index e0f7e417f..000000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java +++ /dev/null @@ -1,733 +0,0 @@ -package com.genersoft.iot.vmp.utils.redis; - -import java.util.*; -import java.util.concurrent.TimeUnit; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.DataAccessException; -import org.springframework.data.redis.connection.RedisConnection; -import org.springframework.data.redis.core.*; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; - -/** - * @Description:Redis工具类 - * @author: swwheihei - * @date: 2020年5月6日 下午8:27:29 - */ -@Component -public class RedisUtil { - - @Autowired - private RedisTemplate redisTemplate; - - /** - * 指定缓存失效时间 - * @param key 键 - * @param time 时间(秒) - * @return true / false - */ - public boolean expire(String key, long time) { - try { - if (time > 0) { - redisTemplate.expire(key, time, TimeUnit.SECONDS); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 根据 key 获取过期时间 - * @param key 键 - * @return - */ - public long getExpire(String key) { - return redisTemplate.getExpire(key, TimeUnit.SECONDS); - } - - /** - * 判断 key 是否存在 - * @param key 键 - * @return true / false - */ - public boolean hasKey(String key) { - try { - return redisTemplate.hasKey(key); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 删除缓存 - * @SuppressWarnings("unchecked") 忽略类型转换警告 - * @param key 键(一个或者多个) - */ - public boolean del(String... key) { - try { - if (key != null && key.length > 0) { - if (key.length == 1) { - redisTemplate.delete(key[0]); - } else { -// 传入一个 Collection 集合 - redisTemplate.delete(CollectionUtils.arrayToList(key)); - } - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - -// ============================== String ============================== - - /** - * 普通缓存获取 - * @param key 键 - * @return 值 - */ - public Object get(String key) { - return key == null ? null : redisTemplate.opsForValue().get(key); - } - - /** - * 普通缓存放入 - * @param key 键 - * @param value 值 - * @return true / false - */ - public boolean set(String key, Object value) { - try { - redisTemplate.opsForValue().set(key, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 普通缓存放入并设置时间 - * @param key 键 - * @param value 值 - * @param time 时间(秒),如果 time < 0 则设置无限时间 - * @return true / false - */ - public boolean set(String key, Object value, long time) { - try { - if (time > 0) { - redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); - } else { - set(key, value); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 递增 - * @param key 键 - * @param delta 递增大小 - * @return - */ - public long incr(String key, long delta) { - if (delta < 0) { - throw new RuntimeException("递增因子必须大于 0"); - } - return redisTemplate.opsForValue().increment(key, delta); - } - - /** - * 递减 - * @param key 键 - * @param delta 递减大小 - * @return - */ - public long decr(String key, long delta) { - if (delta < 0) { - throw new RuntimeException("递减因子必须大于 0"); - } - return redisTemplate.opsForValue().increment(key, delta); - } - -// ============================== Map ============================== - - /** - * HashGet - * @param key 键(no null) - * @param item 项(no null) - * @return 值 - */ - public Object hget(String key, String item) { - return redisTemplate.opsForHash().get(key, item); - } - - /** - * 获取 key 对应的 map - * @param key 键(no null) - * @return 对应的多个键值 - */ - public Map hmget(String key) { - return redisTemplate.opsForHash().entries(key); - } - - /** - * HashSet - * @param key 键 - * @param map 值 - * @return true / false - */ - public boolean hmset(String key, Map map) { - try { - redisTemplate.opsForHash().putAll(key, map); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * HashSet 并设置时间 - * @param key 键 - * @param map 值 - * @param time 时间 - * @return true / false - */ - public boolean hmset(String key, Map map, long time) { - try { - redisTemplate.opsForHash().putAll(key, map); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 向一张 Hash表 中放入数据,如不存在则创建 - * @param key 键 - * @param item 项 - * @param value 值 - * @return true / false - */ - public boolean hset(String key, String item, Object value) { - try { - redisTemplate.opsForHash().put(key, item, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 向一张 Hash表 中放入数据,并设置时间,如不存在则创建 - * @param key 键 - * @param item 项 - * @param value 值 - * @param time 时间(如果原来的 Hash表 设置了时间,这里会覆盖) - * @return true / false - */ - public boolean hset(String key, String item, Object value, long time) { - try { - redisTemplate.opsForHash().put(key, item, value); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 删除 Hash表 中的值 - * @param key 键 - * @param item 项(可以多个,no null) - */ - public void hdel(String key, Object... item) { - redisTemplate.opsForHash().delete(key, item); - } - - /** - * 判断 Hash表 中是否有该键的值 - * @param key 键(no null) - * @param item 值(no null) - * @return true / false - */ - public boolean hHasKey(String key, String item) { - return redisTemplate.opsForHash().hasKey(key, item); - } - - /** - * Hash递增,如果不存在则创建一个,并把新增的值返回 - * @param key 键 - * @param item 项 - * @param by 递增大小 > 0 - * @return - */ - public Double hincr(String key, String item, Double by) { - return redisTemplate.opsForHash().increment(key, item, by); - } - - /** - * Hash递减 - * @param key 键 - * @param item 项 - * @param by 递减大小 - * @return - */ - public Double hdecr(String key, String item, Double by) { - return redisTemplate.opsForHash().increment(key, item, -by); - } - -// ============================== Set ============================== - - /** - * 根据 key 获取 set 中的所有值 - * @param key 键 - * @return 值 - */ - public Set sGet(String key) { - try { - return redisTemplate.opsForSet().members(key); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * 从键为 key 的 set 中,根据 value 查询是否存在 - * @param key 键 - * @param value 值 - * @return true / false - */ - public boolean sHasKey(String key, Object value) { - try { - return redisTemplate.opsForSet().isMember(key, value); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 将数据放入 set缓存 - * @param key 键值 - * @param values 值(可以多个) - * @return 成功个数 - */ - public long sSet(String key, Object... values) { - try { - return redisTemplate.opsForSet().add(key, values); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 将数据放入 set缓存,并设置时间 - * @param key 键 - * @param time 时间 - * @param values 值(可以多个) - * @return 成功放入个数 - */ - public long sSet(String key, long time, Object... values) { - try { - long count = redisTemplate.opsForSet().add(key, values); - if (time > 0) { - expire(key, time); - } - return count; - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 获取 set缓存的长度 - * @param key 键 - * @return 长度 - */ - public long sGetSetSize(String key) { - try { - return redisTemplate.opsForSet().size(key); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 移除 set缓存中,值为 value 的 - * @param key 键 - * @param values 值 - * @return 成功移除个数 - */ - public long setRemove(String key, Object... values) { - try { - return redisTemplate.opsForSet().remove(key, values); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } -// ============================== ZSet ============================== - - /** - * 添加一个元素, zset与set最大的区别就是每个元素都有一个score,因此有个排序的辅助功能; zadd - * - * @param key - * @param value - * @param score - */ - public void zAdd(String key, String value, double score) { - redisTemplate.opsForZSet().add(key, value, score); - } - - /** - * 删除元素 zrem - * - * @param key - * @param value - */ - public void zRemove(String key, String value) { - redisTemplate.opsForZSet().remove(key, value); - } - - /** - * score的增加or减少 zincrby - * - * @param key - * @param value - * @param score - */ - public Double zIncrScore(String key, String value, double score) { - return redisTemplate.opsForZSet().incrementScore(key, value, score); - } - - /** - * 查询value对应的score zscore - * - * @param key - * @param value - * @return - */ - public Double zScore(String key, String value) { - return redisTemplate.opsForZSet().score(key, value); - } - - /** - * 判断value在zset中的排名 zrank - * - * @param key - * @param value - * @return - */ - public Long zRank(String key, String value) { - return redisTemplate.opsForZSet().rank(key, value); - } - - /** - * 返回集合的长度 - * - * @param key - * @return - */ - public Long zSize(String key) { - return redisTemplate.opsForZSet().zCard(key); - } - - /** - * 查询集合中指定顺序的值, 0 -1 表示获取全部的集合内容 zrange - * - * 返回有序的集合,score小的在前面 - * - * @param key - * @param start - * @param end - * @return - */ - public Set ZRange(String key, int start, int end) { - return redisTemplate.opsForZSet().range(key, start, end); - } - /** - * 查询集合中指定顺序的值和score,0, -1 表示获取全部的集合内容 - * - * @param key - * @param start - * @param end - * @return - */ - public Set> zRangeWithScore(String key, int start, int end) { - return redisTemplate.opsForZSet().rangeWithScores(key, start, end); - } - /** - * 查询集合中指定顺序的值 zrevrange - * - * 返回有序的集合中,score大的在前面 - * - * @param key - * @param start - * @param end - * @return - */ - public Set zRevRange(String key, int start, int end) { - return redisTemplate.opsForZSet().reverseRange(key, start, end); - } - /** - * 根据score的值,来获取满足条件的集合 zrangebyscore - * - * @param key - * @param min - * @param max - * @return - */ - public Set zSortRange(String key, int min, int max) { - return redisTemplate.opsForZSet().rangeByScore(key, min, max); - } - - -// ============================== List ============================== - - /** - * 获取 list缓存的内容 - * @param key 键 - * @param start 开始 - * @param end 结束(0 到 -1 代表所有值) - * @return - */ - public List lGet(String key, long start, long end) { - try { - return redisTemplate.opsForList().range(key, start, end); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * 获取 list缓存的长度 - * @param key 键 - * @return 长度 - */ - public long lGetListSize(String key) { - try { - return redisTemplate.opsForList().size(key); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 根据索引 index 获取键为 key 的 list 中的元素 - * @param key 键 - * @param index 索引 - * 当 index >= 0 时 {0:表头, 1:第二个元素} - * 当 index < 0 时 {-1:表尾, -2:倒数第二个元素} - * @return 值 - */ - public Object lGetIndex(String key, long index) { - try { - return redisTemplate.opsForList().index(key, index); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * 将值 value 插入键为 key 的 list 中,如果 list 不存在则创建空 list - * @param key 键 - * @param value 值 - * @return true / false - */ - public boolean lSet(String key, Object value) { - try { - redisTemplate.opsForList().rightPush(key, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 将值 value 插入键为 key 的 list 中,并设置时间 - * @param key 键 - * @param value 值 - * @param time 时间 - * @return true / false - */ - public boolean lSet(String key, Object value, long time) { - try { - redisTemplate.opsForList().rightPush(key, value); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 将 values 插入键为 key 的 list 中 - * @param key 键 - * @param values 值 - * @return true / false - */ - public boolean lSetList(String key, List values) { - try { - redisTemplate.opsForList().rightPushAll(key, values); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 将 values 插入键为 key 的 list 中,并设置时间 - * @param key 键 - * @param values 值 - * @param time 时间 - * @return true / false - */ - public boolean lSetList(String key, List values, long time) { - try { - redisTemplate.opsForList().rightPushAll(key, values); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 根据索引 index 修改键为 key 的值 - * @param key 键 - * @param index 索引 - * @param value 值 - * @return true / false - */ - public boolean lUpdateIndex(String key, long index, Object value) { - try { - redisTemplate.opsForList().set(key, index, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 在键为 key 的 list 中删除值为 value 的元素 - * @param key 键 - * @param count 如果 count == 0 则删除 list 中所有值为 value 的元素 - * 如果 count > 0 则删除 list 中最左边那个值为 value 的元素 - * 如果 count < 0 则删除 list 中最右边那个值为 value 的元素 - * @param value - * @return - */ - public long lRemove(String key, long count, Object value) { - try { - return redisTemplate.opsForList().remove(key, count, value); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 模糊查询 - * @param key 键 - * @return true / false - */ - public List keys(String key) { - try { - Set set = redisTemplate.keys(key); - return new ArrayList<>(set); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - - /** - * 模糊查询 - * @param query 查询参数 - * @return - */ -// public List scan(String query) { -// List result = new ArrayList<>(); -// try { -// Cursor> cursor = redisTemplate.opsForHash().scan("field", -// ScanOptions.scanOptions().match(query).count(1000).build()); -// while (cursor.hasNext()) { -// Map.Entry entry = cursor.next(); -// result.add(entry.getKey()); -// Object key = entry.getKey(); -// Object valueSet = entry.getValue(); -// } -// //关闭cursor -// cursor.close(); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// return result; -// } - - /** - * 模糊查询 - * @param query 查询参数 - * @return - */ - public List scan(String query) { - Set keys = (Set) redisTemplate.execute((RedisCallback>) connection -> { - Set keysTmp = new HashSet<>(); - Cursor cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(query).count(1000).build()); - while (cursor.hasNext()) { - keysTmp.add(new String(cursor.next())); - } - return keysTmp; - }); -// Set keys = (Set) redisTemplate.execute(new RedisCallback>(){ -// -// @Override -// public Set doInRedis(RedisConnection connection) throws DataAccessException { -// Set keysTmp = new HashSet<>(); -// Cursor cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(query).count(1000).build()); -// while (cursor.hasNext()) { -// keysTmp.add(new String(cursor.next())); -// } -// return keysTmp; -// } -// }); - - return new ArrayList<>(keys); - } - -} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java index 34a02ee2a..da82acc51 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java @@ -1,9 +1,7 @@ package com.genersoft.iot.vmp.vmanager.device; -import java.util.List; - -import com.genersoft.iot.vmp.common.PageResult; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; +import com.github.pagehelper.PageInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -17,7 +15,7 @@ import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; @CrossOrigin @RestController @@ -27,7 +25,7 @@ public class DeviceController { private final static Logger logger = LoggerFactory.getLogger(DeviceController.class); @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; @Autowired private SIPCommander cmder; @@ -50,13 +48,13 @@ public class DeviceController { } @GetMapping("/devices") - public PageResult devices(int page, int count){ + public PageInfo devices(int page, int count){ if (logger.isDebugEnabled()) { logger.debug("查询所有视频设备API调用"); } - return storager.queryVideoDeviceList(null, page, count); + return storager.queryVideoDeviceList( page, count); } /** @@ -67,7 +65,7 @@ public class DeviceController { * @return 通道列表 */ @GetMapping("/devices/{deviceId}/channels") - public ResponseEntity channels(@PathVariable String deviceId, + public ResponseEntity channels(@PathVariable String deviceId, int page, int count, @RequestParam(required = false) String query, @RequestParam(required = false) String online, @@ -77,7 +75,7 @@ public class DeviceController { if (logger.isDebugEnabled()) { logger.debug("查询所有视频设备API调用"); } - PageResult pageResult = storager.queryChannelsByDeviceId(deviceId, query, channelType, online, page, count); + PageInfo pageResult = storager.queryChannelsByDeviceId(deviceId, null, query, online, page, count); return new ResponseEntity<>(pageResult,HttpStatus.OK); } @@ -124,7 +122,7 @@ public class DeviceController { * @return 子通道列表 */ @GetMapping("/subChannels/{deviceId}/{channelId}/channels") - public ResponseEntity subChannels(@PathVariable String deviceId, + public ResponseEntity subChannels(@PathVariable String deviceId, @PathVariable String channelId, int page, int count, @@ -137,23 +135,23 @@ public class DeviceController { } DeviceChannel deviceChannel = storager.queryChannel(deviceId,channelId); if (deviceChannel == null) { - PageResult deviceChannelPageResult = new PageResult<>(); + PageInfo deviceChannelPageResult = new PageInfo<>(); return new ResponseEntity<>(deviceChannelPageResult,HttpStatus.OK); } - PageResult pageResult = storager.querySubChannels(deviceId, channelId, query, channelType, online, page, count); + PageInfo pageResult = storager.queryChannelsByDeviceId(deviceId, channelId, query, online, page, count); return new ResponseEntity<>(pageResult,HttpStatus.OK); } @PostMapping("/channel/update/{deviceId}") - public ResponseEntity updateChannel(@PathVariable String deviceId,DeviceChannel channel){ + public ResponseEntity updateChannel(@PathVariable String deviceId,DeviceChannel channel){ storager.updateChannel(deviceId, channel); return new ResponseEntity<>(null,HttpStatus.OK); } @GetMapping("/devices/{deviceId}/transport/{streamMode}") @PostMapping("/devices/{deviceId}/transport/{streamMode}") - public ResponseEntity updateTransport(@PathVariable String deviceId, @PathVariable String streamMode){ + public ResponseEntity updateTransport(@PathVariable String deviceId, @PathVariable String streamMode){ Device device = storager.queryVideoDevice(deviceId); device.setStreamMode(streamMode); storager.updateDevice(device); diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java index c9b2d34d9..d825dcbc5 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java @@ -20,7 +20,7 @@ import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; @CrossOrigin @RestController @@ -33,7 +33,7 @@ public class PlayController { private SIPCommander cmder; @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; @Autowired private ZLMRESTfulUtils zlmresTfulUtils; diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java index 56d1c7bd7..2ab06cee6 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java @@ -13,14 +13,13 @@ import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; @CrossOrigin @RestController @@ -33,7 +32,7 @@ public class PlaybackController { private SIPCommander cmder; @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; @Autowired private ZLMRESTfulUtils zlmresTfulUtils; diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/ptz/PtzController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/ptz/PtzController.java index 1a90977b6..f1d3fff1e 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/ptz/PtzController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/ptz/PtzController.java @@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RestController; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; @CrossOrigin @RestController @@ -26,7 +26,7 @@ public class PtzController { private SIPCommander cmder; @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; /*** * http://localhost:8080/api/ptz/34020000001320000002_34020000001320000008?leftRight=1&upDown=0&inOut=0&moveSpeed=50&zoomSpeed=0 diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/record/RecordController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/record/RecordController.java index 502087ef4..704d782e2 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/record/RecordController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/record/RecordController.java @@ -15,7 +15,7 @@ import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; @CrossOrigin @RestController @@ -28,7 +28,7 @@ public class RecordController { private SIPCommander cmder; @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; @Autowired private DeferredResultHolder resultHolder; diff --git a/src/main/java/com/genersoft/iot/vmp/web/ApiControlController.java b/src/main/java/com/genersoft/iot/vmp/web/ApiControlController.java index c9a68bfa1..4349b937c 100644 --- a/src/main/java/com/genersoft/iot/vmp/web/ApiControlController.java +++ b/src/main/java/com/genersoft/iot/vmp/web/ApiControlController.java @@ -3,13 +3,10 @@ package com.genersoft.iot.vmp.web; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.vmanager.ptz.PtzController; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; /** @@ -26,7 +23,7 @@ public class ApiControlController { private SIPCommander cmder; @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; /** * 设备控制 - 云台控制 diff --git a/src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java b/src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java index ce3b7ec84..788b32be1 100644 --- a/src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java +++ b/src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java @@ -1,22 +1,17 @@ package com.genersoft.iot.vmp.web; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.genersoft.iot.vmp.common.PageResult; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.vmanager.device.DeviceController; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; +import com.github.pagehelper.PageInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -32,7 +27,7 @@ public class ApiDeviceController { private final static Logger logger = LoggerFactory.getLogger(ApiDeviceController.class); @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; @Autowired private SIPCommander cmder; @@ -65,12 +60,12 @@ public class ApiDeviceController { JSONObject result = new JSONObject(); List devices; if (start == null || limit ==null) { - devices = storager.queryVideoDeviceList(null); + devices = storager.queryVideoDeviceList(); result.put("DeviceCount", devices.size()); }else { - PageResult deviceList = storager.queryVideoDeviceList(null, start/limit, limit); + PageInfo deviceList = storager.queryVideoDeviceList(start/limit, limit); result.put("DeviceCount", deviceList.getTotal()); - devices = deviceList.getData(); + devices = deviceList.getList(); } JSONArray deviceJSONList = new JSONArray(); @@ -86,8 +81,8 @@ public class ApiDeviceController { deviceJsonObject.put("Online", device.getOnline() == 1); deviceJsonObject.put("Password", ""); deviceJsonObject.put("MediaTransport", device.getTransport()); - deviceJsonObject.put("RemoteIP", device.getHost().getIp()); - deviceJsonObject.put("RemotePort", device.getHost().getPort()); + deviceJsonObject.put("RemoteIP", device.getIp()); + deviceJsonObject.put("RemotePort", device.getPort()); deviceJsonObject.put("LastRegisterAt", ""); deviceJsonObject.put("LastKeepaliveAt", ""); deviceJsonObject.put("UpdatedAt", ""); @@ -120,12 +115,12 @@ public class ApiDeviceController { } List deviceChannels; if (start == null || limit ==null) { - deviceChannels = storager.queryChannelsByDeviceId(serial); + deviceChannels = storager.queryChannelAllByDeviceId(serial, null, null,null); result.put("ChannelCount", deviceChannels.size()); }else { - PageResult pageResult = storager.queryChannelsByDeviceId(serial, null, null, null,start/limit, limit); + PageInfo pageResult = storager.queryChannelsByDeviceId(serial, null, null, null,start/limit, limit); result.put("ChannelCount", pageResult.getTotal()); - deviceChannels = pageResult.getData(); + deviceChannels = pageResult.getList(); } JSONArray channleJSONList = new JSONArray(); diff --git a/src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java b/src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java index 8d845b1cc..f1d8a4188 100644 --- a/src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java +++ b/src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java @@ -1,18 +1,14 @@ package com.genersoft.iot.vmp.web; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.vmanager.play.PlayController; +import com.genersoft.iot.vmp.storager.VideoManagerStoragerServiceImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; /** @@ -29,7 +25,7 @@ public class ApiStreamController { private SIPCommander cmder; @Autowired - private IVideoManagerStorager storager; + private VideoManagerStoragerServiceImpl storager; /** * 实时直播 - 开始直播 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 5a752e5c4..1c44d29b3 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,27 +1,26 @@ spring: application: name: iot-vmp-vmanager - # 影子数据存储方式,支持redis、jdbc,暂不支持mysql - database: redis # 通信方式,支持kafka、http communicate: http - redis: - # Redis服务器IP - host: 127.0.0.1 - #端口号 - port: 6379 - database: 6 - #访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接 - password: - #超时时间 - timeout: 10000 - datasource: - name: eiot - url: jdbc:mysql://127.0.0.1:3306/eiot?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true + datasource: + name: wvp + url: jdbc:sqlite::resource:wvp.db username: password: type: com.alibaba.druid.pool.DruidDataSource - driver-class-name: com.mysql.jdbc.Driver + driver-class-name: org.sqlite.JDBC + +# name: eiot +# url: jdbc:mysql://127.0.0.1:3306/eiot?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true +# username: +# password: +# type: com.alibaba.druid.pool.DruidDataSource +# driver-class-name: com.mysql.jdbc.Driver +pagehelper: + helperDialect: sqlite + supportMethodsArguments: true + params: count server: port: 18080 sip: diff --git a/src/main/resources/wvp.db b/src/main/resources/wvp.db new file mode 100644 index 000000000..34c3add80 Binary files /dev/null and b/src/main/resources/wvp.db differ