From b5cd784d0cde5b7c82ea78aef4ac0e5a161d8c5d Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Mon, 18 May 2026 14:42:43 +0800
Subject: [PATCH] 优化

---
 ard-modules/ard-modules-work/src/main/java/com/ard/work/sdk/hik/service/AbstractHikVisionSDK.java |  136 +++++++++++++++++++++++++++------------------
 1 files changed, 81 insertions(+), 55 deletions(-)

diff --git a/ard-modules/ard-modules-work/src/main/java/com/ard/work/sdk/hik/service/AbstractHikVisionSDK.java b/ard-modules/ard-modules-work/src/main/java/com/ard/work/sdk/hik/service/AbstractHikVisionSDK.java
index e4e7991..c23a459 100644
--- a/ard-modules/ard-modules-work/src/main/java/com/ard/work/sdk/hik/service/AbstractHikVisionSDK.java
+++ b/ard-modules/ard-modules-work/src/main/java/com/ard/work/sdk/hik/service/AbstractHikVisionSDK.java
@@ -41,6 +41,7 @@
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.util.StopWatch;
 import org.springframework.web.multipart.MultipartFile;
+
 import java.awt.geom.Point2D;
 import java.io.ByteArrayInputStream;
 import java.io.File;
@@ -703,34 +704,41 @@
         String cameraId = cmd.getCameraId();
         Integer chanNo = cmd.getChanNo();
         int userId = cmd.getLoginId().intValue();
-
-        NET_DVR_PTZPOS m_ptzPosCurrent = new NET_DVR_PTZPOS();
-        Pointer point = m_ptzPosCurrent.getPointer();
-        IntByReference ibrBytesReturned = new IntByReference(0);
-        m_ptzPosCurrent.write();
-        boolean bool = hCNetSDK.NET_DVR_GetDVRConfig(userId, HCNetSDK.NET_DVR_GET_PTZPOS, chanNo, point,
-                m_ptzPosCurrent.size(), ibrBytesReturned);
-        if (!bool) {
-            int errorCode = hCNetSDK.NET_DVR_GetLastError();
-            String errorDesc = SdkErrorCodeEnum.getDescByCode(errorCode);
-            String errorMsg = String.format("获取ptz失败,错误码:%s,原因:%s", errorCode, errorDesc);
-            log.warn(errorMsg);
-            return null;
+        ArdCamera camera = getCamera(cameraId);
+        if ("1".equals(camera.getType())) {
+            return getPtzHigh(cmd);
+        } else {
+            NET_DVR_PTZPOS m_ptzPosCurrent = new NET_DVR_PTZPOS();
+            Pointer point = m_ptzPosCurrent.getPointer();
+            IntByReference ibrBytesReturned = new IntByReference(0);
+            m_ptzPosCurrent.write();
+            boolean bool = hCNetSDK.NET_DVR_GetDVRConfig(userId, HCNetSDK.NET_DVR_GET_PTZPOS, chanNo, point,
+                    m_ptzPosCurrent.size(), ibrBytesReturned);
+            if (!bool) {
+                int errorCode = hCNetSDK.NET_DVR_GetLastError();
+                String errorDesc = SdkErrorCodeEnum.getDescByCode(errorCode);
+                String errorMsg = String.format("获取ptz失败,错误码:%s,原因:%s", errorCode, errorDesc);
+                log.warn(errorMsg);
+                return null;
+            }
+            m_ptzPosCurrent.read();
+            // DecimalFormat df = new DecimalFormat("0.0");//设置保留位数
+            //16进制转Integer后除10,保留小数点1位
+            //实际显示的PTZ值是获取到的十六进制值的十分之一,
+            //如获取的水平参数P的值是0x1750,实际显示的P值为175度;
+            //获取到的垂直参数T的值是0x0789,实际显示的T值为78.9度;
+            //获取到的变倍参数Z的值是0x1100,实际显示的Z值为110倍。
+            BigDecimal b =
+                    BigDecimal.valueOf((float) Integer.parseInt(Integer.toHexString(m_ptzPosCurrent.wPanPos)) / 10);
+            BigDecimal c =
+                    BigDecimal.valueOf((float) Integer.parseInt(Integer.toHexString(m_ptzPosCurrent.wTiltPos)) / 10);
+            BigDecimal d =
+                    BigDecimal.valueOf((float) Integer.parseInt(Integer.toHexString(m_ptzPosCurrent.wZoomPos)) / 10);
+            float p = b.setScale(1, RoundingMode.HALF_UP).floatValue();
+            float t = c.setScale(1, RoundingMode.HALF_UP).floatValue();
+            float z = d.setScale(1, RoundingMode.HALF_UP).floatValue();
+            return new PtzDto(p, t, z);
         }
-        m_ptzPosCurrent.read();
-        // DecimalFormat df = new DecimalFormat("0.0");//设置保留位数
-        //16进制转Integer后除10,保留小数点1位
-        //实际显示的PTZ值是获取到的十六进制值的十分之一,
-        //如获取的水平参数P的值是0x1750,实际显示的P值为175度;
-        //获取到的垂直参数T的值是0x0789,实际显示的T值为78.9度;
-        //获取到的变倍参数Z的值是0x1100,实际显示的Z值为110倍。
-        BigDecimal b = BigDecimal.valueOf((float) Integer.parseInt(Integer.toHexString(m_ptzPosCurrent.wPanPos)) / 10);
-        BigDecimal c = BigDecimal.valueOf((float) Integer.parseInt(Integer.toHexString(m_ptzPosCurrent.wTiltPos)) / 10);
-        BigDecimal d = BigDecimal.valueOf((float) Integer.parseInt(Integer.toHexString(m_ptzPosCurrent.wZoomPos)) / 10);
-        float p = b.setScale(1, RoundingMode.HALF_UP).floatValue();
-        float t = c.setScale(1, RoundingMode.HALF_UP).floatValue();
-        float z = d.setScale(1, RoundingMode.HALF_UP).floatValue();
-        return new PtzDto(p, t, z);
     }
 
     /**
@@ -741,8 +749,7 @@
      * @author 刘苏义
      * @date 2024/9/5 17:00
      */
-    @Override
-    public PtzDto getPtzHigh(CameraCmd cmd) {
+    private PtzDto getPtzHigh(CameraCmd cmd) {
         try {
             String cameraId = cmd.getCameraId();
             Integer chanNo = cmd.getChanNo();
@@ -796,30 +803,39 @@
         Integer channelNum = cmd.getChanNo();
         PtzDto ptzDto = cmd.getPtzDto();
         int userId = cmd.getLoginId().intValue();
-        NET_DVR_PTZPOS m_ptzPosCurrent = new NET_DVR_PTZPOS();
-        m_ptzPosCurrent.wAction = 1;
-        try {
-            String p = String.valueOf((int) (ptzDto.getP() * 10));
-            String t = String.valueOf((int) (ptzDto.getT() * 10));
-            String z = String.valueOf((int) (ptzDto.getZ() * 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 errorCode = hCNetSDK.NET_DVR_GetLastError();
-                String errorDesc = SdkErrorCodeEnum.getDescByCode(errorCode);
-                String errorMsg = String.format("设置PTZ参数失败,错误码:%s,原因:%s", errorCode, errorDesc);
-                log.warn(errorMsg);
+        ArdCamera camera = getCamera(cameraId);
+        if ("1".equals(camera.getType())) {
+            DeviceCFG systemInfo = getSystemInfo(cmd);
+            if (systemInfo != null && "5.5.112".equals(systemInfo.getDwSoftwareVersion())) {
+                return setPtzHighT(cmd);
+            }
+            return setPtzHigh(cmd);
+        } else {
+            NET_DVR_PTZPOS m_ptzPosCurrent = new NET_DVR_PTZPOS();
+            m_ptzPosCurrent.wAction = 1;
+            try {
+                String p = String.valueOf((int) (ptzDto.getP() * 10));
+                String t = String.valueOf((int) (ptzDto.getT() * 10));
+                String z = String.valueOf((int) (ptzDto.getZ() * 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 errorCode = hCNetSDK.NET_DVR_GetLastError();
+                    String errorDesc = SdkErrorCodeEnum.getDescByCode(errorCode);
+                    String errorMsg = String.format("设置PTZ参数失败,错误码:%s,原因:%s", errorCode, errorDesc);
+                    log.warn(errorMsg);
+                    return false;
+                }
+                return true;
+            } catch (Exception ex) {
+                log.error(ex.getMessage());
                 return false;
             }
-            return true;
-        } catch (Exception ex) {
-            log.error(ex.getMessage());
-            return false;
         }
     }
 
@@ -832,8 +848,7 @@
      * @author 刘苏义
      * @date 2024/9/5 17:04
      */
-    @Override
-    public Boolean setPtzHighT(CameraCmd cmd) {
+    private Boolean setPtzHighT(CameraCmd cmd) {
         String cameraId = cmd.getCameraId();
         Integer chanNo = cmd.getChanNo();
         PtzDto ptzDto = cmd.getPtzDto();
@@ -893,8 +908,7 @@
     }
 
     //非透传 旧设备使用 新固件会导致2通道不自动聚焦
-    @Override
-    public Boolean setPtzHigh(CameraCmd cmd) {
+    private Boolean setPtzHigh(CameraCmd cmd) {
         String cameraId = cmd.getCameraId();
         Integer chanNo = cmd.getChanNo();
         PtzDto ptzDto = cmd.getPtzDto();
@@ -1842,6 +1856,7 @@
             return false;
         }
     }
+
     @Override
     public String recordStop(CameraCmd cmd) {
         String url = "";
@@ -2434,4 +2449,15 @@
             return true;
         }
     }
+
+    /**
+     * 获取相机信息(会校验存在性)
+     */
+    private ArdCamera getCamera(String cameraId) {
+        ArdCamera camera = redisService.getCacheMapValue(CacheConstants.CAMERA_LIST, cameraId);
+        if (camera == null) {
+            throw CameraSDKException.cameraNotExist(cameraId);
+        }
+        return camera;
+    }
 }

--
Gitblit v1.9.3