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