Commit 57fd18cd7c842a821bd03fafe2a954c605e387f6

Authored by 648540858
1 parent 764daa8a

增加分页,搜索,等

.idea/encodings.xml
... ... @@ -3,5 +3,6 @@
3 3 <component name="Encoding">
4 4 <file url="file://$PROJECT_DIR$" charset="UTF-8" />
5 5 <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
  6 + <file url="file://$PROJECT_DIR$/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java" charset="UTF-8" />
6 7 </component>
7 8 </project>
8 9 \ No newline at end of file
... ...
README.md
... ... @@ -6,38 +6,25 @@ WEB VIDEO PLATFORM譏ッ荳荳ェ蝓コ莠雑B28181-2016譬螳樒鴫逧ス醍サ懆ァ「大ケウ蜿ー
6 6 ### fork閾ェ [swwheihei/wvp-GB28181](https://github.com/swwheihei/wvp-GB28181)
7 7  
8 8 # 蠎皮畑蝨コ譎ッ
9   -荳サ隕∝コ皮畑蝨ィIPC遲芽ョセ螟イ。譛牙崋螳唔P蝨ー蝮御ス怙隕∝惠莠定#鄂台クュ隗ら恚逧惻譎ッ縲
10   -隕∵アPC隶セ螟庄莉・隶ソ髣ョ莠定#鄂托シ梧怏莠第恪蜉。蝎ィ逕ィ莠朱Κ鄂イ譛ャ譛榊苅縲
11   -鬚ョ。7譛亥庄莉・霎セ蛻ー蝠畑郤ァ蛻ォ逧枚譯」諤ァ
  9 +蜴滄。ケ逶ョ豈碑セセァ驥榊黒荳ェ鞫ワ譛コ逧磁蜈・悟ス灘燕霑吩クェ譖エ萓ァ驥榊ケウ蜿ー謗・蜈・悟ス鍋┯檎峩謗・謗・鞫ワ譛コ荵滓弍豐。譛蛾琉鬚倡噪縲
12 10  
13 11 # 謾ッ謖∫音諤ァ
14 12 1縲∬ァ「鷹「ァ
15 13 2縲∽コ大床謗ァ蛻カ域婿蜷代∫シゥ謾セ謗ァ蛻カ
16 14 3縲∬ァ「題ョセ螟ソ。諱ッ蜷梧ュ・
17   -4縲∫ヲサ蝨ィ郤ソ逶第而
18   -5縲∝ス募ワ譟・隸「荳主屓謾セ亥渕莠晒VR\DVR梧嘯荳肴髪謖∝ソォ霑帙《eek謫堺ス懶シ
19   -6縲∵裏莠コ隗ら恚閾ェ蜉ィ譁ュ豬
20   -
21   -# 2020霍ッ郤ソ蝗セ
22   -5譛井クュ譌ャ-蠖募ワ蝗樊叛亥渕莠晒VR\DVR峨∬ョセ螟ョ、隸シ亥渕莠主ッシ
23   -5譛井ク区流-隶セ螟冠隴ヲ
24   -6譛井ク頑流-豬∝ェ剃ス楢ョ、隸シLM謗ィ豬√∝叙豬シ
25   -6譛井ク区流-隸ュ髻ウ蟇ケ隶イ縲、ndroid Deme\iOS Demo
26   -7譛井ク区流-隶セ螟ョ、隸シ亥渕莠取焚蟄苓ッ∽ケヲ峨寔鄒、驛ィ鄂イ
27   -8譛井ク区流-莠醍ォッ蠖募ワ荳主屓謾セ
28   -9譛井ク区流-Onvif蜊剰ョョ謾ッ謖
29   -10譛井ク区流-GB28181-2011迚郁ョセ螟る
  15 +4縲∫ヲサ蝨ィ郤ソ逶第而
  16 +5縲∵裏莠コ隗ら恚閾ェ蜉ィ譁ュ豬
  17 +
  18 +# 蠕ョ樒鴫
  19 +蠖募ワ譟・隸「荳主屓謾セ亥渕莠晒VR\DVR梧嘯荳肴髪謖∝ソォ霑帙《eek謫堺ス懶シ
30 20 12譛亥コ-荳顔コァ郤ァ閨斐∵慮髣エ蜷梧ュ・縲∝莉門嵜譬蜉
31 21  
32 22 # 鬘ケ逶ョ驛ィ鄂イ
33   -蜿りヘiki隸エ譏
  23 +
34 24  
35 25 # 菴ソ逕ィ蟶ョ蜉ゥ
36   -蜿りヘiki隸エ譏
  26 +
37 27  
38 28 # 閾エ隹「
39 29 諢溯ー「菴懆螟乗・咯(https://github.com/xiongziliang) 謠蝉セ幄ソ吩ケ域」堤噪蠑貅先オ∝ェ剃ス捺恪蜉。譯楔
40   -諢溯ー「菴懆kkkkk5G](https://gitee.com/kkkkk5G) 謠蝉セ幄ソ吩ケ域」堤噪蜑咲ォッUI
41   -
42   -
43   -[]: https://github.com/swwheihei/wvp-GB28181
44 30 \ No newline at end of file
  31 +諢溯ー「菴懆kkkkk5G](https://gitee.com/kkkkk5G) 謠蝉セ幄ソ吩ケ域」堤噪蜑咲ォッUI
45 32 \ No newline at end of file
... ...
src/main/java/com/genersoft/iot/vmp/conf/VManagerConfig.java
... ... @@ -21,5 +21,7 @@ public class VManagerConfig {
21 21 public void setDatabase(String database) {
22 22 this.database = database;
23 23 }
  24 +
  25 +
24 26  
25 27 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
... ... @@ -129,6 +129,11 @@ public class DeviceChannel {
129 129 private double latitude;
130 130  
131 131 /**
  132 + * 子设备数
  133 + */
  134 + private int subCount;
  135 +
  136 + /**
132 137 * 流唯一编号,存在表示正在直播
133 138 */
134 139 private String ssrc;
... ... @@ -332,4 +337,12 @@ public class DeviceChannel {
332 337 public void setSsrc(String ssrc) {
333 338 this.ssrc = ssrc;
334 339 }
  340 +
  341 + public int getSubCount() {
  342 + return subCount;
  343 + }
  344 +
  345 + public void setSubCount(int subCount) {
  346 + this.subCount = subCount;
  347 + }
335 348 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
... ... @@ -7,6 +7,7 @@ import javax.sip.header.CSeqHeader;
7 7 import javax.sip.message.Request;
8 8 import javax.sip.message.Response;
9 9  
  10 +import com.alibaba.fastjson.JSON;
10 11 import org.slf4j.Logger;
11 12 import org.slf4j.LoggerFactory;
12 13 import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -126,6 +127,7 @@ public class SIPProcessorFactory {
126 127 processor.setRequestEvent(evt);
127 128 return processor;
128 129 } else if (Request.MESSAGE.equals(method)) {
  130 +
129 131 MessageRequestProcessor processor = new MessageRequestProcessor();
130 132 processor.setRequestEvent(evt);
131 133 processor.setTcpSipProvider(getTcpSipProvider());
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
... ... @@ -144,6 +144,7 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
144 144 private void processMessageCatalogList(RequestEvent evt) {
145 145 try {
146 146 Element rootElement = getRootElement(evt);
  147 + String s = rootElement.toString();
147 148 Element deviceIdElement = rootElement.element("DeviceID");
148 149 String deviceId = deviceIdElement.getText().toString();
149 150 Element deviceListElement = rootElement.element("DeviceList");
... ... @@ -171,10 +172,10 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
171 172 DeviceChannel deviceChannel = new DeviceChannel();
172 173 deviceChannel.setName(channelName);
173 174 deviceChannel.setChannelId(channelDeviceId);
174   - if(status.equals("ON")) {
  175 + if(status.equals("ON") || status.equals("On")) {
175 176 deviceChannel.setStatus(1);
176 177 }
177   - if(status.equals("OFF")) {
  178 + if(status.equals("OFF") || status.equals("Off")) {
178 179 deviceChannel.setStatus(0);
179 180 }
180 181  
... ... @@ -185,7 +186,7 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
185 186 deviceChannel.setBlock(XmlUtil.getText(itemDevice,"Block"));
186 187 deviceChannel.setAddress(XmlUtil.getText(itemDevice,"Address"));
187 188 deviceChannel.setParental(itemDevice.element("Parental") == null? 0:Integer.parseInt(XmlUtil.getText(itemDevice,"Parental")));
188   - deviceChannel.setParentId(XmlUtil.getText(itemDevice,"ParentId"));
  189 + deviceChannel.setParentId(XmlUtil.getText(itemDevice,"ParentID"));
189 190 deviceChannel.setSafetyWay(itemDevice.element("SafetyWay") == null? 0:Integer.parseInt(XmlUtil.getText(itemDevice,"SafetyWay")));
190 191 deviceChannel.setRegisterWay(itemDevice.element("RegisterWay") == null? 1:Integer.parseInt(XmlUtil.getText(itemDevice,"RegisterWay")));
191 192 deviceChannel.setCertNum(XmlUtil.getText(itemDevice,"CertNum"));
... ...
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
... ... @@ -77,7 +77,7 @@ public interface IVideoManagerStorager {
77 77 * @param count 每页数量
78 78 * @return
79 79 */
80   - public PageResult queryChannelsByDeviceId(String deviceId, int page, int count);
  80 + public PageResult queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, String online, int page, int count);
81 81  
82 82 /**
83 83 * 获取某个设备的通道列表
... ... @@ -161,6 +161,19 @@ public interface IVideoManagerStorager {
161 161 */
162 162 public StreamInfo queryPlay(String deviceId, String channelId);
163 163  
  164 + /**
  165 + * 查询子设备
  166 + *
  167 + * @param deviceId
  168 + * @param channelId
  169 + * @param page
  170 + * @param count
  171 + * @return
  172 + */
  173 + PageResult querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, String online, int page, int count);
164 174  
165   -
  175 + /**
  176 + * 更新缓存
  177 + */
  178 + public void updateCatch();
166 179 }
... ...
src/main/java/com/genersoft/iot/vmp/storager/VodeoMannagerTask.java 0 → 100644
  1 +package com.genersoft.iot.vmp.storager;
  2 +
  3 +import org.springframework.beans.factory.annotation.Autowired;
  4 +import org.springframework.boot.CommandLineRunner;
  5 +import org.springframework.stereotype.Component;
  6 +
  7 +@Component
  8 +public class VodeoMannagerTask implements CommandLineRunner {
  9 +
  10 + @Autowired
  11 + private IVideoManagerStorager storager;
  12 +
  13 + @Override
  14 + public void run(String... strings) throws Exception {
  15 + storager.updateCatch();
  16 + }
  17 +}
... ...
src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java
... ... @@ -79,10 +79,11 @@ public class VideoManagerJdbcStoragerImpl implements IVideoManagerStorager {
79 79 }
80 80  
81 81 @Override
82   - public PageResult queryChannelsByDeviceId(String deviceId, int page, int count) {
  82 + public PageResult queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, String online, int page, int count) {
83 83 return null;
84 84 }
85 85  
  86 +
86 87 @Override
87 88 public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) {
88 89 return null;
... ... @@ -161,4 +162,13 @@ public class VideoManagerJdbcStoragerImpl implements IVideoManagerStorager {
161 162 return null;
162 163 }
163 164  
  165 + @Override
  166 + public PageResult querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, String online, int page, int count) {
  167 + return null;
  168 + }
  169 +
  170 + @Override
  171 + public void updateCatch() {
  172 +
  173 + }
164 174 }
... ...
src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java
1   -package com.genersoft.iot.vmp.storager.redis;
2   -
3   -import java.util.ArrayList;
4   -import java.util.List;
5   -
6   -import com.alibaba.fastjson.JSON;
7   -import com.alibaba.fastjson.JSONObject;
8   -import com.genersoft.iot.vmp.common.PageResult;
9   -import com.genersoft.iot.vmp.common.StreamInfo;
10   -import com.genersoft.iot.vmp.conf.MediaServerConfig;
11   -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
12   -import org.springframework.beans.factory.annotation.Autowired;
13   -import org.springframework.stereotype.Component;
14   -
15   -import com.genersoft.iot.vmp.common.VideoManagerConstants;
16   -import com.genersoft.iot.vmp.gb28181.bean.Device;
17   -import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
18   -import com.genersoft.iot.vmp.utils.redis.RedisUtil;
19   -
20   -/**
21   - * @Description:视频设备数据存储-redis实现
22   - * @author: swwheihei
23   - * @date: 2020年5月6日 下午2:31:42
24   - */
25   -@Component("redisStorager")
26   -public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager {
27   -
28   - @Autowired
29   - private RedisUtil redis;
30   -
31   -
32   - /**
33   - * 根据设备ID判断设备是否存在
34   - *
35   - * @param deviceId 设备ID
36   - * @return true:存在 false:不存在
37   - */
38   - @Override
39   - public boolean exists(String deviceId) {
40   - return redis.hasKey(VideoManagerConstants.DEVICE_PREFIX+deviceId);
41   - }
42   -
43   - /**
44   - * 视频设备创建
45   - *
46   - * @param device 设备对象
47   - * @return true:创建成功 false:创建失败
48   - */
49   - @Override
50   - public boolean create(Device device) {
51   - return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
52   - }
53   -
54   -
55   -
56   - /**
57   - * 视频设备更新
58   - *
59   - * @param device 设备对象
60   - * @return true:更新成功 false:更新失败
61   - */
62   - @Override
63   - public boolean updateDevice(Device device) {
64   - List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + device.getDeviceId() + "_" + "*");
65   - // 更新device中的通道数量
66   - device.setChannelCount(deviceChannelList.size());
67   - // 存储device
68   - return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
69   -
70   -
71   - }
72   -
73   - @Override
74   - public void updateChannel(String deviceId, DeviceChannel channel) {
75   - // 存储通道
76   - redis.set(VideoManagerConstants.CACHEKEY_PREFIX+deviceId + "_" + channel.getChannelId(),
77   - channel);
78   - List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
79   - // 更新device中的通道数量
80   - Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
81   - device.setChannelCount(deviceChannelList.size());
82   - redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
83   - }
84   -
85   - /**
86   - * 获取设备
87   - *
88   - * @param deviceId 设备ID
89   - * @return Device 设备对象
90   - */
91   - @Override
92   - public Device queryVideoDevice(String deviceId) {
93   - return (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
94   - }
95   -
96   - @Override
97   - public PageResult queryChannelsByDeviceId(String deviceId, int page, int count) {
98   - List<DeviceChannel> result = new ArrayList<>();
99   - PageResult pageResult = new PageResult<DeviceChannel>();
100   - List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
101   - pageResult.setPage(page);
102   - pageResult.setCount(count);
103   - pageResult.setTotal(deviceChannelList.size());
104   - int maxCount = (page + 1 ) * count;
105   - if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
106   - for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) {
107   - result.add((DeviceChannel)redis.get((String)deviceChannelList.get(i)));
108   - }
109   - pageResult.setData(result);
110   - }
111   -
112   - return pageResult;
113   - }
114   -
115   - @Override
116   - public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) {
117   - List<DeviceChannel> result = new ArrayList<>();
118   - List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
119   - if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
120   - for (int i = 0; i < deviceChannelList.size(); i++) {
121   - result.add((DeviceChannel)redis.get((String)deviceChannelList.get(i)));
122   - }
123   - }
124   - return result;
125   - }
126   -
127   - @Override
128   - public DeviceChannel queryChannel(String deviceId, String channelId) {
129   - return (DeviceChannel)redis.get(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + channelId);
130   - }
131   -
132   -
133   - /**
134   - * 获取多个设备
135   - *
136   - * @param deviceIds 设备ID数组
137   - * @return List<Device> 设备对象数组
138   - */
139   - @Override
140   - public PageResult<Device> queryVideoDeviceList(String[] deviceIds, int page, int count) {
141   - List<Device> devices = new ArrayList<>();
142   - PageResult pageResult = new PageResult<Device>();
143   - pageResult.setPage(page);
144   - pageResult.setCount(count);
145   -
146   - if (deviceIds == null || deviceIds.length == 0) {
147   -
148   - List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
149   - pageResult.setTotal(deviceIdList.size());
150   - int maxCount = (page + 1)* count;
151   - for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) {
152   - devices.add((Device)redis.get((String)deviceIdList.get(i)));
153   - }
154   - } else {
155   - for (int i = 0; i < deviceIds.length; i++) {
156   - devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]));
157   - }
158   - }
159   - pageResult.setData(devices);
160   - return pageResult;
161   - }
162   -
163   - /**
164   - * 获取多个设备
165   - *
166   - * @param deviceIds 设备ID数组
167   - * @return List<Device> 设备对象数组
168   - */
169   - @Override
170   - public List<Device> queryVideoDeviceList(String[] deviceIds) {
171   - List<Device> devices = new ArrayList<>();
172   -
173   - if (deviceIds == null || deviceIds.length == 0) {
174   - List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
175   - for (int i = 0; i < deviceIdList.size(); i++) {
176   - devices.add((Device)redis.get((String)deviceIdList.get(i)));
177   - }
178   - } else {
179   - for (int i = 0; i < deviceIds.length; i++) {
180   - devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]));
181   - }
182   - }
183   - return devices;
184   - }
185   -
186   - /**
187   - * 删除设备
188   - *
189   - * @param deviceId 设备ID
190   - * @return true:删除成功 false:删除失败
191   - */
192   - @Override
193   - public boolean delete(String deviceId) {
194   - return redis.del(VideoManagerConstants.DEVICE_PREFIX+deviceId);
195   - }
196   -
197   - /**
198   - * 更新设备在线
199   - *
200   - * @param deviceId 设备ID
201   - * @return true:更新成功 false:更新失败
202   - */
203   - @Override
204   - public boolean online(String deviceId) {
205   - Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
206   - device.setOnline(1);
207   - return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
208   - }
209   -
210   - /**
211   - * 更新设备离线
212   - *
213   - * @param deviceId 设备ID
214   - * @return true:更新成功 false:更新失败
215   - */
216   - @Override
217   - public boolean outline(String deviceId) {
218   - Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
219   - if (device == null) return false;
220   - device.setOnline(0);
221   - return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
222   - }
223   -
224   - /**
225   - * 开始播放时将流存入redis
226   - *
227   - * @param deviceId 设备ID
228   - * @param channelId 通道ID
229   - * @return
230   - */
231   - @Override
232   - public boolean startPlay(String deviceId, String channelId, StreamInfo stream) {
233   - return redis.set(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId),
234   - stream);
235   - }
236   -
237   - /**
238   - * 停止播放时从redis删除
239   - *
240   - * @param deviceId 设备ID
241   - * @param channelId 通道ID
242   - * @return
243   - */
244   - @Override
245   - public boolean stopPlay(String deviceId, String channelId) {
246   - return redis.del(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId));
247   - }
248   -
249   - /**
250   - * 查询播放列表
251   - * @param deviceId 设备ID
252   - * @param channelId 通道ID
253   - * @return
254   - */
255   - @Override
256   - public StreamInfo queryPlay(String deviceId, String channelId) {
257   - return (StreamInfo)redis.get(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId));
258   - }
259   -
260   - /**
261   - * 更新流媒体信息
262   - * @param mediaServerConfig
263   - * @return
264   - */
265   - @Override
266   - public boolean updateMediaInfo(MediaServerConfig mediaServerConfig) {
267   - return redis.set(VideoManagerConstants.MEDIA_SERVER_PREFIX,mediaServerConfig);
268   - }
269   -
270   - /**
271   - * 获取流媒体信息
272   - * @return
273   - */
274   - @Override
275   - public MediaServerConfig getMediaInfo() {
276   - return (MediaServerConfig)redis.get(VideoManagerConstants.MEDIA_SERVER_PREFIX);
277   - }
278   -}
  1 +package com.genersoft.iot.vmp.storager.redis;
  2 +
  3 +import java.util.*;
  4 +
  5 +import com.alibaba.fastjson.JSON;
  6 +import com.alibaba.fastjson.JSONObject;
  7 +import com.genersoft.iot.vmp.common.PageResult;
  8 +import com.genersoft.iot.vmp.common.StreamInfo;
  9 +import com.genersoft.iot.vmp.conf.MediaServerConfig;
  10 +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.stereotype.Component;
  13 +
  14 +import com.genersoft.iot.vmp.common.VideoManagerConstants;
  15 +import com.genersoft.iot.vmp.gb28181.bean.Device;
  16 +import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
  17 +import com.genersoft.iot.vmp.utils.redis.RedisUtil;
  18 +import org.springframework.util.StringUtils;
  19 +
  20 +/**
  21 + * @Description:视频设备数据存储-redis实现
  22 + * @author: swwheihei
  23 + * @date: 2020年5月6日 下午2:31:42
  24 + */
  25 +@Component("redisStorager")
  26 +public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager {
  27 +
  28 + @Autowired
  29 + private RedisUtil redis;
  30 +
  31 + private HashMap<String, HashMap<String, HashSet<String>>> deviceMap = new HashMap<>();
  32 +
  33 +
  34 + /**
  35 + * 根据设备ID判断设备是否存在
  36 + *
  37 + * @param deviceId 设备ID
  38 + * @return true:存在 false:不存在
  39 + */
  40 + @Override
  41 + public boolean exists(String deviceId) {
  42 + return redis.hasKey(VideoManagerConstants.DEVICE_PREFIX+deviceId);
  43 + }
  44 +
  45 + /**
  46 + * 视频设备创建
  47 + *
  48 + * @param device 设备对象
  49 + * @return true:创建成功 false:创建失败
  50 + */
  51 + @Override
  52 + public boolean create(Device device) {
  53 + return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
  54 + }
  55 +
  56 +
  57 +
  58 + /**
  59 + * 视频设备更新
  60 + *
  61 + * @param device 设备对象
  62 + * @return true:更新成功 false:更新失败
  63 + */
  64 + @Override
  65 + public boolean updateDevice(Device device) {
  66 + if (deviceMap.get(device.getDeviceId()) == null) {
  67 + deviceMap.put(device.getDeviceId(), new HashMap<String, HashSet<String>>());
  68 + }
  69 +// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + device.getDeviceId() + "_" + "*");
  70 + // 更新device中的通道数量
  71 + device.setChannelCount(deviceMap.get(device.getDeviceId()).size());
  72 + // 存储device
  73 + return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
  74 +
  75 +
  76 + }
  77 +
  78 + @Override
  79 + public void updateChannel(String deviceId, DeviceChannel channel) {
  80 + String channelId = channel.getChannelId();
  81 + HashMap<String, HashSet<String>> channelMap = deviceMap.get(deviceId);
  82 + if (channelMap == null) return;
  83 +
  84 + // 作为父设备, 确定自己的子节点数
  85 + if (channelMap.get(channelId) == null) {
  86 + channelMap.put(channelId, new HashSet<String>());
  87 + }else if (channelMap.get(channelId).size()> 0) {
  88 + channel.setSubCount(channelMap.get(channelId).size());
  89 + }
  90 +
  91 + // 存储通道
  92 + redis.set(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
  93 + "_" + channel.getChannelId() +
  94 + ":" + channel.getName() +
  95 + "_" + (channel.getStatus() == 1 ? "on":"off") +
  96 + "_" + (channelMap.get(channelId).size() > 0)+
  97 + "_" + channel.getParentId(),
  98 + channel);
  99 + // 更新device中的通道数量
  100 + Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
  101 + device.setChannelCount(deviceMap.get(deviceId).size());
  102 + redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
  103 +
  104 +
  105 + // 如果有父设备,更新父设备内子节点数
  106 + String parentId = channel.getParentId();
  107 + if (!StringUtils.isEmpty(parentId)) {
  108 +
  109 + if (channelMap.get(parentId) == null) {
  110 + channelMap.put(parentId, new HashSet<>());
  111 + }
  112 + channelMap.get(parentId).add(channelId);
  113 +
  114 + DeviceChannel deviceChannel = queryChannel(deviceId, parentId);
  115 + if (deviceChannel != null) {
  116 + deviceChannel.setSubCount(channelMap.get(parentId).size());
  117 + redis.set(VideoManagerConstants.CACHEKEY_PREFIX+deviceId + "_" + deviceChannel.getChannelId(),
  118 + deviceChannel);
  119 +
  120 + }
  121 + }
  122 +
  123 + }
  124 +
  125 + /**
  126 + * 获取设备
  127 + *
  128 + * @param deviceId 设备ID
  129 + * @return Device 设备对象
  130 + */
  131 + @Override
  132 + public Device queryVideoDevice(String deviceId) {
  133 + return (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
  134 + }
  135 +
  136 + @Override
  137 + public PageResult queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, String online, int page, int count) {
  138 + List<DeviceChannel> result = new ArrayList<>();
  139 + PageResult pageResult = new PageResult<DeviceChannel>();
  140 + String queryContent = "*";
  141 + if (!StringUtils.isEmpty(query)) queryContent = String.format("*%S*",query);
  142 + String queryHasSubChannel = "*";
  143 + if (hasSubChannel != null) queryHasSubChannel = hasSubChannel?"true":"false";
  144 + String queryOnline = "*";
  145 + if (!StringUtils.isEmpty(online)) queryOnline = online;
  146 + String queryStr = VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
  147 + "_" + queryContent + // 搜索编号和名称
  148 + "_" + queryOnline + // 搜索是否在线
  149 + "_" + queryHasSubChannel + // 搜索是否含有子节点
  150 + "_" + "*";
  151 + List<Object> deviceChannelList = redis.keys(queryStr);
  152 + pageResult.setPage(page);
  153 + pageResult.setCount(count);
  154 + pageResult.setTotal(deviceChannelList.size());
  155 + int maxCount = (page + 1 ) * count;
  156 + if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
  157 + for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) {
  158 + result.add((DeviceChannel)redis.get((String)deviceChannelList.get(i)));
  159 + }
  160 + pageResult.setData(result);
  161 + }
  162 +
  163 + return pageResult;
  164 + }
  165 +
  166 + @Override
  167 + public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) {
  168 + List<DeviceChannel> result = new ArrayList<>();
  169 + List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
  170 + if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
  171 + for (int i = 0; i < deviceChannelList.size(); i++) {
  172 + result.add((DeviceChannel)redis.get((String)deviceChannelList.get(i)));
  173 + }
  174 + }
  175 + return result;
  176 + }
  177 +
  178 + @Override
  179 + public PageResult querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, String online, int page, int count) {
  180 + List<DeviceChannel> allDeviceChannels = new ArrayList<>();
  181 + String queryContent = "*";
  182 + if (!StringUtils.isEmpty(query)) queryContent = String.format("*%S*",query);
  183 + String queryHasSubChannel = "*";
  184 + if (hasSubChannel != null) queryHasSubChannel = hasSubChannel?"true":"false";
  185 + String queryOnline = "*";
  186 + if (!StringUtils.isEmpty(online)) queryOnline = online;
  187 + String queryStr = VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
  188 + "_" + queryContent + // 搜索编号和名称
  189 + "_" + queryOnline + // 搜索是否在线
  190 + "_" + queryHasSubChannel + // 搜索是否含有子节点
  191 + "_" + parentChannelId;
  192 +
  193 + List<Object> deviceChannelList = redis.keys(queryStr);
  194 +
  195 + if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
  196 + for (int i = 0; i < deviceChannelList.size(); i++) {
  197 + DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i));
  198 + if (deviceChannel.getParentId() != null && deviceChannel.getParentId().equals(parentChannelId)) {
  199 + allDeviceChannels.add(deviceChannel);
  200 + }
  201 + }
  202 + }
  203 + int maxCount = (page + 1 ) * count;
  204 + PageResult pageResult = new PageResult<DeviceChannel>();
  205 + pageResult.setPage(page);
  206 + pageResult.setCount(count);
  207 + pageResult.setTotal(allDeviceChannels.size());
  208 +
  209 + if (allDeviceChannels.size() > 0) {
  210 + pageResult.setData(allDeviceChannels.subList(
  211 + page * count, pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal()
  212 + ));
  213 + }
  214 + return pageResult;
  215 + }
  216 +
  217 + public List<DeviceChannel> querySubChannels(String deviceId, String parentChannelId) {
  218 + List<DeviceChannel> allDeviceChannels = new ArrayList<>();
  219 + List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
  220 +
  221 + if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
  222 + for (int i = 0; i < deviceChannelList.size(); i++) {
  223 + DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i));
  224 + if (deviceChannel.getParentId() != null && deviceChannel.getParentId().equals(parentChannelId)) {
  225 + allDeviceChannels.add(deviceChannel);
  226 + }
  227 + }
  228 + }
  229 +
  230 + return allDeviceChannels;
  231 + }
  232 +
  233 + @Override
  234 + public DeviceChannel queryChannel(String deviceId, String channelId) {
  235 + return (DeviceChannel)redis.get(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + channelId + "_");
  236 + }
  237 +
  238 +
  239 + /**
  240 + * 获取多个设备
  241 + *
  242 + * @param deviceIds 设备ID数组
  243 + * @return List<Device> 设备对象数组
  244 + */
  245 + @Override
  246 + public PageResult<Device> queryVideoDeviceList(String[] deviceIds, int page, int count) {
  247 + List<Device> devices = new ArrayList<>();
  248 + PageResult pageResult = new PageResult<Device>();
  249 + pageResult.setPage(page);
  250 + pageResult.setCount(count);
  251 +
  252 + if (deviceIds == null || deviceIds.length == 0) {
  253 +
  254 + List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
  255 + pageResult.setTotal(deviceIdList.size());
  256 + int maxCount = (page + 1)* count;
  257 + for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) {
  258 + devices.add((Device)redis.get((String)deviceIdList.get(i)));
  259 + }
  260 + } else {
  261 + for (int i = 0; i < deviceIds.length; i++) {
  262 + devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]));
  263 + }
  264 + }
  265 + pageResult.setData(devices);
  266 + return pageResult;
  267 + }
  268 +
  269 + /**
  270 + * 获取多个设备
  271 + *
  272 + * @param deviceIds 设备ID数组
  273 + * @return List<Device> 设备对象数组
  274 + */
  275 + @Override
  276 + public List<Device> queryVideoDeviceList(String[] deviceIds) {
  277 + List<Device> devices = new ArrayList<>();
  278 +
  279 + if (deviceIds == null || deviceIds.length == 0) {
  280 + List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
  281 + for (int i = 0; i < deviceIdList.size(); i++) {
  282 + devices.add((Device)redis.get((String)deviceIdList.get(i)));
  283 + }
  284 + } else {
  285 + for (int i = 0; i < deviceIds.length; i++) {
  286 + devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]));
  287 + }
  288 + }
  289 + return devices;
  290 + }
  291 +
  292 + /**
  293 + * 删除设备
  294 + *
  295 + * @param deviceId 设备ID
  296 + * @return true:删除成功 false:删除失败
  297 + */
  298 + @Override
  299 + public boolean delete(String deviceId) {
  300 + return redis.del(VideoManagerConstants.DEVICE_PREFIX+deviceId);
  301 + }
  302 +
  303 + /**
  304 + * 更新设备在线
  305 + *
  306 + * @param deviceId 设备ID
  307 + * @return true:更新成功 false:更新失败
  308 + */
  309 + @Override
  310 + public boolean online(String deviceId) {
  311 + Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
  312 + device.setOnline(1);
  313 + return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
  314 + }
  315 +
  316 + /**
  317 + * 更新设备离线
  318 + *
  319 + * @param deviceId 设备ID
  320 + * @return true:更新成功 false:更新失败
  321 + */
  322 + @Override
  323 + public boolean outline(String deviceId) {
  324 + Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
  325 + if (device == null) return false;
  326 + device.setOnline(0);
  327 + return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
  328 + }
  329 +
  330 + /**
  331 + * 开始播放时将流存入redis
  332 + *
  333 + * @param deviceId 设备ID
  334 + * @param channelId 通道ID
  335 + * @return
  336 + */
  337 + @Override
  338 + public boolean startPlay(String deviceId, String channelId, StreamInfo stream) {
  339 + return redis.set(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId),
  340 + stream);
  341 + }
  342 +
  343 + /**
  344 + * 停止播放时从redis删除
  345 + *
  346 + * @param deviceId 设备ID
  347 + * @param channelId 通道ID
  348 + * @return
  349 + */
  350 + @Override
  351 + public boolean stopPlay(String deviceId, String channelId) {
  352 + return redis.del(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId));
  353 + }
  354 +
  355 + /**
  356 + * 查询播放列表
  357 + * @param deviceId 设备ID
  358 + * @param channelId 通道ID
  359 + * @return
  360 + */
  361 + @Override
  362 + public StreamInfo queryPlay(String deviceId, String channelId) {
  363 + return (StreamInfo)redis.get(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId));
  364 + }
  365 +
  366 +
  367 +
  368 + /**
  369 + * 更新流媒体信息
  370 + * @param mediaServerConfig
  371 + * @return
  372 + */
  373 + @Override
  374 + public boolean updateMediaInfo(MediaServerConfig mediaServerConfig) {
  375 + return redis.set(VideoManagerConstants.MEDIA_SERVER_PREFIX,mediaServerConfig);
  376 + }
  377 +
  378 + /**
  379 + * 获取流媒体信息
  380 + * @return
  381 + */
  382 + @Override
  383 + public MediaServerConfig getMediaInfo() {
  384 + return (MediaServerConfig)redis.get(VideoManagerConstants.MEDIA_SERVER_PREFIX);
  385 + }
  386 +
  387 + @Override
  388 + public void updateCatch() {
  389 + deviceMap = new HashMap<>();
  390 + // 更新设备
  391 + List<Device> devices = queryVideoDeviceList(null);
  392 + if (devices == null && devices.size() == 0) return;
  393 + for (Device device : devices) {
  394 + // 更新设备下的通道
  395 + HashMap<String, HashSet<String>> channelMap = new HashMap<String, HashSet<String>>();
  396 + List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX +
  397 + device.getDeviceId() + "_" + "*");
  398 + if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
  399 + for (int i = 0; i < deviceChannelList.size(); i++) {
  400 + String key = (String)deviceChannelList.get(i);
  401 + String[] s = key.split("_");
  402 + String channelId = s[3];
  403 + HashSet<String> subChannel = channelMap.get(channelId);
  404 + if (subChannel == null) {
  405 + subChannel = new HashSet<>();
  406 + }
  407 + if (s.length > 4) {
  408 + subChannel.add(s[4]);
  409 + }
  410 + channelMap.put(channelId, subChannel);
  411 + System.out.println();
  412 + }
  413 + }
  414 + deviceMap.put(device.getDeviceId(),channelMap);
  415 + }
  416 + }
  417 +}
... ...
src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java
... ... @@ -9,12 +9,7 @@ import org.slf4j.LoggerFactory;
9 9 import org.springframework.beans.factory.annotation.Autowired;
10 10 import org.springframework.http.HttpStatus;
11 11 import org.springframework.http.ResponseEntity;
12   -import org.springframework.web.bind.annotation.CrossOrigin;
13   -import org.springframework.web.bind.annotation.GetMapping;
14   -import org.springframework.web.bind.annotation.PathVariable;
15   -import org.springframework.web.bind.annotation.PostMapping;
16   -import org.springframework.web.bind.annotation.RequestMapping;
17   -import org.springframework.web.bind.annotation.RestController;
  12 +import org.springframework.web.bind.annotation.*;
18 13 import org.springframework.web.context.request.async.DeferredResult;
19 14  
20 15 import com.alibaba.fastjson.JSONObject;
... ... @@ -72,12 +67,17 @@ public class DeviceController {
72 67 * @return 通道列表
73 68 */
74 69 @GetMapping("devices/{deviceId}/channels")
75   - public ResponseEntity<PageResult> channels(@PathVariable String deviceId, int page, int count){
  70 + public ResponseEntity<PageResult> channels(@PathVariable String deviceId,
  71 + int page, int count,
  72 + @RequestParam(required = false) String query,
  73 + @RequestParam(required = false) String online,
  74 + @RequestParam(required = false) Boolean channelType
  75 + ){
76 76  
77 77 if (logger.isDebugEnabled()) {
78 78 logger.debug("查询所有视频设备API调用");
79 79 }
80   - PageResult pageResult = storager.queryChannelsByDeviceId(deviceId, page, count);
  80 + PageResult pageResult = storager.queryChannelsByDeviceId(deviceId, query, channelType, online, page, count);
81 81 return new ResponseEntity<>(pageResult,HttpStatus.OK);
82 82 }
83 83  
... ... @@ -115,4 +115,33 @@ public class DeviceController {
115 115 return new ResponseEntity<String>("设备预览API调用失败!", HttpStatus.INTERNAL_SERVER_ERROR);
116 116 }
117 117 }
  118 +
  119 + /**
  120 + * 分页查询通道数
  121 + * @param channelId 通道id
  122 + * @param page 当前页
  123 + * @param count 每页条数
  124 + * @return 子通道列表
  125 + */
  126 + @GetMapping("subChannels/{deviceId}/{channelId}/channels")
  127 + public ResponseEntity<PageResult> subChannels(@PathVariable String deviceId,
  128 + @PathVariable String channelId,
  129 + int page,
  130 + int count,
  131 + @RequestParam(required = false) String query,
  132 + @RequestParam(required = false) String online,
  133 + @RequestParam(required = false) Boolean channelType){
  134 +
  135 + if (logger.isDebugEnabled()) {
  136 + logger.debug("查询所有视频设备API调用");
  137 + }
  138 + DeviceChannel deviceChannel = storager.queryChannel(deviceId,channelId);
  139 + if (deviceChannel == null) {
  140 + PageResult<DeviceChannel> deviceChannelPageResult = new PageResult<>();
  141 + new ResponseEntity<>(deviceChannelPageResult,HttpStatus.OK);
  142 + }
  143 +
  144 + PageResult pageResult = storager.querySubChannels(deviceId, channelId, query, channelType, online, page, count);
  145 + return new ResponseEntity<>(pageResult,HttpStatus.OK);
  146 + }
118 147 }
... ...
src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java
... ... @@ -68,7 +68,7 @@ public class ApiDeviceController {
68 68 devices = storager.queryVideoDeviceList(null);
69 69 result.put("DeviceCount", devices.size());
70 70 }else {
71   - PageResult<Device> deviceList = storager.queryVideoDeviceList(null, start, limit);
  71 + PageResult<Device> deviceList = storager.queryVideoDeviceList(null, start/limit, limit);
72 72 result.put("DeviceCount", deviceList.getTotal());
73 73 devices = deviceList.getData();
74 74 }
... ... @@ -123,7 +123,7 @@ public class ApiDeviceController {
123 123 deviceChannels = storager.queryChannelsByDeviceId(serial);
124 124 result.put("ChannelCount", deviceChannels.size());
125 125 }else {
126   - PageResult<DeviceChannel> pageResult = storager.queryChannelsByDeviceId(serial, start, limit);
  126 + PageResult<DeviceChannel> pageResult = storager.queryChannelsByDeviceId(serial, null, null, null,start/limit, limit);
127 127 result.put("ChannelCount", pageResult.getTotal());
128 128 deviceChannels = pageResult.getData();
129 129 }
... ... @@ -139,7 +139,7 @@ public class ApiDeviceController {
139 139 deviceJOSNChannel.put("Name", deviceChannel.getName());
140 140 deviceJOSNChannel.put("Custom", false);
141 141 deviceJOSNChannel.put("CustomName", "");
142   - deviceJOSNChannel.put("SubCount", 0); // TODO ? 子节点数, SubCount > 0 表示该通道为子目录
  142 + deviceJOSNChannel.put("SubCount", deviceChannel.getSubCount()); // TODO ? 子节点数, SubCount > 0 表示该通道为子目录
143 143 deviceJOSNChannel.put("SnapURL", "");
144 144 deviceJOSNChannel.put("Manufacturer ", deviceChannel.getManufacture());
145 145 deviceJOSNChannel.put("Model", deviceChannel.getModel());
... ...
src/main/resources/application.yml
... ... @@ -12,7 +12,7 @@ spring:
12 12 port: 6379
13 13 database: 6
14 14 #访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接
15   - password:
  15 + password: 4767cb971b40a1300fa09b7f87b09d1c
16 16 #超时时间
17 17 timeout: 10000
18 18 datasource:
... ... @@ -31,8 +31,8 @@ sip:
31 31 # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)
32 32 # 后两位为行业编码,定义参照附录D.3
33 33 # 3701020049标识山东济南历下区 信息行业接入
34   - domain: 3701020049
35   - id: 37010200492000000001
  34 + domain: 3402000000
  35 + id: 34020000002000000001
36 36 # 默认设备认证密码,后续扩展使用设备单独密码
37 37 password: 12345678
38 38 media:
... ...