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