From f8bfa797dc155f282c6212edcb7dfbc3c9ab4313 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=AF=85?= <97163845@qq.com> Date: Wed, 20 Aug 2025 11:30:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E5=8D=8E=E7=BA=A2=E5=A4=96=E6=B5=8B?= =?UTF-8?q?=E6=B8=A9=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sdkLog/SdkLog_1_W.log | 37 +++- .../com/inspect/nvr/config/HikLibConfig.java | 7 + .../nvr/controller/CameraController.java | 11 +- .../nvr/controller/DahuaController.java | 12 +- .../daHuaCarme/callback/fSnapReceiveCB.java | 3 +- .../inspect/nvr/domain/Infrared/Camera.java | 2 +- .../nvr/hikVision/utils/jna/HikLibConfig.java | 15 ++ .../com/inspect/nvr/service/DahuaService.java | 5 +- .../nvr/service/impl/DahuaServiceImpl.java | 202 +++++++++++++----- .../service/impl/HikVisionServiceImpl.java | 2 +- .../service/impl/IvsCameraServiceImpl.java | 64 ++---- .../inspect/nvr/utils/StringHexConverter.java | 14 +- 12 files changed, 261 insertions(+), 113 deletions(-) diff --git a/sdkLog/SdkLog_1_W.log b/sdkLog/SdkLog_1_W.log index a2f1896..228eb26 100644 --- a/sdkLog/SdkLog_1_W.log +++ b/sdkLog/SdkLog_1_W.log @@ -1,4 +1,33 @@ -[2025-07-11 15:04:10.150][DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo Succ, Path[E:/qinyl/intellij/src/inspect-nvr/lib/zlib1.dll], hHandleRet[1493237760] -[2025-07-11 15:04:10.150][INF] The COM:HCCoreBase ver is 6.1.4.15, 2020_03_05. Async:1. -[2025-07-11 15:04:10.150][INF] The COM:Core ver is 6.1.9.47, 2022_11_11. Async:1. -[2025-07-11 15:04:10.150][INF] This HCNetSDK ver is 6.1.9.47 Ver 2022_11_11. +[2025-08-18 11:30:56.314][DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo Succ, Path[D:/workspace/inspect-nvr/lib/zlib1.dll], hHandleRet[1430257664] +[2025-08-18 11:30:56.314][INF] The COM:HCCoreBase ver is 6.1.4.15, 2020_03_05. Async:1. +[2025-08-18 11:30:56.314][INF] The COM:Core ver is 6.1.9.47, 2022_11_11. Async:1. +[2025-08-18 11:30:56.314][INF] This HCNetSDK ver is 6.1.9.47 Ver 2022_11_11. +[2025-08-18 11:33:15.465][INF] Login dev 192.168.1.250:8000. +[2025-08-18 11:33:15.466][INF] dwTotalNum[2048] +[2025-08-18 11:33:15.467][INF] Private connect 192.168.1.250:8000 sock=5244 this=0x2bc66ce4 cmd=0x10000 port=56125 +[2025-08-18 11:33:15.467][INF] LogonDev1 in[192.168.1.250:8000] +[2025-08-18 11:33:15.469][DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo Succ, Path[D:/workspace/inspect-nvr/lib/libcrypto-1_1-x64.dll], hHandleRet[519634944] +[2025-08-18 11:33:15.469][DBG] Load [libcrypto-1_1-x64.dll] SUCC, Real Path[D:\workspace\inspect-nvr\lib\libcrypto-1_1-x64.dll] +[2025-08-18 11:33:15.473][DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo Succ, Path[D:/workspace/inspect-nvr/lib/libssl-1_1-x64.dll], hHandleRet[1400373248] +[2025-08-18 11:33:15.473][DBG] Load [libssl-1_1-x64.dll] SUCC, Real Path[D:\workspace\inspect-nvr\lib\libssl-1_1-x64.dll] +[2025-08-18 11:33:15.473][INF] SSLTRANSAPI::IsAllAPILoaded, SSL_library_init Unload +[2025-08-18 11:33:15.473][INF] OpenSSL, Not All Function Loaded! +[2025-08-18 11:33:15.473][INF] SSLTRANSAPI::PrintVersion, OpenSSL version info [OpenSSL 1.1.1l 24 Aug 2021] +[2025-08-18 11:33:15.473][INF] CSSLTrans::SSLCtxInit, dwSSLVersion[6], m_fnTLSServerMethod +[2025-08-18 11:33:15.480][ERR] CSSLTrans::SSLTrans_CTX_Load_CA, invalid path[D:/workspace/inspect-nvr/lib/cert/\] +[2025-08-18 11:33:16.154][DBG] CComBase::Load, Load szDllPath[D:/workspace/inspect-nvr/lib/HCNetSDKCom/HCPreview.dll] SUCC +[2025-08-18 11:33:16.155][INF] AbilityAnalyze---Init-- start +[2025-08-18 11:33:16.156][ERR] AbilityAnalyze---open zip package error, package path D:/workspace/inspect-nvr/lib/LocalXml.zip +[2025-08-18 11:33:16.157][INF] The COM:Preview ver is 6.1.9.47, 2022_11_11. +[2025-08-18 11:33:16.168][INF] Private connect 192.168.1.250:8000 sock=5292 this=0x2bc66ce4 cmd=0x30009 port=56126 +[2025-08-18 11:36:41.425][INF] Login dev 192.168.1.250:8000. +[2025-08-18 11:36:41.437][INF] Private connect 192.168.1.250:8000 sock=5432 this=0x2bc66ce4 cmd=0x10000 port=56365 +[2025-08-18 11:36:41.437][INF] LogonDev1 in[192.168.1.250:8000] +[2025-08-18 11:36:41.503][INF] Private connect 192.168.1.250:8000 sock=5472 this=0x2bc66ce4 cmd=0x30009 port=56367 +[2025-08-18 11:37:10.523][INF] Private connect 192.168.1.250:8000 sock=5536 this=0x2bc66ce4 cmd=0x30200 port=56406 +[2025-08-18 11:37:18.684][INF] Private connect 192.168.1.250:8000 sock=5564 this=0x2bc66ce4 cmd=0x30200 port=56428 +[2025-08-18 11:37:21.152][INF] Private connect 192.168.1.250:8000 sock=5564 this=0x2bc66ce4 cmd=0x30009 port=56431 +[2025-08-18 11:37:27.623][INF] Private connect 192.168.1.250:8000 sock=5344 this=0x2bc66ce4 cmd=0x30009 port=56437 +[2025-08-18 11:37:32.428][INF] Private connect 192.168.1.250:8000 sock=5652 this=0x2bc66ce4 cmd=0x30200 port=56441 +[2025-08-18 11:37:38.720][INF] Private connect 192.168.1.250:8000 sock=5680 this=0x2bc66ce4 cmd=0x30009 port=56443 +[2025-08-18 11:39:11.090][INF] Private connect 192.168.1.250:8000 sock=5736 this=0x2bc66ce4 cmd=0x30009 port=56554 diff --git a/src/main/java/com/inspect/nvr/config/HikLibConfig.java b/src/main/java/com/inspect/nvr/config/HikLibConfig.java index b6bc837..1de7ca8 100644 --- a/src/main/java/com/inspect/nvr/config/HikLibConfig.java +++ b/src/main/java/com/inspect/nvr/config/HikLibConfig.java @@ -8,6 +8,7 @@ import com.inspect.nvr.service.impl.HikFExceptionCallBack_Imp; import com.inspect.nvr.service.impl.HikLoginResultCallBack; import com.sun.jna.Native; import com.sun.jna.Pointer; +import com.sun.jna.ptr.IntByReference; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; @@ -32,6 +33,12 @@ public class HikLibConfig { return null; } } + // 设置接收缓冲区大小(单位:字节,示例设置为1MB) + hcNetSDK.NET_DVR_SetSDKInitCfg(3, new IntByReference(1024*1024).getPointer()); + + // 设置发送缓冲区大小 + hcNetSDK.NET_DVR_SetSDKInitCfg(4, new IntByReference(1024*1024).getPointer()); + //linux系统建议调用以下接口加载组件库 if (osSelect.isLinux()) { HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256); diff --git a/src/main/java/com/inspect/nvr/controller/CameraController.java b/src/main/java/com/inspect/nvr/controller/CameraController.java index 15c7f5c..52fd6a6 100644 --- a/src/main/java/com/inspect/nvr/controller/CameraController.java +++ b/src/main/java/com/inspect/nvr/controller/CameraController.java @@ -4,6 +4,7 @@ package com.inspect.nvr.controller; import com.inspect.nvr.domain.Infrared.Camera; import com.inspect.nvr.domain.Infrared.TemperatureData; import com.inspect.nvr.hikVision.utils.AjaxResult; +import com.inspect.nvr.service.DahuaService; import com.inspect.nvr.service.HikVisionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -18,6 +19,8 @@ public class CameraController { @Resource private HikVisionService cameraService; + @Resource + private DahuaService dahuaService; //获取相机预置位列表--海康相机 @PostMapping("/hw/cameraYzwHikVision") @@ -33,7 +36,13 @@ public class CameraController { @ResponseBody @CrossOrigin public AjaxResult cameraHong(@RequestBody Camera camera) { - TemperatureData temperatureData = cameraService.StartRemote(camera); + TemperatureData temperatureData = null; + if(0 == camera.getCameraType()){ + temperatureData = cameraService.StartRemote(camera); + } else { + temperatureData = dahuaService.StartRemote(camera); + } + return AjaxResult.success().put("data", temperatureData); } diff --git a/src/main/java/com/inspect/nvr/controller/DahuaController.java b/src/main/java/com/inspect/nvr/controller/DahuaController.java index b86ba78..23da394 100644 --- a/src/main/java/com/inspect/nvr/controller/DahuaController.java +++ b/src/main/java/com/inspect/nvr/controller/DahuaController.java @@ -3,8 +3,11 @@ package com.inspect.nvr.controller; import com.inspect.nvr.domain.Infrared.Camera; import com.inspect.nvr.domain.Infrared.NvrInfo; +import com.inspect.nvr.domain.Infrared.TemperatureData; import com.inspect.nvr.service.DahuaService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; @@ -29,7 +32,7 @@ public class DahuaController { @PostMapping("/StartRemote") @CrossOrigin @ResponseBody - public String StartRemote(@RequestBody Camera camera) { + public TemperatureData StartRemote(@RequestBody Camera camera) { return dahuaService.StartRemote(camera); } @PostMapping("/cameraControl") @@ -42,8 +45,11 @@ public class DahuaController { @PostMapping("/Picture") @CrossOrigin @ResponseBody - public ByteArrayInputStream Picture(@RequestBody Camera camera) { - return dahuaService.Picture(camera); + public ResponseEntity Picture(@RequestBody Camera camera) { + return ResponseEntity + .ok() + .body(new InputStreamResource(dahuaService.Picture(camera))); +// return dahuaService.Picture(camera); } diff --git a/src/main/java/com/inspect/nvr/daHuaCarme/callback/fSnapReceiveCB.java b/src/main/java/com/inspect/nvr/daHuaCarme/callback/fSnapReceiveCB.java index b85fb4c..5cffd7c 100644 --- a/src/main/java/com/inspect/nvr/daHuaCarme/callback/fSnapReceiveCB.java +++ b/src/main/java/com/inspect/nvr/daHuaCarme/callback/fSnapReceiveCB.java @@ -25,7 +25,8 @@ public class fSnapReceiveCB implements NetSDKLib.fSnapRev { if (pBuf != null && RevLen > 0) { byte[] buf = pBuf.getByteArray(0, RevLen); ByteArrayInputStream byteArrInput = new ByteArrayInputStream(buf); - } } } + + diff --git a/src/main/java/com/inspect/nvr/domain/Infrared/Camera.java b/src/main/java/com/inspect/nvr/domain/Infrared/Camera.java index 93f122d..dcbe1b1 100644 --- a/src/main/java/com/inspect/nvr/domain/Infrared/Camera.java +++ b/src/main/java/com/inspect/nvr/domain/Infrared/Camera.java @@ -47,5 +47,5 @@ public class Camera { */ private int cameraType; - + private int presetId; } diff --git a/src/main/java/com/inspect/nvr/hikVision/utils/jna/HikLibConfig.java b/src/main/java/com/inspect/nvr/hikVision/utils/jna/HikLibConfig.java index a90b9b7..4ac61e5 100644 --- a/src/main/java/com/inspect/nvr/hikVision/utils/jna/HikLibConfig.java +++ b/src/main/java/com/inspect/nvr/hikVision/utils/jna/HikLibConfig.java @@ -6,6 +6,7 @@ import com.inspect.nvr.service.impl.HikFExceptionCallBack_Imp; import com.inspect.nvr.service.impl.HikLoginResultCallBack; import com.sun.jna.Native; import com.sun.jna.Pointer; +import com.sun.jna.ptr.IntByReference; import org.springframework.context.annotation.Bean; @@ -29,6 +30,20 @@ public class HikLibConfig { return null; } } + + // 设置接收缓冲区大小(单位:字节,示例设置为1MB) + hcNetSDK.NET_DVR_SetSDKInitCfg(3, new IntByReference(1024*1024).getPointer()); + + // 设置发送缓冲区大小 + hcNetSDK.NET_DVR_SetSDKInitCfg(4, new IntByReference(1024*1024).getPointer()); + + // 设置使用私有协议登录(必须在NET_DVR_Init之前调用) +// HCNetSDK.NET_DVR_CMS_PARAM generalCfg = new HCNetSDK.NET_DVR_CMS_PARAM(); +// generalCfg.bySeverProtocolType = 1; // 1表示启用私有协议 +// generalCfg.write(); +// hcNetSDK.NET_DVR_SetSDKInitCfg(8, generalCfg.getPointer()); + + //linux系统建议调用以下接口加载组件库 if (osSelect.isLinux()) { HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256); diff --git a/src/main/java/com/inspect/nvr/service/DahuaService.java b/src/main/java/com/inspect/nvr/service/DahuaService.java index c474547..4c27b69 100644 --- a/src/main/java/com/inspect/nvr/service/DahuaService.java +++ b/src/main/java/com/inspect/nvr/service/DahuaService.java @@ -3,6 +3,7 @@ package com.inspect.nvr.service; import com.inspect.nvr.domain.Infrared.Camera; import com.inspect.nvr.domain.Infrared.NvrInfo; +import com.inspect.nvr.domain.Infrared.TemperatureData; import com.inspect.nvr.hikVision.utils.AjaxResult; import java.io.ByteArrayInputStream; @@ -12,11 +13,11 @@ public interface DahuaService { AjaxResult login(NvrInfo nvrInfo); //大华测温 - String StartRemote(Camera camera); + TemperatureData StartRemote(Camera camera); //大华预置位跳转 String cameraControl(Camera camera,int param1,int param2,int param3); - ByteArrayInputStream Picture(Camera camera); + ByteArrayInputStream Picture(Camera camera) ; } diff --git a/src/main/java/com/inspect/nvr/service/impl/DahuaServiceImpl.java b/src/main/java/com/inspect/nvr/service/impl/DahuaServiceImpl.java index e20d24a..7494094 100644 --- a/src/main/java/com/inspect/nvr/service/impl/DahuaServiceImpl.java +++ b/src/main/java/com/inspect/nvr/service/impl/DahuaServiceImpl.java @@ -9,8 +9,10 @@ import com.inspect.nvr.daHuaCarme.jna.dahua.ToolKits; import com.inspect.nvr.daHuaCarme.utils.jna.DahuaUtils; import com.inspect.nvr.domain.Infrared.Camera; import com.inspect.nvr.domain.Infrared.NvrInfo; +import com.inspect.nvr.domain.Infrared.TemperatureData; import com.inspect.nvr.hikVision.utils.AjaxResult; import com.inspect.nvr.service.DahuaService; +import com.inspect.nvr.utils.StringUtils; import com.inspect.nvr.utils.redis.RedisService; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; @@ -21,6 +23,11 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; @Slf4j @Service @@ -37,6 +44,11 @@ public class DahuaServiceImpl implements DahuaService { @Autowired private fSnapReceiveCB snapReceiveCB; + /** + * 登录大华设备 + * @param nvrInfo + * @return + */ @Override public AjaxResult login(NvrInfo nvrInfo) { @@ -57,21 +69,36 @@ public class DahuaServiceImpl implements DahuaService { //调用登录接口 // NetSDKLib.LLong m_hLoginHandle=NetSDKLib.cki - NetSDKLib.LLong m_hLoginHandle = dhNetSDK.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam); + m_hLoginHandle = dhNetSDK.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam); System.out.println("m_hLoginHandle : " + m_hLoginHandle); if (m_hLoginHandle.longValue() == 0) { System.out.println("登录失败"); System.out.println("大华-获取设备参数失败,错误码:" + ToolKits.getErrorCodePrint(dhNetSDK.CLIENT_GetLastError())); return null; } - - + redisService.setCacheObject(nvrInfo.getNvrIp() + "_m_hLoginHandle", m_hLoginHandle.longValue(), 200L, TimeUnit.SECONDS); + log.info("nvrip:{}",nvrInfo.getNvrIp()); + log.info("redis:{}",redisService.redisTemplate.opsForValue().get(nvrInfo.getNvrIp() + "_m_hLoginHandle")); return null; } + /** + * 获取红外温度信息 + * @param camera + * @return + */ @Override - public String StartRemote(Camera camera) { - + public TemperatureData StartRemote(Camera camera) { + Object storedObj = redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle"); + // 2. 进行空值和类型判断 + if (StringUtils.isNotNull(storedObj)) { + Long storedValue = (Long) storedObj; + m_hLoginHandle = new NetSDKLib.LLong(storedValue); + } else { + //m_hLoginHandle为空 + m_hLoginHandle = null; + } + // 3. 安全转换并创建LLong对象 if (ObjectUtil.isEmpty(m_hLoginHandle)) { NvrInfo nvrInfo = new NvrInfo(); nvrInfo.setNvrIp(camera.getIp()); @@ -79,9 +106,9 @@ public class DahuaServiceImpl implements DahuaService { nvrInfo.setAccount(camera.getUserName()); nvrInfo.setPassword(camera.getPassword()); login(nvrInfo); - m_hLoginHandle = (LLong) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle"); + m_hLoginHandle = new NetSDKLib.LLong((Long) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle")); - log.info("相机:m_hLoginHandle" + camera.getIp() + "m_hLoginHandle" + m_hLoginHandle); + log.info("相机:m_hLoginHandle" + camera.getNvrip() + "m_hLoginHandle" + m_hLoginHandle); } // 1. 初始化输入结构体 @@ -90,10 +117,10 @@ public class DahuaServiceImpl implements DahuaService { // 设置条件参数 - netIn.stCondition.nPresetId = 1; + netIn.stCondition.nPresetId = camera.getPresetId(); netIn.stCondition.nRuleId = 1; netIn.stCondition.nMeterType = NetSDKLib.NET_RADIOMETRY_METERTYPE.NET_RADIOMETRY_METERTYPE_AREA; - netIn.stCondition.nChannel = camera.getChannel(); + netIn.stCondition.nChannel = camera.getChannel()-1; log.info("[DEBUG] 结构体参数设置完成 - " + @@ -122,7 +149,7 @@ public class DahuaServiceImpl implements DahuaService { ); log.info("[DEBUG] CLIENT_QueryDevInfo调用..." + success); -// 4. 读取结果 + // 4. 读取结果 if (success) { netOut.read(); // 将本地内存同步到Java字段 NetSDKLib.NET_RADIOMETRYINFO stTempInfo = netOut.stTempInfo; @@ -130,16 +157,40 @@ public class DahuaServiceImpl implements DahuaService { System.out.println("温度最小值: " + fTemperMin); float fTemperMax = stTempInfo.fTemperMax; System.out.println("温度最大值: " + fTemperMax); - - return "温度: " + fTemperMin; + TemperatureData data = new TemperatureData( + stTempInfo.fTemperMax, + stTempInfo.fTemperMin, + stTempInfo.fTemperAver, + stTempInfo.fTemperStd, + netIn.stCondition.nPresetId, + netIn.stCondition.nRuleId + ); + return data; } System.out.println("大华-获取设备参数失败,错误码:" + ToolKits.getErrorCodePrint(dhNetSDK.CLIENT_GetLastError())); - return "获取温度失败"; + return null; } + /** + * 大华预置位跳转 + * @param camera + * @param param1 + * @param param2 + * @param param3 + * @return + */ @Override public String cameraControl(Camera camera, int param1, int param2, int param3) { + Object storedObj = redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle"); + // 2. 进行空值和类型判断 + if (StringUtils.isNotNull(storedObj)) { + Long storedValue = (Long) storedObj; + m_hLoginHandle = new NetSDKLib.LLong(storedValue); + } else { + //m_hLoginHandle为空 + m_hLoginHandle = null; + } if (ObjectUtil.isEmpty(m_hLoginHandle)) { NvrInfo nvrInfo = new NvrInfo(); nvrInfo.setNvrIp(camera.getIp()); @@ -147,29 +198,37 @@ public class DahuaServiceImpl implements DahuaService { nvrInfo.setAccount(camera.getUserName()); nvrInfo.setPassword(camera.getPassword()); login(nvrInfo); - m_hLoginHandle = (LLong) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle"); - + m_hLoginHandle = new NetSDKLib.LLong((Long) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle")); log.info("相机:m_hLoginHandle" + camera.getIp() + "m_hLoginHandle" + m_hLoginHandle); } String ctr = "GOTO_PRESET"; boolean dResult = dhNetSDK.CLIENT_DHPTZControlEx2(m_hLoginHandle, camera.getChannel() - 1, DahuaUtils.PTZCommand(ctr), 0, camera.getPointNum(), 0, 0, null); if (!dResult) { -// System.out.println("CLIENT_DHPTZControlEx Failed!" + ToolKits.getErrorCodePrint(dhNetSDK.CLIENT_GetLastError())); -// return AjaxResult.error(ToolKits.getErrorCodePrint(dhNetSDK.CLIENT_GetLastError())); log.info("CLIENT_DHPTZControlEx Failed!!"+ToolKits.getErrorCodePrint(dhNetSDK.CLIENT_GetLastError())); return "-1"; } else { -// System.out.println("CLIENT_DHPTZControlEx success"); log.info("CLIENT_DHPTZControlEx success"); -// return AjaxResult.success(); return "0"; } } + /** + * 大华抓图 + * @param camera + * @return + */ @Override public ByteArrayInputStream Picture(Camera camera) { - + Object storedObj = redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle"); + // 2. 进行空值和类型判断 + if (StringUtils.isNotNull(storedObj)) { + Long storedValue = (Long) storedObj; + m_hLoginHandle = new NetSDKLib.LLong(storedValue); + } else { + //m_hLoginHandle为空 + m_hLoginHandle = null; + } if (ObjectUtil.isEmpty(m_hLoginHandle)) { NvrInfo nvrInfo = new NvrInfo(); nvrInfo.setNvrIp(camera.getIp()); @@ -177,44 +236,87 @@ public class DahuaServiceImpl implements DahuaService { nvrInfo.setAccount(camera.getUserName()); nvrInfo.setPassword(camera.getPassword()); login(nvrInfo); - m_hLoginHandle = (LLong) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle"); - + m_hLoginHandle = new NetSDKLib.LLong((Long) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle")); log.info("相机:m_hLoginHandle" + camera.getIp() + "m_hLoginHandle" + m_hLoginHandle); } - + // 2. 准备抓图参数 NetSDKLib.SNAP_PARAMS snapParams = new NetSDKLib.SNAP_PARAMS(); - snapParams.Channel = camera.getChannel() - 1; // channel - snapParams.mode = 0; // capture picture mode - snapParams.Quality = 3; // picture quality - snapParams.InterSnap = 0; // timer capture picture time interval - snapParams.CmdSerial = 0; // request serial - + snapParams.Channel = camera.getChannel() - 1; // channel + snapParams.mode = 0; // capture picture mode + snapParams.Quality = 3; // picture quality + snapParams.InterSnap = 0; // timer capture picture time interval + snapParams.CmdSerial = 0; // request serial IntByReference intByReference = new IntByReference(camera.getChannel() - 1); + dhNetSDK.CLIENT_SetSnapRevCallBack(null, null); + + // 3. 准备接收回调的数据 + final byte[][] imageBytes = new byte[1][]; + final CountDownLatch latch = new CountDownLatch(1); + + // 4. 创建回调 + fSnapReceiveCB snapCallback = new fSnapReceiveCB() { + @Override + public void invoke(NetSDKLib.LLong lLoginID, Pointer pBuf, int RevLen, + int EncodeType, int CmdSerial, Pointer dwUser) { + try { + if (pBuf != null && RevLen > 0) { + imageBytes[0] = pBuf.getByteArray(0, RevLen); + } + } finally { + latch.countDown(); // 确保无论如何都会释放锁 + } + } + }; + + // 5. 设置回调并执行抓图 + dhNetSDK.CLIENT_SetSnapRevCallBack(snapCallback, null); if (!dhNetSDK.CLIENT_SnapPictureEx(m_hLoginHandle, snapParams, intByReference)) { -// System.out.println("CLIENT_SnapPictureEx Failed!" + ToolKits.getErrorCodePrint(dhNetSDK.CLIENT_GetLastError())); - log.error("CLIENT_SnapPictureEx Failed!" + ToolKits.getErrorCodePrint(dhNetSDK.CLIENT_GetLastError())); + log.error("CLIENT_SnapPictureEx Failed! " + + ToolKits.getErrorCodePrint(dhNetSDK.CLIENT_GetLastError())); return null; - } else { - System.out.println("CLIENT_SnapPictureEx success"); - - dhNetSDK.CLIENT_SetSnapRevCallBack(snapReceiveCB,null); - - final ByteArrayInputStream[] byteArrInput = new ByteArrayInputStream[1]; - new fSnapReceiveCB() { - @Override - public void invoke(NetSDKLib.LLong lLoginID, Pointer pBuf, int RevLen, int EncodeType, int CmdSerial, Pointer dwUser) { - - BufferedImage bufferedImage = null; - if (pBuf != null && RevLen > 0) { - byte[] buf = pBuf.getByteArray(0, RevLen); - byteArrInput[0] = new ByteArrayInputStream(buf); - - } - } - }; + } - return byteArrInput[0]; + // 6. 等待回调完成 + try { + if (!latch.await(5, TimeUnit.SECONDS)) { + log.error("等待图片回调超时"); + return null; + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.error("等待图片回调被中断", e); + return null; } + // 7. 如果获取到图片数据,保存到 D:\pic 目录 + if (imageBytes[0] != null) { + try { + // 确保目录存在 + File picDir = new File("D:\\pic"); + if (!picDir.exists()) { + picDir.mkdirs(); // 如果目录不存在,创建它 + } + + // 生成文件名(例如:camera_ip + timestamp) + String fileName = "D:\\pic\\" + camera.getIp() + "_" + System.currentTimeMillis() + ".jpg"; + + // 保存图片 + FileOutputStream fos = new FileOutputStream(fileName); + fos.write(imageBytes[0]); + fos.close(); + + log.info("图片已保存至: " + fileName); + } catch (IOException e) { + log.error("保存图片失败", e); + } + } + boolean bTemp = dhNetSDK.CLIENT_Logout(m_hLoginHandle); + if (bTemp){ + redisService.redisTemplate.opsForValue().getOperations().delete(camera.getIp() + "_m_hLoginHandle"); + log.info("登出成功"); + } + + // 7. 返回结果 + return imageBytes[0] != null ? new ByteArrayInputStream(imageBytes[0]) : null; } diff --git a/src/main/java/com/inspect/nvr/service/impl/HikVisionServiceImpl.java b/src/main/java/com/inspect/nvr/service/impl/HikVisionServiceImpl.java index 3543081..01bf954 100644 --- a/src/main/java/com/inspect/nvr/service/impl/HikVisionServiceImpl.java +++ b/src/main/java/com/inspect/nvr/service/impl/HikVisionServiceImpl.java @@ -195,7 +195,7 @@ public class HikVisionServiceImpl implements HikVisionService { // 2. 设置测温参数 HCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND cond = new HCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND(); cond.dwSize = cond.size(); - cond.dwChan = 2;// 通道号 + cond.dwChan = camera.getChannel();// 通道号 cond.byRuleID = 1; // 规则ID cond.byMode = 1; // 测温模式 cond.wInterval = 10; // 间隔 diff --git a/src/main/java/com/inspect/nvr/service/impl/IvsCameraServiceImpl.java b/src/main/java/com/inspect/nvr/service/impl/IvsCameraServiceImpl.java index e31483f..e397c18 100644 --- a/src/main/java/com/inspect/nvr/service/impl/IvsCameraServiceImpl.java +++ b/src/main/java/com/inspect/nvr/service/impl/IvsCameraServiceImpl.java @@ -78,7 +78,6 @@ public class IvsCameraServiceImpl implements IvsCameraService { .resultCode("0") .build(); } - Camera camera = new Camera(); //赋值 // camera.setIp("192.168.1.231"); @@ -87,7 +86,7 @@ public class IvsCameraServiceImpl implements IvsCameraService { // camera.setPassword("2016.h.BD"); // camera.setChannel(11); // camera.setPointNum(210); - + //目前写死的 nvr信息 cameraType=0海康 1大华 String ip = "192.168.1.231"; int port = 8000; int channel = 11; @@ -103,28 +102,27 @@ public class IvsCameraServiceImpl implements IvsCameraService { channel = Integer.parseInt(splitArray[2]); pointNum = Integer.parseInt(splitArray[3]); cameraType = Integer.parseInt(splitArray[4]); + username = splitArray[5]; + password = splitArray[6]; } - camera.setIp(ip); camera.setPort(port); - camera.setUserName(username); - camera.setPassword(password); camera.setChannel(channel); camera.setPointNum(pointNum); + camera.setUserName(username); + camera.setPassword(password); log.info("PTZ_CONTROL ip:" + ip + " port:" + port + "username:" + username + "password" + password + " channel:" + channel + " pointNum:" + pointNum); log.info("PTZ_CONTROL Type" + cameraType); - - + //大华预置位跳转 if (ObjectUtil.equals(cameraType, 1)) { log.info("开始登录大华摄像头 进行跳转预置位"); String ajaxResult = dahuaService.cameraControl(camera, 0, 0, 0); - PtzControlResult ptzControlResult = PtzControlResult.builder() .resultCode(ajaxResult) .build(); return ptzControlResult; } - + //海康预置位跳转 log.info("开始登录海康摄像头 进行跳转预置位"); lUserID = (Integer) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_userId"); if (ObjectUtil.isEmpty(lUserID)) { @@ -135,7 +133,6 @@ public class IvsCameraServiceImpl implements IvsCameraService { nvrInfo.setPassword(camera.getPassword()); login_V40(nvrInfo); lUserID = (Integer) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_userId"); - log.info("相机:lUserID" + camera.getIp() + "_userId" + lUserID); } @@ -144,16 +141,12 @@ public class IvsCameraServiceImpl implements IvsCameraService { boolean gotoPreset = hcNetSDK.NET_DVR_PTZPreset_Other(lUserID, camera.getChannel(), HCNetSDK.GOTO_PRESET, camera.getPointNum()); if (!gotoPreset) { log.error("海康-获取设备预置位跳转设备参数失败,错误码:" + hcNetSDK.NET_DVR_GetLastError()); - return PtzControlResult.builder() .resultCode("-1") .build(); - } else { log.info("海康-成功跳转到预置位!"); } - - PtzControlResult ptzControlResult = PtzControlResult.builder() .resultCode("0") .build(); @@ -164,7 +157,6 @@ public class IvsCameraServiceImpl implements IvsCameraService { //拍照 @Override public SnapshotCommandResult platformSnapshot(String cameraCode, String domainCode, SnapshotCommandParam param) { - SnapshotCommandResult snapshotCommandResult = SnapshotCommandResult.builder() .taskID(param.getCameraCode()) @@ -179,8 +171,6 @@ public class IvsCameraServiceImpl implements IvsCameraService { List infoList = new ArrayList<>(); final String rawString = String.join((":"), param.getAddress(), param.getUsername(), param.getPassword()); final String hexString = StringHexConverter.toHex(rawString); - - String[] addressArray = param.getAddress().split(":"); final String pictureUrl = "http://" + param.getHost() + ":" + param.getPort() + "/downloadfile?filesessionid=" + hexString; log.info("GET_SNAPSHOT_LIST rawString: {}, hexString: {}, pictureUrl: {}", rawString, hexString, pictureUrl); @@ -210,17 +200,15 @@ public class IvsCameraServiceImpl implements IvsCameraService { throw new RuntimeException("测试环境生成错误图片失败", e); } } - String[] cameraAddressInfos = rawString.split((":")); - if (cameraAddressInfos.length != 6) { - log.error("DOWNLOAD_FILE ADDRESS INFO ERROR rawString: {}", rawString); - try { - return new ByteArrayInputStream(loadDefaultImage()); - } catch (IOException e) { - throw new RuntimeException("测试环境生成错误图片失败2", e); - } - } - +// if (cameraAddressInfos.length != 7) { +// log.error("DOWNLOAD_FILE ADDRESS INFO ERROR rawString: {}", rawString); +// try { +// return new ByteArrayInputStream(loadDefaultImage()); +// } catch (IOException e) { +// throw new RuntimeException("测试环境生成错误图片失败2", e); +// } +// } // 从nvr或者camera下载图片, 开发中 Camera camera = new Camera(); //赋值 @@ -229,8 +217,7 @@ public class IvsCameraServiceImpl implements IvsCameraService { // camera.setUserName("admin"); // camera.setPassword("2016.h.BD"); // camera.setChannel(11); - - log.info("DOWNLOAD_FILE host: {}, port: {}, channel: {}, pointName: {}, username: {}, password: {}", + log.info("DOWNLOAD_FILE ip: {}, port: {}, channel: {}, pointName: {},cameraType: {}, username: {}, password: {}", cameraAddressInfos[0], cameraAddressInfos[1], cameraAddressInfos[2], @@ -245,17 +232,11 @@ public class IvsCameraServiceImpl implements IvsCameraService { camera.setCameraType(Integer.parseInt(cameraAddressInfos[4])); camera.setUserName(cameraAddressInfos[5]); camera.setPassword(cameraAddressInfos[6]); - - if (ObjectUtil.equals(camera.getCameraType(), 1)){ log.info("大华相机拍照"); ByteArrayInputStream picture = dahuaService.Picture(camera); - - + return picture; } - - - //从redis中获取lUserID(存在时间200) lUserID = (Integer) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_userId"); //判断lUserID是否为空 @@ -267,15 +248,12 @@ public class IvsCameraServiceImpl implements IvsCameraService { nvrInfo.setAccount(camera.getUserName()); nvrInfo.setPassword(camera.getPassword()); login_V40(nvrInfo); - lUserID = (Integer) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_userId"); } - HCNetSDK.NET_DVR_JPEGPARA dvrJpegpara = new HCNetSDK.NET_DVR_JPEGPARA(); dvrJpegpara.wPicSize = 3; dvrJpegpara.wPicQuality = 0; dvrJpegpara.write(); - // 2. 创建临时存储目录(系统临时目录更安全) Path tempDir = Paths.get(System.getProperty("java.io.tmpdir"), "hik_capture"); // 生成唯一文件名(IP+时间戳) @@ -285,7 +263,6 @@ public class IvsCameraServiceImpl implements IvsCameraService { if (!Files.exists(tempDir)) { Files.createDirectories(tempDir); } - boolean b = hcNetSDK.NET_DVR_CaptureJPEGPicture(lUserID, camera.getChannel(), dvrJpegpara, tempImagePath.toString().getBytes("GBK")); if (!b) { @@ -294,13 +271,9 @@ public class IvsCameraServiceImpl implements IvsCameraService { } //图片流 InputStream inputStream = Files.newInputStream(tempImagePath); - byte[] bytes = StreamUtils.copyToByteArray(inputStream); - - // 确保删除临时文件 Files.deleteIfExists(tempImagePath); - return new ByteArrayInputStream(bytes); } catch (Exception e) { log.error("抓图失败" + e.getMessage()); @@ -315,12 +288,9 @@ public class IvsCameraServiceImpl implements IvsCameraService { public AjaxResult login_V40(NvrInfo nvrInfo) { - - log.info("nvrIP: " + nvrInfo.getNvrIp() + "serverPort: " + nvrInfo.getServerPort() + "account: " + nvrInfo.getAccount() + "password: " + nvrInfo.getPassword()); HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = HikVisionUtils.login_V40(nvrInfo.getNvrIp(), nvrInfo.getServerPort().shortValue(), nvrInfo.getAccount(), nvrInfo.getPassword());//设备登录信息 HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息 - int lUserID = hcNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); log.info("登录返回lUserID:" + lUserID); if (lUserID == -1) { diff --git a/src/main/java/com/inspect/nvr/utils/StringHexConverter.java b/src/main/java/com/inspect/nvr/utils/StringHexConverter.java index be9569f..942b5cb 100644 --- a/src/main/java/com/inspect/nvr/utils/StringHexConverter.java +++ b/src/main/java/com/inspect/nvr/utils/StringHexConverter.java @@ -27,8 +27,16 @@ public class StringHexConverter { } public static void main(String[] args) { - final String rawString = "3139322e3136382e312e3233313a383030303a31313a3231303a61646d696e3a323031362e682e4244"; - final String hex = fromHex(rawString); - log.info(hex); +// final String rawString = "3139322e3136382e312e3233313a383030303a31313a3231303a61646d696e3a323031362e682e4244"; +// final String hex = fromHex(rawString); +// log.info(hex); + String rawString = "192.168.12.48:8000:33:1:0:admin:sshw1234"; + byte[] bytes = rawString.getBytes(StandardCharsets.UTF_8); + StringBuilder hex = new StringBuilder(); + for (byte b : bytes) { + hex.append(String.format("%02x", b)); + } + String fileSessionId = hex.toString(); + log.info(fileSessionId); } }