package com.inspect.nvr.service.impl;
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
import com.inspect.nvr.domain.Infrared.Camera;
|
|
import com.inspect.nvr.domain.Infrared.NvrInfo;
|
|
import com.inspect.nvr.domain.device.*;
|
|
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.IvsCameraService;
|
|
import com.inspect.nvr.utils.DateUtils;
|
|
import com.inspect.nvr.utils.redis.RedisService;
|
|
import com.sun.jna.ptr.IntByReference;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.core.io.ClassPathResource;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.util.StreamUtils;
|
|
|
|
import javax.annotation.Resource;
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
import java.nio.file.Paths;
|
|
import java.nio.file.StandardCopyOption;
|
|
import java.util.ArrayList;
|
|
import java.util.Date;
|
|
import java.util.List;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
@Service
|
|
public class IvsCameraServiceImpl implements IvsCameraService {
|
|
private final Logger log = LoggerFactory.getLogger(this.getClass());
|
|
|
|
@Value("${test-mode:false}")
|
|
private boolean testMode;
|
|
|
|
@Resource
|
|
private RedisService redisService;
|
|
|
|
private Integer lUserID;
|
|
|
|
@Autowired
|
|
private HCNetSDK hcNetSDK;
|
|
|
|
//跳转预置位
|
|
@Override
|
|
public PtzControlResult ptzControl(PtzControlParam param) {
|
|
if(testMode) {
|
|
return PtzControlResult.builder()
|
|
.resultCode("0")
|
|
.build();
|
|
}
|
|
|
|
Camera camera = new Camera();
|
|
//赋值
|
|
camera.setIp("192.168.1.231");
|
|
camera.setPort(8000);
|
|
camera.setUserName("admin");
|
|
camera.setPassword("2016.h.BD");
|
|
camera.setChannel(4);
|
|
camera.setPointNum(5);
|
|
|
|
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");
|
|
}
|
|
|
|
|
|
//参数:登录令牌,通道号,预置位跳转,跳转的预置位码
|
|
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();
|
|
return ptzControlResult;
|
|
}
|
|
|
|
//拍照
|
|
@Override
|
|
public SnapshotCommandResult platformSnapshot(String cameraCode, String domainCode, SnapshotCommandParam param) {
|
|
|
|
SnapshotCommandResult snapshotCommandResult =
|
|
SnapshotCommandResult.builder()
|
|
.taskID(param.getCameraCode())
|
|
.resultCode("0")
|
|
.build();
|
|
return snapshotCommandResult;
|
|
}
|
|
|
|
@Override
|
|
public SnapshotInfoListResult getSnapshotList(SnapshotInfoListParam param) {
|
|
SnapshotInfoListResult.SnapshotInfoList snapshotInfoList = new SnapshotInfoListResult.SnapshotInfoList();
|
|
List<SnapshotInfoListResult.SnapshotInfo> infoList = new ArrayList<>();
|
|
infoList.add(
|
|
SnapshotInfoListResult.SnapshotInfo.builder()
|
|
.pictureUrl("http://192.168.1.172:18539/downloadfile?filesessionid=" + param.getTaskID())
|
|
.cameraCode(param.getCameraCode())
|
|
.build());
|
|
snapshotInfoList.setTotal(1);
|
|
snapshotInfoList.setSnapshotInfos(infoList);
|
|
SnapshotInfoListResult snapshotInfoListResult =
|
|
SnapshotInfoListResult.builder()
|
|
.resultCode("0")
|
|
.snapshotInfoList(snapshotInfoList)
|
|
.build();
|
|
return snapshotInfoListResult;
|
|
}
|
|
|
|
@Override
|
|
public ByteArrayInputStream downloadFile(String fileSessionId) {
|
|
if (testMode) {
|
|
try {
|
|
return new ByteArrayInputStream(loadDefaultImage());
|
|
} catch (IOException e) {
|
|
throw new RuntimeException("测试环境生成错误图片失败", e);
|
|
}
|
|
}
|
|
|
|
// 从nvr或者camera下载图片, 开发中
|
|
Camera camera = new Camera();
|
|
//赋值
|
|
camera.setIp("192.168.1.195");
|
|
camera.setPort(8000);
|
|
camera.setUserName("admin");
|
|
camera.setPassword("htjc2018");
|
|
camera.setChannel(2);
|
|
|
|
//从redis中获取lUserID(存在时间200)
|
|
lUserID = (Integer) redisService.redisTemplate.opsForValue().get(camera.getIp() + "_userId");
|
|
//判断lUserID是否为空
|
|
if (ObjectUtil.isEmpty(lUserID)) {
|
|
//重新登录获取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");
|
|
}
|
|
|
|
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+时间戳)
|
|
String fileName = String.format("%s_%s.jpg", camera.getIp(), DateUtils.dateTimeNow("yyyyMMddHHmmss"));
|
|
Path tempImagePath = tempDir.resolve(fileName);
|
|
try {
|
|
if (!Files.exists(tempDir)) {
|
|
Files.createDirectories(tempDir);
|
|
}
|
|
|
|
boolean b = hcNetSDK.NET_DVR_CaptureJPEGPicture(lUserID, camera.getChannel(), dvrJpegpara,
|
|
tempImagePath.toString().getBytes("GBK"));
|
|
if (!b) {
|
|
// System.out.println("设置设备进行抓图失败,错误码:" + hcNetSDK.NET_DVR_GetLastError());
|
|
log.error("设置设备进行抓图失败,错误码:" + hcNetSDK.NET_DVR_GetLastError());
|
|
}
|
|
//图片流
|
|
InputStream inputStream = Files.newInputStream(tempImagePath);
|
|
|
|
byte[] bytes = StreamUtils.copyToByteArray(inputStream);
|
|
|
|
|
|
|
|
|
|
// 确保删除临时文件
|
|
Files.deleteIfExists(tempImagePath);
|
|
|
|
return new ByteArrayInputStream(bytes);
|
|
} catch (Exception e) {
|
|
log.error("抓图失败" + e.getMessage());
|
|
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) {
|
|
|
|
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);
|
|
if (lUserID == -1) {
|
|
System.out.println("登录失败,错误码为" + hcNetSDK.NET_DVR_GetLastError());
|
|
return AjaxResult.error(hcNetSDK.NET_DVR_GetErrorMsg(new IntByReference(hcNetSDK.NET_DVR_GetLastError())));
|
|
} else {
|
|
System.out.println(":设备登录成功!" + lUserID);
|
|
// birdNvrMapper.updateNvrInfo(nvrInfo);
|
|
// redisTemplate.opsForValue().set(nvrInfo.getNvrIp() + "_userId", lUserID);
|
|
redisService.setCacheObject(nvrInfo.getNvrIp() + "_userId", lUserID, 200L, TimeUnit.SECONDS);
|
|
//若果设备序列号为空时,即为第一次登陆,写入基础数据
|
|
if (nvrInfo.getNvrSerial() == null || nvrInfo.getNvrSerial().equals("")) {
|
|
m_strDeviceInfo.read();
|
|
HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceinfo_v30 = m_strDeviceInfo.struDeviceV30;
|
|
nvrInfo.setNvrSerial(StringUtils.bytetoString(deviceinfo_v30.sSerialNumber, "GB2312"));
|
|
//模拟通道不为0,并且数字通道为0,即为模拟通道
|
|
if (deviceinfo_v30.byChanNum != 0 && deviceinfo_v30.byIPChanNum == 0) {
|
|
nvrInfo.setChannelType(0);
|
|
nvrInfo.setChannelNumber(deviceinfo_v30.byChanNum + deviceinfo_v30.byHighDChanNum * 256);
|
|
nvrInfo.setStartChannel((int) deviceinfo_v30.byStartChan);
|
|
}
|
|
//模拟通道为0,并且数字通道不为0,即为数字通道
|
|
if (deviceinfo_v30.byChanNum == 0 && deviceinfo_v30.byIPChanNum != 0) {
|
|
nvrInfo.setChannelType(1);
|
|
nvrInfo.setChannelNumber(deviceinfo_v30.byIPChanNum + deviceinfo_v30.byHighDChanNum * 256);
|
|
nvrInfo.setStartChannel((int) deviceinfo_v30.byStartDChan);
|
|
}
|
|
//模拟通道不为0,并且数字通道不为0,即为双通道。
|
|
if (deviceinfo_v30.byChanNum != 0 && deviceinfo_v30.byIPChanNum != 0) {
|
|
nvrInfo.setChannelType(2);
|
|
nvrInfo.setChannelNumber(deviceinfo_v30.byChanNum + deviceinfo_v30.byHighDChanNum * 256);
|
|
nvrInfo.setStartChannel((int) deviceinfo_v30.byStartChan);
|
|
}
|
|
nvrInfo.setCalicheNumber((int) deviceinfo_v30.byDiskNum);
|
|
nvrInfo.setCharEncodeType((int) m_strDeviceInfo.byCharEncodeType);
|
|
nvrInfo.setSyncDate(new Date());
|
|
// nvrInfoMapper.updateNvrInfo(nvrInfo);
|
|
}
|
|
return AjaxResult.success(hcNetSDK.NET_DVR_GetErrorMsg(new IntByReference(hcNetSDK.NET_DVR_GetLastError())));
|
|
}
|
|
}
|
|
}
|