From 56955ef26b0b4dd3cebe46bc066c7bb7dfe1813b Mon Sep 17 00:00:00 2001 From: yinhuaiwei Date: Wed, 17 Dec 2025 17:05:22 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B5=B7=E5=BA=B7/=E5=A4=A7=E5=8D=8E?= =?UTF-8?q?=E8=B0=83=E8=BD=AC=E9=A2=84=E7=BD=AE=E4=BD=8D=E3=80=81=E6=B5=8B?= =?UTF-8?q?=E6=B8=A9=E3=80=81=E6=8A=93=E6=8B=8D=E7=9A=84=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=8F=A5=E6=9F=84=E7=BB=9F=E4=B8=80=E7=AE=A1=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=99=BB=E5=BD=95=E4=B8=8A=E9=99=90=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nvr/controller/IvsCameraController.java | 29 ++++- .../hikVision/utils/jna/HikVisionUtils.java | 2 +- .../nvr/service/HikCaptureService.java | 1 - .../inspect/nvr/service/IvsCameraService.java | 4 + .../nvr/service/impl/DahuaServiceImpl.java | 29 +---- .../service/impl/HikVisionServiceImpl.java | 26 ++-- .../service/impl/IvsCameraServiceImpl.java | 111 +++++++++++++----- 7 files changed, 128 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/inspect/nvr/controller/IvsCameraController.java b/src/main/java/com/inspect/nvr/controller/IvsCameraController.java index d1205e5..991e8a7 100644 --- a/src/main/java/com/inspect/nvr/controller/IvsCameraController.java +++ b/src/main/java/com/inspect/nvr/controller/IvsCameraController.java @@ -1,6 +1,6 @@ package com.inspect.nvr.controller; -import com.inspect.nvr.domain.Infrared.TemperatureData; +import com.inspect.nvr.aop.TimeTrace; import com.inspect.nvr.domain.device.*; import com.inspect.nvr.service.IvsCameraService; import com.inspect.nvr.utils.StringUtils; @@ -11,8 +11,6 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.io.ByteArrayInputStream; -import java.util.ArrayList; -import java.util.List; @Slf4j @RestController @@ -60,7 +58,12 @@ public class IvsCameraController { .body(ivsCameraService.getSnapshotList(param)); } - @GetMapping("/downloadfile") + /** + * @deprecated + * use {@link #capture} instead. + */ + @Deprecated + @GetMapping("/downloadfile_old") public ResponseEntity downloadFile(@RequestParam("filesessionid") String fileSessionId) { // synchronized (captureLock_pic) { log.info("Download File Get Stream, fileSessionId: {}", fileSessionId); @@ -89,4 +92,22 @@ public class IvsCameraController { .body(new InputStreamResource(byteArrayInputStream)); // } } + + @TimeTrace + @GetMapping("/downloadfile") + public ResponseEntity capture(@RequestParam("filesessionid") String fileSessionId) { + ByteArrayInputStream byteArrayInputStream = ivsCameraService.capture(fileSessionId); + return ResponseEntity.ok().body(new InputStreamResource(byteArrayInputStream)); + } + + @TimeTrace + @GetMapping("/digest") + public ResponseEntity rtsp(@RequestParam("filesessionid") String fileSessionId) { + byte[] bytes = ivsCameraService.captureDigest(fileSessionId); + if (bytes == null || bytes.length == 0) { + return ResponseEntity.ok().body("Not OK"); + } + return ResponseEntity.ok().body("OK"); + } + } diff --git a/src/main/java/com/inspect/nvr/hikVision/utils/jna/HikVisionUtils.java b/src/main/java/com/inspect/nvr/hikVision/utils/jna/HikVisionUtils.java index ee79190..9f3d9fe 100644 --- a/src/main/java/com/inspect/nvr/hikVision/utils/jna/HikVisionUtils.java +++ b/src/main/java/com/inspect/nvr/hikVision/utils/jna/HikVisionUtils.java @@ -83,7 +83,7 @@ public class HikVisionUtils { m_strLoginInfo.wPort = port; m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是 m_strLoginInfo.write(); - log.info("海康相机登录成功"); + log.info("海康相机登录"); return m_strLoginInfo; } diff --git a/src/main/java/com/inspect/nvr/service/HikCaptureService.java b/src/main/java/com/inspect/nvr/service/HikCaptureService.java index 1709cf7..ac57d22 100644 --- a/src/main/java/com/inspect/nvr/service/HikCaptureService.java +++ b/src/main/java/com/inspect/nvr/service/HikCaptureService.java @@ -101,7 +101,6 @@ public class HikCaptureService extends BaseCaptureService { /** * 旧版抓图,备用 */ - @Deprecated private byte[] captureJPEGPicture(NvrInfo nvrInfo, int channel, Path fullPath) throws Exception { int userId = hikLoginService.login(nvrInfo); // 兼容 C/C++ 编写的本地库, C 语言用 \0 标记字符串结束 diff --git a/src/main/java/com/inspect/nvr/service/IvsCameraService.java b/src/main/java/com/inspect/nvr/service/IvsCameraService.java index 5b05471..9a82060 100644 --- a/src/main/java/com/inspect/nvr/service/IvsCameraService.java +++ b/src/main/java/com/inspect/nvr/service/IvsCameraService.java @@ -18,4 +18,8 @@ public interface IvsCameraService { SnapshotInfoListResult getSnapshotList(SnapshotInfoListParam param); ByteArrayInputStream downloadFile(String fileSessionId); + + ByteArrayInputStream capture(String fileSessionId); + + byte[] captureDigest(String fileSessionId); } 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 cc24244..640d0ca 100644 --- a/src/main/java/com/inspect/nvr/service/impl/DahuaServiceImpl.java +++ b/src/main/java/com/inspect/nvr/service/impl/DahuaServiceImpl.java @@ -1,7 +1,5 @@ package com.inspect.nvr.service.impl; - -import cn.hutool.core.util.ObjectUtil; import com.inspect.nvr.daHuaCarme.callback.fSnapReceiveCB; import com.inspect.nvr.daHuaCarme.jna.NetSDKLib; import com.inspect.nvr.daHuaCarme.jna.NetSDKLib.LLong; @@ -10,7 +8,7 @@ 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.DahuaLoginService; import com.inspect.nvr.service.DahuaService; import com.inspect.nvr.utils.StringUtils; import com.inspect.nvr.utils.redis.RedisService; @@ -22,7 +20,6 @@ import org.springframework.beans.factory.annotation.Value; 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; @@ -33,8 +30,6 @@ import java.util.concurrent.TimeUnit; @Slf4j @Service public class DahuaServiceImpl implements DahuaService { - - @Autowired private NetSDKLib dhNetSDK; @Resource @@ -48,6 +43,8 @@ public class DahuaServiceImpl implements DahuaService { private static final Object captureLock = new Object(); @Value("${mode.delayTime:3000}") private int delayTime; + @Autowired + private DahuaLoginService dahuaLoginService; /** * 登录大华设备 @@ -114,7 +111,7 @@ public class DahuaServiceImpl implements DahuaService { nvrInfo.setServerPort(camera.getPort()); nvrInfo.setAccount(camera.getUserName()); nvrInfo.setPassword(camera.getPassword()); - m_hLoginHandle = login(nvrInfo); + m_hLoginHandle = dahuaLoginService.login(nvrInfo); // m_hLoginHandle = new NetSDKLib.LLong((Long) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle")); if (StringUtils.isNull(m_hLoginHandle)) { return null; @@ -175,19 +172,9 @@ public class DahuaServiceImpl implements DahuaService { netIn.stCondition.nPresetId, netIn.stCondition.nRuleId ); - boolean b = dhNetSDK.CLIENT_Logout(m_hLoginHandle); -// if (b) { -// redisService.redisTemplate.opsForValue().getOperations().delete(camera.getIp() + "_m_hLoginHandle"); - System.out.println("摄像机登出"); -// } return data; } System.out.println("大华-获取设备参数失败,错误码:" + ToolKits.getErrorCodePrint(dhNetSDK.CLIENT_GetLastError())); - boolean b = dhNetSDK.CLIENT_Logout(m_hLoginHandle); -// if (b) { -// redisService.redisTemplate.opsForValue().getOperations().delete(camera.getIp() + "_m_hLoginHandle"); - System.out.println("摄像机登出"); -// } return null; } @@ -218,8 +205,7 @@ public class DahuaServiceImpl implements DahuaService { nvrInfo.setServerPort(camera.getPort()); nvrInfo.setAccount(camera.getUserName()); nvrInfo.setPassword(camera.getPassword()); - m_hLoginHandle = login(nvrInfo); -// m_hLoginHandle = new NetSDKLib.LLong((Long) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle")); + m_hLoginHandle = dahuaLoginService.login(nvrInfo); log.info("相机:m_hLoginHandle" + camera.getIp() + "m_hLoginHandle" + m_hLoginHandle); // } String ctr = "GOTO_PRESET"; @@ -234,11 +220,6 @@ public class DahuaServiceImpl implements DahuaService { } catch (InterruptedException e) { throw new RuntimeException(e); } - boolean bTemp = dhNetSDK.CLIENT_Logout(m_hLoginHandle); -// if (bTemp) { -// redisService.redisTemplate.opsForValue().getOperations().delete(camera.getIp() + "_m_hLoginHandle"); - log.info("登出成功"); -// } return "0"; } 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 9225a4d..140c9da 100644 --- a/src/main/java/com/inspect/nvr/service/impl/HikVisionServiceImpl.java +++ b/src/main/java/com/inspect/nvr/service/impl/HikVisionServiceImpl.java @@ -18,6 +18,7 @@ import com.inspect.nvr.hikVision.utils.StringUtils; import com.inspect.nvr.hikVision.utils.jna.HCNetSDK; import com.inspect.nvr.hikVision.utils.jna.HikVisionUtils; import com.inspect.nvr.service.HikFRemoteConfigCallBack_imp; +import com.inspect.nvr.service.HikLoginService; import com.inspect.nvr.service.HikVisionService; import com.inspect.nvr.tempCount.TempCount; import com.inspect.nvr.utils.DateUtils; @@ -118,6 +119,8 @@ public class HikVisionServiceImpl implements HikVisionService { public AjaxResult login(NvrInfo nvrInfo) { return login_V40(nvrInfo); } + @Autowired + private HikLoginService hikLoginService; /** @@ -179,18 +182,13 @@ public class HikVisionServiceImpl implements HikVisionService { log.info("实时测温入口================================================="); if (camera.getLUserID() != 0) { - log.info("海康摄像机登录 ip:{}", camera.getIp()); - // 1. 登录设备 - HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = HikVisionUtils.login_V40(camera.getIp(), (short) camera.getPort(), camera.getUserName(), camera.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); - - if (lUserID == -1) { - int errorCode = hcNetSDK.NET_DVR_GetLastError(); - String errorMsg = hcNetSDK.NET_DVR_GetErrorMsg(new IntByReference(errorCode)); - log.error("登录设备失败,错误码为:{},错误信息为:{}", errorCode, errorMsg); - } - camera.setLUserID(lUserID); + NvrInfo nvrInfo = new NvrInfo(); + nvrInfo.setNvrIp(camera.getIp()); + nvrInfo.setServerPort(camera.getPort()); + nvrInfo.setAccount(camera.getUserName()); + nvrInfo.setPassword(camera.getPassword()); + int userId = hikLoginService.login(nvrInfo); + camera.setLUserID(userId); } log.info("开始实时测温================================================="); @@ -218,7 +216,7 @@ public class HikVisionServiceImpl implements HikVisionService { int dwInBufferSize = cond.size(); result = hcNetSDK.NET_DVR_StartRemoteConfig( camera.getLUserID(), - hcNetSDK.NET_DVR_GET_REALTIME_THERMOMETRY, + HCNetSDK.NET_DVR_GET_REALTIME_THERMOMETRY, lpInBuffer, dwInBufferSize, new HikFRemoteConfigCallBack_imp() { @@ -264,7 +262,7 @@ public class HikVisionServiceImpl implements HikVisionService { } temperatureData = temperatureFuture.get(); } catch (Exception e) { - log.error("测温异常报错"); + log.error("测温异常报错: {}", e.getMessage()); } finally { log.info("关闭实时测温result值 {}", result); //关闭实时测温 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 b331a9b..c8e9d0e 100644 --- a/src/main/java/com/inspect/nvr/service/impl/IvsCameraServiceImpl.java +++ b/src/main/java/com/inspect/nvr/service/impl/IvsCameraServiceImpl.java @@ -1,7 +1,6 @@ package com.inspect.nvr.service.impl; import cn.hutool.core.util.ObjectUtil; -import com.fasterxml.jackson.databind.ObjectMapper; import com.inspect.nvr.controller.CameraController; import com.inspect.nvr.domain.Infrared.Camera; import com.inspect.nvr.domain.Infrared.NvrInfo; @@ -11,9 +10,7 @@ import com.inspect.nvr.hikVision.utils.AjaxResult; import com.inspect.nvr.hikVision.utils.StringUtils; import com.inspect.nvr.hikVision.utils.jna.HCNetSDK; import com.inspect.nvr.hikVision.utils.jna.HikVisionUtils; -import com.inspect.nvr.service.DahuaService; -import com.inspect.nvr.service.IvsCameraService; -import com.inspect.nvr.utils.DateUtils; +import com.inspect.nvr.service.*; import com.inspect.nvr.utils.StringHexConverter; import com.inspect.nvr.utils.redis.RedisService; import com.sun.jna.ptr.IntByReference; @@ -32,38 +29,37 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; -import java.util.concurrent.CountDownLatch; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; import java.util.concurrent.TimeUnit; @Slf4j @Service public class IvsCameraServiceImpl implements IvsCameraService { - @Value("${test-mode:false}") private boolean testMode; - @Value("${mode.retryTimes:3}") private int retryTimes; - @Value("${mode.delayTime:3000}") private int delayTime; - @Value("${mode.retryMode:0}") private int retryMode; - @Resource private RedisService redisService; - private Integer lUserID; - @Autowired private HCNetSDK hcNetSDK; - @Autowired private DahuaService dahuaService; @Autowired private CameraController cameraController; + @Autowired + private HikCaptureService hikCaptureService; + @Autowired + private DahuaCaptureService dhCaptureService; + @Autowired + private HikLoginService hikLoginService; @Override public IvsPresetListView ptzPresetList(String cameraCode, String domainCode) { @@ -147,20 +143,14 @@ public class IvsCameraServiceImpl implements IvsCameraService { dahuaService.cameraControl(camera, 0, 0, 0); } else { //海康预置位跳转 - log.info("开始登录海康NVR 进行跳转预置位"); - lUserID = (Integer) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_userId"); - if (ObjectUtil.isEmpty(lUserID)) { - NvrInfo nvrInfo = new NvrInfo(); - nvrInfo.setNvrIp(camera.getIp()); - nvrInfo.setServerPort(camera.getPort()); - nvrInfo.setAccount(camera.getUserName()); - nvrInfo.setPassword(camera.getPassword()); - login_V40(nvrInfo); - lUserID = (Integer) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_userId"); - log.info("相机:lUserID" + camera.getIp() + "_userId" + lUserID); - } + NvrInfo nvrInfo = new NvrInfo(); + nvrInfo.setNvrIp(camera.getIp()); + nvrInfo.setServerPort(camera.getPort()); + nvrInfo.setAccount(camera.getUserName()); + nvrInfo.setPassword(camera.getPassword()); + int userId = hikLoginService.login(nvrInfo); //参数:登录令牌,通道号,预置位跳转,跳转的预置位码 - boolean gotoPreset = hcNetSDK.NET_DVR_PTZPreset_Other(lUserID, camera.getChannel(), HCNetSDK.GOTO_PRESET, camera.getPointNum()); + boolean gotoPreset = hcNetSDK.NET_DVR_PTZPreset_Other(userId, camera.getChannel(), HCNetSDK.GOTO_PRESET, camera.getPointNum()); if (!gotoPreset) { log.error("海康-获取设备预置位跳转设备参数失败,错误码:" + hcNetSDK.NET_DVR_GetLastError()); } else { @@ -334,13 +324,11 @@ public class IvsCameraServiceImpl implements IvsCameraService { return null; } - public byte[] loadDefaultImage() throws IOException { ClassPathResource imgFile = new ClassPathResource("images/infrared_default.jpg"); return StreamUtils.copyToByteArray(imgFile.getInputStream()); } - 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());//设备登录信息 @@ -386,5 +374,68 @@ public class IvsCameraServiceImpl implements IvsCameraService { return AjaxResult.success(hcNetSDK.NET_DVR_GetErrorMsg(new IntByReference(hcNetSDK.NET_DVR_GetLastError()))); } } -} + @Override + public ByteArrayInputStream capture(String fileSessionId) { + final String rawString = StringHexConverter.fromHex(fileSessionId); + log.info("downloadImage hexString: {}, rawString: {}", fileSessionId, rawString); + String[] cameraAddressInfos = rawString.split((":")); + log.info("doCapture ip: {}, port: {}, channel: {}, pointName: {},cameraType: {}, username: {}, password: {}", cameraAddressInfos[0], cameraAddressInfos[1], cameraAddressInfos[2], cameraAddressInfos[3], cameraAddressInfos[4], cameraAddressInfos[5], cameraAddressInfos[6]); + Camera camera = new Camera(); + camera.setIp(cameraAddressInfos[0]); + camera.setPort(Integer.parseInt(cameraAddressInfos[1])); + camera.setChannel(Integer.parseInt(cameraAddressInfos[2])); + camera.setPointNum(Integer.parseInt(cameraAddressInfos[3])); + camera.setCameraType(Integer.parseInt(cameraAddressInfos[4])); + camera.setUserName(cameraAddressInfos[5]); + camera.setPassword(cameraAddressInfos[6]); + + NvrInfo nvrInfo = new NvrInfo(); + nvrInfo.setNvrIp(camera.getIp()); + nvrInfo.setServerPort(camera.getPort()); + nvrInfo.setAccount(camera.getUserName()); + nvrInfo.setPassword(camera.getPassword()); + + if (ObjectUtil.equals(camera.getCameraType(), 1)) { + log.info("大华相机拍照"); + byte[] bytes = dhCaptureService.capture(nvrInfo, camera.getChannel()); + return new ByteArrayInputStream(bytes); + } else { + log.info("海康相机拍照"); + byte[] bytes = hikCaptureService.capture(nvrInfo, camera.getChannel()); + return new ByteArrayInputStream(bytes); + } + } + + @Override + public byte[] captureDigest(String fileSessionId) { + final String rawString = StringHexConverter.fromHex(fileSessionId); + log.info("downloadImage hexString: {}, rawString: {}", fileSessionId, rawString); + String[] cameraAddressInfos = rawString.split((":")); + log.info("doCapture ip: {}, port: {}, channel: {}, pointName: {},cameraType: {}, username: {}, password: {}", cameraAddressInfos[0], cameraAddressInfos[1], cameraAddressInfos[2], cameraAddressInfos[3], cameraAddressInfos[4], cameraAddressInfos[5], cameraAddressInfos[6]); + Camera camera = new Camera(); + camera.setIp(cameraAddressInfos[0]); + camera.setPort(Integer.parseInt(cameraAddressInfos[1])); + camera.setChannel(Integer.parseInt(cameraAddressInfos[2])); + camera.setPointNum(Integer.parseInt(cameraAddressInfos[3])); + camera.setCameraType(Integer.parseInt(cameraAddressInfos[4])); + camera.setUserName(cameraAddressInfos[5]); + camera.setPassword(cameraAddressInfos[6]); + + NvrInfo nvrInfo = new NvrInfo(); + nvrInfo.setNvrIp(camera.getIp()); + nvrInfo.setServerPort(camera.getPort()); + nvrInfo.setAccount(camera.getUserName()); + nvrInfo.setPassword(camera.getPassword()); + + if (ObjectUtil.equals(camera.getCameraType(), 1)) { + log.info("大华相机拍照"); + byte[] bytes = dhCaptureService.captureDigest(nvrInfo, camera.getChannel()); + return bytes; + } else { + log.info("海康相机拍照"); + byte[] bytes = hikCaptureService.captureDigest(nvrInfo, camera.getChannel()); + return bytes; + } + } +}