From c7d15150237c946fbb4f5547dab0018a5f573d88 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期二, 27 六月 2023 15:34:38 +0800 Subject: [PATCH] 增加redis通道 --- src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java | 468 +++++++++++++++++++++++++++++++++------------------------ 1 files changed, 270 insertions(+), 198 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 708008e..d0accf4 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,42 +1,53 @@ package com.genersoft.iot.vmp.vmanager.gb28181.device; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson2.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.bean.SubscribeHolder; import com.genersoft.iot.vmp.gb28181.bean.SyncStatus; -import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; 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.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 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.ibatis.annotations.Options; 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.util.ObjectUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; -import javax.sip.DialogState; +import javax.servlet.http.HttpServletResponse; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.text.ParseException; import java.util.*; -@Api(tags = "鍥芥爣璁惧鏌ヨ", value = "鍥芥爣璁惧鏌ヨ") +@Tag(name = "鍥芥爣璁惧鏌ヨ", description = "鍥芥爣璁惧鏌ヨ") @SuppressWarnings("rawtypes") -@CrossOrigin + @RestController @RequestMapping("/api/device/query") public class DeviceQuery { @@ -47,6 +58,9 @@ private IVideoManagerStorage storager; @Autowired + private IDeviceChannelService deviceChannelService; + + @Autowired private IRedisCatchStorage redisCatchStorage; @Autowired @@ -54,9 +68,6 @@ @Autowired private DeferredResultHolder resultHolder; - - @Autowired - private DeviceOffLineDetector offLineDetector; @Autowired private IDeviceService deviceService; @@ -64,27 +75,17 @@ @Autowired private DynamicTask dynamicTask; - @Autowired - private SubscribeHolder subscribeHolder; - /** * 浣跨敤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); } /** @@ -93,19 +94,15 @@ * @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") + @Options() public PageInfo<Device> devices(int page, int count){ - -// if (logger.isDebugEnabled()) { -// logger.debug("鏌ヨ鎵�鏈夎棰戣澶嘇PI璋冪敤"); -// } - - return storager.queryVideoDeviceList(page, count); +// if (page == null) page = 0; +// if (count == null) count = 20; + return storager.queryVideoDeviceList(page, count,null); } /** @@ -117,34 +114,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), - @ApiImplicitParam(name="catalogUnderDevice", value = "鏄惁鐩村睘涓庤澶囩殑鐩綍" ,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<DeviceChannel> 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 catalogUnderDevice) { -// if (logger.isDebugEnabled()) { -// logger.debug("鏌ヨ瑙嗛璁惧閫氶亾API璋冪敤"); -// } - if (StringUtils.isEmpty(query)) { + if (ObjectUtils.isEmpty(query)) { query = null; } - PageInfo pageResult = storager.queryChannelsByDeviceId(deviceId, query, channelType, online, catalogUnderDevice, page, count); - return new ResponseEntity<>(pageResult,HttpStatus.OK); + return storager.queryChannelsByDeviceId(deviceId, query, channelType, online, catalogUnderDevice, page, count); } /** @@ -152,11 +144,9 @@ * @param deviceId 璁惧id * @return */ - @ApiOperation("鍚屾璁惧閫氶亾") - @ApiImplicitParams({ - @ApiImplicitParam(name="deviceId", value = "璁惧id", required = true, dataTypeClass = String.class), - }) - @PostMapping("/devices/{deviceId}/sync") + @Operation(summary = "鍚屾璁惧閫氶亾") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + @GetMapping("/devices/{deviceId}/sync") public WVPResult<SyncStatus> devicesSync(@PathVariable String deviceId){ if (logger.isDebugEnabled()) { @@ -166,11 +156,8 @@ 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; + return WVPResult.success(channelSyncStatus); } deviceService.sync(device); @@ -185,34 +172,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璋冪敤澶辫触锛�"); } } @@ -227,18 +217,16 @@ * @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 = Boolean.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<DeviceChannel> subChannels(@PathVariable String deviceId, @PathVariable String channelId, int page, int count, @@ -246,17 +234,13 @@ @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 storager.querySubChannels(deviceId, channelId, query, channelType, online, page, count); } /** @@ -265,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); } /** @@ -282,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); } /** @@ -301,58 +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()) { - deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog()); - // 寮�鍚闃� - deviceService.addCatalogSubscribe(deviceInStore); - } - }else if (device.getSubscribeCycleForCatalog() == 0) { - if (deviceInStore.getSubscribeCycleForCatalog() != 0) { - deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog()); - // 鍙栨秷璁㈤槄 - deviceService.removeCatalogSubscribe(deviceInStore); - } - } - - // 绉诲姩浣嶇疆璁㈤槄鐩稿叧鐨勪俊鎭� - if (device.getSubscribeCycleForMobilePosition() > 0) { - if (deviceInStore.getSubscribeCycleForMobilePosition() == 0 || deviceInStore.getSubscribeCycleForMobilePosition() != device.getSubscribeCycleForMobilePosition()) { - deviceInStore.setMobilePositionSubmissionInterval(device.getMobilePositionSubmissionInterval()); - deviceInStore.setSubscribeCycleForMobilePosition(device.getSubscribeCycleForMobilePosition()); - // 寮�鍚闃� - deviceService.addMobilePositionSubscribe(deviceInStore); - } - }else if (device.getSubscribeCycleForMobilePosition() == 0) { - if (deviceInStore.getSubscribeCycleForMobilePosition() != 0) { - // 鍙栨秷璁㈤槄 - deviceService.removeMobilePositionSubscribe(deviceInStore); - } - } - - // TODO 鎶ヨ璁㈤槄鐩稿叧鐨勪俊鎭� - - 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); } /** @@ -360,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()) { @@ -372,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 @@ -404,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, @@ -428,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 @@ -451,7 +417,8 @@ @GetMapping("/{deviceId}/sync_status") - @ApiOperation(value = "鑾峰彇閫氶亾鍚屾杩涘害", notes = "鑾峰彇閫氶亾鍚屾杩涘害") + @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<>(); @@ -459,7 +426,8 @@ wvpResult.setCode(-1); wvpResult.setMsg("鍚屾灏氭湭寮�濮�"); }else { - wvpResult.setCode(0); + wvpResult.setCode(ErrorCode.SUCCESS.getCode()); + wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); wvpResult.setData(channelSyncStatus); if (channelSyncStatus.getErrorMsg() != null) { wvpResult.setMsg(channelSyncStatus.getErrorMsg()); @@ -469,27 +437,131 @@ } @GetMapping("/{deviceId}/subscribe_info") - @ApiOperation(value = "鑾峰彇璁惧鐨勮闃呯姸鎬�", notes = "鑾峰彇璁惧鐨勮闃呯姸鎬�") - public WVPResult<Map<String, String>> getSubscribeInfo(@PathVariable String deviceId) { + @Operation(summary = "鑾峰彇璁惧鐨勮闃呯姸鎬�") + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + public WVPResult<Map<String, Integer>> getSubscribeInfo(@PathVariable String deviceId) { Set<String> allKeys = dynamicTask.getAllKeys(); - Map<String, String> dialogStateMap = new HashMap<>(); + Map<String, Integer> 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()); + dialogStateMap.put("catalog", 1); }else if (subscribeTask instanceof MobilePositionSubscribeTask) { - dialogStateMap.put("mobilePosition", dialogState.toString()); + dialogStateMap.put("mobilePosition", 1); } } } - WVPResult<Map<String, String>> wvpResult = new WVPResult<>(); + 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