mirror of
https://gitee.com/pan648540858/wvp-GB28181-pro.git
synced 2026-05-06 14:07:49 +08:00
sqlite适配
This commit is contained in:
parent
33b51c40dd
commit
fe1f431733
13
pom.xml
13
pom.xml
@ -11,6 +11,7 @@
|
||||
|
||||
<groupId>com.genersoft</groupId>
|
||||
<artifactId>wvp</artifactId>
|
||||
<version>1.1.0</version>
|
||||
<name>web video platform</name>
|
||||
|
||||
<properties>
|
||||
@ -46,15 +47,11 @@
|
||||
<artifactId>spring-context</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- redis -->
|
||||
<!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.data</groupId>
|
||||
<artifactId>spring-data-redis</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>redis.clients</groupId>
|
||||
<artifactId>jedis</artifactId>
|
||||
<version>3.3.0</version>
|
||||
<groupId>org.xerial</groupId>
|
||||
<artifactId>sqlite-jdbc</artifactId>
|
||||
<version>3.32.3.2</version>
|
||||
</dependency>
|
||||
|
||||
<!-- druid数据库连接池 -->
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -1,45 +0,0 @@
|
||||
package com.genersoft.iot.vmp.common;
|
||||
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PageResult<T> {
|
||||
|
||||
private int page;
|
||||
private int count;
|
||||
private int total;
|
||||
|
||||
private List<T> data;
|
||||
|
||||
public List<T> 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<T> data) {
|
||||
this.data = data;
|
||||
}
|
||||
}
|
||||
@ -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() {
|
||||
|
||||
@ -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<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
|
||||
RedisTemplate<Object, Object> template = new RedisTemplate<>();
|
||||
template.setConnectionFactory(redisConnectionFactory);
|
||||
// 使用fastjson进行序列化处理,提高解析效率
|
||||
FastJsonRedisSerializer<Object> serializer = new FastJsonRedisSerializer<Object>(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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -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<String,DeviceChannel> channelMap;
|
||||
|
||||
private int channelCount;
|
||||
|
||||
private List<String> 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<String> getChannelList() {
|
||||
return channelList;
|
||||
public Date getLoginTime() {
|
||||
return loginTime;
|
||||
}
|
||||
|
||||
public void setChannelList(List<String> channelList) {
|
||||
this.channelList = channelList;
|
||||
public void setLoginTime(Date loginTime) {
|
||||
this.loginTime = loginTime;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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:设备离在线状态检测器,用于检测设备状态
|
||||
|
||||
@ -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
|
||||
}
|
||||
@ -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<OfflineEvent> {
|
||||
private final static Logger logger = LoggerFactory.getLogger(OfflineEventListener.class);
|
||||
|
||||
@Autowired
|
||||
private IVideoManagerStorager storager;
|
||||
private VideoManagerStoragerServiceImpl storager;
|
||||
|
||||
@Autowired
|
||||
private RedisUtil redis;
|
||||
|
||||
@ -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<OnlineEvent> {
|
||||
private final static Logger logger = LoggerFactory.getLogger(OnlineEventListener.class);
|
||||
|
||||
@Autowired
|
||||
private IVideoManagerStorager storager;
|
||||
private VideoManagerStoragerServiceImpl storager;
|
||||
|
||||
@Autowired
|
||||
private RedisUtil redis;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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 冗余代码太多待优化
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -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<Device> queryVideoDevices();
|
||||
|
||||
|
||||
/**
|
||||
* 获取某个设备的通道列表
|
||||
*
|
||||
* @param deviceId 设备ID
|
||||
* @return
|
||||
*/
|
||||
@Select("<script> " +
|
||||
"SELECT ch.*, st.ssrc FROM channel ch WHERE ch.deviceId == #{deviceId} " +
|
||||
"<if test='parentChannelId != null'> and parentId == #{parentChannelId}</if>\n" +
|
||||
"<if test='query != null'> and (channelId like '%#{query}$' or name like '%#{query}$')</if>\n" +
|
||||
"<if test='online != null'> and online == #{online} </if>\n" +
|
||||
"INNER JOIN streamInfo st ON ch.deviceId == st.deviceId AND ch.channelId == st.channelId" +
|
||||
"</script>")
|
||||
public List<DeviceChannel> 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);
|
||||
}
|
||||
|
||||
@ -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<DeviceChannel> queryChannelsByDeviceId(String deviceId);
|
||||
/**
|
||||
* 获取某个设备的通道
|
||||
* @param deviceId 设备ID
|
||||
* @param channelId 通道ID
|
||||
*/
|
||||
public DeviceChannel queryChannel(String deviceId, String channelId);
|
||||
|
||||
/**
|
||||
* 获取多个设备
|
||||
*
|
||||
* @param deviceIds 设备ID数组
|
||||
* @return List<Device> 设备对象数组
|
||||
*/
|
||||
public PageResult<Device> queryVideoDeviceList(String[] deviceIds, int page, int count);
|
||||
|
||||
/**
|
||||
* 获取多个设备
|
||||
*
|
||||
* @param deviceIds 设备ID数组
|
||||
* @return List<Device> 设备对象数组
|
||||
*/
|
||||
public List<Device> 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<String, StreamInfo> 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<DeviceChannel> queryChannelAllByDeviceId(String deviceId, String parentChannelId, String query, String online);
|
||||
|
||||
|
||||
/**
|
||||
* 获取某个的通道
|
||||
*
|
||||
* @param deviceId 设备ID
|
||||
* @param channelId 通道ID
|
||||
*/
|
||||
public DeviceChannel queryChannel(String deviceId, String channelId);
|
||||
|
||||
/**
|
||||
* 获取多个设备
|
||||
*
|
||||
* @return List<Device> 设备对象数组
|
||||
*/
|
||||
public PageInfo<Device> queryVideoDeviceList( int page, int count);
|
||||
|
||||
/**
|
||||
* 获取多个设备
|
||||
*
|
||||
* @return List<Device> 设备对象数组
|
||||
*/
|
||||
public List<Device> 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<String, StreamInfo> queryPlayByDeviceId(String deviceId);
|
||||
|
||||
boolean startPlayback(StreamInfo streamInfo);
|
||||
|
||||
boolean stopPlayback(StreamInfo streamInfo);
|
||||
|
||||
StreamInfo queryPlaybackByDevice(String deviceId, String channelId);
|
||||
|
||||
StreamInfo queryPlaybackBySSRC(String ssrc);
|
||||
}
|
||||
@ -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<DeviceChannel> 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<Device> queryVideoDeviceList(int page, int count) {
|
||||
|
||||
PageHelper.startPage(page,count);
|
||||
PageInfo<Device> pageInfo = new PageInfo<>(storageMapper.queryVideoDevices());
|
||||
return pageInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Device> 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<String, StreamInfo> 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;
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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<DeviceChannel> queryChannelsByDeviceId(String deviceId) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DeviceChannel queryChannel(String deviceId, String channelId) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<Device> queryVideoDeviceList(String[] deviceIds, int page, int count) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取多个设备
|
||||
*
|
||||
* @param deviceIds 设备ID数组
|
||||
* @return List<Device> 设备对象数组
|
||||
*/
|
||||
@Override
|
||||
public List<Device> 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<String, StreamInfo> 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;
|
||||
}
|
||||
}
|
||||
@ -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<String, HashMap<String, HashSet<String>>> 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<String, HashSet<String>>());
|
||||
}
|
||||
// 更新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<String, HashSet<String>> channelMap = deviceMap.get(deviceId);
|
||||
if (channelMap == null) return;
|
||||
// 作为父设备, 确定自己的子节点数
|
||||
if (channelMap.get(channelId) == null) {
|
||||
channelMap.put(channelId, new HashSet<String>());
|
||||
}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<String>());
|
||||
}
|
||||
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<String, StreamInfo> stringStreamInfoMap = queryPlayByDeviceId(deviceId);
|
||||
List<DeviceChannel> result = new ArrayList<>();
|
||||
PageResult pageResult = new PageResult<DeviceChannel>();
|
||||
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<Object> deviceChannelList = redis.keys(queryStr);
|
||||
List<Object> deviceChannelList = redis.scan(queryStr);
|
||||
//对查询结果排序,避免出现通道排列顺序乱序的情况
|
||||
Collections.sort(deviceChannelList,new Comparator<Object>(){
|
||||
@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<DeviceChannel> queryChannelsByDeviceId(String deviceId) {
|
||||
List<DeviceChannel> result = new ArrayList<>();
|
||||
// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
|
||||
List<Object> 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<DeviceChannel> 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<Object> deviceChannelList = redis.keys(queryStr);
|
||||
List<Object> 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<DeviceChannel>();
|
||||
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<DeviceChannel> querySubChannels(String deviceId, String parentChannelId) {
|
||||
List<DeviceChannel> allDeviceChannels = new ArrayList<>();
|
||||
// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
|
||||
List<Object> 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<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
|
||||
List<Object> 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<Device> 设备对象数组
|
||||
*/
|
||||
@Override
|
||||
public PageResult<Device> queryVideoDeviceList(String[] deviceIds, int page, int count) {
|
||||
List<Device> devices = new ArrayList<>();
|
||||
PageResult pageResult = new PageResult<Device>();
|
||||
pageResult.setPage(page);
|
||||
pageResult.setCount(count);
|
||||
Device device = null;
|
||||
|
||||
if (deviceIds == null || deviceIds.length == 0) {
|
||||
|
||||
// List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
|
||||
List<Object> 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<Device> 设备对象数组
|
||||
*/
|
||||
@Override
|
||||
public List<Device> queryVideoDeviceList(String[] deviceIds) {
|
||||
List<Device> devices = new ArrayList<>();
|
||||
Device device = null;
|
||||
|
||||
if (deviceIds == null || deviceIds.length == 0) {
|
||||
// List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
|
||||
List<Object> 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<Object> playLeys = redis.keys(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, ssrc));
|
||||
List<Object> 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<Object> playLeys = redis.keys(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, ssrc));
|
||||
List<Object> 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<Object> playLeys = redis.keys(String.format("%S_*_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
|
||||
List<Object> 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<Device> devices = queryVideoDeviceList(null);
|
||||
if (devices == null && devices.size() == 0) return;
|
||||
for (Device device : devices) {
|
||||
// 更新设备下的通道
|
||||
HashMap<String, HashSet<String>> channelMap = new HashMap<String, HashSet<String>>();
|
||||
List<Object> 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<String> 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<DeviceChannel> result = new ArrayList<>();
|
||||
// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
|
||||
List<Object> 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<String, StreamInfo> queryPlayByDeviceId(String deviceId) {
|
||||
Map<String, StreamInfo> streamInfos = new HashMap<>();
|
||||
// List<Object> playLeys = redis.keys(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId));
|
||||
List<Object> 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<Object> 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());
|
||||
}
|
||||
}
|
||||
@ -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<T> implements RedisSerializer<T> {
|
||||
|
||||
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
|
||||
|
||||
private Class<T> clazz;
|
||||
|
||||
public FastJsonRedisSerializer(Class<T> 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);
|
||||
}
|
||||
}
|
||||
@ -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<String> 集合
|
||||
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<Object, Object> hmget(String key) {
|
||||
return redisTemplate.opsForHash().entries(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* HashSet
|
||||
* @param key 键
|
||||
* @param map 值
|
||||
* @return true / false
|
||||
*/
|
||||
public boolean hmset(String key, Map<Object, Object> 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<Object, Object> 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<Object> 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<String> 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<ZSetOperations.TypedTuple<String>> 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<String> 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<String> 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<Object> 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<Object> 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<Object> 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<Object> keys(String key) {
|
||||
try {
|
||||
Set<String> set = redisTemplate.keys(key);
|
||||
return new ArrayList<>(set);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 模糊查询
|
||||
* @param query 查询参数
|
||||
* @return
|
||||
*/
|
||||
// public List<Object> scan(String query) {
|
||||
// List<Object> result = new ArrayList<>();
|
||||
// try {
|
||||
// Cursor<Map.Entry<Object,Object>> cursor = redisTemplate.opsForHash().scan("field",
|
||||
// ScanOptions.scanOptions().match(query).count(1000).build());
|
||||
// while (cursor.hasNext()) {
|
||||
// Map.Entry<Object,Object> 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<Object> scan(String query) {
|
||||
Set<String> keys = (Set<String>) redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
|
||||
Set<String> keysTmp = new HashSet<>();
|
||||
Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(query).count(1000).build());
|
||||
while (cursor.hasNext()) {
|
||||
keysTmp.add(new String(cursor.next()));
|
||||
}
|
||||
return keysTmp;
|
||||
});
|
||||
// Set<String> keys = (Set<String>) redisTemplate.execute(new RedisCallback<Set<String>>(){
|
||||
//
|
||||
// @Override
|
||||
// public Set<String> doInRedis(RedisConnection connection) throws DataAccessException {
|
||||
// Set<String> keysTmp = new HashSet<>();
|
||||
// Cursor<byte[]> 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);
|
||||
}
|
||||
|
||||
}
|
||||
@ -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<Device> devices(int page, int count){
|
||||
public PageInfo<Device> 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<PageResult> channels(@PathVariable String deviceId,
|
||||
public ResponseEntity<PageInfo> 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<PageResult> subChannels(@PathVariable String deviceId,
|
||||
public ResponseEntity<PageInfo> 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<DeviceChannel> deviceChannelPageResult = new PageResult<>();
|
||||
PageInfo<DeviceChannel> 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<PageResult> updateChannel(@PathVariable String deviceId,DeviceChannel channel){
|
||||
public ResponseEntity<PageInfo> 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<PageResult> updateTransport(@PathVariable String deviceId, @PathVariable String streamMode){
|
||||
public ResponseEntity<PageInfo> updateTransport(@PathVariable String deviceId, @PathVariable String streamMode){
|
||||
Device device = storager.queryVideoDevice(deviceId);
|
||||
device.setStreamMode(streamMode);
|
||||
storager.updateDevice(device);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
/**
|
||||
* 设备控制 - 云台控制
|
||||
|
||||
@ -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<Device> devices;
|
||||
if (start == null || limit ==null) {
|
||||
devices = storager.queryVideoDeviceList(null);
|
||||
devices = storager.queryVideoDeviceList();
|
||||
result.put("DeviceCount", devices.size());
|
||||
}else {
|
||||
PageResult<Device> deviceList = storager.queryVideoDeviceList(null, start/limit, limit);
|
||||
PageInfo<Device> 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<DeviceChannel> deviceChannels;
|
||||
if (start == null || limit ==null) {
|
||||
deviceChannels = storager.queryChannelsByDeviceId(serial);
|
||||
deviceChannels = storager.queryChannelAllByDeviceId(serial, null, null,null);
|
||||
result.put("ChannelCount", deviceChannels.size());
|
||||
}else {
|
||||
PageResult<DeviceChannel> pageResult = storager.queryChannelsByDeviceId(serial, null, null, null,start/limit, limit);
|
||||
PageInfo<DeviceChannel> 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();
|
||||
|
||||
@ -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;
|
||||
|
||||
/**
|
||||
* 实时直播 - 开始直播
|
||||
|
||||
@ -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:
|
||||
|
||||
BIN
src/main/resources/wvp.db
Normal file
BIN
src/main/resources/wvp.db
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user