Browse Source
# Conflicts: # README.md # src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java # src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java # src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java # src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java # src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java # src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHTTPProxyController.java # src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java # src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java # src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java # src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java # src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java # src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java # src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java # src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java # src/main/resources/application-dev.yml # web_src/src/components/gb28181/devicePlayer.vuepull/29/head

50 changed files with 1616 additions and 2409 deletions
@ -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; |
|
||||
} |
|
||||
} |
|
@ -0,0 +1,63 @@ |
|||||
|
package com.genersoft.iot.vmp.conf; |
||||
|
|
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
|
import org.springframework.boot.CommandLineRunner; |
||||
|
import org.springframework.core.annotation.Order; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 对配置文件进行校验 |
||||
|
*/ |
||||
|
@Component |
||||
|
@Order(value=2) |
||||
|
public class ApplicationCheckRunner implements CommandLineRunner { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger("ApplicationCheckRunner"); |
||||
|
|
||||
|
@Value("${sip.ip}") |
||||
|
private String sipIp; |
||||
|
|
||||
|
@Value("${media.ip}") |
||||
|
private String mediaIp; |
||||
|
|
||||
|
@Value("${media.wanIp}") |
||||
|
private String mediaWanIp; |
||||
|
|
||||
|
@Value("${media.hookIp}") |
||||
|
private String mediaHookIp; |
||||
|
|
||||
|
@Value("${media.port}") |
||||
|
private int mediaPort; |
||||
|
|
||||
|
@Value("${media.secret}") |
||||
|
private String mediaSecret; |
||||
|
|
||||
|
@Value("${media.streamNoneReaderDelayMS}") |
||||
|
private String streamNoneReaderDelayMS; |
||||
|
|
||||
|
@Value("${sip.ip}") |
||||
|
private String sipIP; |
||||
|
|
||||
|
@Value("${server.port}") |
||||
|
private String serverPort; |
||||
|
|
||||
|
@Value("${media.autoConfig}") |
||||
|
private boolean autoConfig; |
||||
|
|
||||
|
|
||||
|
@Override |
||||
|
public void run(String... args) throws Exception { |
||||
|
if (sipIP.equals("localhost") || sipIP.equals("127.0.0.1")) { |
||||
|
logger.error("sip.ip不能使用 {} ,请使用类似192.168.1.44这样的来自网卡的IP!!!", sipIP ); |
||||
|
System.exit(1); |
||||
|
} |
||||
|
|
||||
|
if (mediaIp.equals("localhost") || mediaIp.equals("127.0.0.1")) { |
||||
|
logger.warn("mediaIp.ip使用 {} ,将无法收到网络内其他设备的推流!!!", mediaIp ); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,50 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.event; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import javax.sip.ResponseEvent; |
||||
|
import javax.sip.message.Request; |
||||
|
import java.util.EventObject; |
||||
|
import java.util.Map; |
||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||
|
|
||||
|
@Component |
||||
|
public class SipSubscribe { |
||||
|
|
||||
|
private final static Logger logger = LoggerFactory.getLogger(SipSubscribe.class); |
||||
|
|
||||
|
private Map<String, SipSubscribe.Event> errorSubscribes = new ConcurrentHashMap<>(); |
||||
|
|
||||
|
private Map<String, SipSubscribe.Event> okSubscribes = new ConcurrentHashMap<>(); |
||||
|
|
||||
|
public interface Event { |
||||
|
void response(ResponseEvent event); |
||||
|
} |
||||
|
|
||||
|
public void addErrorSubscribe(String key, SipSubscribe.Event event) { |
||||
|
errorSubscribes.put(key, event); |
||||
|
} |
||||
|
|
||||
|
public void addOkSubscribe(String key, SipSubscribe.Event event) { |
||||
|
okSubscribes.put(key, event); |
||||
|
} |
||||
|
|
||||
|
public SipSubscribe.Event getErrorSubscribe(String key) { |
||||
|
return errorSubscribes.get(key); |
||||
|
} |
||||
|
|
||||
|
public SipSubscribe.Event getOkSubscribe(String key) { |
||||
|
return okSubscribes.get(key); |
||||
|
} |
||||
|
|
||||
|
public int getErrorSubscribesSize(){ |
||||
|
return errorSubscribes.size(); |
||||
|
} |
||||
|
public int getOkSubscribesSize(){ |
||||
|
return okSubscribes.size(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,95 @@ |
|||||
|
package com.genersoft.iot.vmp.media.zlm; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
@Component |
||||
|
public class ZLMRTPServerFactory { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger("ZLMRTPServerFactory"); |
||||
|
|
||||
|
@Value("${media.rtp.udpPortRange}") |
||||
|
private String udpPortRange; |
||||
|
|
||||
|
@Autowired |
||||
|
private ZLMRESTfulUtils zlmresTfulUtils; |
||||
|
|
||||
|
private int[] udpPortRangeArray = new int[2]; |
||||
|
|
||||
|
private int currentPort = 0; |
||||
|
|
||||
|
public int createRTPServer(String streamId) { |
||||
|
Map<String, Object> param = new HashMap<>(); |
||||
|
int result = -1; |
||||
|
int newPort = getPortFromUdpPortRange(); |
||||
|
param.put("port", newPort); |
||||
|
param.put("enable_tcp", 1); |
||||
|
param.put("stream_id", streamId); |
||||
|
JSONObject jsonObject = zlmresTfulUtils.openRtpServer(param); |
||||
|
System.out.println(jsonObject); |
||||
|
|
||||
|
if (jsonObject != null) { |
||||
|
switch (jsonObject.getInteger("code")){ |
||||
|
case 0: |
||||
|
result= newPort; |
||||
|
break; |
||||
|
case -300: // id已经存在
|
||||
|
result = newPort; |
||||
|
break; |
||||
|
case -400: // 端口占用
|
||||
|
result= createRTPServer(streamId); |
||||
|
break; |
||||
|
default: |
||||
|
logger.error("创建RTP Server 失败: " + jsonObject.getString("msg")); |
||||
|
break; |
||||
|
} |
||||
|
}else { |
||||
|
// 检查ZLM状态
|
||||
|
logger.error("创建RTP Server 失败: 请检查ZLM服务"); |
||||
|
} |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
public boolean closeRTPServer(String streamId) { |
||||
|
boolean result = false; |
||||
|
Map<String, Object> param = new HashMap<>(); |
||||
|
param.put("stream_id", streamId); |
||||
|
JSONObject jsonObject = zlmresTfulUtils.closeRtpServer(param); |
||||
|
if (jsonObject != null ) { |
||||
|
if (jsonObject.getInteger("code") == 0) { |
||||
|
result = jsonObject.getInteger("hit") == 1; |
||||
|
}else { |
||||
|
logger.error("关闭RTP Server 失败: " + jsonObject.getString("msg")); |
||||
|
} |
||||
|
}else { |
||||
|
// 检查ZLM状态
|
||||
|
logger.error("关闭RTP Server 失败: 请检查ZLM服务"); |
||||
|
} |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
private int getPortFromUdpPortRange() { |
||||
|
if (currentPort == 0) { |
||||
|
String[] udpPortRangeStrArray = udpPortRange.split(","); |
||||
|
udpPortRangeArray[0] = Integer.parseInt(udpPortRangeStrArray[0]); |
||||
|
udpPortRangeArray[1] = Integer.parseInt(udpPortRangeStrArray[1]); |
||||
|
} |
||||
|
|
||||
|
if (currentPort == 0 || currentPort++ > udpPortRangeArray[1]) { |
||||
|
currentPort = udpPortRangeArray[0]; |
||||
|
return udpPortRangeArray[0]; |
||||
|
} else { |
||||
|
if (currentPort % 2 == 1) { |
||||
|
currentPort++; |
||||
|
} |
||||
|
return currentPort++; |
||||
|
} |
||||
|
} |
||||
|
} |
@ -1,56 +0,0 @@ |
|||||
package com.genersoft.iot.vmp.media.zlm; |
|
||||
|
|
||||
import com.alibaba.fastjson.JSONObject; |
|
||||
import org.springframework.beans.factory.annotation.Autowired; |
|
||||
import org.springframework.beans.factory.annotation.Value; |
|
||||
import org.springframework.stereotype.Component; |
|
||||
|
|
||||
import java.util.HashMap; |
|
||||
import java.util.Map; |
|
||||
|
|
||||
@Component |
|
||||
public class ZLMUtils { |
|
||||
|
|
||||
@Value("${media.rtp.udpPortRange}") |
|
||||
private String udpPortRange; |
|
||||
|
|
||||
@Autowired |
|
||||
private ZLMRESTfulUtils zlmresTfulUtils; |
|
||||
|
|
||||
private int[] udpPortRangeArray = new int[2]; |
|
||||
|
|
||||
private int currentPort = 0; |
|
||||
|
|
||||
public int getNewRTPPort(String ssrc) { |
|
||||
String streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase(); |
|
||||
Map<String, Object> param = new HashMap<>(); |
|
||||
int newPort = getPortFromUdpPortRange(); |
|
||||
param.put("port", newPort); |
|
||||
param.put("enable_tcp", 1); |
|
||||
param.put("stream_id", streamId); |
|
||||
JSONObject jsonObject = zlmresTfulUtils.openRtpServer(param); |
|
||||
if (jsonObject != null && jsonObject.getInteger("code") == 0) { |
|
||||
return newPort; |
|
||||
} else { |
|
||||
return getNewRTPPort(ssrc); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
private int getPortFromUdpPortRange() { |
|
||||
if (currentPort == 0) { |
|
||||
String[] udpPortRangeStrArray = udpPortRange.split(","); |
|
||||
udpPortRangeArray[0] = Integer.parseInt(udpPortRangeStrArray[0]); |
|
||||
udpPortRangeArray[1] = Integer.parseInt(udpPortRangeStrArray[1]); |
|
||||
} |
|
||||
|
|
||||
if (currentPort == 0 || currentPort++ > udpPortRangeArray[1]) { |
|
||||
currentPort = udpPortRangeArray[0]; |
|
||||
return udpPortRangeArray[0]; |
|
||||
} else { |
|
||||
if (currentPort % 2 == 1) { |
|
||||
currentPort++; |
|
||||
} |
|
||||
return currentPort++; |
|
||||
} |
|
||||
} |
|
||||
} |
|
@ -0,0 +1,58 @@ |
|||||
|
package com.genersoft.iot.vmp.storager; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.common.StreamInfo; |
||||
|
import com.genersoft.iot.vmp.conf.MediaServerConfig; |
||||
|
|
||||
|
import java.util.Map; |
||||
|
|
||||
|
public interface IRedisCatchStorage { |
||||
|
|
||||
|
/** |
||||
|
* 开始播放时将流存入 |
||||
|
* |
||||
|
* @param stream 流信息 |
||||
|
* @return |
||||
|
*/ |
||||
|
boolean startPlay(StreamInfo stream); |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 停止播放时删除 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
boolean stopPlay(StreamInfo streamInfo); |
||||
|
|
||||
|
/** |
||||
|
* 查询播放列表 |
||||
|
* @return |
||||
|
*/ |
||||
|
StreamInfo queryPlay(StreamInfo streamInfo); |
||||
|
|
||||
|
StreamInfo queryPlayByStreamId(String steamId); |
||||
|
|
||||
|
StreamInfo queryPlaybackByStreamId(String steamId); |
||||
|
|
||||
|
StreamInfo queryPlayByDevice(String deviceId, String code); |
||||
|
|
||||
|
/** |
||||
|
* 更新流媒体信息 |
||||
|
* @param mediaServerConfig |
||||
|
* @return |
||||
|
*/ |
||||
|
boolean updateMediaInfo(MediaServerConfig mediaServerConfig); |
||||
|
|
||||
|
/** |
||||
|
* 获取流媒体信息 |
||||
|
* @return |
||||
|
*/ |
||||
|
MediaServerConfig getMediaInfo(); |
||||
|
|
||||
|
Map<String, StreamInfo> queryPlayByDeviceId(String deviceId); |
||||
|
|
||||
|
boolean startPlayback(StreamInfo stream); |
||||
|
|
||||
|
boolean stopPlayback(StreamInfo streamInfo); |
||||
|
|
||||
|
StreamInfo queryPlaybackByDevice(String deviceId, String code); |
||||
|
} |
@ -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; |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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(); |
|
||||
} |
|
||||
} |
|
@ -0,0 +1,51 @@ |
|||||
|
package com.genersoft.iot.vmp.storager.dao; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; |
||||
|
import org.apache.ibatis.annotations.*; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* 用于存储设备通道信息 |
||||
|
*/ |
||||
|
@Mapper |
||||
|
public interface DeviceChannelMapper { |
||||
|
|
||||
|
@Insert("INSERT INTO device_channel (channelId, deviceId, name, manufacture, model, owner, civilCode, block, " + |
||||
|
"address, parental, parentId, safetyWay, registerWay, certNum, certifiable, errCode, secrecy, " + |
||||
|
"ipAddress, port, password, PTZType, status) " + |
||||
|
"VALUES ('${channelId}', '${deviceId}', '${name}', '${manufacture}', '${model}', '${owner}', '${civilCode}', '${block}'," + |
||||
|
"'${address}', ${parental}, '${parentId}', ${safetyWay}, ${registerWay}, '${certNum}', ${certifiable}, ${errCode}, '${secrecy}', " + |
||||
|
"'${ipAddress}', ${port}, '${password}', ${PTZType}, ${status})") |
||||
|
int add(DeviceChannel channel); |
||||
|
|
||||
|
@Update("UPDATE device_channel " + |
||||
|
"SET name=#{name}, manufacture=#{manufacture}, model=#{model}, owner=#{owner}, civilCode=#{civilCode}, " + |
||||
|
"block=#{block}, address=#{address}, parental=#{parental}, parentId=#{parentId}, safetyWay=#{safetyWay}, " + |
||||
|
"registerWay=#{registerWay}, certNum=#{certNum}, certifiable=#{certifiable}, errCode=#{errCode}, secrecy=#{secrecy}, " + |
||||
|
"ipAddress=#{ipAddress}, port=#{port}, password=#{password}, PTZType=#{PTZType}, status=#{status}, streamId=#{streamId}, " + |
||||
|
"hasAudio=#{hasAudio}" + |
||||
|
"WHERE deviceId=#{deviceId} AND channelId=#{channelId}") |
||||
|
int update(DeviceChannel channel); |
||||
|
|
||||
|
@Select(value = {" <script>" + |
||||
|
"SELECT * FROM ( "+ |
||||
|
" SELECT * , (SELECT count(0) FROM device_channel WHERE parentId=dc.channelId) as subCount FROM device_channel dc " + |
||||
|
" WHERE dc.deviceId=#{deviceId} " + |
||||
|
" <if test=\"query != null\"> AND (dc.channelId LIKE '%${query}%' OR dc.name LIKE '%${query}%' OR dc.name LIKE '%${query}%')</if> " + |
||||
|
" <if test=\"parentChannelId != null\"> AND dc.parentId=#{parentChannelId} </if> " + |
||||
|
" <if test=\"online == true\" > AND dc.status=1</if>" + |
||||
|
" <if test=\"online == false\" > AND dc.status=0</if>) dcr" + |
||||
|
" WHERE 1=1 " + |
||||
|
" <if test=\"hasSubChannel == true\" > AND subCount >0</if>" + |
||||
|
" <if test=\"hasSubChannel == false\" > AND subCount=0</if>" + |
||||
|
" </script>"}) |
||||
|
List<DeviceChannel> queryChannelsByDeviceId(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, Boolean online); |
||||
|
|
||||
|
@Select("SELECT * FROM device_channel WHERE deviceId=#{deviceId} AND channelId=#{channelId}") |
||||
|
DeviceChannel queryChannel(String deviceId, String channelId); |
||||
|
|
||||
|
@Delete("DELETE FROM device_channel WHERE deviceId=#{deviceId}") |
||||
|
int cleanChannelsByDeviceId(String deviceId); |
||||
|
|
||||
|
} |
@ -0,0 +1,66 @@ |
|||||
|
package com.genersoft.iot.vmp.storager.dao; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import org.apache.ibatis.annotations.*; |
||||
|
import org.springframework.stereotype.Repository; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* 用于存储设备信息 |
||||
|
*/ |
||||
|
@Mapper |
||||
|
@Repository |
||||
|
public interface DeviceMapper { |
||||
|
|
||||
|
@Select("SELECT * FROM device WHERE deviceId = #{deviceId}") |
||||
|
Device getDeviceByDeviceId(String deviceId); |
||||
|
|
||||
|
@Insert("INSERT INTO device (" + |
||||
|
"deviceId, " + |
||||
|
"name, " + |
||||
|
"manufacturer, " + |
||||
|
"model, " + |
||||
|
"firmware, " + |
||||
|
"transport," + |
||||
|
"streamMode," + |
||||
|
"ip," + |
||||
|
"port," + |
||||
|
"hostAddress," + |
||||
|
"online" + |
||||
|
") VALUES (" + |
||||
|
"#{deviceId}," + |
||||
|
"#{name}," + |
||||
|
"#{manufacturer}," + |
||||
|
"#{model}," + |
||||
|
"#{firmware}," + |
||||
|
"#{transport}," + |
||||
|
"#{streamMode}," + |
||||
|
"#{ip}," + |
||||
|
"#{port}," + |
||||
|
"#{hostAddress}," + |
||||
|
"#{online}" + |
||||
|
")") |
||||
|
int add(Device device); |
||||
|
|
||||
|
|
||||
|
@Update("UPDATE device " + |
||||
|
"SET name=#{name}, " + |
||||
|
"manufacturer=#{manufacturer}," + |
||||
|
"model=#{model}," + |
||||
|
"firmware=#{firmware}, " + |
||||
|
"transport=#{transport}," + |
||||
|
"streamMode=#{streamMode}, " + |
||||
|
"ip=#{ip}, " + |
||||
|
"port=#{port}, " + |
||||
|
"hostAddress=#{hostAddress}, " + |
||||
|
"online=#{online} " + |
||||
|
"WHERE deviceId=#{deviceId}") |
||||
|
int update(Device device); |
||||
|
|
||||
|
@Select("SELECT *, (SELECT count(0) FROM device_channel WHERE deviceId=de.deviceId) as channelCount FROM device de") |
||||
|
List<Device> getDevices(); |
||||
|
|
||||
|
@Delete("DELETE FROM device WHERE deviceId=#{deviceId}") |
||||
|
int del(String deviceId); |
||||
|
} |
@ -0,0 +1,166 @@ |
|||||
|
package com.genersoft.iot.vmp.storager.impl; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.common.StreamInfo; |
||||
|
import com.genersoft.iot.vmp.common.VideoManagerConstants; |
||||
|
import com.genersoft.iot.vmp.conf.MediaServerConfig; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; |
||||
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
||||
|
import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper; |
||||
|
import com.genersoft.iot.vmp.utils.redis.RedisUtil; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import java.util.HashMap; |
||||
|
import java.util.HashSet; |
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
@Component |
||||
|
public class RedisCatchStorageImpl implements IRedisCatchStorage { |
||||
|
|
||||
|
@Autowired |
||||
|
private RedisUtil redis; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeviceChannelMapper deviceChannelMapper; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 开始播放时将流存入redis |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
@Override |
||||
|
public boolean startPlay(StreamInfo stream) { |
||||
|
return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, stream.getStreamId(),stream.getDeviceID(), stream.getCahnnelId()), |
||||
|
stream); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 停止播放时从redis删除 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
@Override |
||||
|
public boolean stopPlay(StreamInfo streamInfo) { |
||||
|
if (streamInfo == null) return false; |
||||
|
DeviceChannel deviceChannel = deviceChannelMapper.queryChannel(streamInfo.getDeviceID(), streamInfo.getCahnnelId()); |
||||
|
if (deviceChannel != null) { |
||||
|
deviceChannel.setStreamId(null); |
||||
|
deviceChannel.setDeviceId(streamInfo.getDeviceID()); |
||||
|
deviceChannelMapper.update(deviceChannel); |
||||
|
} |
||||
|
return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, |
||||
|
streamInfo.getStreamId(), |
||||
|
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.getStreamId(), |
||||
|
streamInfo.getDeviceID(), |
||||
|
streamInfo.getCahnnelId())); |
||||
|
} |
||||
|
@Override |
||||
|
public StreamInfo queryPlayByStreamId(String steamId) { |
||||
|
List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, steamId)); |
||||
|
if (playLeys == null || playLeys.size() == 0) return null; |
||||
|
return (StreamInfo)redis.get(playLeys.get(0).toString()); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public StreamInfo queryPlaybackByStreamId(String steamId) { |
||||
|
List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAY_BLACK_PREFIX, steamId)); |
||||
|
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 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> players = redis.scan(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId)); |
||||
|
if (players.size() == 0) return streamInfos; |
||||
|
for (int i = 0; i < players.size(); i++) { |
||||
|
String key = (String) players.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.getStreamId(),stream.getDeviceID(), stream.getCahnnelId()), |
||||
|
stream); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
@Override |
||||
|
public boolean stopPlayback(StreamInfo streamInfo) { |
||||
|
if (streamInfo == null) return false; |
||||
|
DeviceChannel deviceChannel = deviceChannelMapper.queryChannel(streamInfo.getDeviceID(), streamInfo.getCahnnelId()); |
||||
|
if (deviceChannel != null) { |
||||
|
deviceChannel.setStreamId(null); |
||||
|
deviceChannel.setDeviceId(streamInfo.getDeviceID()); |
||||
|
deviceChannelMapper.update(deviceChannel); |
||||
|
} |
||||
|
return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, |
||||
|
streamInfo.getStreamId(), |
||||
|
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) { |
||||
|
playLeys = redis.scan(String.format("%S_*_*_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, |
||||
|
deviceId)); |
||||
|
} |
||||
|
if (playLeys == null || playLeys.size() == 0) return null; |
||||
|
return (StreamInfo)redis.get(playLeys.get(0).toString()); |
||||
|
} |
||||
|
} |
@ -0,0 +1,202 @@ |
|||||
|
package com.genersoft.iot.vmp.storager.impl; |
||||
|
|
||||
|
import java.util.*; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; |
||||
|
import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper; |
||||
|
import com.genersoft.iot.vmp.storager.dao.DeviceMapper; |
||||
|
import com.github.pagehelper.PageHelper; |
||||
|
import com.github.pagehelper.PageInfo; |
||||
|
import io.swagger.models.auth.In; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
||||
|
import org.springframework.util.StringUtils; |
||||
|
|
||||
|
/** |
||||
|
* @Description:视频设备数据存储-jdbc实现 |
||||
|
* @author: swwheihei |
||||
|
* @date: 2020年5月6日 下午2:31:42 |
||||
|
*/ |
||||
|
@Component |
||||
|
public class VideoManagerStoragerImpl implements IVideoManagerStorager { |
||||
|
|
||||
|
@Autowired |
||||
|
private DeviceMapper deviceMapper; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeviceChannelMapper deviceChannelMapper; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 根据设备ID判断设备是否存在 |
||||
|
* |
||||
|
* @param deviceId 设备ID |
||||
|
* @return true:存在 false:不存在 |
||||
|
*/ |
||||
|
@Override |
||||
|
public boolean exists(String deviceId) { |
||||
|
return deviceMapper.getDeviceByDeviceId(deviceId) != null; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 视频设备创建 |
||||
|
* |
||||
|
* @param device 设备对象 |
||||
|
* @return true:创建成功 false:创建失败 |
||||
|
*/ |
||||
|
@Override |
||||
|
public synchronized boolean create(Device device) { |
||||
|
return deviceMapper.add(device) > 0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 视频设备更新 |
||||
|
* |
||||
|
* @param device 设备对象 |
||||
|
* @return true:更新成功 false:更新失败 |
||||
|
*/ |
||||
|
@Override |
||||
|
public synchronized boolean updateDevice(Device device) { |
||||
|
Device deviceByDeviceId = deviceMapper.getDeviceByDeviceId(device.getDeviceId()); |
||||
|
if (deviceByDeviceId == null) { |
||||
|
return deviceMapper.add(device) > 0; |
||||
|
}else { |
||||
|
return deviceMapper.update(device) > 0; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public synchronized void updateChannel(String deviceId, DeviceChannel channel) { |
||||
|
String channelId = channel.getChannelId(); |
||||
|
channel.setDeviceId(deviceId); |
||||
|
DeviceChannel deviceChannel = deviceChannelMapper.queryChannel(deviceId, channelId); |
||||
|
if (deviceChannel == null) { |
||||
|
deviceChannelMapper.add(channel); |
||||
|
}else { |
||||
|
deviceChannelMapper.update(channel); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取设备 |
||||
|
* |
||||
|
* @param deviceId 设备ID |
||||
|
* @return Device 设备对象 |
||||
|
*/ |
||||
|
@Override |
||||
|
public Device queryVideoDevice(String deviceId) { |
||||
|
return deviceMapper.getDeviceByDeviceId(deviceId); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public PageInfo queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, Boolean online, int page, int count) { |
||||
|
// 获取到所有正在播放的流
|
||||
|
PageHelper.startPage(page, count); |
||||
|
List<DeviceChannel> all = deviceChannelMapper.queryChannelsByDeviceId(deviceId, null, query, hasSubChannel, online); |
||||
|
return new PageInfo<>(all); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
@Override |
||||
|
public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) { |
||||
|
return deviceChannelMapper.queryChannelsByDeviceId(deviceId, null,null, null, null); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public PageInfo<DeviceChannel> querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, String online, int page, int count) { |
||||
|
PageHelper.startPage(page, count); |
||||
|
List<DeviceChannel> all = deviceChannelMapper.queryChannelsByDeviceId(deviceId, parentChannelId, null, null, null); |
||||
|
return new PageInfo<>(all); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public DeviceChannel queryChannel(String deviceId, String channelId) { |
||||
|
return deviceChannelMapper.queryChannel(deviceId, channelId); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 获取多个设备 |
||||
|
* |
||||
|
* @param page 当前页数 |
||||
|
* @param count 每页数量 |
||||
|
* @return PageInfo<Device> 分页设备对象数组 |
||||
|
*/ |
||||
|
@Override |
||||
|
public PageInfo<Device> queryVideoDeviceList(int page, int count) { |
||||
|
PageHelper.startPage(page, count); |
||||
|
List<Device> all = deviceMapper.getDevices(); |
||||
|
return new PageInfo<>(all); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取多个设备 |
||||
|
* |
||||
|
* @return List<Device> 设备对象数组 |
||||
|
*/ |
||||
|
@Override |
||||
|
public List<Device> queryVideoDeviceList() { |
||||
|
|
||||
|
List<Device> deviceList = deviceMapper.getDevices(); |
||||
|
return deviceList; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 删除设备 |
||||
|
* |
||||
|
* @param deviceId 设备ID |
||||
|
* @return true:删除成功 false:删除失败 |
||||
|
*/ |
||||
|
@Override |
||||
|
public boolean delete(String deviceId) { |
||||
|
int result = deviceMapper.del(deviceId); |
||||
|
|
||||
|
return result > 0; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 更新设备在线 |
||||
|
* |
||||
|
* @param deviceId 设备ID |
||||
|
* @return true:更新成功 false:更新失败 |
||||
|
*/ |
||||
|
@Override |
||||
|
public synchronized boolean online(String deviceId) { |
||||
|
Device device = deviceMapper.getDeviceByDeviceId(deviceId); |
||||
|
device.setOnline(1); |
||||
|
System.out.println("更新设备在线"); |
||||
|
if (device == null) { |
||||
|
return false; |
||||
|
} |
||||
|
return deviceMapper.update(device) > 0; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 更新设备离线 |
||||
|
* |
||||
|
* @param deviceId 设备ID |
||||
|
* @return true:更新成功 false:更新失败 |
||||
|
*/ |
||||
|
@Override |
||||
|
public synchronized boolean outline(String deviceId) { |
||||
|
Device device = deviceMapper.getDeviceByDeviceId(deviceId); |
||||
|
device.setOnline(0); |
||||
|
System.out.println("更新设备离线"); |
||||
|
return deviceMapper.update(device) > 0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
@Override |
||||
|
public void cleanChannelsForDevice(String deviceId) { |
||||
|
int result = deviceChannelMapper.cleanChannelsByDeviceId(deviceId); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
@ -1,237 +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 com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
|
||||
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; |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public boolean updateParentPlatform(ParentPlatform parentPlatform) { |
|
||||
return false; |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public boolean deleteParentPlatform(ParentPlatform parentPlatform) { |
|
||||
return false; |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public PageResult<ParentPlatform> queryParentPlatformList(int page, int count) { |
|
||||
return null; |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public ParentPlatform queryParentPlatById(String platformGbId) { |
|
||||
return null; |
|
||||
} |
|
||||
} |
|
@ -1,600 +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 com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
|
||||
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) { |
|
||||
playLeys = redis.scan(String.format("%S_*_*_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, |
|
||||
deviceId)); |
|
||||
} |
|
||||
if (playLeys == null || playLeys.size() == 0) return null; |
|
||||
return (StreamInfo)redis.get(playLeys.get(0).toString()); |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public boolean updateParentPlatform(ParentPlatform parentPlatform) { |
|
||||
|
|
||||
// 存储device
|
|
||||
return redis.set(VideoManagerConstants.PLATFORM_PREFIX + parentPlatform.getDeviceGBId(), parentPlatform); |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public boolean deleteParentPlatform(ParentPlatform parentPlatform) { |
|
||||
return redis.del(VideoManagerConstants.PLATFORM_PREFIX + parentPlatform.getDeviceGBId()); |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public PageResult<ParentPlatform> queryParentPlatformList(int page, int count) { |
|
||||
PageResult pageResult = new PageResult<Device>(); |
|
||||
pageResult.setPage(page); |
|
||||
pageResult.setCount(count); |
|
||||
List<ParentPlatform> resultData = new ArrayList<>(); |
|
||||
List<Object> parentPlatformList = redis.scan(VideoManagerConstants.PLATFORM_PREFIX + "*"); |
|
||||
pageResult.setTotal(parentPlatformList.size()); |
|
||||
int maxCount = (page + 1)* count; |
|
||||
for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) { |
|
||||
ParentPlatform parentPlatform =(ParentPlatform)redis.get((String)parentPlatformList.get(i)); |
|
||||
resultData.add(parentPlatform); |
|
||||
|
|
||||
} |
|
||||
pageResult.setData(resultData); |
|
||||
return pageResult; |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public ParentPlatform queryParentPlatById(String platformGbId) { |
|
||||
return (ParentPlatform)redis.get(VideoManagerConstants.PLATFORM_PREFIX + platformGbId); |
|
||||
} |
|
||||
} |
|
@ -1,401 +0,0 @@ |
|||||
package com.genersoft.iot.vmp.vmanager.device.entity; |
|
||||
|
|
||||
import java.util.List; |
|
||||
|
|
||||
import javax.persistence.Column; |
|
||||
import javax.persistence.Id; |
|
||||
import javax.persistence.Table; |
|
||||
import javax.persistence.Transient; |
|
||||
import javax.validation.constraints.Max; |
|
||||
import javax.validation.constraints.NotNull; |
|
||||
import javax.validation.constraints.Size; |
|
||||
|
|
||||
import io.swagger.annotations.ApiModel; |
|
||||
import io.swagger.annotations.ApiModelProperty; |
|
||||
|
|
||||
/** |
|
||||
* @Description:视频设备信息 |
|
||||
* @author: songww |
|
||||
* @date: 2020年5月8日 下午2:05:56 |
|
||||
*/ |
|
||||
@ApiModel(value = "视频设备信息", description = "视频设备信息") |
|
||||
@Table(name="VMP_VIDEODEVICES") |
|
||||
public class Device { |
|
||||
|
|
||||
/** |
|
||||
* 设备Id |
|
||||
*/ |
|
||||
@ApiModelProperty("设备编号") |
|
||||
@Id |
|
||||
@Column(name="DEVICE_ID") |
|
||||
@NotNull(message = "deviceId 不能为 null") |
|
||||
@Size(min = 4, max = 32, message = "deviceId 必须大于 4 位并且小于 32 位") |
|
||||
private String deviceId; |
|
||||
|
|
||||
/** |
|
||||
* 设备名称 |
|
||||
*/ |
|
||||
@ApiModelProperty("设备名称") |
|
||||
@Column(name="DEVICE_NAME") |
|
||||
@Size(max = 32, message = "deviceName 必须小于 32 位") |
|
||||
private String deviceName; |
|
||||
|
|
||||
/** |
|
||||
* 生产厂商 |
|
||||
*/ |
|
||||
@ApiModelProperty("生产厂商") |
|
||||
@Column(name="MANUFACTURER") |
|
||||
@Size(max = 64, message = "manufacturer 必须小于 64 位") |
|
||||
private String manufacturer; |
|
||||
|
|
||||
/** |
|
||||
* 型号 |
|
||||
*/ |
|
||||
@ApiModelProperty("型号") |
|
||||
@Column(name="MODEL") |
|
||||
@Size(max = 64, message = "manufacturer 必须小于 64 位") |
|
||||
private String model; |
|
||||
|
|
||||
/** |
|
||||
* 固件版本 |
|
||||
*/ |
|
||||
@ApiModelProperty("固件版本") |
|
||||
@Column(name="FIRMWARE") |
|
||||
@Size(max = 64, message = "firmware 必须小于 64 位") |
|
||||
private String firmware; |
|
||||
|
|
||||
/** |
|
||||
* 通信协议 |
|
||||
* GB28181 ONVIF |
|
||||
*/ |
|
||||
@ApiModelProperty("通信协议") |
|
||||
@Column(name="PROTOCOL") |
|
||||
@NotNull(message = "protocol 不能为 null") |
|
||||
@Size(max = 16, message = "protocol 必须小于 16 位") |
|
||||
private String protocol; |
|
||||
|
|
||||
/** |
|
||||
* SIP 传输协议 |
|
||||
* UDP/TCP |
|
||||
*/ |
|
||||
@ApiModelProperty("SIP 传输协议") |
|
||||
@Column(name="TRANSPORT") |
|
||||
@Size(min = 3,max = 3 ,message = "transport 必须为 3 位") |
|
||||
private String transport; |
|
||||
|
|
||||
/** |
|
||||
* 数据流传输模式 |
|
||||
* UDP:udp传输 |
|
||||
* TCP-ACTIVE:tcp主动模式 |
|
||||
* TCP-PASSIVE:tcp被动模式 |
|
||||
*/ |
|
||||
@ApiModelProperty("数据流传输模式") |
|
||||
@Column(name="STREAM_MODE") |
|
||||
@Size(max = 64, message = "streamMode 必须小于 16 位") |
|
||||
private String streamMode; |
|
||||
|
|
||||
/** |
|
||||
* IP地址 |
|
||||
*/ |
|
||||
@ApiModelProperty("IP地址") |
|
||||
@Column(name="IP") |
|
||||
@Size(max = 15, message = "streamMode 必须小于 15 位") |
|
||||
private String ip; |
|
||||
|
|
||||
/** |
|
||||
* 端口号 |
|
||||
*/ |
|
||||
@ApiModelProperty("端口号") |
|
||||
@Column(name="PORT") |
|
||||
@Max(value = 65535,message = "port 最大值为 65535") |
|
||||
private Integer port; |
|
||||
|
|
||||
/** |
|
||||
* 在线状态 1在线, 0离线 |
|
||||
*/ |
|
||||
@ApiModelProperty("在线状态") |
|
||||
@Size(min = 1,max = 1 ,message = "online 必须为 1 位") |
|
||||
@Column(name="ONLINE") |
|
||||
private String online; |
|
||||
|
|
||||
/** |
|
||||
* 通道数量 |
|
||||
*/ |
|
||||
@ApiModelProperty("通道数量") |
|
||||
@Column(name="CHANNEL_SUM") |
|
||||
@Max(value = 1000000000,message = "channelSum 最大值为 1000000000") |
|
||||
private Integer channelSum; |
|
||||
|
|
||||
@Override |
|
||||
public String toString() { |
|
||||
return "Device{" + |
|
||||
"deviceId='" + deviceId + '\'' + |
|
||||
", deviceName='" + deviceName + '\'' + |
|
||||
", manufacturer='" + manufacturer + '\'' + |
|
||||
", model='" + model + '\'' + |
|
||||
", firmware='" + firmware + '\'' + |
|
||||
", protocol='" + protocol + '\'' + |
|
||||
", transport='" + transport + '\'' + |
|
||||
", streamMode='" + streamMode + '\'' + |
|
||||
", ip='" + ip + '\'' + |
|
||||
", port=" + port + |
|
||||
", online='" + online + '\'' + |
|
||||
", channelSum=" + channelSum + |
|
||||
", createTime='" + createTime + '\'' + |
|
||||
", registerTime='" + registerTime + '\'' + |
|
||||
", heartbeatTime='" + heartbeatTime + '\'' + |
|
||||
", updateTime='" + updateTime + '\'' + |
|
||||
", updatePerson='" + updatePerson + '\'' + |
|
||||
", syncTime='" + syncTime + '\'' + |
|
||||
", syncPerson='" + syncPerson + '\'' + |
|
||||
", username='" + username + '\'' + |
|
||||
", password='" + password + '\'' + |
|
||||
", channelList=" + channelList + |
|
||||
'}'; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 创建时间 |
|
||||
*/ |
|
||||
@ApiModelProperty("创建时间") |
|
||||
@Column(name="CREATE_TIME") |
|
||||
private String createTime; |
|
||||
|
|
||||
/** |
|
||||
* 注册时间 |
|
||||
*/ |
|
||||
@ApiModelProperty("注册时间") |
|
||||
@Column(name="REGISTER_TIME") |
|
||||
private String registerTime; |
|
||||
|
|
||||
/** |
|
||||
* 心跳时间 |
|
||||
*/ |
|
||||
@ApiModelProperty("心跳时间") |
|
||||
@Column(name="HEARTBEAT_TIME") |
|
||||
private String heartbeatTime; |
|
||||
|
|
||||
/** |
|
||||
* 修改时间 |
|
||||
*/ |
|
||||
@ApiModelProperty("更新时间") |
|
||||
@Column(name="UPDATE_TIME") |
|
||||
private String updateTime; |
|
||||
|
|
||||
/** |
|
||||
* 修改人 |
|
||||
*/ |
|
||||
@ApiModelProperty("修改人") |
|
||||
@Column(name="UPDATE_PERSON") |
|
||||
private String updatePerson; |
|
||||
|
|
||||
/** |
|
||||
* 同步时间 |
|
||||
*/ |
|
||||
@ApiModelProperty("同步时间") |
|
||||
@Column(name="SYNC_TIME") |
|
||||
private String syncTime; |
|
||||
|
|
||||
/** |
|
||||
* 同步人 |
|
||||
*/ |
|
||||
@ApiModelProperty("同步人") |
|
||||
@Column(name="SYNC_PERSON") |
|
||||
private String syncPerson; |
|
||||
|
|
||||
/** |
|
||||
* ONVIF协议-用户名 |
|
||||
*/ |
|
||||
@ApiModelProperty("用户名") |
|
||||
@Column(name="USERNAME") |
|
||||
@Size(max = 32, message = "username 必须小于 32 位") |
|
||||
private String username; |
|
||||
|
|
||||
/** |
|
||||
* ONVIF协议-密码 |
|
||||
*/ |
|
||||
@ApiModelProperty("密码") |
|
||||
@Size(max = 32, message = "password 必须小于 32 位") |
|
||||
@Column(name="PASSWORD") |
|
||||
private String password; |
|
||||
|
|
||||
@Transient |
|
||||
private List<DeviceChannel> channelList; |
|
||||
|
|
||||
|
|
||||
public String getDeviceId() { |
|
||||
return deviceId; |
|
||||
} |
|
||||
|
|
||||
public void setDeviceId(String deviceId) { |
|
||||
this.deviceId = deviceId; |
|
||||
} |
|
||||
|
|
||||
public String getDeviceName() { |
|
||||
return deviceName; |
|
||||
} |
|
||||
|
|
||||
public void setDeviceName(String deviceName) { |
|
||||
this.deviceName = deviceName; |
|
||||
} |
|
||||
|
|
||||
public String getManufacturer() { |
|
||||
return manufacturer; |
|
||||
} |
|
||||
|
|
||||
public void setManufacturer(String manufacturer) { |
|
||||
this.manufacturer = manufacturer; |
|
||||
} |
|
||||
|
|
||||
public String getModel() { |
|
||||
return model; |
|
||||
} |
|
||||
|
|
||||
public void setModel(String model) { |
|
||||
this.model = model; |
|
||||
} |
|
||||
|
|
||||
public String getFirmware() { |
|
||||
return firmware; |
|
||||
} |
|
||||
|
|
||||
public void setFirmware(String firmware) { |
|
||||
this.firmware = firmware; |
|
||||
} |
|
||||
|
|
||||
public String getProtocol() { |
|
||||
return protocol; |
|
||||
} |
|
||||
|
|
||||
public void setProtocol(String protocol) { |
|
||||
this.protocol = protocol; |
|
||||
} |
|
||||
|
|
||||
public String getTransport() { |
|
||||
return transport; |
|
||||
} |
|
||||
|
|
||||
public void setTransport(String transport) { |
|
||||
this.transport = transport; |
|
||||
} |
|
||||
|
|
||||
public String getStreamMode() { |
|
||||
return streamMode; |
|
||||
} |
|
||||
|
|
||||
public void setStreamMode(String streamMode) { |
|
||||
this.streamMode = streamMode; |
|
||||
} |
|
||||
|
|
||||
public String getIp() { |
|
||||
return ip; |
|
||||
} |
|
||||
|
|
||||
public void setIp(String ip) { |
|
||||
this.ip = ip; |
|
||||
} |
|
||||
|
|
||||
public Integer getPort() { |
|
||||
return port; |
|
||||
} |
|
||||
|
|
||||
public void setPort(Integer port) { |
|
||||
this.port = port; |
|
||||
} |
|
||||
|
|
||||
public String getOnline() { |
|
||||
return online; |
|
||||
} |
|
||||
|
|
||||
public void setOnline(String online) { |
|
||||
this.online = online; |
|
||||
} |
|
||||
|
|
||||
public Integer getChannelSum() { |
|
||||
return channelSum; |
|
||||
} |
|
||||
|
|
||||
public void setChannelSum(Integer channelSum) { |
|
||||
this.channelSum = channelSum; |
|
||||
} |
|
||||
|
|
||||
public String getCreateTime() { |
|
||||
return createTime; |
|
||||
} |
|
||||
|
|
||||
public void setCreateTime(String createTime) { |
|
||||
this.createTime = createTime; |
|
||||
} |
|
||||
|
|
||||
public String getRegisterTime() { |
|
||||
return registerTime; |
|
||||
} |
|
||||
|
|
||||
public void setRegisterTime(String registerTime) { |
|
||||
this.registerTime = registerTime; |
|
||||
} |
|
||||
|
|
||||
public String getHeartbeatTime() { |
|
||||
return heartbeatTime; |
|
||||
} |
|
||||
|
|
||||
public void setHeartbeatTime(String heartbeatTime) { |
|
||||
this.heartbeatTime = heartbeatTime; |
|
||||
} |
|
||||
|
|
||||
public String getUpdateTime() { |
|
||||
return updateTime; |
|
||||
} |
|
||||
|
|
||||
public void setUpdateTime(String updateTime) { |
|
||||
this.updateTime = updateTime; |
|
||||
} |
|
||||
|
|
||||
public String getUpdatePerson() { |
|
||||
return updatePerson; |
|
||||
} |
|
||||
|
|
||||
public void setUpdatePerson(String updatePerson) { |
|
||||
this.updatePerson = updatePerson; |
|
||||
} |
|
||||
|
|
||||
public String getSyncTime() { |
|
||||
return syncTime; |
|
||||
} |
|
||||
|
|
||||
public void setSyncTime(String syncTime) { |
|
||||
this.syncTime = syncTime; |
|
||||
} |
|
||||
|
|
||||
public String getSyncPerson() { |
|
||||
return syncPerson; |
|
||||
} |
|
||||
|
|
||||
public void setSyncPerson(String syncPerson) { |
|
||||
this.syncPerson = syncPerson; |
|
||||
} |
|
||||
|
|
||||
public String getUsername() { |
|
||||
return username; |
|
||||
} |
|
||||
|
|
||||
public void setUsername(String username) { |
|
||||
this.username = username; |
|
||||
} |
|
||||
|
|
||||
public String getPassword() { |
|
||||
return password; |
|
||||
} |
|
||||
|
|
||||
public void setPassword(String password) { |
|
||||
this.password = password; |
|
||||
} |
|
||||
|
|
||||
public List<DeviceChannel> getChannelList() { |
|
||||
return channelList; |
|
||||
} |
|
||||
|
|
||||
public void setChannelList(List<DeviceChannel> channelList) { |
|
||||
this.channelList = channelList; |
|
||||
} |
|
||||
} |
|
@ -1,385 +0,0 @@ |
|||||
package com.genersoft.iot.vmp.vmanager.device.entity; |
|
||||
|
|
||||
import javax.persistence.Column; |
|
||||
import javax.persistence.Id; |
|
||||
import javax.persistence.Table; |
|
||||
|
|
||||
import io.swagger.annotations.ApiModel; |
|
||||
import io.swagger.annotations.ApiModelProperty; |
|
||||
|
|
||||
/** |
|
||||
* @Description:设备通道信息 |
|
||||
* @author: songww |
|
||||
* @date: 2020年5月20日 下午9:00:46 |
|
||||
*/ |
|
||||
@ApiModel(value = "设备通道信息", description = "设备通道信息") |
|
||||
@Table(name="VMP_VIDEOCHANNELS") |
|
||||
public class DeviceChannel { |
|
||||
|
|
||||
/** |
|
||||
* 通道编号 |
|
||||
*/ |
|
||||
@ApiModelProperty("通道编号") |
|
||||
@Id |
|
||||
@Column(name="CHANNEL_ID") |
|
||||
private String channelId; |
|
||||
|
|
||||
/** |
|
||||
* 设备编号 |
|
||||
*/ |
|
||||
@ApiModelProperty("设备编号") |
|
||||
@Column(name="DEVICE_ID") |
|
||||
private String deviceId; |
|
||||
|
|
||||
/** |
|
||||
* 通道名 |
|
||||
*/ |
|
||||
@ApiModelProperty("通道名") |
|
||||
@Column(name="CHANNEL_NAME") |
|
||||
private String channelName; |
|
||||
|
|
||||
/** |
|
||||
* 生产厂商 |
|
||||
*/ |
|
||||
@ApiModelProperty("生产厂商") |
|
||||
@Column(name="MANUFACTURER") |
|
||||
private String manufacture; |
|
||||
|
|
||||
/** |
|
||||
* 型号 |
|
||||
*/ |
|
||||
@ApiModelProperty("型号") |
|
||||
@Column(name="MODEL") |
|
||||
private String model; |
|
||||
|
|
||||
/** |
|
||||
* 设备归属 |
|
||||
*/ |
|
||||
@ApiModelProperty("设备归属") |
|
||||
@Column(name="OWNER") |
|
||||
private String owner; |
|
||||
|
|
||||
/** |
|
||||
* 行政区域 |
|
||||
*/ |
|
||||
@ApiModelProperty("行政区域") |
|
||||
@Column(name="CIVIL_CODE") |
|
||||
private String civilCode; |
|
||||
|
|
||||
/** |
|
||||
* 警区 |
|
||||
*/ |
|
||||
@ApiModelProperty("警区") |
|
||||
@Column(name="BLOCK") |
|
||||
private String block; |
|
||||
|
|
||||
/** |
|
||||
* 安装地址 |
|
||||
*/ |
|
||||
@ApiModelProperty("安装地址") |
|
||||
@Column(name="ADDRESS") |
|
||||
private String address; |
|
||||
|
|
||||
/** |
|
||||
* 是否有子设备 1有, 0没有 |
|
||||
*/ |
|
||||
@ApiModelProperty("是否有子设备") |
|
||||
@Column(name="PARENTAL") |
|
||||
private String parental; |
|
||||
|
|
||||
/** |
|
||||
* 父级id |
|
||||
*/ |
|
||||
@ApiModelProperty("父级编码") |
|
||||
@Column(name="PARENT_ID") |
|
||||
private String parentId; |
|
||||
|
|
||||
/** |
|
||||
* 信令安全模式 缺省为0; 0:不采用; 2: S/MIME签名方式; 3: S/ MIME加密签名同时采用方式; 4:数字摘要方式 |
|
||||
*/ |
|
||||
@ApiModelProperty("信令安全模式") |
|
||||
@Column(name="SAFETY_WAY") |
|
||||
private String safetyWay; |
|
||||
|
|
||||
/** |
|
||||
* 注册方式 缺省为1;1:符合IETFRFC3261标准的认证注册模 式; 2:基于口令的双向认证注册模式; 3:基于数字证书的双向认证注册模式 |
|
||||
*/ |
|
||||
@ApiModelProperty("注册方式") |
|
||||
@Column(name="REGISTER_WAY") |
|
||||
private String registerWay; |
|
||||
|
|
||||
/** |
|
||||
* 证书序列号 |
|
||||
*/ |
|
||||
@ApiModelProperty("证书序列号") |
|
||||
@Column(name="CERT_NUM") |
|
||||
private String certNum; |
|
||||
|
|
||||
/** |
|
||||
* 证书有效标识 缺省为0;证书有效标识:0:无效1: 有效 |
|
||||
*/ |
|
||||
@ApiModelProperty("证书有效标识") |
|
||||
@Column(name="CERT_VALID") |
|
||||
private String certValid; |
|
||||
|
|
||||
/** |
|
||||
* 证书无效原因码 |
|
||||
*/ |
|
||||
@ApiModelProperty("证书无效原因码") |
|
||||
@Column(name="CERT_ERRCODE") |
|
||||
private String certErrCode; |
|
||||
|
|
||||
/** |
|
||||
* 证书终止有效期 |
|
||||
*/ |
|
||||
@ApiModelProperty("证书终止有效期") |
|
||||
@Column(name="CERT_ENDTIME") |
|
||||
private String certEndTime; |
|
||||
|
|
||||
/** |
|
||||
* 保密属性 缺省为0; 0:不涉密, 1:涉密 |
|
||||
*/ |
|
||||
@ApiModelProperty("保密属性") |
|
||||
@Column(name="SECRECY") |
|
||||
private String secrecy; |
|
||||
|
|
||||
/** |
|
||||
* IP地址 |
|
||||
*/ |
|
||||
@ApiModelProperty("IP地址") |
|
||||
@Column(name="IP") |
|
||||
private String ip; |
|
||||
|
|
||||
/** |
|
||||
* 端口号 |
|
||||
*/ |
|
||||
@ApiModelProperty("端口号") |
|
||||
@Column(name="PORT") |
|
||||
private Integer port; |
|
||||
|
|
||||
/** |
|
||||
* 密码 |
|
||||
*/ |
|
||||
@ApiModelProperty("密码") |
|
||||
@Column(name="PASSWORD") |
|
||||
private String password; |
|
||||
|
|
||||
/** |
|
||||
* 在线/离线 |
|
||||
* 1在线,0离线 |
|
||||
* 默认在线 |
|
||||
* 信令: |
|
||||
* <Status>ON</Status> |
|
||||
* <Status>OFF</Status> |
|
||||
* 遇到过NVR下的IPC下发信令可以推流, 但是 Status 响应 OFF |
|
||||
*/ |
|
||||
@ApiModelProperty("状态") |
|
||||
@Column(name="ONLINE") |
|
||||
private String online; |
|
||||
|
|
||||
/** |
|
||||
* 经度 |
|
||||
*/ |
|
||||
@ApiModelProperty("经度") |
|
||||
@Column(name="LONGITUDE") |
|
||||
private double longitude; |
|
||||
|
|
||||
/** |
|
||||
* 纬度 |
|
||||
*/ |
|
||||
@ApiModelProperty("纬度") |
|
||||
@Column(name="LATITUDE") |
|
||||
private double latitude; |
|
||||
|
|
||||
public String getChannelId() { |
|
||||
return channelId; |
|
||||
} |
|
||||
|
|
||||
public void setChannelId(String channelId) { |
|
||||
this.channelId = channelId; |
|
||||
} |
|
||||
|
|
||||
public String getDeviceId() { |
|
||||
return deviceId; |
|
||||
} |
|
||||
|
|
||||
public void setDeviceId(String deviceId) { |
|
||||
this.deviceId = deviceId; |
|
||||
} |
|
||||
|
|
||||
public String getChannelName() { |
|
||||
return channelName; |
|
||||
} |
|
||||
|
|
||||
public void setChannelName(String channelName) { |
|
||||
this.channelName = channelName; |
|
||||
} |
|
||||
|
|
||||
public String getManufacture() { |
|
||||
return manufacture; |
|
||||
} |
|
||||
|
|
||||
public void setManufacture(String manufacture) { |
|
||||
this.manufacture = manufacture; |
|
||||
} |
|
||||
|
|
||||
public String getModel() { |
|
||||
return model; |
|
||||
} |
|
||||
|
|
||||
public void setModel(String model) { |
|
||||
this.model = model; |
|
||||
} |
|
||||
|
|
||||
public String getOwner() { |
|
||||
return owner; |
|
||||
} |
|
||||
|
|
||||
public void setOwner(String owner) { |
|
||||
this.owner = owner; |
|
||||
} |
|
||||
|
|
||||
public String getCivilCode() { |
|
||||
return civilCode; |
|
||||
} |
|
||||
|
|
||||
public void setCivilCode(String civilCode) { |
|
||||
this.civilCode = civilCode; |
|
||||
} |
|
||||
|
|
||||
public String getBlock() { |
|
||||
return block; |
|
||||
} |
|
||||
|
|
||||
public void setBlock(String block) { |
|
||||
this.block = block; |
|
||||
} |
|
||||
|
|
||||
public String getAddress() { |
|
||||
return address; |
|
||||
} |
|
||||
|
|
||||
public void setAddress(String address) { |
|
||||
this.address = address; |
|
||||
} |
|
||||
|
|
||||
public String getParental() { |
|
||||
return parental; |
|
||||
} |
|
||||
|
|
||||
public void setParental(String parental) { |
|
||||
this.parental = parental; |
|
||||
} |
|
||||
|
|
||||
public String getParentId() { |
|
||||
return parentId; |
|
||||
} |
|
||||
|
|
||||
public void setParentId(String parentId) { |
|
||||
this.parentId = parentId; |
|
||||
} |
|
||||
|
|
||||
public String getSafetyWay() { |
|
||||
return safetyWay; |
|
||||
} |
|
||||
|
|
||||
public void setSafetyWay(String safetyWay) { |
|
||||
this.safetyWay = safetyWay; |
|
||||
} |
|
||||
|
|
||||
public String getRegisterWay() { |
|
||||
return registerWay; |
|
||||
} |
|
||||
|
|
||||
public void setRegisterWay(String registerWay) { |
|
||||
this.registerWay = registerWay; |
|
||||
} |
|
||||
|
|
||||
public String getCertNum() { |
|
||||
return certNum; |
|
||||
} |
|
||||
|
|
||||
public void setCertNum(String certNum) { |
|
||||
this.certNum = certNum; |
|
||||
} |
|
||||
|
|
||||
public String getCertValid() { |
|
||||
return certValid; |
|
||||
} |
|
||||
|
|
||||
public void setCertValid(String certValid) { |
|
||||
this.certValid = certValid; |
|
||||
} |
|
||||
|
|
||||
public String getCertErrCode() { |
|
||||
return certErrCode; |
|
||||
} |
|
||||
|
|
||||
public void setCertErrCode(String certErrCode) { |
|
||||
this.certErrCode = certErrCode; |
|
||||
} |
|
||||
|
|
||||
public String getCertEndTime() { |
|
||||
return certEndTime; |
|
||||
} |
|
||||
|
|
||||
public void setCertEndTime(String certEndTime) { |
|
||||
this.certEndTime = certEndTime; |
|
||||
} |
|
||||
|
|
||||
public String getSecrecy() { |
|
||||
return secrecy; |
|
||||
} |
|
||||
|
|
||||
public void setSecrecy(String secrecy) { |
|
||||
this.secrecy = secrecy; |
|
||||
} |
|
||||
|
|
||||
public String getIp() { |
|
||||
return ip; |
|
||||
} |
|
||||
|
|
||||
public void setIp(String ip) { |
|
||||
this.ip = ip; |
|
||||
} |
|
||||
|
|
||||
public Integer getPort() { |
|
||||
return port; |
|
||||
} |
|
||||
|
|
||||
public void setPort(Integer port) { |
|
||||
this.port = port; |
|
||||
} |
|
||||
|
|
||||
public String getPassword() { |
|
||||
return password; |
|
||||
} |
|
||||
|
|
||||
public void setPassword(String password) { |
|
||||
this.password = password; |
|
||||
} |
|
||||
|
|
||||
public String getOnline() { |
|
||||
return online; |
|
||||
} |
|
||||
|
|
||||
public void setOnline(String online) { |
|
||||
this.online = online; |
|
||||
} |
|
||||
|
|
||||
public double getLongitude() { |
|
||||
return longitude; |
|
||||
} |
|
||||
|
|
||||
public void setLongitude(double longitude) { |
|
||||
this.longitude = longitude; |
|
||||
} |
|
||||
|
|
||||
public double getLatitude() { |
|
||||
return latitude; |
|
||||
} |
|
||||
|
|
||||
public void setLatitude(double latitude) { |
|
||||
this.latitude = latitude; |
|
||||
} |
|
||||
} |
|
Binary file not shown.
Loading…
Reference in new issue