sqlite适配

This commit is contained in:
648540858 2020-11-15 22:47:08 +08:00
parent 33b51c40dd
commit fe1f431733
39 changed files with 739 additions and 2095 deletions

13
pom.xml
View File

@ -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数据库连接池 -->

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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() {

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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:设备离在线状态检测器用于检测设备状态

View File

@ -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
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 冗余代码太多待优化

View File

@ -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")

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -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;
}
}

View File

@ -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());
}
}

View File

@ -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);
}
}

View File

@ -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);
}
/**
* 查询集合中指定顺序的值和score0, -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);
}
}

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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;
/**
* 设备控制 - 云台控制

View File

@ -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();

View File

@ -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;
/**
* 实时直播 - 开始直播

View File

@ -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

Binary file not shown.