From fc89b7b517e191fb6c9b66fa86dd05ebab0f54c5 Mon Sep 17 00:00:00 2001 From: jiang <893224616@qq.com> Date: 星期三, 13 七月 2022 11:29:46 +0800 Subject: [PATCH] 测试提交权限 --- src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java | 292 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 214 insertions(+), 78 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java index d9357d2..767e9c4 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java @@ -1,34 +1,44 @@ package com.genersoft.iot.vmp.vmanager.gb28181.device; import com.alibaba.fastjson.JSONObject; +import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; +import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder; +import com.genersoft.iot.vmp.gb28181.bean.SyncStatus; +import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; +import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask; +import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; +import com.genersoft.iot.vmp.vmanager.bean.BaseTree; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.PageInfo; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import org.apache.commons.compress.utils.IOUtils; +import org.apache.http.HttpResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; -import java.util.List; -import java.util.UUID; +import javax.servlet.http.HttpServletResponse; +import javax.sip.DialogState; +import java.io.*; +import java.nio.file.Files; +import java.util.*; @Api(tags = "鍥芥爣璁惧鏌ヨ", value = "鍥芥爣璁惧鏌ヨ") @SuppressWarnings("rawtypes") @@ -40,7 +50,7 @@ private final static Logger logger = LoggerFactory.getLogger(DeviceQuery.class); @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IRedisCatchStorage redisCatchStorage; @@ -50,12 +60,15 @@ @Autowired private DeferredResultHolder resultHolder; - - @Autowired - private DeviceOffLineDetector offLineDetector; @Autowired private IDeviceService deviceService; + + @Autowired + private DynamicTask dynamicTask; + + @Autowired + private SubscribeHolder subscribeHolder; /** * 浣跨敤ID鏌ヨ鍥芥爣璁惧 @@ -118,12 +131,14 @@ @ApiImplicitParam(name="query", value = "鏌ヨ鍐呭" ,dataTypeClass = String.class), @ApiImplicitParam(name="online", value = "鏄惁鍦ㄧ嚎" ,dataTypeClass = Boolean.class), @ApiImplicitParam(name="channelType", value = "璁惧/瀛愮洰褰�-> false/true" ,dataTypeClass = Boolean.class), + @ApiImplicitParam(name="catalogUnderDevice", value = "鏄惁鐩村睘涓庤澶囩殑鐩綍" ,dataTypeClass = Boolean.class), }) public ResponseEntity<PageInfo> channels(@PathVariable String deviceId, int page, int count, @RequestParam(required = false) String query, @RequestParam(required = false) Boolean online, - @RequestParam(required = false) Boolean channelType) { + @RequestParam(required = false) Boolean channelType, + @RequestParam(required = false) Boolean catalogUnderDevice) { // if (logger.isDebugEnabled()) { // logger.debug("鏌ヨ瑙嗛璁惧閫氶亾API璋冪敤"); // } @@ -131,7 +146,7 @@ query = null; } - PageInfo pageResult = storager.queryChannelsByDeviceId(deviceId, query, channelType, online, page, count); + PageInfo pageResult = storager.queryChannelsByDeviceId(deviceId, query, channelType, online, catalogUnderDevice, page, count); return new ResponseEntity<>(pageResult,HttpStatus.OK); } @@ -145,48 +160,27 @@ @ApiImplicitParam(name="deviceId", value = "璁惧id", required = true, dataTypeClass = String.class), }) @PostMapping("/devices/{deviceId}/sync") - public DeferredResult<ResponseEntity<Device>> devicesSync(@PathVariable String deviceId){ + public WVPResult<SyncStatus> devicesSync(@PathVariable String deviceId){ if (logger.isDebugEnabled()) { logger.debug("璁惧閫氶亾淇℃伅鍚屾API璋冪敤锛宒eviceId锛�" + deviceId); } Device device = storager.queryVideoDevice(deviceId); - String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId; - String uuid = UUID.randomUUID().toString(); - // 榛樿瓒呮椂鏃堕棿涓�30鍒嗛挓 - DeferredResult<ResponseEntity<Device>> result = new DeferredResult<ResponseEntity<Device>>(30*60*1000L); - result.onTimeout(()->{ - logger.warn("璁惧[{}]閫氶亾淇℃伅鍚屾瓒呮椂", deviceId); - // 閲婃斁rtpserver - RequestMessage msg = new RequestMessage(); - msg.setKey(key); - msg.setId(uuid); - WVPResult<Object> wvpResult = new WVPResult<>(); - wvpResult.setCode(-1); - wvpResult.setData(device); - wvpResult.setMsg("鏇存柊瓒呮椂"); - msg.setData(wvpResult); - resultHolder.invokeAllResult(msg); - - }); - // 绛夊緟鍏朵粬鐩稿悓璇锋眰杩斿洖鏃朵竴璧疯繑鍥� - if (resultHolder.exist(key, null)) { - return result; + boolean status = deviceService.isSyncRunning(deviceId); + // 宸插瓨鍦ㄥ垯杩斿洖杩涘害 + if (status) { + WVPResult<SyncStatus> wvpResult = new WVPResult<>(); + wvpResult.setCode(0); + SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId); + wvpResult.setData(channelSyncStatus); + return wvpResult; } - cmder.catalogQuery(device, event -> { - RequestMessage msg = new RequestMessage(); - msg.setKey(key); - msg.setId(uuid); - WVPResult<Object> wvpResult = new WVPResult<>(); - wvpResult.setCode(-1); - wvpResult.setData(device); - wvpResult.setMsg(String.format("鍚屾閫氶亾澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); - msg.setData(wvpResult); - resultHolder.invokeAllResult(msg); - }); + deviceService.sync(device); - resultHolder.put(key, uuid, result); - return result; + WVPResult<SyncStatus> wvpResult = new WVPResult<>(); + wvpResult.setCode(0); + wvpResult.setMsg("寮�濮嬪悓姝�"); + return wvpResult; } /** @@ -204,14 +198,23 @@ if (logger.isDebugEnabled()) { logger.debug("璁惧淇℃伅鍒犻櫎API璋冪敤锛宒eviceId锛�" + deviceId); } - - if (offLineDetector.isOnline(deviceId)) { - return new ResponseEntity<String>("涓嶅厑璁稿垹闄ゅ湪绾胯澶囷紒", HttpStatus.NOT_ACCEPTABLE); - } + // 娓呴櫎redis璁板綍 boolean isSuccess = storager.delete(deviceId); if (isSuccess) { redisCatchStorage.clearCatchByDeviceId(deviceId); + // 鍋滄姝よ澶囩殑璁㈤槄鏇存柊 + Set<String> allKeys = dynamicTask.getAllKeys(); + for (String key : allKeys) { + if (key.startsWith(deviceId)) { + Runnable runnable = dynamicTask.get(key); + if (runnable instanceof ISubscribeTask) { + ISubscribeTask subscribeTask = (ISubscribeTask) runnable; + subscribeTask.stop(); + } + dynamicTask.stop(key); + } + } JSONObject json = new JSONObject(); json.put("deviceId", deviceId); return new ResponseEntity<>(json.toString(),HttpStatus.OK); @@ -239,7 +242,7 @@ @ApiImplicitParam(name="page", value = "褰撳墠椤�", required = true, dataTypeClass = Integer.class), @ApiImplicitParam(name="count", value = "姣忛〉鏉℃暟", required = true, dataTypeClass = Integer.class), @ApiImplicitParam(name="query", value = "鏌ヨ鍐呭", dataTypeClass = String.class), - @ApiImplicitParam(name="online", value = "鏄惁鍦ㄧ嚎", dataTypeClass = String.class), + @ApiImplicitParam(name="online", value = "鏄惁鍦ㄧ嚎", dataTypeClass = Boolean.class), @ApiImplicitParam(name="channelType", value = "閫氶亾绫诲瀷锛� 瀛愮洰褰�", dataTypeClass = Boolean.class), }) @GetMapping("/sub_channels/{deviceId}/{channelId}/channels") @@ -248,7 +251,7 @@ int page, int count, @RequestParam(required = false) String query, - @RequestParam(required = false) String online, + @RequestParam(required = false) Boolean online, @RequestParam(required = false) Boolean channelType){ // if (logger.isDebugEnabled()) { @@ -297,7 +300,8 @@ public ResponseEntity<PageInfo> updateTransport(@PathVariable String deviceId, @PathVariable String streamMode){ Device device = storager.queryVideoDevice(deviceId); device.setStreamMode(streamMode); - storager.updateDevice(device); +// storager.updateDevice(device); + deviceService.updateDevice(device); return new ResponseEntity<>(null,HttpStatus.OK); } @@ -314,25 +318,7 @@ public ResponseEntity<WVPResult<String>> updateDevice(Device device){ if (device != null && device.getDeviceId() != null) { - Device deviceInStore = storager.queryVideoDevice(device.getDeviceId()); - if (!StringUtils.isEmpty(device.getName())) deviceInStore.setName(device.getName()); - if (!StringUtils.isEmpty(device.getCharset())) deviceInStore.setCharset(device.getCharset()); - if (!StringUtils.isEmpty(device.getMediaServerId())) deviceInStore.setMediaServerId(device.getMediaServerId()); - - if ((deviceInStore.getSubscribeCycleForCatalog() <=0 && device.getSubscribeCycleForCatalog() > 0) - || deviceInStore.getSubscribeCycleForCatalog() != device.getSubscribeCycleForCatalog()) { - deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog()); - // 寮�鍚闃� - deviceService.addCatalogSubscribe(deviceInStore); - } - if (deviceInStore.getSubscribeCycleForCatalog() > 0 && device.getSubscribeCycleForCatalog() <= 0) { - deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog()); - // 鍙栨秷璁㈤槄 - deviceService.removeCatalogSubscribe(deviceInStore); - } - - storager.updateDevice(deviceInStore); - cmder.deviceInfoQuery(deviceInStore); + deviceService.updateDevice(device); } WVPResult<String> result = new WVPResult<>(); result.setCode(0); @@ -357,6 +343,11 @@ Device device = storager.queryVideoDevice(deviceId); String uuid = UUID.randomUUID().toString(); String key = DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId; + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(2*1000L); + if(device == null) { + result.setResult(new ResponseEntity(String.format("璁惧%s涓嶅瓨鍦�", deviceId),HttpStatus.OK)); + return result; + } cmder.deviceStatusQuery(device, event -> { RequestMessage msg = new RequestMessage(); msg.setId(uuid); @@ -364,7 +355,6 @@ msg.setData(String.format("鑾峰彇璁惧鐘舵�佸け璐ワ紝閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); resultHolder.invokeResult(msg); }); - DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(2*1000L); result.onTimeout(()->{ logger.warn(String.format("鑾峰彇璁惧鐘舵�佽秴鏃�")); // 閲婃斁rtpserver @@ -434,9 +424,155 @@ return result; } - @GetMapping("/{deviceId}/tree") - @ApiOperation(value = "閫氶亾鏍戝舰缁撴瀯", notes = "閫氶亾鏍戝舰缁撴瀯") - public WVPResult<List<DeviceChannelTree>> tree(@PathVariable String deviceId) { - return WVPResult.Data(storager.tree(deviceId)); + + @GetMapping("/{deviceId}/sync_status") + @ApiOperation(value = "鑾峰彇閫氶亾鍚屾杩涘害", notes = "鑾峰彇閫氶亾鍚屾杩涘害") + public WVPResult<SyncStatus> getSyncStatus(@PathVariable String deviceId) { + SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId); + WVPResult<SyncStatus> wvpResult = new WVPResult<>(); + if (channelSyncStatus == null) { + wvpResult.setCode(-1); + wvpResult.setMsg("鍚屾灏氭湭寮�濮�"); + }else { + wvpResult.setCode(0); + wvpResult.setData(channelSyncStatus); + if (channelSyncStatus.getErrorMsg() != null) { + wvpResult.setMsg(channelSyncStatus.getErrorMsg()); + } + } + return wvpResult; + } + + @GetMapping("/{deviceId}/subscribe_info") + @ApiOperation(value = "鑾峰彇璁惧鐨勮闃呯姸鎬�", notes = "鑾峰彇璁惧鐨勮闃呯姸鎬�") + public WVPResult<Map<String, String>> getSubscribeInfo(@PathVariable String deviceId) { + Set<String> allKeys = dynamicTask.getAllKeys(); + Map<String, String> dialogStateMap = new HashMap<>(); + for (String key : allKeys) { + if (key.startsWith(deviceId)) { + ISubscribeTask subscribeTask = (ISubscribeTask)dynamicTask.get(key); + DialogState dialogState = subscribeTask.getDialogState(); + if (dialogState == null) { + continue; + } + if (subscribeTask instanceof CatalogSubscribeTask) { + dialogStateMap.put("catalog", dialogState.toString()); + }else if (subscribeTask instanceof MobilePositionSubscribeTask) { + dialogStateMap.put("mobilePosition", dialogState.toString()); + } + } + } + WVPResult<Map<String, String>> wvpResult = new WVPResult<>(); + wvpResult.setCode(0); + wvpResult.setData(dialogStateMap); + return wvpResult; + } + + @GetMapping("/snap/{deviceId}/{channelId}") + @ApiOperation(value = "璇锋眰鎴浘", notes = "璇锋眰鎴浘") + public void getSnap(HttpServletResponse resp, @PathVariable String deviceId, @PathVariable String channelId) { + + try { + final InputStream in = Files.newInputStream(new File("snap" + File.separator + deviceId + "_" + channelId + ".jpg").toPath()); + resp.setContentType(MediaType.IMAGE_PNG_VALUE); + IOUtils.copy(in, resp.getOutputStream()); + } catch (IOException e) { + resp.setStatus(HttpServletResponse.SC_NOT_FOUND); + } + } + + /** + * 鏌ヨ鍥芥爣鏍� + * @param deviceId 璁惧ID + * @param parentId 鐖禝D + * @param page 褰撳墠椤� + * @param count 姣忛〉鏉℃暟 + * @return 鍥芥爣璁惧 + */ + @ApiOperation("鏌ヨ鍥芥爣鏍�") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceId", value = "璁惧ID", required = true, dataTypeClass = String.class), + @ApiImplicitParam(name = "parentId", value = "鐖禝D", required = false, dataTypeClass = String.class), + @ApiImplicitParam(name = "onlyCatalog", value = "鍙幏鍙栫洰褰�", required = false, dataTypeClass = Boolean.class), + @ApiImplicitParam(name="page", value = "褰撳墠椤�", required = true, dataTypeClass = Integer.class), + @ApiImplicitParam(name="count", value = "姣忛〉鏉℃暟", required = true, dataTypeClass = Integer.class), + }) + @GetMapping("/tree/{deviceId}") + public ResponseEntity<PageInfo> getTree(@PathVariable String deviceId, @RequestParam(required = false) String parentId, @RequestParam(required = false) Boolean onlyCatalog, int page, int count){ + + + if (page <= 0) { + page = 1; + } + if (onlyCatalog == null) { + onlyCatalog = false; + } + + List<BaseTree<DeviceChannel>> treeData = deviceService.queryVideoDeviceTree(deviceId, parentId, onlyCatalog); + if (treeData == null || (page - 1) * count > treeData.size()) { + PageInfo<BaseTree<DeviceChannel>> pageInfo = new PageInfo<>(); + pageInfo.setPageNum(page); + pageInfo.setTotal(treeData == null? 0 : treeData.size()); + pageInfo.setSize(0); + pageInfo.setList(new ArrayList<>()); + return new ResponseEntity<>(pageInfo,HttpStatus.OK); + } + + int toIndex = Math.min(page * count, treeData.size()); + // 澶勭悊鍒嗛〉 + List<BaseTree<DeviceChannel>> trees = treeData.subList((page - 1) * count, toIndex); + PageInfo<BaseTree<DeviceChannel>> pageInfo = new PageInfo<>(); + pageInfo.setPageNum(page); + pageInfo.setTotal(treeData.size()); + pageInfo.setSize(trees.size()); + pageInfo.setList(trees); + + return new ResponseEntity<>(pageInfo,HttpStatus.OK); + } + + + /** + * 鏌ヨ鍥芥爣鏍戜笅鐨勯�氶亾 + * @param deviceId 璁惧ID + * @param parentId 鐖禝D + * @param page 褰撳墠椤� + * @param count 姣忛〉鏉℃暟 + * @return 鍥芥爣璁惧 + */ + @ApiOperation("鏌ヨ鍥芥爣鏍戜笅鐨勯�氶亾") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceId", value = "璁惧ID", required = true, dataTypeClass = String.class), + @ApiImplicitParam(name = "parentId", value = "鐖禝D", required = false, dataTypeClass = String.class), + @ApiImplicitParam(name="page", value = "褰撳墠椤�", required = true, dataTypeClass = Integer.class), + @ApiImplicitParam(name="count", value = "姣忛〉鏉℃暟", required = true, dataTypeClass = Integer.class), + }) + @GetMapping("/tree/channel/{deviceId}") + public ResponseEntity<PageInfo> getChannelInTreeNode(@PathVariable String deviceId, @RequestParam(required = false) String parentId, int page, int count){ + + + if (page <= 0) { + page = 1; + } + + List<DeviceChannel> treeData = deviceService.queryVideoDeviceInTreeNode(deviceId, parentId); + if (treeData == null || (page - 1) * count > treeData.size()) { + PageInfo<BaseTree<DeviceChannel>> pageInfo = new PageInfo<>(); + pageInfo.setPageNum(page); + pageInfo.setTotal(treeData == null? 0 : treeData.size()); + pageInfo.setSize(0); + pageInfo.setList(new ArrayList<>()); + return new ResponseEntity<>(pageInfo,HttpStatus.OK); + } + + int toIndex = Math.min(page * count, treeData.size()); + // 澶勭悊鍒嗛〉 + List<DeviceChannel> trees = treeData.subList((page - 1) * count, toIndex); + PageInfo<DeviceChannel> pageInfo = new PageInfo<>(); + pageInfo.setPageNum(page); + pageInfo.setTotal(treeData.size()); + pageInfo.setSize(trees.size()); + pageInfo.setList(trees); + + return new ResponseEntity<>(pageInfo,HttpStatus.OK); } } -- Gitblit v1.8.0