From 57fd18cd7c842a821bd03fafe2a954c605e387f6 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期三, 30 九月 2020 17:59:11 +0800 Subject: [PATCH] 增加分页,搜索,等 --- src/main/java/com/genersoft/iot/vmp/conf/VManagerConfig.java | 2 .idea/encodings.xml | 1 src/main/java/com/genersoft/iot/vmp/storager/VodeoMannagerTask.java | 17 + src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java | 695 +++++++++++++++++++++++++++------------------ README.md | 29 - src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java | 17 + src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java | 12 src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java | 13 src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java | 45 ++ src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java | 6 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java | 2 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java | 7 src/main/resources/application.yml | 6 13 files changed, 533 insertions(+), 319 deletions(-) diff --git a/.idea/encodings.xml b/.idea/encodings.xml index fade66b..e470467 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -3,5 +3,6 @@ <component name="Encoding"> <file url="file://$PROJECT_DIR$" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" /> + <file url="file://$PROJECT_DIR$/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java" charset="UTF-8" /> </component> </project> \ No newline at end of file diff --git a/README.md b/README.md index 1f1dbc9..8eb641f 100644 --- a/README.md +++ b/README.md @@ -6,38 +6,25 @@ ### fork鑷� [swwheihei/wvp-GB28181](https://github.com/swwheihei/wvp-GB28181) # 搴旂敤鍦烘櫙锛� -涓昏搴旂敤鍦↖PC绛夎澶囨病鏈夊浐瀹欼P鍦板潃锛屼絾闇�瑕佸湪浜掕仈缃戜腑瑙傜湅鐨勫満鏅�� -瑕佹眰IPC璁惧鍙互璁块棶浜掕仈缃戯紝鏈変簯鏈嶅姟鍣ㄧ敤浜庨儴缃叉湰鏈嶅姟銆� -棰勮7鏈堝彲浠ヨ揪鍒板晢鐢ㄧ骇鍒殑鏂囨。鎬� +鍘熼」鐩瘮杈冧晶閲嶅崟涓憚鍍忔満鐨勬帴鍏ワ紝褰撳墠杩欎釜鏇翠晶閲嶅钩鍙版帴鍏ワ紝褰撶劧锛岀洿鎺ユ帴鎽勫儚鏈轰篃鏄病鏈夐棶棰樼殑銆� # 鏀寔鐗规�э細 1銆佽棰戦瑙� 2銆佷簯鍙版帶鍒讹紙鏂瑰悜銆佺缉鏀炬帶鍒讹級 3銆佽棰戣澶囦俊鎭悓姝� -4銆佺鍦ㄧ嚎鐩戞帶 -5銆佸綍鍍忔煡璇笌鍥炴斁锛堝熀浜嶯VR\DVR锛屾殏涓嶆敮鎸佸揩杩涖�乻eek鎿嶄綔锛� -6銆佹棤浜鸿鐪嬭嚜鍔ㄦ柇娴� +4銆佺鍦ㄧ嚎鐩戞帶 +5銆佹棤浜鸿鐪嬭嚜鍔ㄦ柇娴� -# 2020璺嚎鍥撅細 -5鏈堜腑鏃�-褰曞儚鍥炴斁锛堝熀浜嶯VR\DVR锛夈�佽澶囪璇侊紙鍩轰簬瀵嗙爜锛� -5鏈堜笅鏃�-璁惧鎶ヨ -6鏈堜笂鏃�-娴佸獟浣撹璇侊紙ZLM鎺ㄦ祦銆佸彇娴侊級 -6鏈堜笅鏃�-璇煶瀵硅銆丄ndroid Deme\iOS Demo -7鏈堜笅鏃�-璁惧璁よ瘉锛堝熀浜庢暟瀛楄瘉涔︼級銆侀泦缇ら儴缃� -8鏈堜笅鏃�-浜戠褰曞儚涓庡洖鏀� -9鏈堜笅鏃�-Onvif鍗忚鏀寔 -10鏈堜笅鏃�-GB28181-2011鐗堣澶囬�傞厤 +# 寰呭疄鐜帮細 +褰曞儚鏌ヨ涓庡洖鏀撅紙鍩轰簬NVR\DVR锛屾殏涓嶆敮鎸佸揩杩涖�乻eek鎿嶄綔锛� 12鏈堝簳-涓婄骇绾ц仈銆佹椂闂村悓姝ャ�佸叾浠栧浗鏍囪兘鍔� # 椤圭洰閮ㄧ讲 -鍙傝�僿iki璇存槑 + # 浣跨敤甯姪 -鍙傝�僿iki璇存槑 + # 鑷磋阿 鎰熻阿浣滆�匸澶忔](https://github.com/xiongziliang) 鎻愪緵杩欎箞妫掔殑寮�婧愭祦濯掍綋鏈嶅姟妗嗘灦 -鎰熻阿浣滆�匸kkkkk5G](https://gitee.com/kkkkk5G) 鎻愪緵杩欎箞妫掔殑鍓嶇UI - - -[]: https://github.com/swwheihei/wvp-GB28181 \ No newline at end of file +鎰熻阿浣滆�匸kkkkk5G](https://gitee.com/kkkkk5G) 鎻愪緵杩欎箞妫掔殑鍓嶇UI \ No newline at end of file diff --git a/src/main/java/com/genersoft/iot/vmp/conf/VManagerConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/VManagerConfig.java index 6045ea2..be83a88 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/VManagerConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/VManagerConfig.java @@ -21,5 +21,7 @@ public void setDatabase(String database) { this.database = database; } + + } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java index 5c3989a..73fafc1 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java @@ -129,6 +129,11 @@ private double latitude; /** + * 瀛愯澶囨暟 + */ + private int subCount; + + /** * 娴佸敮涓�缂栧彿锛屽瓨鍦ㄨ〃绀烘鍦ㄧ洿鎾� */ private String ssrc; @@ -332,4 +337,12 @@ public void setSsrc(String ssrc) { this.ssrc = ssrc; } + + public int getSubCount() { + return subCount; + } + + public void setSubCount(int subCount) { + this.subCount = subCount; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java index fe97e2b..63f28cd 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java @@ -7,6 +7,7 @@ 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; @@ -126,6 +127,7 @@ processor.setRequestEvent(evt); return processor; } else if (Request.MESSAGE.equals(method)) { + MessageRequestProcessor processor = new MessageRequestProcessor(); processor.setRequestEvent(evt); processor.setTcpSipProvider(getTcpSipProvider()); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java index e9f5906..0dfcdb0 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java @@ -144,6 +144,7 @@ private void processMessageCatalogList(RequestEvent evt) { try { Element rootElement = getRootElement(evt); + String s = rootElement.toString(); Element deviceIdElement = rootElement.element("DeviceID"); String deviceId = deviceIdElement.getText().toString(); Element deviceListElement = rootElement.element("DeviceList"); @@ -171,10 +172,10 @@ DeviceChannel deviceChannel = new DeviceChannel(); deviceChannel.setName(channelName); deviceChannel.setChannelId(channelDeviceId); - if(status.equals("ON")) { + if(status.equals("ON") || status.equals("On")) { deviceChannel.setStatus(1); } - if(status.equals("OFF")) { + if(status.equals("OFF") || status.equals("Off")) { deviceChannel.setStatus(0); } @@ -185,7 +186,7 @@ deviceChannel.setBlock(XmlUtil.getText(itemDevice,"Block")); deviceChannel.setAddress(XmlUtil.getText(itemDevice,"Address")); deviceChannel.setParental(itemDevice.element("Parental") == null? 0:Integer.parseInt(XmlUtil.getText(itemDevice,"Parental"))); - deviceChannel.setParentId(XmlUtil.getText(itemDevice,"ParentId")); + deviceChannel.setParentId(XmlUtil.getText(itemDevice,"ParentID")); deviceChannel.setSafetyWay(itemDevice.element("SafetyWay") == null? 0:Integer.parseInt(XmlUtil.getText(itemDevice,"SafetyWay"))); deviceChannel.setRegisterWay(itemDevice.element("RegisterWay") == null? 1:Integer.parseInt(XmlUtil.getText(itemDevice,"RegisterWay"))); deviceChannel.setCertNum(XmlUtil.getText(itemDevice,"CertNum")); diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java index 0993c11..69ac02b 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java @@ -77,7 +77,7 @@ * @param count 姣忛〉鏁伴噺 * @return */ - public PageResult queryChannelsByDeviceId(String deviceId, int page, int count); + public PageResult queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, String online, int page, int count); /** * 鑾峰彇鏌愪釜璁惧鐨勯�氶亾鍒楄〃 @@ -161,6 +161,19 @@ */ public StreamInfo queryPlay(String deviceId, String channelId); + /** + * 鏌ヨ瀛愯澶� + * + * @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(); } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/VodeoMannagerTask.java b/src/main/java/com/genersoft/iot/vmp/storager/VodeoMannagerTask.java new file mode 100644 index 0000000..c96e4bb --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/storager/VodeoMannagerTask.java @@ -0,0 +1,17 @@ +package com.genersoft.iot.vmp.storager; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class VodeoMannagerTask implements CommandLineRunner { + + @Autowired + private IVideoManagerStorager storager; + + @Override + public void run(String... strings) throws Exception { + storager.updateCatch(); + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java index b4e2ff9..40ec167 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java @@ -79,9 +79,10 @@ } @Override - public PageResult queryChannelsByDeviceId(String deviceId, int page, int count) { + public PageResult queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, String online, int page, int count) { return null; } + @Override public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) { @@ -161,4 +162,13 @@ 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() { + + } } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java index 8ea9f7e..e1411ab 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java @@ -1,278 +1,417 @@ -package com.genersoft.iot.vmp.storager.redis; - -import java.util.ArrayList; -import java.util.List; - -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; - -/** - * @Description:瑙嗛璁惧鏁版嵁瀛樺偍-redis瀹炵幇 - * @author: swwheihei - * @date: 2020骞�5鏈�6鏃� 涓嬪崍2:31:42 - */ -@Component("redisStorager") -public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager { - - @Autowired - private RedisUtil redis; - - - /** - * 鏍规嵁璁惧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) { - List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + device.getDeviceId() + "_" + "*"); - // 鏇存柊device涓殑閫氶亾鏁伴噺 - device.setChannelCount(deviceChannelList.size()); - // 瀛樺偍device - return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device); - - - } - - @Override - public void updateChannel(String deviceId, DeviceChannel channel) { - // 瀛樺偍閫氶亾 - redis.set(VideoManagerConstants.CACHEKEY_PREFIX+deviceId + "_" + channel.getChannelId(), - channel); - List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*"); - // 鏇存柊device涓殑閫氶亾鏁伴噺 - Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId); - device.setChannelCount(deviceChannelList.size()); - redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device); - } - - /** - * 鑾峰彇璁惧 - * - * @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, int page, int count) { - List<DeviceChannel> result = new ArrayList<>(); - PageResult pageResult = new PageResult<DeviceChannel>(); - List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*"); - 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++) { - result.add((DeviceChannel)redis.get((String)deviceChannelList.get(i))); - } - 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 + "_" + "*"); - 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 DeviceChannel queryChannel(String deviceId, String channelId) { - return (DeviceChannel)redis.get(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + channelId); - } - - - /** - * 鑾峰彇澶氫釜璁惧 - * - * @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); - - if (deviceIds == null || deviceIds.length == 0) { - - List<Object> deviceIdList = redis.keys(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))); - } - } else { - for (int i = 0; i < deviceIds.length; i++) { - devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i])); - } - } - pageResult.setData(devices); - return pageResult; - } - - /** - * 鑾峰彇澶氫釜璁惧 - * - * @param deviceIds 璁惧ID鏁扮粍 - * @return List<Device> 璁惧瀵硅薄鏁扮粍 - */ - @Override - public List<Device> queryVideoDeviceList(String[] deviceIds) { - List<Device> devices = new ArrayList<>(); - - if (deviceIds == null || deviceIds.length == 0) { - List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*"); - for (int i = 0; i < deviceIdList.size(); i++) { - devices.add((Device)redis.get((String)deviceIdList.get(i))); - } - } else { - for (int i = 0; i < deviceIds.length; i++) { - devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i])); - } - } - 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 - * - * @param deviceId 璁惧ID - * @param channelId 閫氶亾ID - * @return - */ - @Override - public boolean startPlay(String deviceId, String channelId, StreamInfo stream) { - return redis.set(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId), - stream); - } - - /** - * 鍋滄鎾斁鏃朵粠redis鍒犻櫎 - * - * @param deviceId 璁惧ID - * @param channelId 閫氶亾ID - * @return - */ - @Override - public boolean stopPlay(String deviceId, String channelId) { - return redis.del(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId)); - } - - /** - * 鏌ヨ鎾斁鍒楄〃 - * @param deviceId 璁惧ID - * @param channelId 閫氶亾ID - * @return - */ - @Override - public StreamInfo queryPlay(String deviceId, String channelId) { - return (StreamInfo)redis.get(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId)); - } - - /** - * 鏇存柊娴佸獟浣撲俊鎭� - * @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); - } -} +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>>()); + } +// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + device.getDeviceId() + "_" + "*"); + // 鏇存柊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.getName() + + "_" + (channel.getStatus() == 1 ? "on":"off") + + "_" + (channelMap.get(channelId).size() > 0)+ + "_" + 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)) { + + if (channelMap.get(parentId) == null) { + channelMap.put(parentId, new HashSet<>()); + } + channelMap.get(parentId).add(channelId); + + DeviceChannel deviceChannel = queryChannel(deviceId, parentId); + if (deviceChannel != null) { + deviceChannel.setSubCount(channelMap.get(parentId).size()); + redis.set(VideoManagerConstants.CACHEKEY_PREFIX+deviceId + "_" + deviceChannel.getChannelId(), + deviceChannel); + + } + } + + } + + /** + * 鑾峰彇璁惧 + * + * @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) { + 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); + 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++) { + result.add((DeviceChannel)redis.get((String)deviceChannelList.get(i))); + } + 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 + "_" + "*"); + 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); + + 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 + "_" + "*"); + + 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) { + return (DeviceChannel)redis.get(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + channelId + "_"); + } + + + /** + * 鑾峰彇澶氫釜璁惧 + * + * @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); + + if (deviceIds == null || deviceIds.length == 0) { + + List<Object> deviceIdList = redis.keys(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))); + } + } else { + for (int i = 0; i < deviceIds.length; i++) { + devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i])); + } + } + pageResult.setData(devices); + return pageResult; + } + + /** + * 鑾峰彇澶氫釜璁惧 + * + * @param deviceIds 璁惧ID鏁扮粍 + * @return List<Device> 璁惧瀵硅薄鏁扮粍 + */ + @Override + public List<Device> queryVideoDeviceList(String[] deviceIds) { + List<Device> devices = new ArrayList<>(); + + if (deviceIds == null || deviceIds.length == 0) { + List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*"); + for (int i = 0; i < deviceIdList.size(); i++) { + devices.add((Device)redis.get((String)deviceIdList.get(i))); + } + } else { + for (int i = 0; i < deviceIds.length; i++) { + devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i])); + } + } + 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 + * + * @param deviceId 璁惧ID + * @param channelId 閫氶亾ID + * @return + */ + @Override + public boolean startPlay(String deviceId, String channelId, StreamInfo stream) { + return redis.set(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId), + stream); + } + + /** + * 鍋滄鎾斁鏃朵粠redis鍒犻櫎 + * + * @param deviceId 璁惧ID + * @param channelId 閫氶亾ID + * @return + */ + @Override + public boolean stopPlay(String deviceId, String channelId) { + return redis.del(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId)); + } + + /** + * 鏌ヨ鎾斁鍒楄〃 + * @param deviceId 璁惧ID + * @param channelId 閫氶亾ID + * @return + */ + @Override + public StreamInfo queryPlay(String deviceId, String channelId) { + return (StreamInfo)redis.get(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId)); + } + + + + /** + * 鏇存柊娴佸獟浣撲俊鎭� + * @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.keys(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<>(); + } + if (s.length > 4) { + subChannel.add(s[4]); + } + channelMap.put(channelId, subChannel); + System.out.println(); + } + } + deviceMap.put(device.getDeviceId(),channelMap); + } + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java index 9b229ac..7958a8a 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java @@ -9,12 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -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 org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; import com.alibaba.fastjson.JSONObject; @@ -72,12 +67,17 @@ * @return 閫氶亾鍒楄〃 */ @GetMapping("devices/{deviceId}/channels") - public ResponseEntity<PageResult> channels(@PathVariable String deviceId, int page, int count){ + public ResponseEntity<PageResult> channels(@PathVariable String deviceId, + int page, int count, + @RequestParam(required = false) String query, + @RequestParam(required = false) String online, + @RequestParam(required = false) Boolean channelType + ){ if (logger.isDebugEnabled()) { logger.debug("鏌ヨ鎵�鏈夎棰戣澶嘇PI璋冪敤"); } - PageResult pageResult = storager.queryChannelsByDeviceId(deviceId, page, count); + PageResult pageResult = storager.queryChannelsByDeviceId(deviceId, query, channelType, online, page, count); return new ResponseEntity<>(pageResult,HttpStatus.OK); } @@ -115,4 +115,33 @@ return new ResponseEntity<String>("璁惧棰勮API璋冪敤澶辫触锛�", HttpStatus.INTERNAL_SERVER_ERROR); } } + + /** + * 鍒嗛〉鏌ヨ閫氶亾鏁� + * @param channelId 閫氶亾id + * @param page 褰撳墠椤� + * @param count 姣忛〉鏉℃暟 + * @return 瀛愰�氶亾鍒楄〃 + */ + @GetMapping("subChannels/{deviceId}/{channelId}/channels") + public ResponseEntity<PageResult> subChannels(@PathVariable String deviceId, + @PathVariable String channelId, + int page, + int count, + @RequestParam(required = false) String query, + @RequestParam(required = false) String online, + @RequestParam(required = false) Boolean channelType){ + + if (logger.isDebugEnabled()) { + logger.debug("鏌ヨ鎵�鏈夎棰戣澶嘇PI璋冪敤"); + } + DeviceChannel deviceChannel = storager.queryChannel(deviceId,channelId); + if (deviceChannel == null) { + PageResult<DeviceChannel> deviceChannelPageResult = new PageResult<>(); + new ResponseEntity<>(deviceChannelPageResult,HttpStatus.OK); + } + + PageResult pageResult = storager.querySubChannels(deviceId, channelId, query, channelType, online, page, count); + return new ResponseEntity<>(pageResult,HttpStatus.OK); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java b/src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java index 57b102c..ce3b7ec 100644 --- a/src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java +++ b/src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java @@ -68,7 +68,7 @@ devices = storager.queryVideoDeviceList(null); result.put("DeviceCount", devices.size()); }else { - PageResult<Device> deviceList = storager.queryVideoDeviceList(null, start, limit); + PageResult<Device> deviceList = storager.queryVideoDeviceList(null, start/limit, limit); result.put("DeviceCount", deviceList.getTotal()); devices = deviceList.getData(); } @@ -123,7 +123,7 @@ deviceChannels = storager.queryChannelsByDeviceId(serial); result.put("ChannelCount", deviceChannels.size()); }else { - PageResult<DeviceChannel> pageResult = storager.queryChannelsByDeviceId(serial, start, limit); + PageResult<DeviceChannel> pageResult = storager.queryChannelsByDeviceId(serial, null, null, null,start/limit, limit); result.put("ChannelCount", pageResult.getTotal()); deviceChannels = pageResult.getData(); } @@ -139,7 +139,7 @@ deviceJOSNChannel.put("Name", deviceChannel.getName()); deviceJOSNChannel.put("Custom", false); deviceJOSNChannel.put("CustomName", ""); - deviceJOSNChannel.put("SubCount", 0); // TODO ? 瀛愯妭鐐规暟, SubCount > 0 琛ㄧず璇ラ�氶亾涓哄瓙鐩綍 + deviceJOSNChannel.put("SubCount", deviceChannel.getSubCount()); // TODO ? 瀛愯妭鐐规暟, SubCount > 0 琛ㄧず璇ラ�氶亾涓哄瓙鐩綍 deviceJOSNChannel.put("SnapURL", ""); deviceJOSNChannel.put("Manufacturer ", deviceChannel.getManufacture()); deviceJOSNChannel.put("Model", deviceChannel.getModel()); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b59b139..235caa6 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -12,7 +12,7 @@ port: 6379 database: 6 #璁块棶瀵嗙爜,鑻ヤ綘鐨剅edis鏈嶅姟鍣ㄦ病鏈夎缃瘑鐮侊紝灏变笉闇�瑕佺敤瀵嗙爜鍘昏繛鎺� - password: + password: 4767cb971b40a1300fa09b7f87b09d1c #瓒呮椂鏃堕棿 timeout: 10000 datasource: @@ -31,8 +31,8 @@ # 鏍规嵁鍥芥爣6.1.2涓瀹氾紝domain瀹滈噰鐢↖D缁熶竴缂栫爜鐨勫墠鍗佷綅缂栫爜銆傚浗鏍囬檮褰旸涓畾涔夊墠8浣嶄负涓績缂栫爜锛堢敱鐪佺骇銆佸競绾с�佸尯绾с�佸熀灞傜紪鍙风粍鎴愶紝鍙傜収GB/T 2260-2007锛� # 鍚庝袱浣嶄负琛屼笟缂栫爜锛屽畾涔夊弬鐓ч檮褰旸.3 # 3701020049鏍囪瘑灞变笢娴庡崡鍘嗕笅鍖� 淇℃伅琛屼笟鎺ュ叆 - domain: 3701020049 - id: 37010200492000000001 + domain: 3402000000 + id: 34020000002000000001 # 榛樿璁惧璁よ瘉瀵嗙爜锛屽悗缁墿灞曚娇鐢ㄨ澶囧崟鐙瘑鐮� password: 12345678 media: -- Gitblit v1.8.0