From 1af77ab5f7c11a4b3d59c1989b51b9fca29679ce Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期二, 18 十月 2022 22:18:49 +0800 Subject: [PATCH] Merge pull request #645 from IKangXu/wvp-28181-2.0 --- src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java | 520 ++++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 324 insertions(+), 196 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 1d63909..d91b596 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,36 +1,52 @@ 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.conf.exception.ControllerException; 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.IDeviceChannelService; 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.ErrorCode; 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 io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +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.ObjectUtils; 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 javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.io.*; +import java.nio.file.Files; +import java.text.ParseException; +import java.util.*; -@Api(tags = "鍥芥爣璁惧鏌ヨ", value = "鍥芥爣璁惧鏌ヨ") +@Tag(name = "鍥芥爣璁惧鏌ヨ", description = "鍥芥爣璁惧鏌ヨ") @SuppressWarnings("rawtypes") @CrossOrigin @RestController @@ -40,7 +56,10 @@ private final static Logger logger = LoggerFactory.getLogger(DeviceQuery.class); @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; + + @Autowired + private IDeviceChannelService deviceChannelService; @Autowired private IRedisCatchStorage redisCatchStorage; @@ -50,31 +69,24 @@ @Autowired private DeferredResultHolder resultHolder; - - @Autowired - private DeviceOffLineDetector offLineDetector; @Autowired private IDeviceService deviceService; + + @Autowired + private DynamicTask dynamicTask; /** * 浣跨敤ID鏌ヨ鍥芥爣璁惧 * @param deviceId 鍥芥爣ID * @return 鍥芥爣璁惧 */ - @ApiOperation("浣跨敤ID鏌ヨ鍥芥爣璁惧") - @ApiImplicitParams({ - @ApiImplicitParam(name = "deviceId", value = "璁惧ID", required = true, dataTypeClass = String.class), - }) + @Operation(summary = "鏌ヨ鍥芥爣璁惧") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) @GetMapping("/devices/{deviceId}") - public ResponseEntity<Device> devices(@PathVariable String deviceId){ + public Device devices(@PathVariable String deviceId){ -// if (logger.isDebugEnabled()) { -// logger.debug("鏌ヨ瑙嗛璁惧API璋冪敤锛宒eviceId锛�" + deviceId); -// } - - Device device = storager.queryVideoDevice(deviceId); - return new ResponseEntity<>(device,HttpStatus.OK); + return storager.queryVideoDevice(deviceId); } /** @@ -83,17 +95,11 @@ * @param count 姣忛〉鏌ヨ鏁伴噺 * @return 鍒嗛〉鍥芥爣鍒楄〃 */ - @ApiOperation("鍒嗛〉鏌ヨ鍥芥爣璁惧") - @ApiImplicitParams({ - @ApiImplicitParam(name = "page", value = "褰撳墠椤�", required = true, dataTypeClass = Integer.class), - @ApiImplicitParam(name = "count", value = "姣忛〉鏌ヨ鏁伴噺", required = true, dataTypeClass = Integer.class), - }) + @Operation(summary = "鍒嗛〉鏌ヨ鍥芥爣璁惧") + @Parameter(name = "page", description = "褰撳墠椤�", required = true) + @Parameter(name = "count", description = "姣忛〉鏌ヨ鏁伴噺", required = true) @GetMapping("/devices") public PageInfo<Device> devices(int page, int count){ - -// if (logger.isDebugEnabled()) { -// logger.debug("鏌ヨ鎵�鏈夎棰戣澶嘇PI璋冪敤"); -// } return storager.queryVideoDeviceList(page, count); } @@ -107,32 +113,29 @@ * @param query 鏌ヨ鍐呭 * @param online 鏄惁鍦ㄧ嚎 鍦ㄧ嚎 true / 绂荤嚎 false * @param channelType 璁惧 false/瀛愮洰褰� true + * @param catalogUnderDevice 鏄惁鐩村睘涓庤澶囩殑鐩綍 * @return 閫氶亾鍒楄〃 */ - @ApiOperation("鍒嗛〉鏌ヨ閫氶亾") @GetMapping("/devices/{deviceId}/channels") - @ApiImplicitParams({ - @ApiImplicitParam(name="deviceId", value = "璁惧id", required = true ,dataTypeClass = String.class), - @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 = Boolean.class), - @ApiImplicitParam(name="channelType", value = "璁惧/瀛愮洰褰�-> false/true" ,dataTypeClass = Boolean.class), - }) - public ResponseEntity<PageInfo> channels(@PathVariable String deviceId, + @Operation(summary = "鍒嗛〉鏌ヨ閫氶亾") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + @Parameter(name = "page", description = "褰撳墠椤�", required = true) + @Parameter(name = "count", description = "姣忛〉鏌ヨ鏁伴噺", required = true) + @Parameter(name = "query", description = "鏌ヨ鍐呭") + @Parameter(name = "online", description = "鏄惁鍦ㄧ嚎") + @Parameter(name = "channelType", description = "璁惧/瀛愮洰褰�-> false/true") + @Parameter(name = "catalogUnderDevice", description = "鏄惁鐩村睘涓庤澶囩殑鐩綍") + public PageInfo channels(@PathVariable String deviceId, int page, int count, @RequestParam(required = false) String query, @RequestParam(required = false) Boolean online, - @RequestParam(required = false) Boolean channelType) { -// if (logger.isDebugEnabled()) { -// logger.debug("鏌ヨ瑙嗛璁惧閫氶亾API璋冪敤"); -// } - if (StringUtils.isEmpty(query)) { + @RequestParam(required = false) Boolean channelType, + @RequestParam(required = false) Boolean catalogUnderDevice) { + if (ObjectUtils.isEmpty(query)) { query = null; } - PageInfo pageResult = storager.queryChannelsByDeviceId(deviceId, query, channelType, online, page, count); - return new ResponseEntity<>(pageResult,HttpStatus.OK); + return storager.queryChannelsByDeviceId(deviceId, query, channelType, online, catalogUnderDevice, page, count); } /** @@ -140,53 +143,27 @@ * @param deviceId 璁惧id * @return */ - @ApiOperation("鍚屾璁惧閫氶亾") - @ApiImplicitParams({ - @ApiImplicitParam(name="deviceId", value = "璁惧id", required = true, dataTypeClass = String.class), - }) + @Operation(summary = "鍚屾璁惧閫氶亾") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) @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) { + SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId); + return WVPResult.success(channelSyncStatus); } - 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; } /** @@ -194,27 +171,37 @@ * @param deviceId 璁惧id * @return */ - @ApiOperation("绉婚櫎璁惧") - @ApiImplicitParams({ - @ApiImplicitParam(name="deviceId", value = "璁惧id", required = true, dataTypeClass = String.class), - }) + @Operation(summary = "绉婚櫎璁惧") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) @DeleteMapping("/devices/{deviceId}/delete") - public ResponseEntity<String> delete(@PathVariable String deviceId){ + public String delete(@PathVariable String deviceId){ if (logger.isDebugEnabled()) { logger.debug("璁惧淇℃伅鍒犻櫎API璋冪敤锛宒eviceId锛�" + deviceId); } // 娓呴櫎redis璁板綍 - boolean isSuccess = storager.delete(deviceId); + boolean isSuccess = deviceService.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); + return json.toString(); } else { logger.warn("璁惧淇℃伅鍒犻櫎API璋冪敤澶辫触锛�"); - return new ResponseEntity<String>("璁惧淇℃伅鍒犻櫎API璋冪敤澶辫触锛�", HttpStatus.INTERNAL_SERVER_ERROR); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "璁惧淇℃伅鍒犻櫎API璋冪敤澶辫触锛�"); } } @@ -229,36 +216,31 @@ * @param channelType 閫氶亾绫诲瀷 * @return 瀛愰�氶亾鍒楄〃 */ - @ApiOperation("鍒嗛〉鏌ヨ瀛愮洰褰曢�氶亾") - @ApiImplicitParams({ - @ApiImplicitParam(name="deviceId", value = "璁惧id", required = true, dataTypeClass = String.class), - @ApiImplicitParam(name="channelId", value = "閫氶亾id", required = true, dataTypeClass = String.class), - @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="channelType", value = "閫氶亾绫诲瀷锛� 瀛愮洰褰�", dataTypeClass = Boolean.class), - }) + @Operation(summary = "鍒嗛〉鏌ヨ瀛愮洰褰曢�氶亾") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + @Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿", required = true) + @Parameter(name = "page", description = "褰撳墠椤�", required = true) + @Parameter(name = "count", description = "姣忛〉鏌ヨ鏁伴噺", required = true) + @Parameter(name = "query", description = "鏌ヨ鍐呭") + @Parameter(name = "online", description = "鏄惁鍦ㄧ嚎") + @Parameter(name = "channelType", description = "璁惧/瀛愮洰褰�-> false/true") @GetMapping("/sub_channels/{deviceId}/{channelId}/channels") - public ResponseEntity<PageInfo> subChannels(@PathVariable String deviceId, + public PageInfo 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 online, @RequestParam(required = false) Boolean channelType){ -// if (logger.isDebugEnabled()) { -// logger.debug("鏌ヨ鎵�鏈夎棰戦�氶亾API璋冪敤"); -// } DeviceChannel deviceChannel = storager.queryChannel(deviceId,channelId); if (deviceChannel == null) { PageInfo<DeviceChannel> deviceChannelPageResult = new PageInfo<>(); - return new ResponseEntity<>(deviceChannelPageResult,HttpStatus.OK); + return deviceChannelPageResult; } PageInfo pageResult = storager.querySubChannels(deviceId, channelId, query, channelType, online, page, count); - return new ResponseEntity<>(pageResult,HttpStatus.OK); + return pageResult; } /** @@ -267,15 +249,12 @@ * @param channel 閫氶亾 * @return */ - @ApiOperation("鏇存柊閫氶亾淇℃伅") - @ApiImplicitParams({ - @ApiImplicitParam(name="deviceId", value = "璁惧id", required = true, dataTypeClass = String.class), - @ApiImplicitParam(name="channel", value = "閫氶亾", required = true, dataTypeClass = String.class), - }) + @Operation(summary = "鏇存柊閫氶亾淇℃伅") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + @Parameter(name = "channel", description = "閫氶亾淇℃伅", required = true) @PostMapping("/channel/update/{deviceId}") - public ResponseEntity<PageInfo> updateChannel(@PathVariable String deviceId,DeviceChannel channel){ - storager.updateChannel(deviceId, channel); - return new ResponseEntity<>(null,HttpStatus.OK); + public void updateChannel(@PathVariable String deviceId,DeviceChannel channel){ + deviceChannelService.updateChannel(deviceId, channel); } /** @@ -284,18 +263,37 @@ * @param streamMode 鏁版嵁娴佷紶杈撴ā寮� * @return */ - @ApiOperation("淇敼鏁版嵁娴佷紶杈撴ā寮�") - @ApiImplicitParams({ - @ApiImplicitParam(name = "deviceId", value = "璁惧id", required = true, dataTypeClass = String.class), - @ApiImplicitParam(name = "streamMode", value = "鏁版嵁娴佷紶杈撴ā寮�, 鍙栧�硷細" + - "UDP锛坲dp浼犺緭锛夛紝TCP-ACTIVE锛坱cp涓诲姩妯″紡,鏆備笉鏀寔锛夛紝TCP-PASSIVE锛坱cp琚姩妯″紡锛�", dataTypeClass = String.class), - }) + @Operation(summary = "淇敼鏁版嵁娴佷紶杈撴ā寮�") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + @Parameter(name = "streamMode", description = "鏁版嵁娴佷紶杈撴ā寮�, 鍙栧�硷細" + + "UDP锛坲dp浼犺緭锛夛紝TCP-ACTIVE锛坱cp涓诲姩妯″紡,鏆備笉鏀寔锛夛紝TCP-PASSIVE锛坱cp琚姩妯″紡锛�", required = true) @PostMapping("/transport/{deviceId}/{streamMode}") - public ResponseEntity<PageInfo> updateTransport(@PathVariable String deviceId, @PathVariable String streamMode){ - Device device = storager.queryVideoDevice(deviceId); + public void updateTransport(@PathVariable String deviceId, @PathVariable String streamMode){ + Device device = deviceService.getDevice(deviceId); device.setStreamMode(streamMode); - storager.updateDevice(device); - return new ResponseEntity<>(null,HttpStatus.OK); + deviceService.updateCustomDevice(device); + } + + /** + * 娣诲姞璁惧淇℃伅 + * @param device 璁惧淇℃伅 + * @return + */ + @Operation(summary = "娣诲姞璁惧淇℃伅") + @Parameter(name = "device", description = "璁惧", required = true) + @PostMapping("/device/add/") + public void addDevice(Device device){ + + if (device == null || device.getDeviceId() == null) { + throw new ControllerException(ErrorCode.ERROR400); + } + + // 鏌ョ湅deviceId鏄惁瀛樺湪 + boolean exist = deviceService.isExist(device.getDeviceId()); + if (exist) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), "璁惧缂栧彿宸插瓨鍦�"); + } + deviceService.addDevice(device); } /** @@ -303,38 +301,14 @@ * @param device 璁惧淇℃伅 * @return */ - @ApiOperation("鏇存柊璁惧淇℃伅") - @ApiImplicitParams({ - @ApiImplicitParam(name = "device", value = "璁惧淇℃伅", required = true, dataTypeClass = Device.class) - }) + @Operation(summary = "鏇存柊璁惧淇℃伅") + @Parameter(name = "device", description = "璁惧", required = true) @PostMapping("/device/update/") - public ResponseEntity<WVPResult<String>> updateDevice(Device device){ + public void 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 (device.getSubscribeCycleForCatalog() > 0) { - if (deviceInStore.getSubscribeCycleForCatalog() == 0 || deviceInStore.getSubscribeCycleForCatalog() != device.getSubscribeCycleForCatalog()) { - // 寮�鍚闃� - deviceService.addCatalogSubscribe(deviceInStore); - } - }else if (device.getSubscribeCycleForCatalog() == 0) { - if (deviceInStore.getSubscribeCycleForCatalog() != 0) { - // 鍙栨秷璁㈤槄 - deviceService.removeCatalogSubscribe(deviceInStore); - } - } - - storager.updateDevice(device); - cmder.deviceInfoQuery(device); + deviceService.updateCustomDevice(device); } - WVPResult<String> result = new WVPResult<>(); - result.setCode(0); - result.setMsg("success"); - return new ResponseEntity<>(result,HttpStatus.OK); } /** @@ -342,10 +316,8 @@ * * @param deviceId 璁惧id */ - @ApiOperation("璁惧鐘舵�佹煡璇�") - @ApiImplicitParams({ - @ApiImplicitParam(name = "deviceId", value = "璁惧id", required = true, dataTypeClass = String.class), - }) + @Operation(summary = "璁惧鐘舵�佹煡璇�") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) @GetMapping("/devices/{deviceId}/status") public DeferredResult<ResponseEntity<String>> deviceStatusApi(@PathVariable String deviceId) { if (logger.isDebugEnabled()) { @@ -354,14 +326,23 @@ Device device = storager.queryVideoDevice(deviceId); String uuid = UUID.randomUUID().toString(); String key = DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId; - cmder.deviceStatusQuery(device, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("鑾峰彇璁惧鐘舵�佸け璐ワ紝閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); - resultHolder.invokeResult(msg); - }); - DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(2*1000L); + 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; + } + try { + cmder.deviceStatusQuery(device, event -> { + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("鑾峰彇璁惧鐘舵�佸け璐ワ紝閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); + resultHolder.invokeResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鑾峰彇璁惧鐘舵��: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } result.onTimeout(()->{ logger.warn(String.format("鑾峰彇璁惧鐘舵�佽秴鏃�")); // 閲婃斁rtpserver @@ -386,16 +367,14 @@ * @param endTime 鎶ヨ鍙戠敓缁堟鏃堕棿锛堝彲閫夛級 * @return true = 鍛戒护鍙戦�佹垚鍔� */ - @ApiOperation("璁惧鎶ヨ鏌ヨ") - @ApiImplicitParams({ - @ApiImplicitParam(name = "deviceId", value = "璁惧id", required = true, dataTypeClass = String.class), - @ApiImplicitParam(name = "startPriority", value = "鎶ヨ璧峰绾у埆", dataTypeClass = String.class), - @ApiImplicitParam(name = "endPriority", value = "鎶ヨ缁堟绾у埆", dataTypeClass = String.class), - @ApiImplicitParam(name = "alarmMethod", value = "鎶ヨ鏂瑰紡鏉′欢", dataTypeClass = String.class), - @ApiImplicitParam(name = "alarmType", value = "鎶ヨ绫诲瀷", dataTypeClass = String.class), - @ApiImplicitParam(name = "startTime", value = "鎶ヨ鍙戠敓璧峰鏃堕棿", dataTypeClass = String.class), - @ApiImplicitParam(name = "endTime", value = "鎶ヨ鍙戠敓缁堟鏃堕棿", dataTypeClass = String.class), - }) + @Operation(summary = "璁惧鐘舵�佹煡璇�") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + @Parameter(name = "startPriority", description = "鎶ヨ璧峰绾у埆") + @Parameter(name = "endPriority", description = "鎶ヨ缁堟绾у埆") + @Parameter(name = "alarmMethod", description = "鎶ヨ鏂瑰紡鏉′欢") + @Parameter(name = "alarmType", description = "鎶ヨ绫诲瀷") + @Parameter(name = "startTime", description = "鎶ヨ鍙戠敓璧峰鏃堕棿") + @Parameter(name = "endTime", description = "鎶ヨ鍙戠敓缁堟鏃堕棿") @GetMapping("/alarm/{deviceId}") public DeferredResult<ResponseEntity<String>> alarmApi(@PathVariable String deviceId, @RequestParam(required = false) String startPriority, @@ -410,14 +389,19 @@ Device device = storager.queryVideoDevice(deviceId); String key = DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId; String uuid = UUID.randomUUID().toString(); - cmder.alarmInfoQuery(device, startPriority, endPriority, alarmMethod, alarmType, startTime, endTime, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("璁惧鎶ヨ鏌ヨ澶辫触锛岄敊璇爜锛� %s, %s",event.statusCode, event.msg)); - resultHolder.invokeResult(msg); - }); - DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String >> (3 * 1000L); + try { + cmder.alarmInfoQuery(device, startPriority, endPriority, alarmMethod, alarmType, startTime, endTime, event -> { + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("璁惧鎶ヨ鏌ヨ澶辫触锛岄敊璇爜锛� %s, %s",event.statusCode, event.msg)); + resultHolder.invokeResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 璁惧鎶ヨ鏌ヨ: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String >> (3 * 1000L); result.onTimeout(()->{ logger.warn(String.format("璁惧鎶ヨ鏌ヨ瓒呮椂")); // 閲婃斁rtpserver @@ -431,9 +415,153 @@ 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") + @Operation(summary = "鑾峰彇閫氶亾鍚屾杩涘害") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + 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(ErrorCode.SUCCESS.getCode()); + wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); + wvpResult.setData(channelSyncStatus); + if (channelSyncStatus.getErrorMsg() != null) { + wvpResult.setMsg(channelSyncStatus.getErrorMsg()); + } + } + return wvpResult; + } + + @GetMapping("/{deviceId}/subscribe_info") + @Operation(summary = "鑾峰彇璁惧鐨勮闃呯姸鎬�") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + public WVPResult<Map<String, Integer>> getSubscribeInfo(@PathVariable String deviceId) { + Set<String> allKeys = dynamicTask.getAllKeys(); + Map<String, Integer> dialogStateMap = new HashMap<>(); + for (String key : allKeys) { + if (key.startsWith(deviceId)) { + ISubscribeTask subscribeTask = (ISubscribeTask)dynamicTask.get(key); + if (subscribeTask instanceof CatalogSubscribeTask) { + dialogStateMap.put("catalog", 1); + }else if (subscribeTask instanceof MobilePositionSubscribeTask) { + dialogStateMap.put("mobilePosition", 1); + } + } + } + WVPResult<Map<String, Integer>> wvpResult = new WVPResult<>(); + wvpResult.setCode(0); + wvpResult.setData(dialogStateMap); + return wvpResult; + } + + @GetMapping("/snap/{deviceId}/{channelId}") + @Operation(summary = "璇锋眰鎴浘") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + @Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿", required = true) + 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 鍥芥爣璁惧 + */ + @Operation(summary = "鏌ヨ鍥芥爣鏍�") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + @Parameter(name = "parentId", description = "鐖剁骇鍥芥爣缂栧彿") + @Parameter(name = "onlyCatalog", description = "鍙幏鍙栫洰褰�") + @Parameter(name = "page", description = "褰撳墠椤�", required = true) + @Parameter(name = "count", description = "姣忛〉鏉℃暟", required = true) + @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 鍥芥爣璁惧 + */ + @Operation(summary = "鏌ヨ鍥芥爣鏍戜笅鐨勯�氶亾") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + @Parameter(name = "parentId", description = "鐖剁骇鍥芥爣缂栧彿") + @Parameter(name = "page", description = "褰撳墠椤�", required = true) + @Parameter(name = "count", description = "姣忛〉鏉℃暟", required = true) + @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