From d873828ae4b9d4fc6ad510513c6c3f0c33118fd8 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Tue, 30 Dec 2025 11:32:06 +0800
Subject: [PATCH] 优化

---
 ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java |   40 +++---------
 ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java             |    6 +-
 ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java      |   36 +++--------
 ard-device/src/main/java/com/ard/device/component/sdk/dh/service/impl/DaHuaSDK.java      |   39 +++++--------
 ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java    |   27 +++++----
 ard-device/src/main/java/com/ard/device/camera/domain/ArdCamera.java                     |    2 
 ard-device/src/main/java/com/ard/device/component/sdk/common/GlobalVariable.java         |    3 
 7 files changed, 58 insertions(+), 95 deletions(-)

diff --git a/ard-device/src/main/java/com/ard/device/camera/domain/ArdCamera.java b/ard-device/src/main/java/com/ard/device/camera/domain/ArdCamera.java
index 135810d..b7c379c 100644
--- a/ard-device/src/main/java/com/ard/device/camera/domain/ArdCamera.java
+++ b/ard-device/src/main/java/com/ard/device/camera/domain/ArdCamera.java
@@ -4,6 +4,7 @@
 import com.ard.common.core.domain.BaseEntity;
 import com.ard.device.channel.domain.ArdChannel;
 import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import java.util.List;
@@ -17,6 +18,7 @@
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
+@Builder
 public class ArdCamera extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
diff --git a/ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java b/ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java
index d387132..993e729 100644
--- a/ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java
+++ b/ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java
@@ -163,7 +163,7 @@
         ardCamera.setUpdateBy(SecurityUtils.getUsername());
         int res = ardCameraMapper.updateArdCamera(ardCamera);
         if (res > 0) {
-            cameraSDKService.logout(ardCamera.getId());//sdk注销
+            cameraSDKService.logout(ardCamera);//sdk注销
             cameraSDKService.login(ardCamera);//sdk登录获取通道信息
         }
         return res;
@@ -186,7 +186,7 @@
                 //删除当前相机的所有通道
                 ardChannelService.deleteArdChannelByDeviceId(id);
                 //sdk注销
-                cameraSDKService.logout(id);
+                cameraSDKService.logout(camera);
             }
         }
         return ardCameraMapper.deleteArdCameraByIds(ids);
@@ -207,7 +207,7 @@
             //删除当前相机的所有通道
             ardChannelService.deleteArdChannelByDeviceId(id);
             //sdk注销
-            cameraSDKService.logout(id);
+            cameraSDKService.logout(ArdCamera.builder().id(id).build());
         }
         return i;
     }
@@ -408,15 +408,20 @@
      * @author 刘苏义
      * @date 2024/8/22 14:37
      */
-    @Scheduled(fixedDelay = 30000)
+    @Scheduled(fixedDelay = 10000)
     public void failedReconnect() {
         try {
             log.debug("定时执行失败相机重连任务");
-            List<Object> ardCameras = redisService.getListKey(CacheConstants.CAMERA_LIST_KEY);
-            ardCameras.stream()
-                    .map(object -> (ArdCamera) object) // 将Object转换为ArdCameras
-                    .filter(camera -> !GlobalVariable.loginMap.containsKey(camera.getId()))
-                    .forEach(camera -> cameraSDKService.login(camera));
+            // 从数据库取全部设备
+            List<ArdCamera> cameraList = selectArdCameraList(new ArdCamera());
+            cameraList.stream()
+                    // 只处理登录失败或离线的设备
+                    .filter(camera -> camera.getLoginId() == null || camera.getLoginId() < 0 || "0".equals(camera.getState()))
+                    .forEach(camera -> {
+                        log.info("尝试重新登录设备 {}:{}", camera.getIp(), camera.getPort());
+                        cameraSDKService.login(camera);
+                    });
+
         } catch (Exception ex) {
             log.error("定时执行失败相机重连任务异常:{}", ex.getMessage());
         }
@@ -435,9 +440,7 @@
             List<ArdCamera> ardCameraList = selectArdCameraList(new ArdCamera());
             ardCameraList
                     .forEach(camera -> {
-                        CameraCmd cmd = new CameraCmd();
-                        cmd.setCameraId(camera.getId());
-                        boolean onLineNew = cameraSDKService.isOnLine(cmd);
+                        boolean onLineNew = cameraSDKService.isOnLine(camera);
                         boolean onLineOld = "1".equals(camera.getState());
                         if (onLineNew != onLineOld) {
                             if (onLineNew) {
diff --git a/ard-device/src/main/java/com/ard/device/component/sdk/common/GlobalVariable.java b/ard-device/src/main/java/com/ard/device/component/sdk/common/GlobalVariable.java
index f76ae07..ec95a86 100644
--- a/ard-device/src/main/java/com/ard/device/component/sdk/common/GlobalVariable.java
+++ b/ard-device/src/main/java/com/ard/device/component/sdk/common/GlobalVariable.java
@@ -16,8 +16,7 @@
  **/
 @Data
 public class GlobalVariable {
-    //保存相机登录信息(cameraId:loginId)
-    public static Map<String, Object> loginMap = new ConcurrentHashMap<>();
+
     //保存相机登录信息(loginId:Camera)
     public static Map<Integer, ArdCamera> hikLoginMap = new ConcurrentHashMap<>();
 }
diff --git a/ard-device/src/main/java/com/ard/device/component/sdk/dh/service/impl/DaHuaSDK.java b/ard-device/src/main/java/com/ard/device/component/sdk/dh/service/impl/DaHuaSDK.java
index 54fa4d5..84468ce 100644
--- a/ard-device/src/main/java/com/ard/device/component/sdk/dh/service/impl/DaHuaSDK.java
+++ b/ard-device/src/main/java/com/ard/device/component/sdk/dh/service/impl/DaHuaSDK.java
@@ -17,6 +17,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
+
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 import java.io.*;
@@ -102,7 +103,8 @@
     public void login(ArdCamera camera) {
         try {
             NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
-            NetSDKLib.LLong loginId = LoginModule.login(camera.getIp(), camera.getPort(), camera.getUsername(), camera.getPassword(), m_stDeviceInfo);
+            NetSDKLib.LLong loginId = LoginModule.login(camera.getIp(), camera.getPort(), camera.getUsername(),
+                    camera.getPassword(), m_stDeviceInfo);
             if (loginId.longValue() <= 0) {
                 camera.setChanNum(0);
                 camera.setLoginId(-1L);
@@ -116,7 +118,7 @@
             camera.setChanNum(m_stDeviceInfo.byChanNum);
             camera.setStartChan(1);
             camera.setLoginId(loginId.longValue());
-            GlobalVariable.loginMap.put(camera.getId(), loginId);
+
             //获取最新通道
             List<ArdChannel> ardChannelList = getChannels(camera);
             if (!ardChannelList.isEmpty()) {
@@ -135,11 +137,8 @@
      * 2023/10/17 8:28:13
      */
     @Override
-    public void logout(String cameraId) {
-        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
-            return;
-        }
-        NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId);
+    public void logout(ArdCamera ardCamera) {
+        NetSDKLib.LLong loginId = new NetSDKLib.LLong(ardCamera.getLoginId());
         LoginModule.logout(loginId);
     }
 
@@ -149,13 +148,9 @@
      * 2023/10/17 8:28:13
      */
     @Override
-    public boolean isOnLine(CameraCmd cmd) {
+    public boolean isOnLine(ArdCamera ardCamera) {
         try {
-            String cameraId = cmd.getCameraId();
-            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
-                return false;
-            }
-            NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId);
+            NetSDKLib.LLong loginId = new NetSDKLib.LLong(ardCamera.getLoginId());
             NetSDKLib.NET_WORKSTATE dh_ptz_location_info = new NetSDKLib.NET_WORKSTATE();
             boolean b = ConfigModule.queryDevState(loginId, NET_DEVSTATE_ONLINE, dh_ptz_location_info);
             if (!b) {
@@ -185,8 +180,8 @@
             channel.setDeviceId(camera.getId());
             channel.setChanNo(i);
             //获取视频编码
-            CameraCmd cameraCmd = new CameraCmd(camera.getId(), channel.getChanNo());
-            VideoCompressionCfg videoCompressionCfg = getVideoCompressionCfg(cameraCmd);
+            camera.setChanNo(i);
+            VideoCompressionCfg videoCompressionCfg = getVideoCompressionCfg(camera);
             if (StringUtils.isNotNull(videoCompressionCfg)) {
                 channel.setVideoCode(videoCompressionCfg.getVideoEncType());
             }
@@ -202,16 +197,12 @@
     }
 
     @Override
-    public VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd) {
-        String cameraId = cmd.getCameraId();
-        Integer chanNo = cmd.getChanNo();
-        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
-            return null;
-        }
-        NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId);
+    public VideoCompressionCfg getVideoCompressionCfg(ArdCamera ardCamera) {
+
+        NetSDKLib.LLong loginId = new NetSDKLib.LLong(ardCamera.getLoginId());
         NetSDKLib.CFG_ENCODE_INFO cfg_encode_info = new NetSDKLib.CFG_ENCODE_INFO();
-        cfg_encode_info.nChannelID = chanNo - 1;
-        boolean b = ConfigModule.GetNewDevConfig(loginId, chanNo - 1, CFG_CMD_ENCODE, cfg_encode_info);
+        cfg_encode_info.nChannelID = ardCamera.getChanNo() - 1;
+        boolean b = ConfigModule.GetNewDevConfig(loginId, ardCamera.getChanNo() - 1, CFG_CMD_ENCODE, cfg_encode_info);
         if (b) {
             int emCompression = cfg_encode_info.stuMainStream[0].stuVideoFormat.emCompression;//视频格式
             String videoEncType;
diff --git a/ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java b/ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java
index c146539..728245a 100644
--- a/ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java
+++ b/ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java
@@ -9,6 +9,7 @@
 import com.ard.device.component.sdk.common.ResolutionEnum;
 import com.ard.device.component.sdk.common.SdkErrorCodeEnum;
 import com.ard.device.component.sdk.common.osSelect;
+import com.ard.device.component.sdk.dh.lib.NetSDKLib;
 import com.ard.device.component.sdk.event.LoginEvent;
 import com.ard.device.component.sdk.hik.lib.ExceptionCallBack;
 import com.ard.device.component.sdk.hik.lib.HCNetSDK;
@@ -109,8 +110,6 @@
                 return;
             }
             log.info("Login Success 【 {}:{} 】", camera.getIp(), camera.getPort());
-
-            GlobalVariable.loginMap.put(camera.getId(), loginId);
             GlobalVariable.hikLoginMap.put(loginId, camera);
             camera.setLoginId((long) loginId);
             camera.setState("1");
@@ -138,26 +137,15 @@
      * 注销
      */
     @Override
-    public void logout(String cameraId) {
-        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
-            return;
-        }
-        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
-        boolean b = hCNetSDK.NET_DVR_Logout(userId);
-        if (b) {
-            GlobalVariable.loginMap.remove(cameraId);
-        }
+    public void logout(ArdCamera ardCamera) {
+
+        hCNetSDK.NET_DVR_Logout(ardCamera.getLoginId().intValue());
     }
 
     @Override
-    public boolean isOnLine(CameraCmd cmd) {
+    public boolean isOnLine(ArdCamera ardCamera) {
         try {
-            String cameraId = cmd.getCameraId();
-            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
-                return false;
-            }
-            Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
-            return hCNetSDK.NET_DVR_RemoteControl(userId, NET_DVR_CHECK_USER_STATUS, null, 0);
+            return hCNetSDK.NET_DVR_RemoteControl(ardCamera.getLoginId().intValue(), NET_DVR_CHECK_USER_STATUS, null, 0);
         } catch (Exception ex) {
             log.error("检测在线异常:{}", ex.getMessage());
             return false;
@@ -169,19 +157,13 @@
      *
      */
     @Override
-    public VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd) {
-        String cameraId = cmd.getCameraId();
-        Integer chanNo = cmd.getChanNo();
-        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
-            return null;
-        }
-        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
-
+    public VideoCompressionCfg getVideoCompressionCfg(ArdCamera ardCamera) {
+        Integer chanNo = ardCamera.getChanNo();
+        int userId = ardCamera.getLoginId().intValue();
         HCNetSDK.NET_DVR_COMPRESSIONCFG_V30 compressionCfg = new HCNetSDK.NET_DVR_COMPRESSIONCFG_V30();
         compressionCfg.write();
         Pointer point = compressionCfg.getPointer();
         IntByReference ibrBytesReturned = new IntByReference(0);
-
         boolean bool = hCNetSDK.NET_DVR_GetDVRConfig(userId, HCNetSDK.NET_DVR_GET_COMPRESSCFG_V30, chanNo, point,
                 compressionCfg.size(), ibrBytesReturned);
         if (bool) {
@@ -432,8 +414,8 @@
                     channel.setName(channelName);
                     channel.setChanNo(chanNo);
                     //获取视频编码
-                    CameraCmd cameraCmd = new CameraCmd(camera.getId(), chanNo);
-                    VideoCompressionCfg videoCompressionCfg = getVideoCompressionCfg(cameraCmd);
+                    camera.setChanNo(chanNo);
+                    VideoCompressionCfg videoCompressionCfg = getVideoCompressionCfg(camera);
                     if (StringUtils.isNotNull(videoCompressionCfg)) {
                         channel.setVideoCode(videoCompressionCfg.getVideoEncType());
                     }
diff --git a/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java b/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java
index 5195736..91b2e37 100644
--- a/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java
+++ b/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java
@@ -20,13 +20,13 @@
     void login(ArdCamera cameras);
 
     //注销
-    void logout(String cameraId);
+    void logout(ArdCamera ardCamera);
 
     //在线状态
-    boolean isOnLine(CameraCmd cmd);
+    boolean isOnLine(ArdCamera ardCamera);
 
     //获取码流压缩参数
-    VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd);
+    VideoCompressionCfg getVideoCompressionCfg(ArdCamera ardCamera);
 
     //获取相机通道信息
     List<ArdChannel> getChannels(ArdCamera camera);
diff --git a/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java b/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java
index 4ca608e..5de1b57 100644
--- a/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java
+++ b/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java
@@ -55,15 +55,12 @@
 
     //注销
     @Override
-    public void logout(String cameraId) {
+    public void logout(ArdCamera ardCamera) {
         try {
-            ArdCamera ardCamera = redisService.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
-            if (ardCamera != null) {
-                String factory = ardCamera.getFactory();
-                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
-                cameraSDK.logout(cameraId);
-                GlobalVariable.loginMap.remove(cameraId);//移除相机登录id缓存
-            }
+
+            String factory = ardCamera.getFactory();
+            CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
+            cameraSDK.logout(ardCamera);
         } catch (Exception ex) {
             log.error("注销异常:{}", ex.getMessage());
         }
@@ -71,17 +68,11 @@
 
     //在线检测
     @Override
-    public boolean isOnLine(CameraCmd cmd) {
+    public boolean isOnLine(ArdCamera ardCamera) {
         try {
-            boolean onLine = false;
-            String cameraId = cmd.getCameraId();
-            ArdCamera ardCamera = redisService.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
-            if (ardCamera != null) {
-                String factory = ardCamera.getFactory();
-                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
-                onLine = cameraSDK.isOnLine(cmd);
-            }
-            return onLine;
+            String factory = ardCamera.getFactory();
+            CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
+            return cameraSDK.isOnLine(ardCamera);
         } catch (Exception ex) {
             log.error("检测在线异常:{}", ex.getMessage());
             return false;
@@ -90,16 +81,11 @@
 
     @Override
     //获取码流压缩参数
-    public VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd) {
+    public VideoCompressionCfg getVideoCompressionCfg(ArdCamera ardCamera) {
         try {
-            String cameraId = cmd.getCameraId();
-            ArdCamera ardCamera = redisService.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
-            if (ardCamera == null) {
-                return null;
-            }
             String factory = ardCamera.getFactory();
             CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
-            return cameraSDK.getVideoCompressionCfg(cmd);
+            return cameraSDK.getVideoCompressionCfg(ardCamera);
         } catch (Exception ex) {
             log.error("获取码流压缩参数异常:{}", ex.getMessage());
             return null;

--
Gitblit v1.9.3