Browse Source

大华红外测温完善

master
王寅 4 months ago
parent
commit
f8bfa797dc
12 changed files with 261 additions and 113 deletions
  1. +33
    -4
      sdkLog/SdkLog_1_W.log
  2. +7
    -0
      src/main/java/com/inspect/nvr/config/HikLibConfig.java
  3. +10
    -1
      src/main/java/com/inspect/nvr/controller/CameraController.java
  4. +9
    -3
      src/main/java/com/inspect/nvr/controller/DahuaController.java
  5. +2
    -1
      src/main/java/com/inspect/nvr/daHuaCarme/callback/fSnapReceiveCB.java
  6. +1
    -1
      src/main/java/com/inspect/nvr/domain/Infrared/Camera.java
  7. +15
    -0
      src/main/java/com/inspect/nvr/hikVision/utils/jna/HikLibConfig.java
  8. +3
    -2
      src/main/java/com/inspect/nvr/service/DahuaService.java
  9. +152
    -50
      src/main/java/com/inspect/nvr/service/impl/DahuaServiceImpl.java
  10. +1
    -1
      src/main/java/com/inspect/nvr/service/impl/HikVisionServiceImpl.java
  11. +17
    -47
      src/main/java/com/inspect/nvr/service/impl/IvsCameraServiceImpl.java
  12. +11
    -3
      src/main/java/com/inspect/nvr/utils/StringHexConverter.java

+ 33
- 4
sdkLog/SdkLog_1_W.log View File

@ -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

+ 7
- 0
src/main/java/com/inspect/nvr/config/HikLibConfig.java View File

@ -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);


+ 10
- 1
src/main/java/com/inspect/nvr/controller/CameraController.java View File

@ -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);
}


+ 9
- 3
src/main/java/com/inspect/nvr/controller/DahuaController.java View File

@ -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<InputStreamResource> Picture(@RequestBody Camera camera) {
return ResponseEntity
.ok()
.body(new InputStreamResource(dahuaService.Picture(camera)));
// return dahuaService.Picture(camera);
}


+ 2
- 1
src/main/java/com/inspect/nvr/daHuaCarme/callback/fSnapReceiveCB.java View File

@ -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);
}
}
}

+ 1
- 1
src/main/java/com/inspect/nvr/domain/Infrared/Camera.java View File

@ -47,5 +47,5 @@ public class Camera {
*/
private int cameraType;
private int presetId;
}

+ 15
- 0
src/main/java/com/inspect/nvr/hikVision/utils/jna/HikLibConfig.java View File

@ -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);


+ 3
- 2
src/main/java/com/inspect/nvr/service/DahuaService.java View File

@ -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) ;
}

+ 152
- 50
src/main/java/com/inspect/nvr/service/impl/DahuaServiceImpl.java View File

@ -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;
}


+ 1
- 1
src/main/java/com/inspect/nvr/service/impl/HikVisionServiceImpl.java View File

@ -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; // 间隔


+ 17
- 47
src/main/java/com/inspect/nvr/service/impl/IvsCameraServiceImpl.java View File

@ -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<SnapshotInfoListResult.SnapshotInfo> 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) {


+ 11
- 3
src/main/java/com/inspect/nvr/utils/StringHexConverter.java View File

@ -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);
}
}

Loading…
Cancel
Save