package com.whyc.hik; import com.sun.jna.Memory; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import com.whyc.hik.NetSDKDemo.HCNetSDK; import static com.whyc.hik.TestDemo.hCNetSDK; /** * 设备维护管理 * @Author: jiangxin14 * @Date: 2024-08-12 16:56 */ public class DevManager { public static fRemoteConfigCallBack fDevStatusCallBack = null; /** * 手动获取设备在线状态 * @param iUserID */ public static void getDeviceStatus(int iUserID) { boolean devStatus = TestDemo.hCNetSDK.NET_DVR_RemoteControl(iUserID, HCNetSDK.NET_DVR_CHECK_USER_STATUS, null, 0); if (devStatus == false) { System.out.println("设备不在线"); } else { System.out.println("设备在线"); } } /** * 获取设备工作状态,CPU,硬盘状态,通道状态,一般适用于硬盘录像机设备 * @param iUserID */ public static void getWorkS(int iUserID) { HCNetSDK.NET_DVR_GETWORKSTATE_COND strWorkStatusCond = new HCNetSDK.NET_DVR_GETWORKSTATE_COND(); strWorkStatusCond.read(); strWorkStatusCond.dwSize = strWorkStatusCond.size(); //设置结构体大小 strWorkStatusCond.byFindChanByCond = 0; //0- 查找全部通道,1- 根据dwFindChanNo数组中各元素所指定的有效通道号进行查找 strWorkStatusCond.byFindHardByCond = 0; //0- 查找全部磁盘,1- 根据dwFindHardStatus数组中各元素所指定的有效硬盘号进行查找 strWorkStatusCond.write(); Pointer lpInBuffer = strWorkStatusCond.getPointer(); Pointer pUser = null; if (fDevStatusCallBack == null) { fDevStatusCallBack =new fRemoteConfigCallBack(); } int devStatus = TestDemo.hCNetSDK.NET_DVR_StartRemoteConfig(iUserID,HCNetSDK.NET_DVR_GET_WORK_STATUS_V50,lpInBuffer,strWorkStatusCond.size(), fDevStatusCallBack,pUser); if (devStatus <= -1) { System.err.println("获取设备状态NET_DVR_StartRemoteConfig建立失败,错误码:" + TestDemo.hCNetSDK.NET_DVR_GetLastError()); return; } System.out.println("获取设备工作状态成功"); // 添加延时,这里假设延时 5 秒,可根据实际情况调整 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } //调用 NET_DVR_StopRemoteConfig 停止远程配置 boolean stopResult = hCNetSDK.NET_DVR_StopRemoteConfig(devStatus); if (stopResult) { System.out.println("成功停止远程配置"); } else { System.err.println("停止远程配置失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); } } /** * 获取设备状态回调函数 */ static class fRemoteConfigCallBack implements HCNetSDK.FRemoteConfigCallBack { public void invoke(int dwType, Pointer lpBuffer, int dwBufLen, Pointer pUserData){ switch (dwType) { case HCNetSDK.NET_SDK_CALLBACK_TYPE_STATUS: { HCNetSDK.BYTE_ARRAY struCallbackStatus = new HCNetSDK.BYTE_ARRAY(dwBufLen); struCallbackStatus.write(); Pointer pStatus = struCallbackStatus.getPointer(); pStatus.write(0, lpBuffer.getByteArray(0, struCallbackStatus.size()), 0, dwBufLen); struCallbackStatus.read(); // System.out.println(new String(struCallbackStatus.byValue)); break; } case HCNetSDK.NET_SDK_CALLBACK_TYPE_PROGRESS: { HCNetSDK.BYTE_ARRAY struPrscess = new HCNetSDK.BYTE_ARRAY(dwBufLen); struPrscess.write(); Pointer pStatus = struPrscess.getPointer(); pStatus.write(0, lpBuffer.getByteArray(0, struPrscess.size()), 0, dwBufLen); struPrscess.read(); System.out.println("进度值:"+ new String(struPrscess.byValue)); break; } case HCNetSDK.NET_SDK_CALLBACK_TYPE_DATA:{ HCNetSDK.NET_DVR_WORKSTATE_V40 strWorKStatus = new HCNetSDK.NET_DVR_WORKSTATE_V40(); strWorKStatus.read(); strWorKStatus.dwSize = strWorKStatus.size(); strWorKStatus.write(); Pointer lpOutBuffer = strWorKStatus.getPointer(); lpOutBuffer.write(0, lpBuffer.getByteArray(0, strWorKStatus.size()), 0, dwBufLen); strWorKStatus.read(); System.out.println("设备状态:"+strWorKStatus.dwDeviceStatic);//0-正常;1-CPU占用率太高,超过85%;2-硬件错误,例如串口异常 System.out.println("第一个硬盘状态:硬盘容量:"+strWorKStatus.struHardDiskStatic[0].dwVolume+" 硬盘剩余容量:"+strWorKStatus.struHardDiskStatic[0].dwFreeSpace+ " 硬盘状态:"+strWorKStatus.struHardDiskStatic[0].dwHardDiskStatic); System.out.println("第一路通道状态:是否录像:"+strWorKStatus.struChanStatic[0].byRecordStatic+" 信号连接状态:"+strWorKStatus.struChanStatic[0].bySignalStatic+ " 连接该通道的客户端个数:"+strWorKStatus.struChanStatic[0].dwLinkNum); break; } default:{ break; } } } } //获取设备的基本参数 public static void getDeviceInfo(int iUserID) { HCNetSDK.NET_DVR_DEVICECFG_V40 m_strDeviceCfg = new HCNetSDK.NET_DVR_DEVICECFG_V40(); m_strDeviceCfg.dwSize = m_strDeviceCfg.size(); m_strDeviceCfg.write(); Pointer pStrDeviceCfg = m_strDeviceCfg.getPointer(); IntByReference pInt = new IntByReference(0); boolean b_GetCfg = TestDemo.hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_DEVICECFG_V40, 0Xffffffff, pStrDeviceCfg, m_strDeviceCfg.dwSize, pInt); if (b_GetCfg == false) { System.out.println("获取参数失败 错误码:" + TestDemo.hCNetSDK.NET_DVR_GetLastError()); } System.out.println("获取参数成功"); m_strDeviceCfg.read(); System.out.println("设备名称:" + new String(m_strDeviceCfg.sDVRName).trim() + "设备序列号:" + new String(m_strDeviceCfg.sSerialNumber)); System.out.println("模拟通道个数" + m_strDeviceCfg.byChanNum); parseVersion(m_strDeviceCfg.dwSoftwareVersion); parseBuildTime(m_strDeviceCfg.dwSoftwareBuildDate); parseDSPBuildDate(m_strDeviceCfg.dwDSPSoftwareBuildDate); } public static void parseBuildTime(int buildTime) { int year =( (buildTime & 0XFF << 16) >> 16)+2000; int month = (buildTime & 0XFF << 8) >> 8 ; int data = buildTime & 0xFF; System.out.println("Build:"+year+"."+month+"."+data); } public static void parseDSPBuildDate(int DSPBuildDate ) { int year =( (DSPBuildDate & 0XFF << 16) >> 16)+2000; int month = (DSPBuildDate & 0XFF << 8) >> 8 ; int data = DSPBuildDate & 0xFF; System.out.println("DSPBuildDate:"+year+"."+month+"."+data); } //设备版本解析 public static void parseVersion(int version) { int firstVersion = (version & 0XFF << 24) >> 24; int secondVersion = (version & 0XFF << 16) >> 16 ; int lowVersion = version & 0XFF; System.out.println("firstVersion:"+ firstVersion); System.out.println("secondVersion:"+ secondVersion); System.out.println("lowVersion:"+ lowVersion); } //获取设备软硬件能力 public static void GetSofthardware_Ability(int iUserID){ Pointer pInBuf = null; int dwInLength = 0; int dwOutLength = 1024*10; Memory pOutBuf = new Memory(dwOutLength); boolean result = hCNetSDK.NET_DVR_GetDeviceAbility(iUserID, hCNetSDK.DEVICE_SOFTHARDWARE_ABILITY, pInBuf, dwInLength, pOutBuf, dwOutLength); if (result) { // 从输出缓冲区获取 XML 数据 String xmlData = pOutBuf.getString(0); System.out.println("设备软硬件能力信息(XML 格式):"); System.out.println(xmlData); }else { System.out.println("获取设备软硬件能力失败!错误码:"+hCNetSDK.NET_DVR_GetLastError()); } } //设备JPEG抓图能力 public static void GetJPEG_Cap_Ability(int iUserID){ // 构建输入的 XML 数据 String inputXml = "\n" + "\n" + "\n" + " 1\n" + ""; // 输入缓冲区 byte[] inputBytes = inputXml.getBytes(); int dwInLength = inputBytes.length; Memory pInBuf = new Memory(dwInLength); pInBuf.write(0, inputBytes, 0, dwInLength); int dwOutLength = 1024*10;// 输出缓冲区 Memory pOutBuf = new Memory(dwOutLength); boolean result = hCNetSDK.NET_DVR_GetDeviceAbility(iUserID, hCNetSDK.DEVICE_JPEG_CAP_ABILITY, pInBuf, dwInLength, pOutBuf, dwOutLength); if (result) { // 从输出缓冲区获取 XML 数据 String xmlData = pOutBuf.getString(0); System.out.println("设备JPEG抓图能力(XML 格式):"); System.out.println(xmlData); }else { System.out.println("设备JPEG抓图能力!错误码:"+hCNetSDK.NET_DVR_GetLastError()); } } //日志查找 public static void FindLog(int iUserID){ // 初始化查找条件 HCNetSDK.NET_DVR_FIND_LOG_COND findCond = new HCNetSDK.NET_DVR_FIND_LOG_COND(); findCond.dwSelectMode = 2;//按2-时间查找 findCond.dwMainType = 0; //日志主类型,全部 findCond.dwSubType = 0; //日志次类型,全部 // 初始化开始时间 HCNetSDK.NET_DVR_TIME_V50 startTime = new HCNetSDK.NET_DVR_TIME_V50(); startTime.wYear = 2023; startTime.byMonth = 2; startTime.byDay = 1; startTime.byHour = 0; startTime.byMinute = 0; startTime.bySecond = 0; startTime.byISO8601 = 0; startTime.wMillisecond = 0; startTime.cTimeDifferenceH = 0; startTime.cTimeDifferenceM = 0; // 初始化结束时间 HCNetSDK.NET_DVR_TIME_V50 endTime = new HCNetSDK.NET_DVR_TIME_V50(); endTime.wYear = 2023; endTime.byMonth = 2; endTime.byDay = 7; endTime.byHour = 11; endTime.byMinute = 22; endTime.bySecond = 0; endTime.byISO8601 = 0; endTime.wMillisecond = 0; endTime.cTimeDifferenceH = 0; endTime.cTimeDifferenceM = 0; // 将开始时间和结束时间赋值给查找条件结构体 findCond.struStartTime = startTime; findCond.struEndTime = endTime; // 开始查找日志 int lLogHandle = hCNetSDK.NET_DVR_FindDVRLog_V50(iUserID, findCond); if (lLogHandle < 0) { System.out.println("日志查找失败,错误码:"+hCNetSDK.NET_DVR_GetLastError()); return; } // 用于存储是否找到日志的标志 boolean foundLog = false; // 日志信息结构体实例 HCNetSDK.NET_DVR_LOG_V50 logData = new HCNetSDK.NET_DVR_LOG_V50(); // 循环获取日志 int result = hCNetSDK.NET_DVR_FindNextLog_V50(lLogHandle, logData); HCNetSDK.NET_DVR_TIME_V50 logTime = logData.struLogTime; HCNetSDK.NET_DVR_IPADDR remoteHostAddr = logData.struRemoteHostAddr; while (result>0) { foundLog = true; if(result==1000){ System.out.println("获取日志信息成功:"); System.out.println("日志时间: " + logTime.wYear + "-" + logTime.byMonth + "-" + logTime.byDay + " " + logTime.byHour + ":" + logTime.byMinute + ":" + logTime.bySecond+ ", 主类型: " + logData.dwMajorType + ", 次类型: " + logData.dwMinorType + ", 远程主机地址: " + remoteHostAddr.getIpV4String()); result = hCNetSDK.NET_DVR_FindNextLog_V50(lLogHandle, logData); } else if (result==HCNetSDK.NET_DVR_FILE_NOFIND) { System.out.println("未查找到日志"); break; } else if (result==HCNetSDK.NET_DVR_ISFINDING) { System.out.println("正在查找请等待"); result = hCNetSDK.NET_DVR_FindNextLog_V50(lLogHandle, logData); } else if (result==HCNetSDK.NET_DVR_NOMOREFILE) { System.out.println("没有更多的日志,查找结束"); break; } else if (result==HCNetSDK.NET_DVR_FILE_EXCEPTION) { System.out.println("查找日志时异常"); break; } } // 根据是否找到日志输出相应信息 if (!foundLog){ System.out.println("查找失败"); } // 释放查找日志的资源 boolean closeResult = hCNetSDK.NET_DVR_FindLogClose_V30(lLogHandle); if (closeResult) { System.out.println("日志查找资源释放成功"); } else { System.out.println("日志查找资源释放失败,错误码: "+hCNetSDK.NET_DVR_GetLastError()); } } }