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