From 0484a33f0550b344382f0d3caac5b26bbba23ca0 Mon Sep 17 00:00:00 2001 From: ‘liusuyi’ <1951119284@qq.com> Date: 星期三, 24 五月 2023 14:42:12 +0800 Subject: [PATCH] 增加按坐标控制云台ptz接口 --- ard-work/src/main/resources/templates/test.html | 251 ++++++++++++-------- ard-work/src/main/java/com/ruoyi/device/hiksdk/util/hikSdkUtil/GisUtil.java | 77 ++++++ ruoyi-framework/target/classes/com/ruoyi/framework/aspectj/SdkOperateAspect.class | 0 ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java | 4 ard-work/target/classes/com/ruoyi/device/hiksdk/controller/SdkController.class | 0 ard-work/target/classes/templates/test.html | 251 ++++++++++++-------- ard-work/pom.xml | 6 ard-work/src/main/java/com/ruoyi/constant/sdkPriority.java | 12 + ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.java | 45 ++ ard-work/src/main/java/com/ruoyi/device/hiksdk/service/hikClientService.java | 2 ard-work/target/classes/com/ruoyi/device/hiksdk/service/hikClientService.class | 0 ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java | 10 ard-work/target/classes/com/ruoyi/device/camera/domain/CameraCmd.class | 0 ard-work/target/classes/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.class | 0 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java | 13 15 files changed, 444 insertions(+), 227 deletions(-) diff --git a/ard-work/pom.xml b/ard-work/pom.xml index 7148b55..2b2665c 100644 --- a/ard-work/pom.xml +++ b/ard-work/pom.xml @@ -93,6 +93,12 @@ <version>2.0.9</version> <scope>compile</scope> </dependency> + <!--寮犲缓鎻愪緵寮曞渚濊禆--> + <dependency> + <groupId>org.gavaghan</groupId> + <artifactId>geodesy</artifactId> + <version>1.1.3</version> + </dependency> </dependencies> </project> \ No newline at end of file diff --git a/ard-work/src/main/java/com/ruoyi/constant/sdkPriority.java b/ard-work/src/main/java/com/ruoyi/constant/sdkPriority.java new file mode 100644 index 0000000..e144862 --- /dev/null +++ b/ard-work/src/main/java/com/ruoyi/constant/sdkPriority.java @@ -0,0 +1,12 @@ +package com.ruoyi.constant; + +/** + * @Description: sdk鎺у埗浼樺厛绾� + * @ClassName: sdkPriority + * @Author: 鍒樿嫃涔� + * @Date: 2023骞�05鏈�23鏃�11:25 + * @Version: 1.0 + **/ +public class sdkPriority { + static Integer radar_fire = 999; +} diff --git a/ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java b/ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java index ae02ac9..c96576a 100644 --- a/ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java +++ b/ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java @@ -26,4 +26,8 @@ Map<String,Double>ptzMap; /*杩囨湡闂撮殧锛堝垎閽燂級*/ Integer expired; + /*鐩告満缁忕含搴�*/ + String camPosition; + /*鐩爣缁忕含搴�*/ + String targetPosition; } diff --git a/ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java b/ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java index f8682b1..37d47f1 100644 --- a/ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java +++ b/ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java @@ -163,6 +163,16 @@ return toAjax(sdk.setPtz(cmd)); } + @ApiOperation("鎸囧悜鐩爣") + @PostMapping("/setTargetPosition") + @Log(title = "鎸囧悜鐩爣", businessType = BusinessType.CONTROL) + @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.targetPosition"}) + public @ResponseBody + AjaxResult setTargetPosition(@RequestBody CameraCmd cmd) { + return toAjax(sdk.setTargetPosition(cmd)); + } + + @ApiOperation("璁剧疆闆舵柟浣嶈") @PostMapping("/setZeroPTZ") @Log(title = "璁剧疆闆舵柟浣嶈", businessType = BusinessType.CONTROL) diff --git a/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/hikClientService.java b/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/hikClientService.java index 31a17da..207b8f1 100644 --- a/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/hikClientService.java +++ b/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/hikClientService.java @@ -15,7 +15,7 @@ **/ public interface hikClientService { void loadHCNetSDKLib(); - + boolean setTargetPosition(CameraCmd cmd); //鐧诲綍 ArdCameras login(ArdCameras cameras); diff --git a/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.java b/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.java index f9a5d5d..f1121bb 100644 --- a/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.java @@ -9,16 +9,12 @@ import com.ruoyi.device.camera.mapper.ArdCamerasMapper; import com.ruoyi.device.hiksdk.common.global.globalVariable; import com.ruoyi.device.camera.domain.ArdCameras; -import com.ruoyi.device.camera.service.IArdCamerasService; -import com.ruoyi.device.cameracalibration.domain.ArdCamerasCalibration; import com.ruoyi.device.hiksdk.domain.recordInfo; -import com.ruoyi.device.cameracalibration.service.IArdCamerasCalibrationService; +import com.ruoyi.device.hiksdk.util.hikSdkUtil.GisUtil; import com.ruoyi.device.hiksdk.util.hikSdkUtil.HCNetSDK; import com.ruoyi.device.hiksdk.service.hikClientService; -import com.ruoyi.device.hiksdk.util.imageUtil.waterMarkUtil; import com.ruoyi.device.hiksdk.util.minioUtil.MinioUtil; import com.ruoyi.system.mapper.SysUserMapper; -import com.ruoyi.system.service.ISysUserService; import com.sun.jna.Native; import com.sun.jna.Platform; import com.sun.jna.Pointer; @@ -29,11 +25,8 @@ import sun.misc.BASE64Encoder; import javax.annotation.Resource; -import javax.imageio.ImageIO; -import javax.servlet.http.HttpServletResponse; import java.io.*; import java.math.BigDecimal; -import java.net.URLEncoder; import java.nio.ByteBuffer; import java.text.DecimalFormat; import java.text.SimpleDateFormat; @@ -240,7 +233,7 @@ * @淇敼浜哄拰鍏跺畠淇℃伅 */ @Override - @SdkOperate + // @SdkOperate public boolean PTZControlWithSpeed(CameraCmd cmd) { String cameraId = cmd.getCameraId(); boolean enable = cmd.isEnable(); @@ -289,7 +282,6 @@ } return bool; } - /** * 璁剧疆鑱氱劍鍊� @@ -595,6 +587,39 @@ } } + @Override + public boolean setTargetPosition(CameraCmd cmd) { + String cameraId = cmd.getCameraId(); + Integer channelNum = cmd.getChannelNum(); + if (!globalVariable.loginMap.containsKey(cameraId)) { + return false; + } + Integer userId = globalVariable.loginMap.get(cameraId); + HCNetSDK.NET_DVR_PTZPOS m_ptzPosCurrent = new HCNetSDK.NET_DVR_PTZPOS(); + m_ptzPosCurrent.wAction = 1; + try { + double[] cameraPositon = Arrays.stream(cmd.getCamPosition().split(",")).mapToDouble(Double::parseDouble).toArray(); + double[] targetPositions = Arrays.stream(cmd.getTargetPosition().split(",")).mapToDouble(Double::parseDouble).toArray(); + double[] cameraPTZ = GisUtil.getCameraPTZ(cameraPositon, targetPositions, 20, 150); + String p = String.valueOf((int) ( cameraPTZ[0] * 10)); + String t = String.valueOf((int) ( cameraPTZ[1] * 10)); + String z = String.valueOf((int) (cameraPTZ[2]* 10)); + m_ptzPosCurrent.wPanPos = (short) (Integer.parseInt(p, 16)); + m_ptzPosCurrent.wTiltPos = (short) (Integer.parseInt(t, 16)); + m_ptzPosCurrent.wZoomPos = (short) (Integer.parseInt(z, 16)); + Pointer point = m_ptzPosCurrent.getPointer(); + m_ptzPosCurrent.write(); + boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_PTZPOS, channelNum, point, m_ptzPosCurrent.size()); + if (!bool) { + int code = hCNetSDK.NET_DVR_GetLastError(); + log.info("璁剧疆ptz澶辫触,璇风◢鍚庨噸璇�" + code); + } + return bool; + } catch (Exception ex) { + log.error(ex.getMessage()); + return false; + } + } /** * @鎻忚堪 鎿嶆帶閿佸畾 * @鍙傛暟 [userId, channelNum] diff --git a/ard-work/src/main/java/com/ruoyi/device/hiksdk/util/hikSdkUtil/GisUtil.java b/ard-work/src/main/java/com/ruoyi/device/hiksdk/util/hikSdkUtil/GisUtil.java new file mode 100644 index 0000000..c4e019d --- /dev/null +++ b/ard-work/src/main/java/com/ruoyi/device/hiksdk/util/hikSdkUtil/GisUtil.java @@ -0,0 +1,77 @@ +package com.ruoyi.device.hiksdk.util.hikSdkUtil; + +import org.gavaghan.geodesy.*; + +import java.math.BigDecimal; +import java.util.Arrays; + +public class GisUtil { + + public static GeodeticCalculator geodeticCalculator = new GeodeticCalculator(); + + /** + * 鏍规嵁缁忕含搴︼紝璁$畻涓ょ偣闂寸殑璺濈 + * + * @param longitudeFrom 绗竴涓偣鐨勭粡搴� + * @param latitudeFrom 绗竴涓偣鐨勭含搴� + * @param longitudeTo 绗簩涓偣鐨勭粡搴� + * @param latitudeTo 绗簩涓偣鐨勭含搴� + * @return 杩斿洖璺濈 鍗曚綅绫� + */ + public static double getDistance(double longitudeFrom, double latitudeFrom, double longitudeTo, double latitudeTo) { + GlobalCoordinates source = new GlobalCoordinates(latitudeFrom, longitudeFrom); + GlobalCoordinates target = new GlobalCoordinates(latitudeTo, longitudeTo); + return geodeticCalculator.calculateGeodeticCurve(Ellipsoid.WGS84, source, target).getEllipsoidalDistance(); + } + + /** + * 璁$畻浠巉rom鍒皌o鏂瑰悜鐨勭洿绾夸笌姝e寳鏂瑰悜澶硅 + * + * @param longitudeFrom 绗竴涓偣鐨勭粡搴� + * @param latitudeFrom 绗竴涓偣鐨勭含搴� + * @param longitudeTo 绗簩涓偣鐨勭粡搴� + * @param latitudeTo 绗簩涓偣鐨勭含搴� + * @return 杩斿洖瑙掑害 + */ + public static double getNorthAngle(double longitudeFrom, double latitudeFrom, double longitudeTo, double latitudeTo) { + GlobalPosition source = new GlobalPosition(latitudeFrom, longitudeFrom, 0); + GlobalPosition target = new GlobalPosition(latitudeTo, longitudeTo, 0); + return geodeticCalculator.calculateGeodeticMeasurement(Ellipsoid.WGS84, source, target).getAzimuth(); + } + + /** + * @param camera 缁忓害,绾害,楂樺害 濡�:{125.097531, 46.60029, 120}; + * @param lookAt 缁忓害,绾害,楂樺害 濡�:{125.124731, 46.584808, 0}; + * @param viewAngle 鐩告満鍙瑙掑害 濡�:20 + * @param viewWidth 瑙嗗煙瀹藉害 濡�:150 + * @return ptz 鏁扮粍 濡�:[129.5355798969157, -2.5419097807416655, 23.3676043024458] + */ + public static double[] getCameraPTZ(double[] camera, double[] lookAt, double viewAngle, double viewWidth) { + double p = 0, t = 0, z = 0; + double distance = GisUtil.getDistance(camera[0], camera[1], lookAt[0], lookAt[1]); + double northAngle = GisUtil.getNorthAngle(camera[0], camera[1], lookAt[0], lookAt[1]); + double height = camera[2] - lookAt[2]; + p = northAngle; + t = Angle.toDegrees(Math.atan(height / distance)) * -1+360; + z = distance * Math.tan(viewAngle / 2) * 2 / viewWidth; + /* p = new BigDecimal(p).setScale(1,BigDecimal.ROUND_HALF_UP).doubleValue(); + t = new BigDecimal(t).setScale(1,BigDecimal.ROUND_HALF_UP).doubleValue(); + z = new BigDecimal(z).setScale(1,BigDecimal.ROUND_HALF_UP).doubleValue();*/ + return new double[]{p, t, z}; + } + + public static void main(String[] args) { + // 125.097531,46.60029, 125.124731,46.584808 + //鐩告満浣嶇疆 + double[] camera = {125.146964331147,46.5580925811216,102};//缁忓害,绾害,楂樺害 + //鐪嬪悜鐨勪綅缃� + double[] lookAt = {125.155449,46.555108,0};//缁忓害,绾害,楂樺害 + + double viewAngle = 20;//鐩告満鍙瑙掑害 + double viewWidth = 150;//鐩告満瑙嗗煙瀹藉害 + + double[] ptz = GisUtil.getCameraPTZ(camera, lookAt, viewAngle, viewWidth); + System.out.println("ptz:" + Arrays.toString(ptz)); + + } +} diff --git a/ard-work/src/main/resources/templates/test.html b/ard-work/src/main/resources/templates/test.html index a79c89f..bc58555 100644 --- a/ard-work/src/main/resources/templates/test.html +++ b/ard-work/src/main/resources/templates/test.html @@ -9,115 +9,127 @@ <link rel="stylesheet" th:href="@{/css/bootstrap.css}"/> <script th:src="@{/js/bootstrap.js}"></script> <style> - .top-buffer { margin-top:10px; } + .top-buffer { + margin-top: 10px; + } </style> <body> <div class="container"> - <div class="row "> - <div class="dropdown"> - 鐩告満id锛� - <select id="select"> - </select> - </div> + <div class="row "> + <div class="dropdown"> + 鐩告満id锛�<select id="select"> + </select> </div> - <div class="row top-buffer"> - <div class="col-md-1 col-md-offset-1"> - <button id="up" type="button" class="btn btn-primary">涓�</button> - </div> - <div class="col-md-4 col-md-offset-3"> - <div class="btn-group" role="group"> - <button id="controlZoomIn" type="button" class="btn btn-primary">璋冪劍-</button> - <button id="controlZoomOut" type="button" class="btn btn-primary">璋冪劍+</button> - </div> - </div> + </div> + <div class="row top-buffer"> + <div class="col-md-1 col-md-offset-1"> + <button id="up" type="button" class="btn btn-primary">涓�</button> </div> - <div class="row "> - <div class="col-md-1"> - <button id="left" type="button" class="btn btn-primary">宸�</button> - </div> - <div class="col-md-1 col-md-offset-1"> - <button id="right" type="button" class="btn btn-primary">鍙�</button> - </div> - <div class="col-md-4 col-md-offset-2"> - <div class="btn-group" role="group"> - <button id="controlFocusNear" type="button" class="btn btn-primary">鑱氱劍-</button> - <button id="controlFocusFar" type="button" class="btn btn-primary">鑱氱劍+</button> - </div> - </div> - </div> - <div class="row "> - <div class="col-md-1 col-md-offset-1"> - <button id="down" type="button" class="btn btn-primary">涓�</button> - </div> - <div class="col-md-4 col-md-offset-3"> - <div class="btn-group" role="group"> - <button id="controlIrisOpen" type="button" class="btn btn-primary">鍏夊湀-</button> - <button id="controlIrisClose" type="button" class="btn btn-primary">鍏夊湀+</button> - </div> - </div> - </div> - <div class="row top-buffer"> - <div class="input-group"> - <span class="input-group-addon">P鍊硷細</span> - <input id="p" class="form-control" placeholder="璇疯緭鍏鍊�"/> - </div> - <div class="input-group"> - <span class="input-group-addon">T鍊硷細</span> - <input id="t" class="form-control" placeholder="璇疯緭鍏鍊�"/> - </div> - <div class="input-group"> - <span class="input-group-addon">Z鍊硷細</span> - <input id="z" class="form-control" placeholder="璇疯緭鍏鍊�"/> - </div> - </div> - <div class="row top-buffer"> + <div class="col-md-4 col-md-offset-3"> <div class="btn-group" role="group"> - <button id="getPTZ" type="button" class="btn btn-default">鑾峰彇ptz</button> - <button id="setPTZ" type="button" class="btn btn-default">璁剧疆ptz</button> - <button id="setPreset" type="button" class="btn btn-default">璁鹃缃偣</button> - <button id="gotoPreset" type="button" class="btn btn-default">璋冮缃偣</button> - <button id="getZeroPTZ" type="button" class="btn btn-default">璋冪敤闆舵柟浣嶈</button> - <button id="setZeroPTZ" type="button" class="btn btn-default">璁剧疆闆舵柟浣嶈</button> - </div> - </div> - <div class="row top-buffer"> - <div class="btn-group" role="group"> - <button id="FocusMode" type="button" class="btn btn-default">鎵嬪姩鑱氱劍</button> - <div id="focusDiv" class="input-group"> - <span class="input-group-addon">鑱氱劍鍊硷細</span> - <input id="focus" class="form-control" placeholder="鑱氱劍鍊�"/> - </div> - <button id="getFocusPos" type="button" class="btn btn-default">鑾峰彇鑱氱劍鍊�</button> - <button id="setFocusPos" type="button" class="btn btn-default">璁剧疆鑱氱劍鍊�</button> - </div> - </div> - <div class="row top-buffer"> - <div class="btn-group" role="group"> - <button id="WiperPwron" type="button" class="btn btn-default">寮�鍚洦鍒�</button> - <button id="Defogcfg" type="button" class="btn btn-default">寮�鍚�忛浘</button> - <button id="Infrarecfg" type="button" class="btn btn-default">寮�鍚孩澶�</button> - <button id="HeateRpwron" type="button" class="btn btn-default">寮�鍚簯鍙板姞鐑�</button> - <button id="CameraDeicing" type="button" class="btn btn-default">寮�鍚暅澶村姞鐑�</button> - </div> - </div> - <div class="row top-buffer"> - <div class="btn-group" role="group"> - <button id="voice" type="button" class="btn btn-default">寮�濮嬭闊冲璁�</button> - <button id="record" type="button" class="btn btn-default">寮�濮嬪綍鍍�</button> - <button id="realCutPic" type="button" class="btn btn-default">瀹炴椂鎶撳浘</button> - <button id="saveCutPic" type="button" class="btn btn-default">瀛樺偍鎶撳浘</button> - </div> - </div> - <div class="row top-buffer"> - <div class="col-md-6"> - <img class="thumbnail" id="imgContainer" style="width: 500px; height: 400px;padding: 5px 5px;"/> - </div> - <div class="col-md-6"> - <video id="video" muted autoplay loop controls style="width: 800px; height: 100%; object-fit: fill" /> + <button id="controlZoomIn" type="button" class="btn btn-primary">璋冪劍-</button> + <button id="controlZoomOut" type="button" class="btn btn-primary">璋冪劍+</button> </div> </div> </div> -</body> + <div class="row "> + <div class="col-md-1"> + <button id="left" type="button" class="btn btn-primary">宸�</button> + </div> + <div class="col-md-1 col-md-offset-1"> + <button id="right" type="button" class="btn btn-primary">鍙�</button> + </div> + <div class="col-md-4 col-md-offset-2"> + <div class="btn-group" role="group"> + <button id="controlFocusNear" type="button" class="btn btn-primary">鑱氱劍-</button> + <button id="controlFocusFar" type="button" class="btn btn-primary">鑱氱劍+</button> + </div> + </div> + </div> + <div class="row "> + <div class="col-md-1 col-md-offset-1"> + <button id="down" type="button" class="btn btn-primary">涓�</button> + </div> + <div class="col-md-4 col-md-offset-3"> + <div class="btn-group" role="group"> + <button id="controlIrisOpen" type="button" class="btn btn-primary">鍏夊湀-</button> + <button id="controlIrisClose" type="button" class="btn btn-primary">鍏夊湀+</button> + </div> + </div> + </div> + <div class="row"> + <div class="col-md-6"> + <div class="row top-buffer"> + <div class="input-group"> + <span class="input-group-addon">鐩殑鍧愭爣鍊硷細</span> + <input id="targetPostion" class="form-control" placeholder="鐩殑鍧愭爣"/> + <button id="setTargetPostion" type="button" class="btn btn-default">鎸囧悜鍧愭爣</button> + </div> + <div class="input-group"> + <span class="input-group-addon">P鍊硷細</span> + <input id="p" class="form-control" placeholder="璇疯緭鍏鍊�"/> + </div> + <div class="input-group"> + <span class="input-group-addon">T鍊硷細</span> + <input id="t" class="form-control" placeholder="璇疯緭鍏鍊�"/> + </div> + <div class="input-group"> + <span class="input-group-addon">Z鍊硷細</span> + <input id="z" class="form-control" placeholder="璇疯緭鍏鍊�"/> + </div> + </div> + <div class="row top-buffer"> + <div class="btn-group" role="group"> + <button id="getPTZ" type="button" class="btn btn-default">鑾峰彇ptz</button> + <button id="setPTZ" type="button" class="btn btn-default">璁剧疆ptz</button> + <button id="setPreset" type="button" class="btn btn-default">璁鹃缃偣</button> + <button id="gotoPreset" type="button" class="btn btn-default">璋冮缃偣</button> + <button id="getZeroPTZ" type="button" class="btn btn-default">璋冪敤闆舵柟浣嶈</button> + <button id="setZeroPTZ" type="button" class="btn btn-default">璁剧疆闆舵柟浣嶈</button> + </div> + </div> + <div class="row top-buffer"> + <div class="btn-group" role="group"> + <button id="FocusMode" type="button" class="btn btn-default">鎵嬪姩鑱氱劍</button> + <div id="focusDiv" class="input-group"> + <span class="input-group-addon">鑱氱劍鍊硷細</span> + <input id="focus" class="form-control" placeholder="鑱氱劍鍊�"/> + </div> + <button id="getFocusPos" type="button" class="btn btn-default">鑾峰彇鑱氱劍鍊�</button> + <button id="setFocusPos" type="button" class="btn btn-default">璁剧疆鑱氱劍鍊�</button> + </div> + </div> + <div class="row top-buffer"> + <div class="btn-group" role="group"> + <button id="WiperPwron" type="button" class="btn btn-default">寮�鍚洦鍒�</button> + <button id="Defogcfg" type="button" class="btn btn-default">寮�鍚�忛浘</button> + <button id="Infrarecfg" type="button" class="btn btn-default">寮�鍚孩澶�</button> + <button id="HeateRpwron" type="button" class="btn btn-default">寮�鍚簯鍙板姞鐑�</button> + <button id="CameraDeicing" type="button" class="btn btn-default">寮�鍚暅澶村姞鐑�</button> + </div> + </div> + <div class="row top-buffer"> + <div class="btn-group" role="group"> + <button id="voice" type="button" class="btn btn-default">寮�濮嬭闊冲璁�</button> + <button id="record" type="button" class="btn btn-default">寮�濮嬪綍鍍�</button> + <button id="realCutPic" type="button" class="btn btn-default">瀹炴椂鎶撳浘</button> + <button id="saveCutPic" type="button" class="btn btn-default">瀛樺偍鎶撳浘</button> + </div> + </div> + <div class="row top-buffer"> + <div class="col-md-6"> + <img class="thumbnail" id="imgContainer" style="width: 500px; height: 300px;"/> + </div> + </div> + </div> + <div class="col-md-1"/> + <div class="col-md-5"> + <div class="row top-buffer"> + <video id="video" muted autoplay loop controls style="width: 800px; height: 100%; object-fit: fill;"/> + </div> + </div> + </div> +</div> <script th:inline="javascript"> var cameraId, opt, token; window.onload = function () { @@ -134,7 +146,10 @@ ipaddr: arr[i].ip, username: arr[i].username, password: arr[i].password, - port: arr[i].rtspPort + port: arr[i].rtspPort, + longitude: arr[i].longitude, + latitude: arr[i].latitude, + altitude: arr[i].altitude }; cameraMap.set(arr[i].id, camera); //鍏堝垱寤哄ソselect閲岄潰鐨刼ption鍏冪礌 @@ -371,6 +386,34 @@ 'Authorization': token }, url: "../hik/setPTZ", + type: "post", + dataType: "json", + data: JSON.stringify(myEntity), + success: function (data) { + console.log(data); + } + }) + }) + $("#setTargetPostion").click(function () { + cameraId = $('#select option:selected').val(); + var camera = cameraMap.get(cameraId); + var camP = camera.longitude + ',' + camera.latitude + ',' + camera.altitude; + var targetP = $('#targetPostion').val(); + //瀹氫箟涓�涓甫鏈塎ap瀛楁鐨勫疄浣撳璞� + var myEntity = { + channelNum: 1, + cameraId: cameraId, + targetPosition: targetP, + camPosition: camP, + }; + console.log(myEntity) + $.ajax({ + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': token + }, + url: "../hik/setTargetPosition", type: "post", dataType: "json", data: JSON.stringify(myEntity), @@ -636,7 +679,7 @@ data: JSON.stringify(opt), success: function (data) { console.log(data.data); - $("#imgContainer").attr("src","data:image/png;base64,"+data.data); + $("#imgContainer").attr("src", "data:image/png;base64," + data.data); } }) }) @@ -722,6 +765,7 @@ } }) } + let webRtcServer = null; let videoMap = new Map(); $('video').click(function (e) { @@ -738,7 +782,7 @@ } else if (camera.type == "dh") { realViewDh("127.0.0.1", ID, camera.username, camera.password, camera.ipaddr, camera.port); } else { - realViewHik("192.168.1.15", ID, camera.username, camera.password, camera.ipaddr, camera.port); + realViewHik("192.168.1.15", ID, camera.username, camera.password, camera.ipaddr, camera.port); } } }); @@ -784,4 +828,5 @@ webRtcServer.disconnect(); } </script> +</body> </html> \ No newline at end of file diff --git a/ard-work/target/classes/com/ruoyi/device/camera/domain/CameraCmd.class b/ard-work/target/classes/com/ruoyi/device/camera/domain/CameraCmd.class index 02d6849..ce9a311 100644 --- a/ard-work/target/classes/com/ruoyi/device/camera/domain/CameraCmd.class +++ b/ard-work/target/classes/com/ruoyi/device/camera/domain/CameraCmd.class Binary files differ diff --git a/ard-work/target/classes/com/ruoyi/device/hiksdk/controller/SdkController.class b/ard-work/target/classes/com/ruoyi/device/hiksdk/controller/SdkController.class index 0b2dd05..d484177 100644 --- a/ard-work/target/classes/com/ruoyi/device/hiksdk/controller/SdkController.class +++ b/ard-work/target/classes/com/ruoyi/device/hiksdk/controller/SdkController.class Binary files differ diff --git a/ard-work/target/classes/com/ruoyi/device/hiksdk/service/hikClientService.class b/ard-work/target/classes/com/ruoyi/device/hiksdk/service/hikClientService.class index 8be64eb..3b58cdc 100644 --- a/ard-work/target/classes/com/ruoyi/device/hiksdk/service/hikClientService.class +++ b/ard-work/target/classes/com/ruoyi/device/hiksdk/service/hikClientService.class Binary files differ diff --git a/ard-work/target/classes/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.class b/ard-work/target/classes/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.class index 210e4b0..dc7b4af 100644 --- a/ard-work/target/classes/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.class +++ b/ard-work/target/classes/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.class Binary files differ diff --git a/ard-work/target/classes/templates/test.html b/ard-work/target/classes/templates/test.html index a79c89f..bc58555 100644 --- a/ard-work/target/classes/templates/test.html +++ b/ard-work/target/classes/templates/test.html @@ -9,115 +9,127 @@ <link rel="stylesheet" th:href="@{/css/bootstrap.css}"/> <script th:src="@{/js/bootstrap.js}"></script> <style> - .top-buffer { margin-top:10px; } + .top-buffer { + margin-top: 10px; + } </style> <body> <div class="container"> - <div class="row "> - <div class="dropdown"> - 鐩告満id锛� - <select id="select"> - </select> - </div> + <div class="row "> + <div class="dropdown"> + 鐩告満id锛�<select id="select"> + </select> </div> - <div class="row top-buffer"> - <div class="col-md-1 col-md-offset-1"> - <button id="up" type="button" class="btn btn-primary">涓�</button> - </div> - <div class="col-md-4 col-md-offset-3"> - <div class="btn-group" role="group"> - <button id="controlZoomIn" type="button" class="btn btn-primary">璋冪劍-</button> - <button id="controlZoomOut" type="button" class="btn btn-primary">璋冪劍+</button> - </div> - </div> + </div> + <div class="row top-buffer"> + <div class="col-md-1 col-md-offset-1"> + <button id="up" type="button" class="btn btn-primary">涓�</button> </div> - <div class="row "> - <div class="col-md-1"> - <button id="left" type="button" class="btn btn-primary">宸�</button> - </div> - <div class="col-md-1 col-md-offset-1"> - <button id="right" type="button" class="btn btn-primary">鍙�</button> - </div> - <div class="col-md-4 col-md-offset-2"> - <div class="btn-group" role="group"> - <button id="controlFocusNear" type="button" class="btn btn-primary">鑱氱劍-</button> - <button id="controlFocusFar" type="button" class="btn btn-primary">鑱氱劍+</button> - </div> - </div> - </div> - <div class="row "> - <div class="col-md-1 col-md-offset-1"> - <button id="down" type="button" class="btn btn-primary">涓�</button> - </div> - <div class="col-md-4 col-md-offset-3"> - <div class="btn-group" role="group"> - <button id="controlIrisOpen" type="button" class="btn btn-primary">鍏夊湀-</button> - <button id="controlIrisClose" type="button" class="btn btn-primary">鍏夊湀+</button> - </div> - </div> - </div> - <div class="row top-buffer"> - <div class="input-group"> - <span class="input-group-addon">P鍊硷細</span> - <input id="p" class="form-control" placeholder="璇疯緭鍏鍊�"/> - </div> - <div class="input-group"> - <span class="input-group-addon">T鍊硷細</span> - <input id="t" class="form-control" placeholder="璇疯緭鍏鍊�"/> - </div> - <div class="input-group"> - <span class="input-group-addon">Z鍊硷細</span> - <input id="z" class="form-control" placeholder="璇疯緭鍏鍊�"/> - </div> - </div> - <div class="row top-buffer"> + <div class="col-md-4 col-md-offset-3"> <div class="btn-group" role="group"> - <button id="getPTZ" type="button" class="btn btn-default">鑾峰彇ptz</button> - <button id="setPTZ" type="button" class="btn btn-default">璁剧疆ptz</button> - <button id="setPreset" type="button" class="btn btn-default">璁鹃缃偣</button> - <button id="gotoPreset" type="button" class="btn btn-default">璋冮缃偣</button> - <button id="getZeroPTZ" type="button" class="btn btn-default">璋冪敤闆舵柟浣嶈</button> - <button id="setZeroPTZ" type="button" class="btn btn-default">璁剧疆闆舵柟浣嶈</button> - </div> - </div> - <div class="row top-buffer"> - <div class="btn-group" role="group"> - <button id="FocusMode" type="button" class="btn btn-default">鎵嬪姩鑱氱劍</button> - <div id="focusDiv" class="input-group"> - <span class="input-group-addon">鑱氱劍鍊硷細</span> - <input id="focus" class="form-control" placeholder="鑱氱劍鍊�"/> - </div> - <button id="getFocusPos" type="button" class="btn btn-default">鑾峰彇鑱氱劍鍊�</button> - <button id="setFocusPos" type="button" class="btn btn-default">璁剧疆鑱氱劍鍊�</button> - </div> - </div> - <div class="row top-buffer"> - <div class="btn-group" role="group"> - <button id="WiperPwron" type="button" class="btn btn-default">寮�鍚洦鍒�</button> - <button id="Defogcfg" type="button" class="btn btn-default">寮�鍚�忛浘</button> - <button id="Infrarecfg" type="button" class="btn btn-default">寮�鍚孩澶�</button> - <button id="HeateRpwron" type="button" class="btn btn-default">寮�鍚簯鍙板姞鐑�</button> - <button id="CameraDeicing" type="button" class="btn btn-default">寮�鍚暅澶村姞鐑�</button> - </div> - </div> - <div class="row top-buffer"> - <div class="btn-group" role="group"> - <button id="voice" type="button" class="btn btn-default">寮�濮嬭闊冲璁�</button> - <button id="record" type="button" class="btn btn-default">寮�濮嬪綍鍍�</button> - <button id="realCutPic" type="button" class="btn btn-default">瀹炴椂鎶撳浘</button> - <button id="saveCutPic" type="button" class="btn btn-default">瀛樺偍鎶撳浘</button> - </div> - </div> - <div class="row top-buffer"> - <div class="col-md-6"> - <img class="thumbnail" id="imgContainer" style="width: 500px; height: 400px;padding: 5px 5px;"/> - </div> - <div class="col-md-6"> - <video id="video" muted autoplay loop controls style="width: 800px; height: 100%; object-fit: fill" /> + <button id="controlZoomIn" type="button" class="btn btn-primary">璋冪劍-</button> + <button id="controlZoomOut" type="button" class="btn btn-primary">璋冪劍+</button> </div> </div> </div> -</body> + <div class="row "> + <div class="col-md-1"> + <button id="left" type="button" class="btn btn-primary">宸�</button> + </div> + <div class="col-md-1 col-md-offset-1"> + <button id="right" type="button" class="btn btn-primary">鍙�</button> + </div> + <div class="col-md-4 col-md-offset-2"> + <div class="btn-group" role="group"> + <button id="controlFocusNear" type="button" class="btn btn-primary">鑱氱劍-</button> + <button id="controlFocusFar" type="button" class="btn btn-primary">鑱氱劍+</button> + </div> + </div> + </div> + <div class="row "> + <div class="col-md-1 col-md-offset-1"> + <button id="down" type="button" class="btn btn-primary">涓�</button> + </div> + <div class="col-md-4 col-md-offset-3"> + <div class="btn-group" role="group"> + <button id="controlIrisOpen" type="button" class="btn btn-primary">鍏夊湀-</button> + <button id="controlIrisClose" type="button" class="btn btn-primary">鍏夊湀+</button> + </div> + </div> + </div> + <div class="row"> + <div class="col-md-6"> + <div class="row top-buffer"> + <div class="input-group"> + <span class="input-group-addon">鐩殑鍧愭爣鍊硷細</span> + <input id="targetPostion" class="form-control" placeholder="鐩殑鍧愭爣"/> + <button id="setTargetPostion" type="button" class="btn btn-default">鎸囧悜鍧愭爣</button> + </div> + <div class="input-group"> + <span class="input-group-addon">P鍊硷細</span> + <input id="p" class="form-control" placeholder="璇疯緭鍏鍊�"/> + </div> + <div class="input-group"> + <span class="input-group-addon">T鍊硷細</span> + <input id="t" class="form-control" placeholder="璇疯緭鍏鍊�"/> + </div> + <div class="input-group"> + <span class="input-group-addon">Z鍊硷細</span> + <input id="z" class="form-control" placeholder="璇疯緭鍏鍊�"/> + </div> + </div> + <div class="row top-buffer"> + <div class="btn-group" role="group"> + <button id="getPTZ" type="button" class="btn btn-default">鑾峰彇ptz</button> + <button id="setPTZ" type="button" class="btn btn-default">璁剧疆ptz</button> + <button id="setPreset" type="button" class="btn btn-default">璁鹃缃偣</button> + <button id="gotoPreset" type="button" class="btn btn-default">璋冮缃偣</button> + <button id="getZeroPTZ" type="button" class="btn btn-default">璋冪敤闆舵柟浣嶈</button> + <button id="setZeroPTZ" type="button" class="btn btn-default">璁剧疆闆舵柟浣嶈</button> + </div> + </div> + <div class="row top-buffer"> + <div class="btn-group" role="group"> + <button id="FocusMode" type="button" class="btn btn-default">鎵嬪姩鑱氱劍</button> + <div id="focusDiv" class="input-group"> + <span class="input-group-addon">鑱氱劍鍊硷細</span> + <input id="focus" class="form-control" placeholder="鑱氱劍鍊�"/> + </div> + <button id="getFocusPos" type="button" class="btn btn-default">鑾峰彇鑱氱劍鍊�</button> + <button id="setFocusPos" type="button" class="btn btn-default">璁剧疆鑱氱劍鍊�</button> + </div> + </div> + <div class="row top-buffer"> + <div class="btn-group" role="group"> + <button id="WiperPwron" type="button" class="btn btn-default">寮�鍚洦鍒�</button> + <button id="Defogcfg" type="button" class="btn btn-default">寮�鍚�忛浘</button> + <button id="Infrarecfg" type="button" class="btn btn-default">寮�鍚孩澶�</button> + <button id="HeateRpwron" type="button" class="btn btn-default">寮�鍚簯鍙板姞鐑�</button> + <button id="CameraDeicing" type="button" class="btn btn-default">寮�鍚暅澶村姞鐑�</button> + </div> + </div> + <div class="row top-buffer"> + <div class="btn-group" role="group"> + <button id="voice" type="button" class="btn btn-default">寮�濮嬭闊冲璁�</button> + <button id="record" type="button" class="btn btn-default">寮�濮嬪綍鍍�</button> + <button id="realCutPic" type="button" class="btn btn-default">瀹炴椂鎶撳浘</button> + <button id="saveCutPic" type="button" class="btn btn-default">瀛樺偍鎶撳浘</button> + </div> + </div> + <div class="row top-buffer"> + <div class="col-md-6"> + <img class="thumbnail" id="imgContainer" style="width: 500px; height: 300px;"/> + </div> + </div> + </div> + <div class="col-md-1"/> + <div class="col-md-5"> + <div class="row top-buffer"> + <video id="video" muted autoplay loop controls style="width: 800px; height: 100%; object-fit: fill;"/> + </div> + </div> + </div> +</div> <script th:inline="javascript"> var cameraId, opt, token; window.onload = function () { @@ -134,7 +146,10 @@ ipaddr: arr[i].ip, username: arr[i].username, password: arr[i].password, - port: arr[i].rtspPort + port: arr[i].rtspPort, + longitude: arr[i].longitude, + latitude: arr[i].latitude, + altitude: arr[i].altitude }; cameraMap.set(arr[i].id, camera); //鍏堝垱寤哄ソselect閲岄潰鐨刼ption鍏冪礌 @@ -371,6 +386,34 @@ 'Authorization': token }, url: "../hik/setPTZ", + type: "post", + dataType: "json", + data: JSON.stringify(myEntity), + success: function (data) { + console.log(data); + } + }) + }) + $("#setTargetPostion").click(function () { + cameraId = $('#select option:selected').val(); + var camera = cameraMap.get(cameraId); + var camP = camera.longitude + ',' + camera.latitude + ',' + camera.altitude; + var targetP = $('#targetPostion').val(); + //瀹氫箟涓�涓甫鏈塎ap瀛楁鐨勫疄浣撳璞� + var myEntity = { + channelNum: 1, + cameraId: cameraId, + targetPosition: targetP, + camPosition: camP, + }; + console.log(myEntity) + $.ajax({ + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': token + }, + url: "../hik/setTargetPosition", type: "post", dataType: "json", data: JSON.stringify(myEntity), @@ -636,7 +679,7 @@ data: JSON.stringify(opt), success: function (data) { console.log(data.data); - $("#imgContainer").attr("src","data:image/png;base64,"+data.data); + $("#imgContainer").attr("src", "data:image/png;base64," + data.data); } }) }) @@ -722,6 +765,7 @@ } }) } + let webRtcServer = null; let videoMap = new Map(); $('video').click(function (e) { @@ -738,7 +782,7 @@ } else if (camera.type == "dh") { realViewDh("127.0.0.1", ID, camera.username, camera.password, camera.ipaddr, camera.port); } else { - realViewHik("192.168.1.15", ID, camera.username, camera.password, camera.ipaddr, camera.port); + realViewHik("192.168.1.15", ID, camera.username, camera.password, camera.ipaddr, camera.port); } } }); @@ -784,4 +828,5 @@ webRtcServer.disconnect(); } </script> +</body> </html> \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java index e0b93c8..6f27a17 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java @@ -1,7 +1,5 @@ package com.ruoyi.framework.aspectj; -import com.ruoyi.common.annotation.SdkOperate; -import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; @@ -9,19 +7,13 @@ import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.device.camera.service.IArdCamerasService; -import com.ruoyi.system.service.ISysUserService; -import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; - import javax.annotation.Resource; import java.util.Date; -import java.util.HashMap; -import java.util.Map; /** * SDK鎺у埗澶勭悊 @@ -42,7 +34,6 @@ @Around("dsPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { - Boolean resultMap = dataScopeFilter(point); if (resultMap) { return point.proceed(); @@ -57,16 +48,18 @@ * @param joinPoint 鍒囩偣 */ public Boolean dataScopeFilter(ProceedingJoinPoint joinPoint) { - //鑾峰彇璇锋眰鎺у埗鐩告満鐨勪俊鎭� CameraCmd cmd = (CameraCmd) joinPoint.getArgs()[0]; ArdCameras ardCameras = ardCamerasService.selectArdCamerasById(cmd.getCameraId()); if (StringUtils.isNull(ardCameras)) { return false; } + //浼樺厛绾ф瘮瀵� Date operatorExpired = ardCameras.getOperatorExpired(); Date now = new Date(); if (now.before(operatorExpired)) { + //鏈繃鏈� + LoginUser loginUser = SecurityUtils.getLoginUser(); if (StringUtils.isNull(loginUser)) { return false;//褰撳墠鐧诲綍鐢ㄦ埛涓虹┖涓嶅彲浠ユ帶鍒� diff --git a/ruoyi-framework/target/classes/com/ruoyi/framework/aspectj/SdkOperateAspect.class b/ruoyi-framework/target/classes/com/ruoyi/framework/aspectj/SdkOperateAspect.class index f456be1..b9019ef 100644 --- a/ruoyi-framework/target/classes/com/ruoyi/framework/aspectj/SdkOperateAspect.class +++ b/ruoyi-framework/target/classes/com/ruoyi/framework/aspectj/SdkOperateAspect.class Binary files differ -- Gitblit v1.9.3