From 65b4c5cec92e4c024fc868f1ae668d08eb354170 Mon Sep 17 00:00:00 2001 From: lawrencehj <1934378145@qq.com> Date: 星期三, 03 二月 2021 11:08:10 +0800 Subject: [PATCH] 增加多种信令的API调用接口 --- src/main/java/com/genersoft/iot/vmp/vmanager/ptz/PtzController.java | 70 ++++++- src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceConfig.java | 121 +++++++++++++ src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceControl.java | 238 ++++++++++++++++++++++++++ src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceQuery.java | 87 ++++++++- 4 files changed, 492 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceConfig.java b/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceConfig.java new file mode 100644 index 0000000..6c4f7a3 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceConfig.java @@ -0,0 +1,121 @@ +/** + * 璁惧璁剧疆鍛戒护API鎺ュ彛 + * + * @author lawrencehj + * @date 2021骞�2鏈�2鏃� + */ + +package com.genersoft.iot.vmp.vmanager.device; + +import javax.sip.message.Response; + +import com.alibaba.fastjson.JSONObject; +import com.genersoft.iot.vmp.gb28181.bean.Device; +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.gb28181.utils.XmlUtil; +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.async.DeferredResult; + +@CrossOrigin +@RestController +@RequestMapping("/api") +public class DeviceConfig { + + private final static Logger logger = LoggerFactory.getLogger(DeviceQuery.class); + + @Autowired + private IVideoManagerStorager storager; + + @Autowired + private SIPCommander cmder; + + @Autowired + private DeferredResultHolder resultHolder; + + /** + * 鐪嬪畧浣嶆帶鍒跺懡浠PI鎺ュ彛 + * + * @param deviceId + * @param enabled 鐪嬪畧浣嶄娇鑳�1:寮�鍚�,0:鍏抽棴 + * @param resetTime 鑷姩褰掍綅鏃堕棿闂撮殧锛堝彲閫夛級 + * @param presetIndex 璋冪敤棰勭疆浣嶇紪鍙凤紙鍙�夛級 + * @param channelId 閫氶亾缂栫爜锛堝彲閫夛級 + */ + @GetMapping("/config/{deviceId}/basicParam") + public DeferredResult<ResponseEntity<String>> homePositionApi(@PathVariable String deviceId, + @RequestParam(required = false) String channelId, + @RequestParam(required = false) String name, + @RequestParam(required = false) String expiration, + @RequestParam(required = false) String heartBeatInterval, + @RequestParam(required = false) String heartBeatCount) { + if (logger.isDebugEnabled()) { + logger.debug("鎶ヨ澶嶄綅API璋冪敤"); + } + Device device = storager.queryVideoDevice(deviceId); + cmder.deviceBasicConfigCmd(device, channelId, name, expiration, heartBeatInterval, heartBeatCount, event -> { + Response response = event.getResponse(); + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG + (XmlUtil.isEmpty(channelId) ? deviceId : channelId)); + msg.setData(String.format("璁惧閰嶇疆鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", response.getStatusCode(), response.getReasonPhrase())); + resultHolder.invokeResult(msg); + }); + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L); + result.onTimeout(() -> { + logger.warn(String.format("璁惧閰嶇疆鎿嶄綔瓒呮椂, 璁惧鏈繑鍥炲簲绛旀寚浠�")); + // 閲婃斁rtpserver + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG + (XmlUtil.isEmpty(channelId) ? deviceId : channelId)); + JSONObject json = new JSONObject(); + json.put("DeviceID", deviceId); + json.put("Status", "Timeout"); + json.put("Description", "璁惧閰嶇疆鎿嶄綔瓒呮椂, 璁惧鏈繑鍥炲簲绛旀寚浠�"); + msg.setData(json); //("鐪嬪畧浣嶆帶鍒舵搷浣滆秴鏃�, 璁惧鏈繑鍥炲簲绛旀寚浠�"); + resultHolder.invokeResult(msg); + }); + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG + (XmlUtil.isEmpty(channelId) ? deviceId : channelId), result); + return result; + } + + /** + * 璁惧閰嶇疆鏌ヨ璇锋眰API鎺ュ彛 + * + * @param deviceId + */ + @GetMapping("/config/{deviceId}/query/{configType}") + public DeferredResult<ResponseEntity<String>> configDownloadApi(@PathVariable String deviceId, + @PathVariable String configType, + @RequestParam(required = false) String channelId) { + if (logger.isDebugEnabled()) { + logger.debug("璁惧鐘舵�佹煡璇PI璋冪敤"); + } + Device device = storager.queryVideoDevice(deviceId); + cmder.deviceConfigQuery(device, channelId, configType, event -> { + Response response = event.getResponse(); + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + (XmlUtil.isEmpty(channelId) ? deviceId : channelId)); + msg.setData(String.format("鑾峰彇璁惧閰嶇疆澶辫触锛岄敊璇爜锛� %s, %s", response.getStatusCode(), response.getReasonPhrase())); + resultHolder.invokeResult(msg); + }); + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String >> (3 * 1000L); + result.onTimeout(()->{ + logger.warn(String.format("鑾峰彇璁惧閰嶇疆瓒呮椂")); + // 閲婃斁rtpserver + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + (XmlUtil.isEmpty(channelId) ? deviceId : channelId)); + msg.setData("Timeout. Device did not response to this command."); + resultHolder.invokeResult(msg); + }); + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + (XmlUtil.isEmpty(channelId) ? deviceId : channelId), result); + return result; + } + +} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceControl.java b/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceControl.java new file mode 100644 index 0000000..7221359 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceControl.java @@ -0,0 +1,238 @@ +/** + * 璁惧鎺у埗鍛戒护API鎺ュ彛 + * + * @author lawrencehj + * @date 2021骞�2鏈�1鏃� + */ + +package com.genersoft.iot.vmp.vmanager.device; + +import javax.sip.message.Response; + +import com.alibaba.fastjson.JSONObject; +import com.genersoft.iot.vmp.gb28181.bean.Device; +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.gb28181.utils.XmlUtil; +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.async.DeferredResult; + +@CrossOrigin +@RestController +@RequestMapping("/api") +public class DeviceControl { + + private final static Logger logger = LoggerFactory.getLogger(DeviceQuery.class); + + @Autowired + private IVideoManagerStorager storager; + + @Autowired + private SIPCommander cmder; + + @Autowired + private DeferredResultHolder resultHolder; + + /** + * 杩滅▼鍚姩鎺у埗鍛戒护API鎺ュ彛 + * + * @param deviceId + */ + @GetMapping("/control/{deviceId}/teleboot") + @PostMapping("/control/{deviceId}/teleboot") + public ResponseEntity<String> teleBootApi(@PathVariable String deviceId) { + if (logger.isDebugEnabled()) { + logger.debug("璁惧杩滅▼鍚姩API璋冪敤"); + } + Device device = storager.queryVideoDevice(deviceId); + boolean sucsess = cmder.teleBootCmd(device); + if (sucsess) { + JSONObject json = new JSONObject(); + json.put("DeviceID", deviceId); + json.put("Result", "OK"); + return new ResponseEntity<>(json.toJSONString(), HttpStatus.OK); + } else { + logger.warn("璁惧杩滅▼鍚姩API璋冪敤澶辫触锛�"); + return new ResponseEntity<String>("璁惧杩滅▼鍚姩API璋冪敤澶辫触锛�", HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + /** + * 褰曞儚鎺у埗鍛戒护API鎺ュ彛 + * + * @param deviceId + * @param recordCmdStr Record锛氭墜鍔ㄥ綍鍍忥紝StopRecord锛氬仠姝㈡墜鍔ㄥ綍鍍� + * @param channelId 閫氶亾缂栫爜锛堝彲閫夛級 + */ + @GetMapping("/control/{deviceId}/record/{recordCmdStr}") + public DeferredResult<ResponseEntity<String>> recordApi(@PathVariable String deviceId, + @PathVariable String recordCmdStr, @RequestParam(required = false) String channelId) { + if (logger.isDebugEnabled()) { + logger.debug("寮�濮�/鍋滄褰曞儚API璋冪敤"); + } + Device device = storager.queryVideoDevice(deviceId); + cmder.recordCmd(device, channelId, recordCmdStr, event -> { + Response response = event.getResponse(); + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (XmlUtil.isEmpty(channelId) ? deviceId : channelId)); + msg.setData(String.format("寮�濮�/鍋滄褰曞儚鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", response.getStatusCode(), response.getReasonPhrase())); + resultHolder.invokeResult(msg); + }); + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L); + result.onTimeout(() -> { + logger.warn(String.format("寮�濮�/鍋滄褰曞儚鎿嶄綔瓒呮椂, 璁惧鏈繑鍥炲簲绛旀寚浠�")); + // 閲婃斁rtpserver + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (XmlUtil.isEmpty(channelId) ? deviceId : channelId)); + msg.setData("Timeout. Device did not response to this command."); + resultHolder.invokeResult(msg); + }); + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (XmlUtil.isEmpty(channelId) ? deviceId : channelId), result); + return result; + } + + /** + * 鎶ヨ甯冮槻/鎾ら槻鍛戒护API鎺ュ彛 + * + * @param deviceId + * @param guardCmdStr SetGuard锛氬竷闃诧紝ResetGuard锛氭挙闃� + */ + @GetMapping("/control/{deviceId}/guard/{guardCmdStr}") + public DeferredResult<ResponseEntity<String>> guardApi(@PathVariable String deviceId, @PathVariable String guardCmdStr) { + if (logger.isDebugEnabled()) { + logger.debug("甯冮槻/鎾ら槻API璋冪敤"); + } + Device device = storager.queryVideoDevice(deviceId); + cmder.guardCmd(device, guardCmdStr, event -> { + Response response = event.getResponse(); + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId); + msg.setData(String.format("甯冮槻/鎾ら槻鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", response.getStatusCode(), response.getReasonPhrase())); + resultHolder.invokeResult(msg); + }); + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L); + result.onTimeout(() -> { + logger.warn(String.format("甯冮槻/鎾ら槻鎿嶄綔瓒呮椂, 璁惧鏈繑鍥炲簲绛旀寚浠�")); + // 閲婃斁rtpserver + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId); + msg.setData("Timeout. Device did not response to this command."); + resultHolder.invokeResult(msg); + }); + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId, result); + return result; + } + + /** + * 鎶ヨ澶嶄綅API鎺ュ彛 + * + * @param deviceId + * @param alarmMethod 鎶ヨ鏂瑰紡锛堝彲閫夛級 + * @param alarmType 鎶ヨ绫诲瀷锛堝彲閫夛級 + */ + @GetMapping("/control/{deviceId}/resetAlarm") + public DeferredResult<ResponseEntity<String>> resetAlarmApi(@PathVariable String deviceId, + @RequestParam(required = false) String alarmMethod, + @RequestParam(required = false) String alarmType) { + if (logger.isDebugEnabled()) { + logger.debug("鎶ヨ澶嶄綅API璋冪敤"); + } + Device device = storager.queryVideoDevice(deviceId); + cmder.alarmCmd(device, alarmMethod, alarmType, event -> { + Response response = event.getResponse(); + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId); + msg.setData(String.format("鎶ヨ澶嶄綅鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", response.getStatusCode(), response.getReasonPhrase())); + resultHolder.invokeResult(msg); + }); + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L); + result.onTimeout(() -> { + logger.warn(String.format("鎶ヨ澶嶄綅鎿嶄綔瓒呮椂, 璁惧鏈繑鍥炲簲绛旀寚浠�")); + // 閲婃斁rtpserver + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId); + msg.setData("Timeout. Device did not response to this command."); + resultHolder.invokeResult(msg); + }); + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId, result); + return result; + } + + /** + * 寮哄埗鍏抽敭甯PI鎺ュ彛 + * + * @param deviceId + * @param channelId + */ + @GetMapping("/control/{deviceId}/iFrame") + @PostMapping("/control/{deviceId}/iFrame") + public ResponseEntity<String> iFrame(@PathVariable String deviceId, + @RequestParam(required = false) String channelId) { + if (logger.isDebugEnabled()) { + logger.debug("寮哄埗鍏抽敭甯PI璋冪敤"); + } + Device device = storager.queryVideoDevice(deviceId); + boolean sucsess = cmder.iFrameCmd(device, channelId); + if (sucsess) { + JSONObject json = new JSONObject(); + json.put("DeviceID", deviceId); + json.put("ChannelID", channelId); + json.put("Result", "OK"); + return new ResponseEntity<>(json.toJSONString(), HttpStatus.OK); + } else { + logger.warn("寮哄埗鍏抽敭甯PI璋冪敤澶辫触锛�"); + return new ResponseEntity<String>("寮哄埗鍏抽敭甯PI璋冪敤澶辫触锛�", HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + /** + * 鐪嬪畧浣嶆帶鍒跺懡浠PI鎺ュ彛 + * + * @param deviceId + * @param enabled 鐪嬪畧浣嶄娇鑳�1:寮�鍚�,0:鍏抽棴 + * @param resetTime 鑷姩褰掍綅鏃堕棿闂撮殧锛堝彲閫夛級 + * @param presetIndex 璋冪敤棰勭疆浣嶇紪鍙凤紙鍙�夛級 + * @param channelId 閫氶亾缂栫爜锛堝彲閫夛級 + */ + @GetMapping("/control/{deviceId}/homePosition/{enabled}") + public DeferredResult<ResponseEntity<String>> homePositionApi(@PathVariable String deviceId, + @PathVariable String enabled, + @RequestParam(required = false) String resetTime, + @RequestParam(required = false) String presetIndex, + @RequestParam(required = false) String channelId) { + if (logger.isDebugEnabled()) { + logger.debug("鎶ヨ澶嶄綅API璋冪敤"); + } + Device device = storager.queryVideoDevice(deviceId); + cmder.homePositionCmd(device, channelId, enabled, resetTime, presetIndex, event -> { + Response response = event.getResponse(); + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (XmlUtil.isEmpty(channelId) ? deviceId : channelId)); + msg.setData(String.format("鐪嬪畧浣嶆帶鍒舵搷浣滃け璐ワ紝閿欒鐮侊細 %s, %s", response.getStatusCode(), response.getReasonPhrase())); + resultHolder.invokeResult(msg); + }); + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L); + result.onTimeout(() -> { + logger.warn(String.format("鐪嬪畧浣嶆帶鍒舵搷浣滆秴鏃�, 璁惧鏈繑鍥炲簲绛旀寚浠�")); + // 閲婃斁rtpserver + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (XmlUtil.isEmpty(channelId) ? deviceId : channelId)); + JSONObject json = new JSONObject(); + json.put("DeviceID", deviceId); + json.put("Status", "Timeout"); + json.put("Description", "鐪嬪畧浣嶆帶鍒舵搷浣滆秴鏃�, 璁惧鏈繑鍥炲簲绛旀寚浠�"); + msg.setData(json); //("鐪嬪畧浣嶆帶鍒舵搷浣滆秴鏃�, 璁惧鏈繑鍥炲簲绛旀寚浠�"); + resultHolder.invokeResult(msg); + }); + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (XmlUtil.isEmpty(channelId) ? deviceId : channelId), result); + return result; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceQuery.java similarity index 65% rename from src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java rename to src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceQuery.java index 17d1e7d..350adaa 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceQuery.java @@ -17,6 +17,7 @@ import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; +import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; import javax.sip.message.Response; @@ -24,9 +25,9 @@ @CrossOrigin @RestController @RequestMapping("/api") -public class DeviceController { +public class DeviceQuery { - private final static Logger logger = LoggerFactory.getLogger(DeviceController.class); + private final static Logger logger = LoggerFactory.getLogger(DeviceQuery.class); @Autowired private IVideoManagerStorager storager; @@ -77,11 +78,9 @@ int page, int count, @RequestParam(required = false) String query, @RequestParam(required = false) Boolean online, - @RequestParam(required = false) Boolean channelType - ){ - + @RequestParam(required = false) Boolean channelType) { if (logger.isDebugEnabled()) { - logger.debug("鏌ヨ鎵�鏈夎棰戣澶嘇PI璋冪敤"); + logger.debug("鏌ヨ瑙嗛璁惧閫氶亾API璋冪敤"); } if (StringUtils.isEmpty(query)) { query = null; @@ -135,8 +134,8 @@ json.put("deviceId", deviceId); return new ResponseEntity<>(json.toString(),HttpStatus.OK); } else { - logger.warn("璁惧棰勮API璋冪敤澶辫触锛�"); - return new ResponseEntity<String>("璁惧棰勮API璋冪敤澶辫触锛�", HttpStatus.INTERNAL_SERVER_ERROR); + logger.warn("璁惧淇℃伅鍒犻櫎API璋冪敤澶辫触锛�"); + return new ResponseEntity<String>("璁惧淇℃伅鍒犻櫎API璋冪敤澶辫触锛�", HttpStatus.INTERNAL_SERVER_ERROR); } } @@ -157,7 +156,7 @@ @RequestParam(required = false) Boolean channelType){ if (logger.isDebugEnabled()) { - logger.debug("鏌ヨ鎵�鏈夎棰戣澶嘇PI璋冪敤"); + logger.debug("鏌ヨ鎵�鏈夎棰戦�氶亾API璋冪敤"); } DeviceChannel deviceChannel = storager.queryChannel(deviceId,channelId); if (deviceChannel == null) { @@ -183,4 +182,74 @@ storager.updateDevice(device); return new ResponseEntity<>(null,HttpStatus.OK); } + + /** + * 璁惧鐘舵�佹煡璇㈣姹侫PI鎺ュ彛 + * + * @param deviceId + */ + @GetMapping("/devices/{deviceId}/status") + public DeferredResult<ResponseEntity<String>> deviceStatusApi(@PathVariable String deviceId) { + if (logger.isDebugEnabled()) { + logger.debug("璁惧鐘舵�佹煡璇PI璋冪敤"); + } + Device device = storager.queryVideoDevice(deviceId); + cmder.deviceStatusQuery(device, event -> { + Response response = event.getResponse(); + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId); + msg.setData(String.format("鑾峰彇璁惧鐘舵�佸け璐ワ紝閿欒鐮侊細 %s, %s", response.getStatusCode(), response.getReasonPhrase())); + resultHolder.invokeResult(msg); + }); + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(2*1000L); + result.onTimeout(()->{ + logger.warn(String.format("鑾峰彇璁惧鐘舵�佽秴鏃�")); + // 閲婃斁rtpserver + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId); + msg.setData("Timeout. Device did not response to this command."); + resultHolder.invokeResult(msg); + }); + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId, result); + return result; + } + + /** + * 璁惧鎶ヨ鏌ヨ璇锋眰API鎺ュ彛 + * + * @param deviceId + */ + @GetMapping("/alarm/{deviceId}") + public DeferredResult<ResponseEntity<String>> alarmApi(@PathVariable String deviceId, + @RequestParam(required = false) String startPriority, + @RequestParam(required = false) String endPriority, + @RequestParam(required = false) String alarmMethod, + @RequestParam(required = false) String alarmType, + @RequestParam(required = false) String startTime, + @RequestParam(required = false) String endTime) { + if (logger.isDebugEnabled()) { + logger.debug("璁惧鎶ヨ鏌ヨAPI璋冪敤"); + } + Device device = storager.queryVideoDevice(deviceId); + cmder.alarmInfoQuery(device, startPriority, endPriority, alarmMethod, alarmType, startTime, endTime, event -> { + Response response = event.getResponse(); + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId); + msg.setData(String.format("璁惧鎶ヨ鏌ヨ澶辫触锛岄敊璇爜锛� %s, %s", response.getStatusCode(), response.getReasonPhrase())); + resultHolder.invokeResult(msg); + }); + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String >> (3 * 1000L); + result.onTimeout(()->{ + logger.warn(String.format("璁惧鎶ヨ鏌ヨ瓒呮椂")); + // 閲婃斁rtpserver + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId); + msg.setData("璁惧鎶ヨ鏌ヨ瓒呮椂"); + resultHolder.invokeResult(msg); + }); + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId, result); + return result; + } + + } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/ptz/PtzController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/ptz/PtzController.java index 4c41e16..1efdd3d 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/ptz/PtzController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/ptz/PtzController.java @@ -5,14 +5,16 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.async.DeferredResult; + +import javax.sip.message.Response; import com.genersoft.iot.vmp.gb28181.bean.Device; +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.gb28181.utils.XmlUtil; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; @CrossOrigin @@ -28,6 +30,9 @@ @Autowired private IVideoManagerStorager storager; + @Autowired + private DeferredResultHolder resultHolder; + /*** * 浜戝彴鎺у埗 * @param deviceId 璁惧id @@ -49,16 +54,18 @@ cmder.frontEndCmd(device, channelId, cmdCode, horizonSpeed, verticalSpeed, zoomSpeed); return new ResponseEntity<String>("success",HttpStatus.OK); } - // public ResponseEntity<String> ptz(@PathVariable String deviceId,@PathVariable String channelId,int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed){ - - // if (logger.isDebugEnabled()) { - // logger.debug(String.format("璁惧浜戝彴鎺у埗 API璋冪敤锛宒eviceId锛�%s 锛宑hannelId锛�%s 锛宭eftRight锛�%d 锛寀pDown锛�%d 锛宨nOut锛�%d 锛宮oveSpeed锛�%d 锛寊oomSpeed锛�%d",deviceId, channelId, leftRight, upDown, inOut, moveSpeed, zoomSpeed)); - // } - // Device device = storager.queryVideoDevice(deviceId); - - // cmder.ptzCmd(device, channelId, leftRight, upDown, inOut, moveSpeed, zoomSpeed); - // return new ResponseEntity<String>("success",HttpStatus.OK); - // } + + /** + * 閫氱敤鍓嶇鎺у埗鍛戒护API鎺ュ彛 + * + * @param deviceId + * @param channelId + * @param cmdCode + * @param parameter1 + * @param parameter2 + * @param combindCode2 + * @return + */ @PostMapping("/frontEndCommand/{deviceId}/{channelId}") public ResponseEntity<String> frontEndCommand(@PathVariable String deviceId,@PathVariable String channelId,int cmdCode, int parameter1, int parameter2, int combindCode2){ @@ -70,4 +77,37 @@ cmder.frontEndCmd(device, channelId, cmdCode, parameter1, parameter2, combindCode2); return new ResponseEntity<String>("success",HttpStatus.OK); } + + /** + * 棰勭疆浣嶆煡璇㈠懡浠PI鎺ュ彛 + * + * @param deviceId + * @param channelId + * @return + */ + @GetMapping("/presetQuery/{deviceId}/{channelId}") + public DeferredResult<ResponseEntity<String>> presetQueryApi(@PathVariable String deviceId, @PathVariable String channelId) { + if (logger.isDebugEnabled()) { + logger.debug("璁惧棰勭疆浣嶆煡璇PI璋冪敤"); + } + Device device = storager.queryVideoDevice(deviceId); + cmder.presetQuery(device, channelId, event -> { + Response response = event.getResponse(); + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + (XmlUtil.isEmpty(channelId) ? deviceId : channelId)); + msg.setData(String.format("鑾峰彇璁惧棰勭疆浣嶅け璐ワ紝閿欒鐮侊細 %s, %s", response.getStatusCode(), response.getReasonPhrase())); + resultHolder.invokeResult(msg); + }); + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String >> (3 * 1000L); + result.onTimeout(()->{ + logger.warn(String.format("鑾峰彇璁惧棰勭疆浣嶈秴鏃�")); + // 閲婃斁rtpserver + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + (XmlUtil.isEmpty(channelId) ? deviceId : channelId)); + msg.setData("鑾峰彇璁惧棰勭疆浣嶈秴鏃�"); + resultHolder.invokeResult(msg); + }); + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + (XmlUtil.isEmpty(channelId) ? deviceId : channelId), result); + return result; + } } -- Gitblit v1.8.0