From 08b6a55a3a111aaee9842999b85afa60b6d61dc3 Mon Sep 17 00:00:00 2001 From: houzhongjian <houzhongyi@126.com> Date: 星期四, 14 十一月 2024 15:29:38 +0800 Subject: [PATCH] 大华及海康摄像头截图功能开发 --- iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/HIKDevice.java | 330 +++++++++++++++++++++++++----------------------------- 1 files changed, 155 insertions(+), 175 deletions(-) diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/HIKDevice.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/HIKDevice.java index 06a5fd4..df8e685 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/HIKDevice.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/HIKDevice.java @@ -1,5 +1,9 @@ package com.iailab.module.data.video.hikvision.utils; +import com.alibaba.fastjson.JSONException; +import com.iailab.module.data.video.config.VideoConfiguration; +import com.iailab.module.data.video.dto.CameraDTO; +import com.iailab.module.data.video.enums.CameraStatusEnum; import com.sun.jna.Native; import com.sun.jna.NativeLong; import com.sun.jna.Platform; @@ -8,41 +12,43 @@ import javax.annotation.PreDestroy; import java.io.File; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; @Slf4j @Component public class HIKDevice { - // 接口的实例,通过接口实例调用外部dll/so的函数 - public static HCNetSDK hCNetSDK = null; + // 接口的实例,通过接口实例调用外部dll/so的函数 + public static HCNetSDK hCNetSDK = null; // 用户登录返回句柄 - public static int lUserID; + public static int lUserID; + //构造函数 - public HIKDevice(){ - if (hCNetSDK == null) { + public HIKDevice() { + if (hCNetSDK == null) { synchronized (HCNetSDK.class) { try { - if (Platform.isWindows()) { - hCNetSDK = (HCNetSDK) Native.loadLibrary(MessageCode.HIK_WIN_PATH, HCNetSDK.class); - } - if (Platform.isLinux()) { - hCNetSDK = (HCNetSDK) Native.loadLibrary(MessageCode.HIK_LINUX_PATH, HCNetSDK.class); - } + if (Platform.isWindows()) { + hCNetSDK = (HCNetSDK) Native.loadLibrary(MessageCode.HIK_WIN_PATH, HCNetSDK.class); + } + if (Platform.isLinux()) { + hCNetSDK = (HCNetSDK) Native.loadLibrary(MessageCode.HIK_LINUX_PATH, HCNetSDK.class); + } } catch (Exception ex) { log.error("SdkInitService-init-hCNetSDK-error"); } } } } - /** - * 初始化资源配置 - */ - public int initDevices(){ - System.out.println("进入构造函数"); + + /** + * 初始化资源配置 + */ + public int initDevices() { + System.out.println("进入构造函数"); // 初始化SDK boolean initSuc = hCNetSDK.NET_DVR_Init(); if (initSuc != true) { @@ -52,180 +58,154 @@ // 设置连接时间与重连时间 hCNetSDK.NET_DVR_SetConnectTime(2000, 1); System.out.println("初始化SDK资源完成"); - return 0; - } + return 0; + } //销毁函数 @PreDestroy public void destroy() throws Exception { hCNetSDK.NET_DVR_Cleanup(); } - + /* - * 功能:登录设备 - * 参数: - * deviceIP-设备局域网IP地址 - * devicePort-设备SDK服务端口 - * userName-用户名 - * passWord-密码 - * */ -// public String loginDevice() throws JSONException { -// if (!getDeviceStatus()) { -// int init = initDevices(); -// if (init == 1) { -// return "初始化失败"; -// } -// ArrayList<String> list = mZnfxCodeService.getDriverInfo("driverinfo"); -// if (list != null && list.size() > 0) { -// String driverip = list.get(0); -// String driverport = list.get(1); -// String username = list.get(2); -// String password = list.get(3); -// String returnVal = Login_V40(driverip, Short.parseShort(driverport), username, password); -// System.out.println(returnVal); -// return returnVal; -// } else { -// return "获取设备信息失败!"; -// } -// } -// else -// { -// String result = captureJPEGPicture(); -// System.out.println(result); -// return result; -// } -// -// } + * 功能:登录设备 + * 参数: + * deviceIP-设备局域网IP地址 + * devicePort-设备SDK服务端口 + * userName-用户名 + * passWord-密码 + * */ + public String loginDevice(CameraDTO camera) throws JSONException { + if (!getDeviceStatus(camera.getId())) { + int init = initDevices(); + if (init == 1) { + return "初始化失败"; + } + String driverip = camera.getIp(); + String driverport = camera.getPort(); + String username = camera.getUsername(); + String password = camera.getPassword(); + String returnVal = Login_V40(driverip, Short.parseShort(driverport), username, password, camera); + System.out.println(returnVal); + return returnVal; + } else { + String result = captureJPEGPicture(camera); + System.out.println(result); + return result; + } + + } /** - * - * @param m_sDeviceIP 设备ip地址 - * @param wPort 端口号,设备网络SDK登录默认端口8000 - * @param m_sUsername 用户名 - * @param m_sPassword 密码 - */ - public String Login_V40(String m_sDeviceIP,short wPort,String m_sUsername,String m_sPassword) { - /* 注册 */ - // 设备登录信息 - HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO(); + * @param m_sDeviceIP 设备ip地址 + * @param wPort 端口号,设备网络SDK登录默认端口8000 + * @param m_sUsername 用户名 + * @param m_sPassword 密码 + */ + public String Login_V40(String m_sDeviceIP, short wPort, String m_sUsername, String m_sPassword, CameraDTO camera) { + /* 注册 */ + // 设备登录信息 + HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO(); - // 设备信息 - HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40(); - m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN]; - System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length()); - m_strLoginInfo.wPort =wPort ; - m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN]; - System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length()); - m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN]; - System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length()); - // 是否异步登录:false- 否,true- 是 - m_strLoginInfo.bUseAsynLogin = false; - // write()调用后数据才写入到内存中 - m_strLoginInfo.write(); + // 设备信息 + HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40(); + m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN]; + System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length()); + m_strLoginInfo.wPort = wPort; + m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN]; + System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length()); + m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN]; + System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length()); + // 是否异步登录:false- 否,true- 是 + m_strLoginInfo.bUseAsynLogin = false; + // write()调用后数据才写入到内存中 + m_strLoginInfo.write(); - lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); - if (lUserID == -1) { -// updateZnfxPostalStatus(PostalStatus.ABNORMAL.value()); -// mZnfxPostalStatusService.changeStatus(MessageCode.POSTAL_STATUS_TYPE_CAMERA, PostalStatus.ABNORMAL.value()); - - System.out.println("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError()); - return "登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError(); - } else { - System.out.println("登录成功!"); - // read()后,结构体中才有对应的数据 - m_strDeviceInfo.read(); -// updateZnfxPostalStatus(PostalStatus.NORMAL.value()); -// mZnfxPostalStatusService.changeStatus(MessageCode.POSTAL_STATUS_TYPE_CAMERA, PostalStatus.NORMAL.value()); - - String result = captureJPEGPicture(); - - return result; - } - } - - //注销设备 - public String logoutDevice() - { - NativeLong nlUserID = new NativeLong(lUserID); - if (!hCNetSDK.NET_DVR_Logout(nlUserID)) - { - System.out.println("注销失败,设备ID:"+ nlUserID.intValue() + "错误码:"+hCNetSDK.NET_DVR_GetLastError()); - return "{\"result\":\"loginDevice Fail\",\"userID\":"+nlUserID.intValue()+",\"errorCode\":"+hCNetSDK.NET_DVR_GetLastError()+"}"; - }else{ - System.out.println("注销成功,设备ID:"+ nlUserID.intValue()); - return "{\"result\":\"logoutDevice Success\",\"userID\":"+nlUserID.intValue()+",\"errorCode\":0}"; + lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); + if (lUserID == -1) { + VideoConfiguration.staticCameraService.setStatus(camera.getId(), CameraStatusEnum.OFFLINE.getCode()); + System.out.println("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError()); + return "登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError(); + } else { + System.out.println("登录成功!"); + // read()后,结构体中才有对应的数据 + m_strDeviceInfo.read(); + VideoConfiguration.staticCameraService.setStatus(camera.getId(), CameraStatusEnum.ONLIEN.getCode()); + String result = captureJPEGPicture(camera); + return result; } } - /** - * 设备抓图(无预览) - * 单帧设备抓取保存的图片为JPG,具体注意问题需要详细查看【设备网络sdk使用手册】 - * @return - */ - public String captureJPEGPicture() - { -// ArrayList<String> list = mZnfxCodeService.getDriverInfo("driverpic"); - List<String> list = new ArrayList<>(); - list.add("tlChannel"); - list.add("tlPicSize"); - list.add("tlPicQuality"); - if (list != null && list.size() > 0) { - int tlChannel = Integer.parseInt(list.get(0)); - int tlPicSize = Integer.parseInt(list.get(1)); - int tlPicQuality = Integer.parseInt(list.get(2)); - NativeLong nlUserID = new NativeLong(lUserID); - NativeLong nChannel = new NativeLong(tlChannel); - HCNetSDK.NET_DVR_JPEGPARA lpJpegPara = new HCNetSDK.NET_DVR_JPEGPARA(); - lpJpegPara.wPicSize = (short)tlPicSize; - lpJpegPara.wPicQuality = (short)tlPicQuality; - // 参数必须写入到结构体,否则在保存图片的时候异常图片 - lpJpegPara.write(); - String tFiledirName = CommonUtils.getCurrDate();//yyyyMMdd - // 创建文件名称 - String tDatePath = MessageCode.DvrPicSavePath+"/"+tFiledirName; - // 判断文件夹是否创建 - File tFile = new File(tDatePath); - if (!tFile.exists()){ - tFile.mkdirs(); - } - String tDate = CommonUtils.getCurrDate2();//yyyyMMddHHmmss - // 文件名称 - String tImageName = tDate +".png"; - // 全路径 - String tPath = tDatePath+"/"+tImageName; - // 开始抓图 - if (!hCNetSDK.NET_DVR_CaptureJPEGPicture(nlUserID, nChannel, lpJpegPara, tPath)) - { - return "失败编码:"+hCNetSDK.NET_DVR_GetLastError() ; - }else { - Long tImageId = CommonUtils.Getnum();//生成流水号 -// saveZnfxImageInfo(tFiledirName,tImageName,tPath,tImageId); + //注销设备 + public String logoutDevice() { + NativeLong nlUserID = new NativeLong(lUserID); + if (!hCNetSDK.NET_DVR_Logout(nlUserID)) { + System.out.println("注销失败,设备ID:" + nlUserID.intValue() + "错误码:" + hCNetSDK.NET_DVR_GetLastError()); + return "{\"result\":\"loginDevice Fail\",\"userID\":" + nlUserID.intValue() + ",\"errorCode\":" + hCNetSDK.NET_DVR_GetLastError() + "}"; + } else { + System.out.println("注销成功,设备ID:" + nlUserID.intValue()); + return "{\"result\":\"logoutDevice Success\",\"userID\":" + nlUserID.intValue() + ",\"errorCode\":0}"; + } + } - return "success>>>>>>>>>>>" + tImageName; - } - } - else - { - return "login fail>>>>>>>>>>>"; - } - } - /** - * 检查设备是否在线 + /** + * 设备抓图(无预览) + * 单帧设备抓取保存的图片为JPG,具体注意问题需要详细查看【设备网络sdk使用手册】 + * * @return */ - private boolean getDeviceStatus() { - boolean isOnLine = hCNetSDK.NET_DVR_RemoteControl(lUserID, 20005, null, 0); -// if (!isOnLine) { -//// updateZnfxPostalStatus(PostalStatus.ABNORMAL.value()); //离线 -//// insertZnfxPostalStatusLog(PostalStatus.ABNORMAL.value()); -// mZnfxPostalStatusService.changeStatus(MessageCode.POSTAL_STATUS_TYPE_CAMERA, PostalStatus.ABNORMAL.value()); -// return false; -// } else { -// mZnfxPostalStatusService.changeStatus(MessageCode.POSTAL_STATUS_TYPE_CAMERA, PostalStatus.NORMAL.value()); -//// updateZnfxPostalStatus(PostalStatus.NORMAL.value());//在线 -// } - return true; - } + public String captureJPEGPicture(CameraDTO camera) { + int tlChannel = camera.getChannel(); + String tlPicSize = VideoConfiguration.staticPicSize; + String tlPicQuality = VideoConfiguration.staticPicQuality; + NativeLong nlUserID = new NativeLong(lUserID); + NativeLong nChannel = new NativeLong(tlChannel); + HCNetSDK.NET_DVR_JPEGPARA lpJpegPara = new HCNetSDK.NET_DVR_JPEGPARA(); + lpJpegPara.wPicSize = Short.parseShort(tlPicSize); + lpJpegPara.wPicQuality = Short.parseShort(tlPicQuality); + // 参数必须写入到结构体,否则在保存图片的时候异常图片 + lpJpegPara.write(); + String tFilename = CommonUtils.getCurrDate();//yyyyMMdd + // 创建文件名称 + String tDatePath = VideoConfiguration.staticHkCapturePath + tFilename; + // 判断文件夹是否创建 + File tFile = new File(tDatePath); + if (!tFile.exists()) { + tFile.mkdirs(); + } + String tDate = CommonUtils.getCurrDate2();//yyyyMMddHHmmss + // 文件名称 + String tImageName = tDate + ".png"; + // 全路径 + String tPath = tDatePath + "/" + tImageName; + // 开始抓图 + if (!hCNetSDK.NET_DVR_CaptureJPEGPicture(nlUserID, nChannel, lpJpegPara, tPath)) { + return "失败编码:" + hCNetSDK.NET_DVR_GetLastError(); + } else { + Map<String, String> params = new HashMap<>(); + params.put("strFileName", tPath); + params.put("cmdSerial", camera.getCode()); + params.put("brand", "HK"); + VideoConfiguration.staticCameraService.dealCapture(params); + return "success>>>>>>>>>>>" + tImageName; + } + } + + /** + * 检查设备是否在线 + * + * @return + */ + private boolean getDeviceStatus(String id) { + boolean isOnLine = hCNetSDK.NET_DVR_RemoteControl(lUserID, 20005, null, 0); + if (!isOnLine) { + VideoConfiguration.staticCameraService.setStatus(id, CameraStatusEnum.OFFLINE.getCode()); + return false; + } else { + VideoConfiguration.staticCameraService.setStatus(id, CameraStatusEnum.ONLIEN.getCode()); + } + return true; + } // /** // * 更新摄像头通讯状态 // * @param status -- Gitblit v1.9.3