|
|
|
@ -18,6 +18,7 @@ import com.sun.jna.Pointer; |
|
|
|
import com.sun.jna.ptr.IntByReference; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.beans.factory.annotation.Value; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
import javax.annotation.Resource; |
|
|
|
@ -39,21 +40,24 @@ public class DahuaServiceImpl implements DahuaService { |
|
|
|
@Resource |
|
|
|
private RedisService redisService; |
|
|
|
|
|
|
|
private LLong m_hLoginHandle; |
|
|
|
// private LLong m_hLoginHandle; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private fSnapReceiveCB snapReceiveCB; |
|
|
|
|
|
|
|
private static final Object captureLock = new Object(); |
|
|
|
@Value("${mode.delayTime:3000}") |
|
|
|
private int delayTime; |
|
|
|
|
|
|
|
/** |
|
|
|
* 登录大华设备 |
|
|
|
* |
|
|
|
* @param nvrInfo |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public AjaxResult login(NvrInfo nvrInfo) { |
|
|
|
|
|
|
|
public LLong login(NvrInfo nvrInfo) { |
|
|
|
log.info("大华调用登录------------"); |
|
|
|
//入参 |
|
|
|
NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstInParam = new NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY(); |
|
|
|
// pstInParam.szIP=camera.getIp().getBytes(); |
|
|
|
@ -71,58 +75,62 @@ public class DahuaServiceImpl implements DahuaService { |
|
|
|
|
|
|
|
//调用登录接口 |
|
|
|
// NetSDKLib.LLong m_hLoginHandle=NetSDKLib.cki |
|
|
|
m_hLoginHandle = dhNetSDK.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam); |
|
|
|
LLong 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; |
|
|
|
// 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 m_hLoginHandle; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 获取红外温度信息 |
|
|
|
* |
|
|
|
* @param camera |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public TemperatureData StartRemote(Camera camera) { |
|
|
|
log.info("大华实时测温入口================================================="); |
|
|
|
Object storedObj = redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle"); |
|
|
|
// 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)) { |
|
|
|
log.info("大华摄像机登录 ip:{}",camera.getIp()); |
|
|
|
NvrInfo nvrInfo = new NvrInfo(); |
|
|
|
nvrInfo.setNvrIp(camera.getIp()); |
|
|
|
nvrInfo.setServerPort(camera.getPort()); |
|
|
|
nvrInfo.setAccount(camera.getUserName()); |
|
|
|
nvrInfo.setPassword(camera.getPassword()); |
|
|
|
login(nvrInfo); |
|
|
|
m_hLoginHandle = new NetSDKLib.LLong((Long) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle")); |
|
|
|
log.info("相机:m_hLoginHandle" + camera.getNvrip() + "m_hLoginHandle" + m_hLoginHandle); |
|
|
|
// if (StringUtils.isNotNull(storedObj)) { |
|
|
|
// Long storedValue = (Long) storedObj; |
|
|
|
// m_hLoginHandle = new NetSDKLib.LLong(storedValue); |
|
|
|
// } else { |
|
|
|
// //m_hLoginHandle为空 |
|
|
|
LLong m_hLoginHandle = null; |
|
|
|
// } |
|
|
|
// // 3. 安全转换并创建LLong对象 |
|
|
|
// if (ObjectUtil.isEmpty(m_hLoginHandle)) { |
|
|
|
log.info("大华摄像机登录 ip:{}", camera.getIp()); |
|
|
|
NvrInfo nvrInfo = new NvrInfo(); |
|
|
|
nvrInfo.setNvrIp(camera.getIp()); |
|
|
|
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")); |
|
|
|
if (StringUtils.isNull(m_hLoginHandle)) { |
|
|
|
return null; |
|
|
|
} |
|
|
|
log.info("相机:m_hLoginHandle" + camera.getNvrip() + "m_hLoginHandle" + m_hLoginHandle); |
|
|
|
// } |
|
|
|
|
|
|
|
// 1. 初始化输入结构体 |
|
|
|
log.info("开始实时测温================================================="); |
|
|
|
log.info("cameraip:{},PresetId:{}",camera.getIp(),camera.getPresetId()); |
|
|
|
log.info("cameraip:{},PresetId:{}", camera.getIp(), camera.getPresetId()); |
|
|
|
NetSDKLib.NET_IN_RADIOMETRY_GETTEMPER netIn = new NetSDKLib.NET_IN_RADIOMETRY_GETTEMPER(); |
|
|
|
// 设置条件参数 |
|
|
|
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()-1; |
|
|
|
netIn.stCondition.nChannel = camera.getChannel() - 1; |
|
|
|
|
|
|
|
|
|
|
|
log.info("[DEBUG] 结构体参数设置完成 - " + |
|
|
|
@ -168,24 +176,25 @@ public class DahuaServiceImpl implements DahuaService { |
|
|
|
netIn.stCondition.nRuleId |
|
|
|
); |
|
|
|
boolean b = dhNetSDK.CLIENT_Logout(m_hLoginHandle); |
|
|
|
if (b) { |
|
|
|
redisService.redisTemplate.opsForValue().getOperations().delete(camera.getIp() + "_m_hLoginHandle"); |
|
|
|
System.out.println("摄像机登出"); |
|
|
|
} |
|
|
|
// 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("摄像机登出"); |
|
|
|
} |
|
|
|
// if (b) { |
|
|
|
// redisService.redisTemplate.opsForValue().getOperations().delete(camera.getIp() + "_m_hLoginHandle"); |
|
|
|
System.out.println("摄像机登出"); |
|
|
|
// } |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 大华预置位跳转 |
|
|
|
* |
|
|
|
* @param camera |
|
|
|
* @param param1 |
|
|
|
* @param param2 |
|
|
|
@ -194,64 +203,74 @@ public class DahuaServiceImpl implements DahuaService { |
|
|
|
*/ |
|
|
|
@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()); |
|
|
|
nvrInfo.setServerPort(camera.getPort()); |
|
|
|
nvrInfo.setAccount(camera.getUserName()); |
|
|
|
nvrInfo.setPassword(camera.getPassword()); |
|
|
|
login(nvrInfo); |
|
|
|
m_hLoginHandle = new NetSDKLib.LLong((Long) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle")); |
|
|
|
log.info("相机:m_hLoginHandle" + camera.getIp() + "m_hLoginHandle" + m_hLoginHandle); |
|
|
|
} |
|
|
|
// 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为空 |
|
|
|
LLong m_hLoginHandle = null; |
|
|
|
// } |
|
|
|
// if (ObjectUtil.isEmpty(m_hLoginHandle)) { |
|
|
|
NvrInfo nvrInfo = new NvrInfo(); |
|
|
|
nvrInfo.setNvrIp(camera.getIp()); |
|
|
|
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")); |
|
|
|
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) { |
|
|
|
log.info("CLIENT_DHPTZControlEx Failed!!"+ToolKits.getErrorCodePrint(dhNetSDK.CLIENT_GetLastError())); |
|
|
|
return "-1"; |
|
|
|
log.info("CLIENT_DHPTZControlEx Failed!!" + ToolKits.getErrorCodePrint(dhNetSDK.CLIENT_GetLastError())); |
|
|
|
} else { |
|
|
|
log.info("CLIENT_DHPTZControlEx success"); |
|
|
|
return "0"; |
|
|
|
} |
|
|
|
try { |
|
|
|
Thread.sleep(delayTime); // 等待2秒后重试 |
|
|
|
} 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"; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 大华抓图 |
|
|
|
* |
|
|
|
* @param camera |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public ByteArrayInputStream Picture(Camera camera) { |
|
|
|
synchronized (captureLock) { |
|
|
|
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()); |
|
|
|
nvrInfo.setServerPort(camera.getPort()); |
|
|
|
nvrInfo.setAccount(camera.getUserName()); |
|
|
|
nvrInfo.setPassword(camera.getPassword()); |
|
|
|
login(nvrInfo); |
|
|
|
m_hLoginHandle = new NetSDKLib.LLong((Long) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_m_hLoginHandle")); |
|
|
|
log.info("相机:m_hLoginHandle" + camera.getIp() + "m_hLoginHandle" + m_hLoginHandle); |
|
|
|
} |
|
|
|
// 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为空 |
|
|
|
LLong m_hLoginHandle = null; |
|
|
|
// } |
|
|
|
// if (ObjectUtil.isEmpty(m_hLoginHandle)) { |
|
|
|
NvrInfo nvrInfo = new NvrInfo(); |
|
|
|
nvrInfo.setNvrIp(camera.getIp()); |
|
|
|
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")); |
|
|
|
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 |
|
|
|
@ -295,39 +314,40 @@ public class DahuaServiceImpl implements DahuaService { |
|
|
|
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(); // 如果目录不存在,创建它 |
|
|
|
} |
|
|
|
// 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"; |
|
|
|
// 生成文件名(例如:camera_ip + timestamp) |
|
|
|
String fileName = "D:\\pic\\" + camera.getIp() + "_" + System.currentTimeMillis() + ".jpg"; |
|
|
|
|
|
|
|
// 保存图片 |
|
|
|
FileOutputStream fos = new FileOutputStream(fileName); |
|
|
|
fos.write(imageBytes[0]); |
|
|
|
fos.close(); |
|
|
|
// 保存图片 |
|
|
|
FileOutputStream fos = new FileOutputStream(fileName); |
|
|
|
fos.write(imageBytes[0]); |
|
|
|
fos.close(); |
|
|
|
|
|
|
|
log.info("图片已保存至: " + fileName); |
|
|
|
} catch (IOException e) { |
|
|
|
log.error("保存图片失败", e); |
|
|
|
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"); |
|
|
|
} catch (InterruptedException e) { |
|
|
|
Thread.currentThread().interrupt(); |
|
|
|
log.error("等待图片回调被中断", e); |
|
|
|
return null; |
|
|
|
} finally { |
|
|
|
boolean bTemp = dhNetSDK.CLIENT_Logout(m_hLoginHandle); |
|
|
|
// if (bTemp) { |
|
|
|
// redisService.redisTemplate.opsForValue().getOperations().delete(camera.getIp() + "_m_hLoginHandle"); |
|
|
|
log.info("登出成功"); |
|
|
|
// } |
|
|
|
} |
|
|
|
return imageBytes[0] != null ? new ByteArrayInputStream(imageBytes[0]) : null; |
|
|
|
return imageBytes[0] != null ? new ByteArrayInputStream(imageBytes[0]) : null; |
|
|
|
} |
|
|
|
// 7. 返回结果 |
|
|
|
} |
|
|
|
|