From 1429d53c021ed4433d3a8d7976688d31b21a2156 Mon Sep 17 00:00:00 2001 From: huangfeng Date: Thu, 19 Jun 2025 10:43:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=B5=B7=E5=BA=B7?= =?UTF-8?q?=E5=BA=93=E5=88=9D=E5=A7=8B=E5=8C=96=E5=92=8C=E7=99=BB=E5=85=A5?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hcsdk/HCModule.java | 117 ++++++++++++++++++ .../com/xydl/cac/CacBackendApplication.java | 4 + .../com/xydl/cac/model/StaticVariable.java | 1 + .../xydl/cac/thermal/HCThermalService.java | 45 ++++--- 4 files changed, 144 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/hcsdk/HCModule.java diff --git a/src/main/java/com/hcsdk/HCModule.java b/src/main/java/com/hcsdk/HCModule.java new file mode 100644 index 0000000..64e4a63 --- /dev/null +++ b/src/main/java/com/hcsdk/HCModule.java @@ -0,0 +1,117 @@ +package com.hcsdk; + +import com.sun.jna.Native; +import com.sun.jna.Pointer; +import com.xydl.cac.model.StaticVariable; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class HCModule { + + public static HCNetSDK hCNetSDK = null; + static int userID; + static FExceptionCallBack_Imp fExceptionCallBack; + static String libPath; + + private static boolean createSDKInstance() { + if (hCNetSDK == null) { + synchronized (HCNetSDK.class) { + String strDllPath = libPath + "libhcnetsdk.so"; + hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class); + } + } + return true; + } + + static class FExceptionCallBack_Imp implements HCNetSDK.FExceptionCallBack { + @Override + public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) { + log.info("回调: dwType=" + dwType + ", lUserID=" + lUserID + ", lHandle=" + lHandle + ", pUser=" + pUser); + return; + } + } + + public static void init() { + libPath = StaticVariable.jarPath + "/hklib/"; + log.info("海康库路径=" + libPath); + createSDKInstance(); + + HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256); + HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256); + //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限 + String strPath1 = libPath + "libcrypto.so.1.1"; + String strPath2 = libPath + "libssl.so.1.1"; + System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length()); + ptrByteArray1.write(); + hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer()); + System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length()); + ptrByteArray2.write(); + hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer()); + String strPathCom = libPath + "HCNetSDKCom/"; + HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH(); + System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length()); + struComPath.write(); + hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer()); + + boolean r = hCNetSDK.NET_DVR_Init(); + if (!r) { + log.error("海康热成像初始化失败,错误码为: " + hCNetSDK.NET_DVR_GetLastError()); + } + + Pointer pUser = null; + r = hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, pUser); + if (!r) { + log.error("海康设置回调失败,错误码为: " + hCNetSDK.NET_DVR_GetLastError()); + } + } + + public static boolean logout() { + return hCNetSDK.NET_DVR_Logout(userID); + } + + public static void cleanup() { + if (hCNetSDK != null) { + hCNetSDK.NET_DVR_Cleanup(); + } + hCNetSDK = null; + } + + + /** + * 登录设备,支持 V40 和 V30 版本,功能一致。 + * + * @param ip 设备IP地址 + * @param port SDK端口,默认为设备的8000端口 + * @param user 设备用户名 + * @param psw 设备密码 + * @return 登录成功返回用户ID,失败返回-1 + */ + public static boolean login(String ip, short port, String user, String psw) { + // 创建设备登录信息和设备信息对象 + HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息 + HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息 + + m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN]; + System.arraycopy(ip.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, ip.length()); + + m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN]; + System.arraycopy(user.getBytes(), 0, m_strLoginInfo.sUserName, 0, user.length()); + + m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN]; + System.arraycopy(psw.getBytes(), 0, m_strLoginInfo.sPassword, 0, psw.length()); + + m_strLoginInfo.wPort = port; + m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是 +// m_strLoginInfo.byLoginMode=1; //ISAPI登录 + m_strLoginInfo.write(); + + // 执行登录操作 + userID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); + if (userID == -1) { + log.error("海康热成像登入失败" + ip + ":" + port + + ", 用户名:" + user + ", 密码:" + psw + ", 错误码为: " + hCNetSDK.NET_DVR_GetLastError()); + return false; + } + return true; // 返回登录结果 + } +} diff --git a/src/main/java/com/xydl/cac/CacBackendApplication.java b/src/main/java/com/xydl/cac/CacBackendApplication.java index d76f9ef..cc45954 100644 --- a/src/main/java/com/xydl/cac/CacBackendApplication.java +++ b/src/main/java/com/xydl/cac/CacBackendApplication.java @@ -1,8 +1,10 @@ package com.xydl.cac; +import com.xydl.cac.model.StaticVariable; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.system.ApplicationHome; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableAsync; @@ -25,6 +27,8 @@ public class CacBackendApplication { } public static void main(String[] args) { + ApplicationHome home = new ApplicationHome(CacBackendApplication.class); + StaticVariable.jarPath = home.getSource().getParentFile().getAbsolutePath(); SpringApplication.run(CacBackendApplication.class, args); } } diff --git a/src/main/java/com/xydl/cac/model/StaticVariable.java b/src/main/java/com/xydl/cac/model/StaticVariable.java index a67010c..7f00efc 100644 --- a/src/main/java/com/xydl/cac/model/StaticVariable.java +++ b/src/main/java/com/xydl/cac/model/StaticVariable.java @@ -14,6 +14,7 @@ import java.util.concurrent.ConcurrentHashMap; public class StaticVariable { + public static String jarPath = ""; public static Iec104Server iec104Server = null; public static Iec104Client realTime104Client = null; diff --git a/src/main/java/com/xydl/cac/thermal/HCThermalService.java b/src/main/java/com/xydl/cac/thermal/HCThermalService.java index 15e2836..f26960e 100644 --- a/src/main/java/com/xydl/cac/thermal/HCThermalService.java +++ b/src/main/java/com/xydl/cac/thermal/HCThermalService.java @@ -1,5 +1,6 @@ package com.xydl.cac.thermal; +import com.hcsdk.HCModule; import com.xydl.cac.entity.NSensor; import com.xydl.cac.entity.ThermalConfig; import com.xydl.cac.model.StaticVariable; @@ -32,25 +33,23 @@ public class HCThermalService { if (shutdown == 1) { return; } -// try { -// LoginModule.init(null, null); -// NSensor sensor = list.get(0); -// boolean r = LoginModule.login(sensor.getIp(), sensor.getPort(), sensor.getUsername(), sensor.getPasswd()); -// if (r) { -// log.info("大华热成像登入成功" + sensor.getIp() + ":" + sensor.getPort() -// + ", 用户名:" + sensor.getUsername() + ", 密码:" + sensor.getPasswd()); -// } else { -// log.error("大华热成像登入失败" + sensor.getIp() + ":" + sensor.getPort() -// + ", 用户名:" + sensor.getUsername() + ", 密码:" + sensor.getPasswd()); -// return; -// } -// String time = DateUtil.format(new Date()); -// for (NSensor item : list) { + try { + HCModule.init(); + NSensor sensor = list.get(0); + boolean r = HCModule.login(sensor.getIp(), sensor.getPort().shortValue(), sensor.getUsername(), sensor.getPasswd()); + if (r) { + log.info("海康热成像登入成功" + sensor.getIp() + ":" + sensor.getPort() + + ", 用户名:" + sensor.getUsername() + ", 密码:" + sensor.getPasswd()); + } else { + return; + } + String time = DateUtil.format(new Date()); + for (NSensor item : list) { // NetSDKLib.NET_RADIOMETRYINFO data = ThermalCameraModule.queryItemTemper(0, 0, sensor.getTmId(), sensor.getTmType()); // if (data == null) { -// log.warn("大华热成像没有采集到数据, 序号" + item.getTmId() + "测量项目" + sensor.getTmType()); +// log.warn("海康热成像没有采集到数据, 序号" + item.getTmId() + "测量项目" + sensor.getTmType()); // } else { -// log.info("大华热成像采集到序号" + item.getTmId() + "测量项目" + sensor.getTmType() + "的max=" +// log.info("海康热成像采集到序号" + item.getTmId() + "测量项目" + sensor.getTmType() + "的max=" // + data.fTemperMax + ", min=" + data.fTemperMin + ", aver=" + data.fTemperAver); // if (StringUtils.isNotBlank(config.getMaxtemp())) { // String value = String.valueOf(data.fTemperMax); @@ -71,12 +70,12 @@ public class HCThermalService { // StaticVariable.updateLastData(item.getDevId(), config.getAvertemp(), value, time); // } // } -// } -// LoginModule.logout(); -// } catch (Exception ex) { -// log.error("大华热成像测温采集异常, " + ex.getMessage(), ex); -// } finally { -// LoginModule.cleanup(); -// } + } + HCModule.logout(); + } catch (Exception ex) { + log.error("海康热成像测温采集异常, " + ex.getMessage(), ex); + } finally { + HCModule.cleanup(); + } } }