New file |
| | |
| | | package com.whyc.controller; |
| | | |
| | | import com.whyc.dto.Response; |
| | | import com.whyc.service.HikTempService; |
| | | import io.swagger.annotations.Api; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.io.IOException; |
| | | |
| | | @RequestMapping("hikTemp") |
| | | @RestController |
| | | @Api("海康摄像头温度点位") |
| | | public class HikTempController { |
| | | |
| | | @Autowired |
| | | private HikTempService service; |
| | | |
| | | @GetMapping("getTempPoint") |
| | | public Response getTempPoint(String ip) throws IOException, InterruptedException { |
| | | return service.getTempPoint(ip); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.whyc.hik; |
| | | |
| | | 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-26 10:02 |
| | | */ |
| | | public class AlarmDevParamCfg { |
| | | |
| | | |
| | | /** |
| | | * 获取报警主机RS485参数 |
| | | * |
| | | * @param lUserID |
| | | */ |
| | | public static void getRs485Cfg(int lUserID) { |
| | | HCNetSDK.NET_DVR_ALARM_RS485CFG rs485CFG = new HCNetSDK.NET_DVR_ALARM_RS485CFG(); |
| | | rs485CFG.dwSize = rs485CFG.size(); |
| | | Pointer pointer = rs485CFG.getPointer(); |
| | | IntByReference pInt1 = new IntByReference(0); |
| | | rs485CFG.write(); |
| | | boolean bGetRs485 = hCNetSDK.NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_ALARM_RS485CFG, 3, pointer, rs485CFG.dwSize, pInt1); |
| | | if (!bGetRs485) { |
| | | System.out.println("获取报警主机RS485参数失败!错误号:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | return; |
| | | } |
| | | rs485CFG.read(); |
| | | return; |
| | | |
| | | } |
| | | |
| | | public static void getRs485SlotInfo(int iUserID) { |
| | | HCNetSDK.NET_DVR_ALARMHOST_RS485_SLOT_CFG strRs485SlotCFG = new HCNetSDK.NET_DVR_ALARMHOST_RS485_SLOT_CFG(); |
| | | strRs485SlotCFG.dwSize = strRs485SlotCFG.size(); |
| | | Pointer pRs485SlotCFG = strRs485SlotCFG.getPointer(); |
| | | IntByReference pInt1 = new IntByReference(0); |
| | | strRs485SlotCFG.write(); |
| | | String Schannel = "0000000100000001"; //高2字节表示485通道号,低2字节表示槽位号,都从1开始 |
| | | int channel = Integer.parseInt(Schannel, 2); |
| | | boolean bRs485Slot = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_ALARMHOST_RS485_SLOT_CFG, channel, pRs485SlotCFG, strRs485SlotCFG.dwSize, pInt1); |
| | | if (!bRs485Slot) { |
| | | System.out.println("获取报警主机RS485槽位参数失败!错误号:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | return; |
| | | } |
| | | strRs485SlotCFG.read(); |
| | | return; |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | package com.whyc.hik; |
| | | |
| | | import com.sun.jna.NativeLong; |
| | | import com.sun.jna.Pointer; |
| | | import com.sun.jna.ptr.IntByReference; |
| | | import com.whyc.hik.NetSDKDemo.HCNetSDK; |
| | | |
| | | import java.io.File; |
| | | import java.io.FileOutputStream; |
| | | import java.io.IOException; |
| | | import java.io.UnsupportedEncodingException; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | |
| | | import static com.whyc.hik.TestDemo.hCNetSDK; |
| | | |
| | | /** |
| | | * 通道参数配置 |
| | | * @Author: jiangxin14 |
| | | * @Date: 2024-08-26 09:46 |
| | | */ |
| | | public class ChannelParamCfg { |
| | | |
| | | |
| | | /** |
| | | * 获取与设置设备图像参数 |
| | | * @param iUserID |
| | | */ |
| | | //获取设备的图像参数-移动侦测高亮显示 |
| | | public static void GetandSetPicCfg(int iUserID) { |
| | | HCNetSDK.NET_DVR_PICCFG_V40 strPicCfg = new HCNetSDK.NET_DVR_PICCFG_V40(); |
| | | strPicCfg.dwSize = strPicCfg.size(); |
| | | Pointer pStrPicCfg = strPicCfg.getPointer(); |
| | | NativeLong lChannel = new NativeLong(1); |
| | | IntByReference pInt = new IntByReference(0); |
| | | boolean b_GetPicCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_PICCFG_V40, lChannel.intValue(), |
| | | pStrPicCfg, strPicCfg.size(), pInt); |
| | | if (b_GetPicCfg == false) { |
| | | System.out.println("获取图像参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | strPicCfg.read(); |
| | | System.out.println("通道号:" + lChannel ); |
| | | System.out.println("预览的图像是否显示OSD:" + strPicCfg.dwShowOsd); |
| | | System.out.println("移动侦测高亮显示是否开启:"+strPicCfg.struMotion.byEnableDisplay); |
| | | strPicCfg.read(); |
| | | |
| | | //直接把获取到的参数设置回去,如果有需要可以自行修改其中需要修改的字段 |
| | | boolean b_SetPicCfg = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_PICCFG_V40,lChannel.intValue(), |
| | | pStrPicCfg, strPicCfg.size()); |
| | | if (b_SetPicCfg == false) { |
| | | System.out.println("设置图像参数移动侦测高亮参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | else { |
| | | System.out.println("设置移动侦测高亮参数成功"); |
| | | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 球机PTZ参数获取设置 |
| | | * @param iUserID |
| | | */ |
| | | |
| | | public static void SetPTZcfg(int iUserID) { |
| | | HCNetSDK.NET_DVR_PTZPOS struPtTZPos = new HCNetSDK.NET_DVR_PTZPOS(); |
| | | IntByReference pUsers = new IntByReference(1); |
| | | boolean b_GetPTZ = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_PTZPOS, 1, struPtTZPos.getPointer(), struPtTZPos.size(), pUsers); |
| | | if (b_GetPTZ == false) { |
| | | System.out.println("获取PTZ坐标信息失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } else { |
| | | struPtTZPos.read(); |
| | | int wPanPos = Integer.parseInt(Integer.toHexString(struPtTZPos.wPanPos).trim()); |
| | | float WPanPos = wPanPos * 0.1f; |
| | | int wTiltPos = Integer.parseInt(Integer.toHexString(struPtTZPos.wTiltPos).trim()); |
| | | float WTiltPos = wTiltPos * 0.1f; |
| | | int wZoomPos = Integer.parseInt(Integer.toHexString(struPtTZPos.wZoomPos).trim()); |
| | | float WZoomPos = wZoomPos * 0.1f; |
| | | System.out.println("P参数:" + WPanPos + "\n"); |
| | | System.out.println("T参数:" + wTiltPos + "\n"); |
| | | System.out.println("Z参数:" + wZoomPos + "\n"); |
| | | } |
| | | // struPtTZPos.wAction = 2; |
| | | //本结构体中的wAction参数是设置时的操作类型,因此获取时该参数无效。实际显示的PTZ值是获取到的十六进制值的十分之一, |
| | | // 如获取的水平参数P的值是0x1750,实际显示的P值为175度;获取到的垂直参数T的值是0x0789,实际显示的T值为78.9度,如果T未负值,获取的值减去360 |
| | | // 获取到的变倍参数Z的值是0x1100,实际显示的Z值为110倍。 |
| | | // String pHex="13669"; |
| | | // int pInter=Integer.parseInt(pHex); |
| | | // short pInter = 13669; |
| | | // System.out.println(pInter); |
| | | // struPtTZPos.wPanPos = (short) pInter; |
| | | // struPtTZPos.write(); |
| | | // boolean b_SetPTZ = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_PTZPOS, 1, struPtTZPos.getPointer(), struPtTZPos.size()); |
| | | // if (b_GetPTZ == false) { |
| | | // System.out.println("设置PTZ坐标信息失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | // } else { |
| | | // |
| | | // System.out.println("设置PTZ成功"); |
| | | // } |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 设置云台锁定信息 |
| | | * @param iUserID |
| | | */ |
| | | public static void SetPTZLOCKCFG(int iUserID) { |
| | | HCNetSDK.NET_DVR_PTZ_LOCKCFG struPtzLockCfg =new HCNetSDK.NET_DVR_PTZ_LOCKCFG(); |
| | | struPtzLockCfg.dwSize =struPtzLockCfg.size(); |
| | | Pointer pStrPtzLockCfg = struPtzLockCfg.getPointer(); |
| | | NativeLong lChannel = new NativeLong(1); |
| | | IntByReference pInt = new IntByReference(0); |
| | | boolean b_GetPtzLockCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_PTZLOCKCFG, lChannel.intValue(), |
| | | pStrPtzLockCfg, struPtzLockCfg.size(), pInt); |
| | | if (b_GetPtzLockCfg == false) { |
| | | System.out.println("获取云台锁定信息失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | struPtzLockCfg.read(); |
| | | System.out.println("通道号:" + lChannel ); |
| | | System.out.println("云台锁定控制状态为:" + struPtzLockCfg.byWorkMode); |
| | | |
| | | struPtzLockCfg.read(); |
| | | struPtzLockCfg.byWorkMode= 1; //0- 解锁,1- 锁定 |
| | | struPtzLockCfg.write(); |
| | | boolean b_SetPtzLockCfg = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_PTZLOCKCFG,lChannel.intValue(), |
| | | pStrPtzLockCfg, struPtzLockCfg.size()); |
| | | if (b_SetPtzLockCfg== false) { |
| | | System.out.println("设置云台锁定信息失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | else { |
| | | System.out.println("设置云台锁定信息成功"); |
| | | System.out.println("云台锁定控制状态当前为:" + struPtzLockCfg.byWorkMode); |
| | | } |
| | | } |
| | | |
| | | // public static void PTZControlOther(int iUserID){ |
| | | // boolean b_ptzcontrol=hCNetSDK.NET_DVR_PTZControl_Other(iUserID,1,HCNetSDK.TILT_UP,0); |
| | | // |
| | | // if( b_ptzcontrol==false){ |
| | | // System.out.println("云台向上转动失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | // }else{ |
| | | // System.out.println("设置向上转动成功"); |
| | | // } |
| | | |
| | | // } |
| | | |
| | | /** |
| | | * 获取(设置)前端参数(扩展) |
| | | * @param iUserID |
| | | */ |
| | | public static void GetCameraPara(int iUserID) { |
| | | HCNetSDK.NET_DVR_CAMERAPARAMCFG_EX struCameraParam = new HCNetSDK.NET_DVR_CAMERAPARAMCFG_EX(); |
| | | Pointer pstruCameraParam = struCameraParam.getPointer(); |
| | | IntByReference ibrBytesReturned = new IntByReference(0); |
| | | boolean b_GetCameraParam = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_CCDPARAMCFG_EX, 1, pstruCameraParam, struCameraParam.size(), ibrBytesReturned); |
| | | if (!b_GetCameraParam) { |
| | | System.out.println("获取前端参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | struCameraParam.read(); |
| | | System.out.println("是否开启旋转:" + struCameraParam.struCorridorMode.byEnableCorridorMode); |
| | | |
| | | //直接把获取到的参数设置回去,如果有需要可以自行修改其中需要修改的字段 |
| | | boolean b_SetCameraParam = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_CCDPARAMCFG_EX, 1, pstruCameraParam, struCameraParam.size()); |
| | | if (!b_SetCameraParam) { |
| | | System.out.println("设置前端参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | struCameraParam.read(); |
| | | System.out.println("设置成功"); |
| | | } |
| | | |
| | | |
| | | |
| | | //获取和设置网络参数 |
| | | public static void GetNetCfg(int iUserID) { |
| | | HCNetSDK.NET_DVR_NETCFG_V50 struNetCfg = new HCNetSDK.NET_DVR_NETCFG_V50(); |
| | | Pointer pstruNetCfg = struNetCfg.getPointer(); |
| | | IntByReference ibrBytesReturned = new IntByReference(0); |
| | | boolean b_GetNetCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_NETCFG_V50, 1, pstruNetCfg, struNetCfg.size(), ibrBytesReturned); |
| | | if (!b_GetNetCfg) { |
| | | System.out.println("获取网络参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | struNetCfg.read(); |
| | | System.out.println("是否启用DHCP:" + struNetCfg.byUseDhcp); |
| | | |
| | | //直接把获取到的参数设置回去,如果有需要可以自行修改其中需要修改的字段 |
| | | boolean b_SetNetCfg = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_NETCFG_V50, 1, pstruNetCfg, struNetCfg.size()); |
| | | if (!b_SetNetCfg) { |
| | | System.out.println("设置网络参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | struNetCfg.read(); |
| | | System.out.println("设置成功"); |
| | | } |
| | | |
| | | |
| | | |
| | | //获取和设置录像计划 |
| | | public static void GetRecordCfg(int iUserID){ |
| | | HCNetSDK.NET_DVR_RECORD_V40 struRecordCfg = new HCNetSDK.NET_DVR_RECORD_V40(); |
| | | Pointer pstruRecordCfg = struRecordCfg.getPointer(); |
| | | |
| | | //System.out.println("指针为:"+pstruRecordCfg); |
| | | IntByReference ibrBytesReturned = new IntByReference(1); |
| | | boolean b_GetRecordCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_RECORDCFG_V40, 1, pstruRecordCfg, struRecordCfg.size(), ibrBytesReturned); |
| | | if (!b_GetRecordCfg) { |
| | | System.out.println("获取录像计划失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | struRecordCfg.read(); |
| | | System.out.println("码流类型:" + struRecordCfg.byStreamType); |
| | | |
| | | //直接把获取到的参数设置回去,如果有需要可以自行修改其中需要修改的字段 |
| | | boolean b_SetRecordCfg = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_RECORDCFG_V40, 1, pstruRecordCfg, struRecordCfg.size()); |
| | | if (!b_SetRecordCfg) { |
| | | System.out.println("设置录像计划失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | struRecordCfg.read(); |
| | | System.out.println("设置成功"); |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 获取快球聚焦模式信息。 |
| | | * @param iUserID |
| | | */ |
| | | public static void GetFocusMode(int iUserID) { |
| | | HCNetSDK.NET_DVR_FOCUSMODE_CFG struFocusMode = new HCNetSDK.NET_DVR_FOCUSMODE_CFG(); |
| | | struFocusMode.read(); |
| | | struFocusMode.dwSize = struFocusMode.size(); |
| | | struFocusMode.write(); |
| | | Pointer pFocusMode = struFocusMode.getPointer(); |
| | | IntByReference ibrBytesReturned = new IntByReference(0); |
| | | boolean b_GetCameraParam = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_FOCUSMODECFG, 1, pFocusMode, struFocusMode.size(), ibrBytesReturned); |
| | | if (!b_GetCameraParam) { |
| | | System.out.println("获取快球聚焦模式失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | struFocusMode.read(); |
| | | System.out.println("聚焦模式:" + struFocusMode.byFocusMode); |
| | | struFocusMode.byFocusMode = 1; |
| | | struFocusMode.byFocusDefinitionDisplay = 1; |
| | | struFocusMode.byFocusSpeedLevel = 3; |
| | | struFocusMode.write(); |
| | | boolean b_SetCameraParam = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_FOCUSMODECFG, 1, pFocusMode, struFocusMode.size()); |
| | | if (!b_SetCameraParam) { |
| | | System.out.println("设置快球聚焦模式失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | struFocusMode.read(); |
| | | System.out.println("设置成功"); |
| | | } |
| | | |
| | | /** |
| | | * 获取IP通道 |
| | | * @param iUserID |
| | | * @throws UnsupportedEncodingException |
| | | */ |
| | | public static void GetIPChannelInfo(int iUserID) throws UnsupportedEncodingException { |
| | | IntByReference ibrBytesReturned = new IntByReference(0);//获取IP接入配置参数 |
| | | HCNetSDK.NET_DVR_IPPARACFG_V40 m_strIpparaCfg = new HCNetSDK.NET_DVR_IPPARACFG_V40(); |
| | | m_strIpparaCfg.write(); |
| | | //lpIpParaConfig 接收数据的缓冲指针 |
| | | Pointer lpIpParaConfig = m_strIpparaCfg.getPointer(); |
| | | boolean bRet = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_IPPARACFG_V40, 0, lpIpParaConfig, m_strIpparaCfg.size(), ibrBytesReturned); |
| | | m_strIpparaCfg.read(); |
| | | System.out.println("起始数字通道号:" + m_strIpparaCfg.dwStartDChan); |
| | | |
| | | for (int iChannum = 0; iChannum < m_strIpparaCfg.dwDChanNum; iChannum++) { |
| | | int channum = iChannum + m_strIpparaCfg.dwStartDChan; |
| | | HCNetSDK.NET_DVR_PICCFG_V40 strPicCfg = new HCNetSDK.NET_DVR_PICCFG_V40(); |
| | | strPicCfg.dwSize = strPicCfg.size(); |
| | | strPicCfg.write(); |
| | | Pointer pStrPicCfg = strPicCfg.getPointer(); |
| | | NativeLong lChannel = new NativeLong(channum); |
| | | IntByReference pInt = new IntByReference(0); |
| | | boolean b_GetPicCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_PICCFG_V40, lChannel.intValue(), |
| | | pStrPicCfg, strPicCfg.size(), pInt); |
| | | // if (b_GetPicCfg == false) { |
| | | // System.out.println("获取图像参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | // } |
| | | strPicCfg.read(); |
| | | m_strIpparaCfg.struStreamMode[iChannum].read(); |
| | | if (m_strIpparaCfg.struStreamMode[iChannum].byGetStreamType == 0) { |
| | | m_strIpparaCfg.struStreamMode[iChannum].uGetStream.setType(HCNetSDK.NET_DVR_IPCHANINFO.class); |
| | | m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.read(); |
| | | |
| | | System.out.println("--------------第"+ (iChannum+1) + "个通道------------------"); |
| | | int channel = m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byIPID + m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byIPIDHigh * 256; |
| | | System.out.println("channel:" + channel); |
| | | if(channel > 0){ |
| | | System.out.println("ip: " + new String(m_strIpparaCfg.struIPDevInfo[channel-1].struIP.sIpV4).trim()); |
| | | } |
| | | System.out.println("name: " + new String(strPicCfg.sChanName,"GBK").trim()); |
| | | if (m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byEnable == 1) { |
| | | System.out.println("IP通道" + channum + "在线"); |
| | | |
| | | } else { |
| | | |
| | | System.out.println("IP通道" + channum + "不在线"); |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取高精度PTZ绝对位置配置,一般热成像设备支持 |
| | | * @param iUserID |
| | | */ |
| | | // |
| | | public static void GetPTZAbsoluteEx(int iUserID) { |
| | | HCNetSDK.NET_DVR_STD_CONFIG struSTDcfg = new HCNetSDK.NET_DVR_STD_CONFIG(); |
| | | HCNetSDK.NET_DVR_PTZABSOLUTEEX_CFG struPTZ = new HCNetSDK.NET_DVR_PTZABSOLUTEEX_CFG(); |
| | | struSTDcfg.read(); |
| | | IntByReference channel = new IntByReference(1); |
| | | struSTDcfg.lpCondBuffer = channel.getPointer(); |
| | | struSTDcfg.dwCondSize = 4; |
| | | struSTDcfg.lpOutBuffer = struPTZ.getPointer(); |
| | | struSTDcfg.dwOutSize = struPTZ.size(); |
| | | struSTDcfg.lpInBuffer = Pointer.NULL; |
| | | struSTDcfg.dwInSize = 0; |
| | | struSTDcfg.write(); |
| | | boolean bGetPTZ = hCNetSDK.NET_DVR_GetSTDConfig(iUserID, HCNetSDK.NET_DVR_GET_PTZABSOLUTEEX, struSTDcfg); |
| | | if (bGetPTZ == false) { |
| | | System.out.println("获取PTZ参数错误,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | return; |
| | | } |
| | | struPTZ.read(); |
| | | System.out.println("焦距范围:" + struPTZ.dwFocalLen); |
| | | System.out.println("聚焦参数:" + struPTZ.struPTZCtrl.dwFocus); |
| | | return; |
| | | } |
| | | |
| | | /** |
| | | * 设置球机预置点 |
| | | * @param iUserID |
| | | */ |
| | | public static void GetCruisePoint(int iUserID) { |
| | | HCNetSDK.NET_DVR_CRUISEPOINT_COND struCruisepointCond = new HCNetSDK.NET_DVR_CRUISEPOINT_COND(); |
| | | struCruisepointCond.read(); |
| | | struCruisepointCond.dwSize = struCruisepointCond.size(); |
| | | struCruisepointCond.dwChan = 1; |
| | | struCruisepointCond.wRouteNo = 1; |
| | | struCruisepointCond.write(); |
| | | |
| | | HCNetSDK.NET_DVR_CRUISEPOINT_V50 struCruisepointV40 = new HCNetSDK.NET_DVR_CRUISEPOINT_V50(); |
| | | struCruisepointV40.read(); |
| | | struCruisepointV40.dwSize = struCruisepointV40.size(); |
| | | struCruisepointV40.write(); |
| | | |
| | | // 错误信息列表 |
| | | IntByReference pInt = new IntByReference(0); |
| | | Pointer lpStatusList = pInt.getPointer(); |
| | | |
| | | boolean flag = hCNetSDK.NET_DVR_GetDeviceConfig(iUserID, 6714, 1, |
| | | struCruisepointCond.getPointer(), struCruisepointCond.size(), lpStatusList, struCruisepointV40.getPointer(), struCruisepointV40.size()); |
| | | if (flag == false) { |
| | | int iErr = hCNetSDK.NET_DVR_GetLastError(); |
| | | System.out.println("NET_DVR_STDXMLConfig失败,错误号:" + iErr); |
| | | return; |
| | | } |
| | | struCruisepointV40.read(); |
| | | } |
| | | |
| | | /** |
| | | * 设备抓图保存到缓冲区 |
| | | * @param iUserID |
| | | */ |
| | | public static void GetPictoPointer(int iUserID) { |
| | | HCNetSDK.NET_DVR_JPEGPARA jpegpara = new HCNetSDK.NET_DVR_JPEGPARA(); |
| | | jpegpara.read(); |
| | | jpegpara.wPicSize = 255; |
| | | jpegpara.wPicQuality = 0; |
| | | jpegpara.write(); |
| | | HCNetSDK.BYTE_ARRAY byte_array = new HCNetSDK.BYTE_ARRAY(10 * 1024 * 1024); |
| | | IntByReference ret = new IntByReference(0); |
| | | boolean b = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(iUserID, 1, jpegpara, byte_array.getPointer(), byte_array.size(), ret); |
| | | if (b == false) { |
| | | System.out.println("抓图失败:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | return; |
| | | } |
| | | byte_array.read(); |
| | | System.out.println("ret:"+ret.getValue()); |
| | | String filePath = ".\\pic\\test.jpg"; // 指定保存文件的路径和名称 |
| | | try { |
| | | WriteBytesToFile(byte_array.byValue,ret.getValue(), filePath); |
| | | System.out.println("图片已成功保存为:" + filePath); |
| | | } catch (IOException e) { |
| | | System.err.println("写入文件时发生错误:" + e.getMessage()); |
| | | e.printStackTrace(); |
| | | } |
| | | System.out.println("抓图成功"); |
| | | return; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 将字节数组写入到指定的文件路径。 |
| | | * |
| | | * @param bytes 字节数组 |
| | | * @param filePath 文件保存路径 |
| | | * @throws IOException 如果文件写入过程中发生错误 |
| | | */ |
| | | private static void WriteBytesToFile(byte[] bytes,int len, String filePath) throws IOException { |
| | | File file = new File(filePath); |
| | | FileOutputStream fos = new FileOutputStream(file); |
| | | |
| | | fos.write(bytes,0,len); |
| | | fos.close(); // 关闭输出流 |
| | | } |
| | | |
| | | /** |
| | | * 这里应该替换为你实际获取字节数组的方法。 |
| | | * 示例中省略具体实现,直接返回null。 |
| | | * |
| | | * @return 图片的字节数组 |
| | | */ |
| | | private static byte[] getYourImageBytes() { |
| | | // 这里应该是从数据库、网络或其他来源获取字节数组的逻辑 |
| | | // 返回示例:null,实际使用时需要替换为有效数据 |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 录像起止时间查询 |
| | | * @param iUserID |
| | | */ |
| | | public static void SearchRecordTime(int iUserID) { |
| | | HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY struRecInq = new HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY(); |
| | | struRecInq.read(); |
| | | struRecInq.dwSize = struRecInq.size(); |
| | | struRecInq.byType = 0; |
| | | struRecInq.write(); |
| | | HCNetSDK.NET_DVR_RECORD_TIME_SPAN struRecSpan = new HCNetSDK.NET_DVR_RECORD_TIME_SPAN(); |
| | | //通道号说明:一般IPC/IPD通道号为1,32路以及以下路数的NVR的IP通道通道号从33开始,64路及以上路数的NVR的IP通道通道号从1开始。 |
| | | if (hCNetSDK.NET_DVR_InquiryRecordTimeSpan(iUserID, 35, struRecInq, struRecSpan) == false) { |
| | | System.out.println("录像起止时间查询失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } else { |
| | | System.out.println("录像起止时间查询成功"); |
| | | struRecSpan.read(); |
| | | System.out.println("开启时间:" + "年:" + struRecSpan.strBeginTime.dwYear + "\n"); |
| | | System.out.println("开启时间:" + "月:" + struRecSpan.strBeginTime.dwMonth + "\n"); |
| | | System.out.println("开启时间:" + "日:" + struRecSpan.strBeginTime.dwDay + "\n"); |
| | | System.out.println("开启时间:" + "时:" + struRecSpan.strBeginTime.dwHour + "\n"); |
| | | System.out.println("停止时间:" + "年:" + struRecSpan.strEndTime.dwYear + "\n"); |
| | | System.out.println("停止时间:" + "月:" + struRecSpan.strEndTime.dwMonth + "\n"); |
| | | System.out.println("停止时间:" + "日:" + struRecSpan.strEndTime.dwDay + "\n"); |
| | | System.out.println("停止时间:" + "时:" + struRecSpan.strEndTime.dwHour + "\n"); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 月历录像查询 |
| | | * @param iUserID |
| | | */ |
| | | public static void GetRecMonth(int iUserID) { |
| | | HCNetSDK.NET_DVR_MRD_SEARCH_PARAM struMrdSeaParam = new HCNetSDK.NET_DVR_MRD_SEARCH_PARAM(); |
| | | struMrdSeaParam.read(); |
| | | struMrdSeaParam.dwSize = struMrdSeaParam.size(); |
| | | struMrdSeaParam.wYear = 2021; |
| | | struMrdSeaParam.byMonth = 1; |
| | | //通道号说明:一般IPC/IPD通道号为1,32路以及以下路数的NVR的IP通道通道号从33开始,64路及以上路数的NVR的IP通道通道号从1开始。 |
| | | struMrdSeaParam.struStreamInfo.dwChannel = 33; |
| | | struMrdSeaParam.write(); |
| | | HCNetSDK.NET_DVR_MRD_SEARCH_RESULT struMrdSeaResu = new HCNetSDK.NET_DVR_MRD_SEARCH_RESULT(); |
| | | struMrdSeaResu.read(); |
| | | struMrdSeaResu.dwSize = struMrdSeaResu.size(); |
| | | struMrdSeaResu.write(); |
| | | IntByReference list = new IntByReference(0); |
| | | boolean b_GetResult = hCNetSDK.NET_DVR_GetDeviceConfig(iUserID, HCNetSDK.NET_DVR_GET_MONTHLY_RECORD_DISTRIBUTION, 0, struMrdSeaParam.getPointer(), |
| | | struMrdSeaParam.size(), list.getPointer(), struMrdSeaResu.getPointer(), struMrdSeaResu.size()); |
| | | if (b_GetResult == false) { |
| | | System.out.println("月历录像查询失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } else { |
| | | struMrdSeaResu.read(); |
| | | for (int i = 0; i <= 32; i++) { |
| | | int day = i + 1; |
| | | System.out.println("" + day + "号是否录像文件" + struMrdSeaResu.byRecordDistribution[i]); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 设备抓图 |
| | | * @param iUserID |
| | | */ |
| | | public static void CaptureJPEGPicture(int iUserID) { |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); |
| | | // String curTime0 = sdf.format(new Date()); |
| | | Boolean result = false; |
| | | int count = 0; |
| | | while (!result) { |
| | | try { |
| | | Thread.sleep(1 * 1000); //设置暂停的时间 5 秒 |
| | | String curTime0 = sdf.format(new Date()); |
| | | count++; |
| | | String filename = ".\\pic\\" + curTime0 + count + ".jpg" + "\0"; |
| | | byte[] fileByte = filename.getBytes("UTF-8"); |
| | | |
| | | HCNetSDK.NET_DVR_JPEGPARA strJpegParm = new HCNetSDK.NET_DVR_JPEGPARA(); |
| | | strJpegParm.read(); |
| | | strJpegParm.wPicSize = 2; |
| | | strJpegParm.wPicQuality = 0; |
| | | strJpegParm.write(); |
| | | boolean b_Cap = hCNetSDK.NET_DVR_CaptureJPEGPicture(iUserID, 1, strJpegParm, fileByte); |
| | | if (b_Cap == false) { |
| | | System.out.println("抓图失败,错误码为:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | return; |
| | | } |
| | | System.out.println(sdf.format(new Date()) + "--循环执行第" + count + "次"); |
| | | if (count == 3) { |
| | | result = true; |
| | | break; |
| | | } |
| | | } catch (InterruptedException e) { |
| | | e.printStackTrace(); |
| | | } catch (UnsupportedEncodingException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | |
New file |
| | |
| | | package com.whyc.hik.Commom; |
| | | |
| | | |
| | | |
| | | import java.io.*; |
| | | |
| | | public class CommonUtil { |
| | | |
| | | //SDK时间解析 |
| | | public static String parseTime(int time) { |
| | | int year = (time >> 26) + 2000; |
| | | int month = (time >> 22) & 15; |
| | | int day = (time >> 17) & 31; |
| | | int hour = (time >> 12) & 31; |
| | | int min = (time >> 6) & 63; |
| | | int second = (time >> 0) & 63; |
| | | String sTime = year + "-" + month + "-" + day + "-" + hour + ":" + min + ":" + second; |
| | | // System.out.println(sTime); |
| | | return sTime; |
| | | |
| | | |
| | | } |
| | | |
| | | //分辨率解析 |
| | | public static String parseResolution(int dwResolution) { |
| | | int interlace = (((dwResolution) >> 28) & 0x1); |
| | | int width = ((((dwResolution) >> 19) & 0x1ff) << 3); //宽 |
| | | int hight = ((((dwResolution) >> 8) & 0x7ff) << 1); //高 |
| | | int fps = ((dwResolution) & 0xff); //帧率 |
| | | String result = width + "*" + hight + "_" + fps; |
| | | return result; |
| | | |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 读取本地文件到数组中 |
| | | * |
| | | * @param filename 本地文件 |
| | | * @return 返回读取到的数据到 byte数组 |
| | | * @throws IOException |
| | | */ |
| | | public static byte[] toByteArray(String filename) throws IOException { |
| | | File file = new File(filename); |
| | | if (!file.exists()) { |
| | | throw new FileNotFoundException(filename); |
| | | } |
| | | ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length()); |
| | | BufferedInputStream in = new BufferedInputStream(new FileInputStream(file)); |
| | | try { |
| | | byte[] buffer = new byte[1024]; |
| | | int len; |
| | | while (-1 != (len = in.read(buffer, 0, buffer.length))) { |
| | | bos.write(buffer, 0, len); |
| | | } |
| | | return bos.toByteArray(); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | throw e; |
| | | } finally { |
| | | bos.close(); |
| | | in.close(); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.whyc.hik.Commom; |
| | | |
| | | public class osSelect { |
| | | |
| | | public static boolean isLinux() { |
| | | return System.getProperty("os.name").toLowerCase().contains("linux"); |
| | | } |
| | | |
| | | public static boolean isWindows() { |
| | | return System.getProperty("os.name").toLowerCase().contains("windows"); |
| | | } |
| | | } |
New file |
| | |
| | | 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 = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + |
| | | "<!--req, 获取JPEG抓图能力时pInBuf参数描述-->\n" + |
| | | "<JpegCaptureAbility version=\"2.0\">\n" + |
| | | " <channelNO>1</channelNO><!--req,通道号-->\n" + |
| | | "</JpegCaptureAbility>"; |
| | | // 输入缓冲区 |
| | | 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()); |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.whyc.hik; |
| | | |
| | | import com.sun.jna.NativeLong; |
| | | import com.sun.jna.Pointer; |
| | | import com.sun.jna.ptr.IntByReference; |
| | | import com.whyc.hik.NetSDKDemo.HCNetSDK; |
| | | |
| | | import java.io.UnsupportedEncodingException; |
| | | |
| | | import static com.whyc.hik.TestDemo.hCNetSDK; |
| | | |
| | | /** |
| | | * @Author: jiangxin14 |
| | | * @Date: 2024-08-24 15:59 |
| | | */ |
| | | public class SdkSysCfg { |
| | | |
| | | public static flowTestcallback flowcallback; //网络流量监测回调函数 |
| | | public static dev_work_state_cb workStateCb; //设备状态回调 |
| | | |
| | | /** |
| | | * PC电脑有多网卡,绑定网卡,指定使用的实际网卡 |
| | | */ |
| | | public static void getandBindIP() { |
| | | HCNetSDK.BYTE_TWODIM[] struByteArray = new HCNetSDK.BYTE_TWODIM[16]; |
| | | IntByReference pInt = new IntByReference(0); |
| | | boolean pEnableBind = false; |
| | | if (!hCNetSDK.NET_DVR_GetLocalIP(struByteArray, pInt, pEnableBind)) { |
| | | System.out.println("NET_DVR_GetLocalIP失败,错误号:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } else { |
| | | int inum = pInt.getValue(); |
| | | for (int i = 0; i < inum; i++) { |
| | | System.out.println("网卡序号:" + i + ", 网卡IP: " + new String(struByteArray[i].strIP).trim()); |
| | | //选择需要绑定的网卡 |
| | | if ("10.9.137.101".equals(new String(struByteArray[i].strIP))) { |
| | | hCNetSDK.NET_DVR_SetValidIP(i, true); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 绑定PC端访问设备的端口访问 |
| | | */ |
| | | //端口绑定 |
| | | public void bindPort() { |
| | | HCNetSDK.NET_DVR_LOCAL_TCP_PORT_BIND_CFG strLocalTcpBind = new HCNetSDK.NET_DVR_LOCAL_TCP_PORT_BIND_CFG(); |
| | | strLocalTcpBind.read(); |
| | | strLocalTcpBind.wLocalBindTcpMinPort = 30000; |
| | | strLocalTcpBind.wLocalBindTcpMaxPort = 30200; |
| | | strLocalTcpBind.write(); |
| | | Pointer pStrLocalTcoBind = strLocalTcpBind.getPointer(); |
| | | if (hCNetSDK.NET_DVR_SetSDKLocalCfg(0, pStrLocalTcoBind) == false) { |
| | | System.out.println("绑定失败,错误码为" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | System.out.println("绑定成功"); |
| | | } |
| | | |
| | | /** |
| | | * 获取与设置设备时间参数 |
| | | * @param iUserID |
| | | */ |
| | | public static void GetandSetDevTime(int iUserID) { |
| | | HCNetSDK.NET_DVR_TIME m_Time = new HCNetSDK.NET_DVR_TIME(); |
| | | Pointer pTime = m_Time.getPointer(); |
| | | IntByReference pInt = new IntByReference(0); |
| | | boolean b_GetTime = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_TIMECFG, 0xffffffff, pTime, m_Time.size(), pInt); |
| | | if (b_GetTime == false) { |
| | | System.out.println("获取时间参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | m_Time.read(); |
| | | System.out.println("年:" + m_Time.dwYear + "月:" + m_Time.dwMonth + "日:" + m_Time.dwDay + "时:" + m_Time.dwHour + |
| | | "分:" + m_Time.dwMinute + "秒:" + m_Time.dwSecond); |
| | | |
| | | //直接把获取到的参数设置回去,如果有需要可以自行修改其中需要修改的字段 |
| | | boolean b_SetPicCfg = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_TIMECFG,0xffffffff, |
| | | m_Time.getPointer(), m_Time.size()); |
| | | if (b_SetPicCfg == false) { |
| | | System.out.println("设置时间失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | else { |
| | | System.out.println("设置时间参数成功"); |
| | | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取用户参数 |
| | | * @param iUserID |
| | | * @throws UnsupportedEncodingException |
| | | */ |
| | | public static void getUsrCfg(int iUserID) throws UnsupportedEncodingException { |
| | | HCNetSDK.NET_DVR_USER_V30 usercfg= new HCNetSDK.NET_DVR_USER_V30(); |
| | | usercfg.dwSize = usercfg.size(); |
| | | Pointer pUserCfg = usercfg.getPointer(); |
| | | NativeLong lChannel = new NativeLong(1); |
| | | IntByReference pInt = new IntByReference(0); |
| | | boolean b_GetUserCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_USERCFG_V30, lChannel.intValue(), |
| | | pUserCfg, usercfg.size(), pInt); |
| | | if (b_GetUserCfg == false) { |
| | | System.out.println("获取用户参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | usercfg.read(); |
| | | //System.out.println("用户名称:" + usercfg.struUser[1].sUserName); |
| | | System.out.println("name: " + new String(usercfg.struUser[0].sUserName,"GBK").trim()); |
| | | System.out.println("password: " + new String(usercfg.struUser[0].sPassword,"GBK").trim()); |
| | | |
| | | } |
| | | |
| | | static class flowTestcallback implements HCNetSDK.FLOWTESTCALLBACK { |
| | | public void invoke(int lFlowHandle, HCNetSDK.NET_DVR_FLOW_INFO pFlowInfo, |
| | | Pointer pUser) { |
| | | pFlowInfo.read(); |
| | | System.out.println("发送的流量数据:" + pFlowInfo.dwSendFlowSize); |
| | | System.out.println("接收的流量数据:" + pFlowInfo.dwRecvFlowSize); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 设备网络流量监测 |
| | | * @param iUserID |
| | | * @throws InterruptedException |
| | | */ |
| | | public void netFlowDec(int iUserID) throws InterruptedException { |
| | | HCNetSDK.NET_DVR_FLOW_TEST_PARAM struFlowPam = new HCNetSDK.NET_DVR_FLOW_TEST_PARAM(); |
| | | struFlowPam.read(); |
| | | struFlowPam.dwSize = struFlowPam.size(); |
| | | struFlowPam.lCardIndex = 0; |
| | | struFlowPam.dwInterval = 1; |
| | | struFlowPam.write(); |
| | | Pointer pUser = null; |
| | | if (flowcallback == null) { |
| | | flowcallback = new flowTestcallback(); |
| | | } |
| | | int FlowHandle = hCNetSDK.NET_DVR_StartNetworkFlowTest(iUserID, struFlowPam, flowcallback, pUser); |
| | | if (FlowHandle <= -1) { |
| | | System.out.println("开启流量检测失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } else { |
| | | System.out.println("开启流量检测成功"); |
| | | } |
| | | Thread.sleep(20000); |
| | | hCNetSDK.NET_DVR_StopNetworkFlowTest(FlowHandle); |
| | | } |
| | | |
| | | /** |
| | | * 球机GIS信息获取,需要特定设置支持 |
| | | * @param iUserID |
| | | */ |
| | | |
| | | public static void GetGisInfo(int iUserID) { |
| | | HCNetSDK.NET_DVR_STD_CONFIG struStdCfg = new HCNetSDK.NET_DVR_STD_CONFIG(); |
| | | HCNetSDK.NET_DVR_GIS_INFO struGisInfo = new HCNetSDK.NET_DVR_GIS_INFO(); |
| | | struStdCfg.read(); |
| | | IntByReference lchannel = new IntByReference(1); |
| | | struStdCfg.lpCondBuffer = lchannel.getPointer(); |
| | | struStdCfg.dwCondSize = 4; |
| | | struStdCfg.lpOutBuffer = struGisInfo.getPointer(); |
| | | struStdCfg.dwOutSize = struGisInfo.size(); |
| | | struStdCfg.write();//设置前之前要write() |
| | | boolean getSTDConfig = hCNetSDK.NET_DVR_GetSTDConfig(iUserID, HCNetSDK.NET_DVR_GET_GISINFO, struStdCfg); |
| | | if (getSTDConfig == false) { |
| | | System.out.println("查询GIS信息失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } else { |
| | | struGisInfo.read(); |
| | | System.out.println("查询成功\n"); |
| | | System.out.println(struGisInfo.struPtzPos.fPanPos + "\n"); |
| | | System.out.println(struGisInfo.struPtzPos.fTiltPos + "\n"); |
| | | System.out.println(struGisInfo.struPtzPos.fZoomPos + "\n"); |
| | | System.out.println(struGisInfo.fHorizontalValue); |
| | | System.out.println(struGisInfo.fVerticalValue); |
| | | } |
| | | |
| | | } |
| | | |
| | | static class dev_work_state_cb implements HCNetSDK.DEV_WORK_STATE_CB { |
| | | public boolean invoke(Pointer pUserdata, int iUserID, HCNetSDK.NET_DVR_WORKSTATE_V40 lpWorkState) { |
| | | |
| | | lpWorkState.read(); |
| | | System.out.println("设备状态:" + lpWorkState.dwDeviceStatic); |
| | | for (int i = 0; i < HCNetSDK.MAX_CHANNUM_V40; i++) { |
| | | int channel = i + 1; |
| | | System.out.println("第" + channel + "通道是否在录像:" + lpWorkState.struChanStatic[i].byRecordStatic); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | } |
| | | |
| | | //定时巡检设备 |
| | | public static void regularInspection() { |
| | | HCNetSDK.NET_DVR_CHECK_DEV_STATE struCheckStatus = new HCNetSDK.NET_DVR_CHECK_DEV_STATE(); |
| | | struCheckStatus.read(); |
| | | struCheckStatus.dwTimeout = 1000; //定时检测设备工作状态,单位:ms,0表示使用默认值(30000),最小值为1000 |
| | | if (workStateCb == null) { |
| | | workStateCb = new dev_work_state_cb(); |
| | | } |
| | | struCheckStatus.fnStateCB = workStateCb; |
| | | struCheckStatus.write(); |
| | | boolean b_state = hCNetSDK.NET_DVR_StartGetDevState(struCheckStatus); |
| | | if (!b_state) { |
| | | System.out.println("定时巡检设备状态失败:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | } |
| | | |
| | | //获取GB28181参数 |
| | | public static void getGB28181Info(int iUserID) { |
| | | |
| | | HCNetSDK.NET_DVR_STREAM_INFO streamInfo = new HCNetSDK.NET_DVR_STREAM_INFO(); |
| | | streamInfo.read(); |
| | | streamInfo.dwSize = streamInfo.size(); //设置结构体大小 |
| | | streamInfo.dwChannel = 1; //设置通道 |
| | | streamInfo.write(); |
| | | Pointer lpInBuffer = streamInfo.getPointer(); |
| | | HCNetSDK.NET_DVR_GBT28181_CHANINFO_CFG gbt28181ChaninfoCfg = new HCNetSDK.NET_DVR_GBT28181_CHANINFO_CFG(); |
| | | gbt28181ChaninfoCfg.read(); |
| | | gbt28181ChaninfoCfg.dwSize = gbt28181ChaninfoCfg.size(); |
| | | gbt28181ChaninfoCfg.write(); |
| | | Pointer lpOutBuffer = gbt28181ChaninfoCfg.getPointer(); |
| | | IntByReference lpBytesReturned = new IntByReference(0); |
| | | //3251对应它的宏定义 |
| | | boolean bRet = hCNetSDK.NET_DVR_GetDeviceConfig(iUserID, 3251, 1, lpInBuffer, |
| | | streamInfo.size(), lpBytesReturned.getPointer(), lpOutBuffer, gbt28181ChaninfoCfg.size()); |
| | | gbt28181ChaninfoCfg.read(); |
| | | |
| | | if (bRet == false) { |
| | | System.out.println("获取失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取码流加密信息 |
| | | * @param iUserID |
| | | */ |
| | | public static void GetAesKeyInfo(int iUserID) { |
| | | HCNetSDK.NET_DVR_AES_KEY_INFO net_dvr_aes_key_info = new HCNetSDK.NET_DVR_AES_KEY_INFO(); |
| | | net_dvr_aes_key_info.read(); |
| | | Pointer pnet_dvr_aes_key_info = net_dvr_aes_key_info.getPointer(); |
| | | IntByReference pInt = new IntByReference(0); |
| | | boolean b_GetCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_AES_KEY, |
| | | 0Xffffffff, pnet_dvr_aes_key_info, net_dvr_aes_key_info.size(), pInt); |
| | | if (b_GetCfg == false) { |
| | | System.out.println("获取码流加密失败 错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | System.out.println("获取码流加密信息成功"); |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.whyc.hik; |
| | | |
| | | import com.sun.jna.Native; |
| | | import com.sun.jna.Pointer; |
| | | import com.whyc.dto.Point; |
| | | import com.whyc.dto.TempPoint; |
| | | import com.whyc.hik.Commom.osSelect; |
| | | import com.whyc.hik.NetSDKDemo.HCNetSDK; |
| | | |
| | | import java.io.FileOutputStream; |
| | | import java.io.IOException; |
| | | import java.io.RandomAccessFile; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.nio.ByteBuffer; |
| | | import java.nio.ByteOrder; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Scanner; |
| | | |
| | | /** |
| | | * @create 2020-07-27-10:42 |
| | | */ |
| | | public class TestDemo { |
| | | static HCNetSDK hCNetSDK = null; |
| | | static int lUserID = -1; //用户句柄 |
| | | public static FExceptionCallBack_Imp fExceptionCallBack; |
| | | |
| | | static class FExceptionCallBack_Imp implements HCNetSDK.FExceptionCallBack { |
| | | public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) { |
| | | System.out.println("异常事件类型:" + dwType); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 动态库加载 |
| | | * |
| | | * @return |
| | | */ |
| | | private static boolean createSDKInstance() { |
| | | if (hCNetSDK == null) { |
| | | synchronized (HCNetSDK.class) { |
| | | String strDllPath = ""; |
| | | try { |
| | | if (osSelect.isWindows()) { |
| | | //win系统加载SDK库路径 |
| | | strDllPath = System.getProperty("user.dir") + "\\src\\main\\resources\\lib\\Hik\\HCNetSDK.dll"; |
| | | } |
| | | else if (osSelect.isLinux()) { |
| | | //Linux系统加载SDK库路径 |
| | | strDllPath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so"; |
| | | } |
| | | hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class); |
| | | } catch (Exception ex) { |
| | | System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage()); |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | public static void main(String[] args) throws IOException, InterruptedException { |
| | | if (hCNetSDK == null) { |
| | | if (!createSDKInstance()) { |
| | | System.out.println("Load SDK fail"); |
| | | return; |
| | | } |
| | | } |
| | | //linux系统建议调用以下接口加载组件库 |
| | | if (osSelect.isLinux()) { |
| | | HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256); |
| | | HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256); |
| | | //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限 |
| | | String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1"; |
| | | String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1"; |
| | | System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length()); |
| | | ptrByteArray1.write(); |
| | | hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_LIBEAY_PATH, ptrByteArray1.getPointer()); |
| | | System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length()); |
| | | ptrByteArray2.write(); |
| | | hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SSLEAY_PATH, ptrByteArray2.getPointer()); |
| | | String strPathCom = System.getProperty("user.dir") + "/lib/"; |
| | | HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH(); |
| | | System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length()); |
| | | struComPath.write(); |
| | | hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SDK_PATH, struComPath.getPointer()); |
| | | } |
| | | |
| | | //SDK初始化,一个程序进程只需要调用一次 |
| | | hCNetSDK.NET_DVR_Init(); |
| | | |
| | | if (fExceptionCallBack == null) { |
| | | fExceptionCallBack = new FExceptionCallBack_Imp(); |
| | | } |
| | | Pointer pUser = null; |
| | | if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, pUser)) { |
| | | return; |
| | | } |
| | | System.out.println("设置异常消息回调成功"); |
| | | |
| | | //启用SDK写日志 |
| | | hCNetSDK.NET_DVR_SetLogToFile(3, "./sdkLog", false); |
| | | |
| | | |
| | | //登录设备,每一台设备只需要登录一次 |
| | | //lUserID = TestDemo.loginDevice("10.9.137.21", (short) 8000, "admin", "Cpfwb518+"); |
| | | lUserID = TestDemo.loginDevice("192.168.10.16", (short) 8000, "admin", "fg001@hdw"); |
| | | //hCNetSDK.NET_DVR_STDXMLConfig(lUserID, "<?xml version=\"1.0\" encoding=\"GB2312\"?><GetDeviceInfo><dwSize>0</dwSize></GetDeviceInfo>", "GetDeviceInfo", 1000); |
| | | |
| | | /*========== 红外 抓图测温 Start==========*/ |
| | | //抓热图 |
| | | HCNetSDK.NET_DVR_JPEGPICTURE_WITH_APPENDDATA m_strJpegWithAppendData = new HCNetSDK.NET_DVR_JPEGPICTURE_WITH_APPENDDATA(); |
| | | m_strJpegWithAppendData.dwSize = m_strJpegWithAppendData.size(); |
| | | HCNetSDK.BYTE_ARRAY ptrJpegByte = new HCNetSDK.BYTE_ARRAY(2*1024*1024); |
| | | HCNetSDK.BYTE_ARRAY ptrP2PDataByte = new HCNetSDK.BYTE_ARRAY(2*1024*1024); |
| | | m_strJpegWithAppendData.pJpegPicBuff = ptrJpegByte.getPointer(); |
| | | m_strJpegWithAppendData.pP2PDataBuff = ptrP2PDataByte.getPointer(); |
| | | m_strJpegWithAppendData.dwJpegPicLen = 2*1024*1024; |
| | | m_strJpegWithAppendData.dwP2PDataLen = 2*1024*1024; |
| | | m_strJpegWithAppendData.write(); |
| | | |
| | | boolean resBoolean = hCNetSDK.NET_DVR_CaptureJPEGPicture_WithAppendData(lUserID, 2, m_strJpegWithAppendData); |
| | | if (resBoolean) { |
| | | System.out.println("抓图成功"); |
| | | //m_strJpegWithAppendData.read(); |
| | | // 定义文件名 |
| | | String cFilename = "Jpegwithappend_1.data"; |
| | | String cFilename2 = "Jpegwithappend_1.csv"; |
| | | |
| | | // 创建文件输出流 |
| | | try (FileOutputStream fos = new FileOutputStream(cFilename)) { |
| | | // 将数据写入文件 |
| | | //fos.write(m_strJpegWithAppendData.pP2PDataBuff, 0, m_strJpegWithAppendData.dwP2PDataLen); |
| | | Pointer pP2PDataBuff = m_strJpegWithAppendData.pP2PDataBuff; |
| | | fos.write(pP2PDataBuff.getByteArray(0, m_strJpegWithAppendData.dwP2PDataLen), 0, m_strJpegWithAppendData.dwP2PDataLen); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); // 捕获并处理异常 |
| | | } |
| | | |
| | | analyzeData(m_strJpegWithAppendData.dwP2PDataLen, cFilename, cFilename2); |
| | | |
| | | |
| | | //获取红外结果并解析 |
| | | }else { |
| | | System.out.printf("抓热图失败:%s",hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | /*========== 红外 抓图测温 End==========*/ |
| | | |
| | | hCNetSDK.NET_DVR_CaptureJPEGPicture_WithAppendData(lUserID,1,null); |
| | | for (boolean exit = false; !exit; ) { |
| | | System.out.println("请输入您想要执行的demo实例! (退出请输入yes)"); |
| | | Scanner input = new Scanner(System.in); |
| | | String str = input.next(); |
| | | // 转换为标准输入 |
| | | str = str.toLowerCase(); |
| | | if (str.equals("yes")) { |
| | | // 退出程序 |
| | | exit = true; |
| | | break; |
| | | } |
| | | switch (str) { |
| | | case "1": |
| | | { |
| | | System.out.println("\n[Module]手动获取设备在线状态"); |
| | | DevManager.getDeviceStatus(lUserID); |
| | | break; |
| | | } |
| | | case "2": |
| | | { |
| | | System.out.println("\n[Module]获取设备工作状态代码"); |
| | | DevManager.getWorkS(lUserID); |
| | | break; |
| | | } |
| | | case "3": |
| | | { |
| | | System.out.println("\n[Module]获取设备基本信息"); |
| | | DevManager.getDeviceInfo(lUserID); |
| | | break; |
| | | } |
| | | |
| | | case "4": |
| | | { |
| | | |
| | | System.out.println("\n[Module]设备抓图代码"); |
| | | ChannelParamCfg.CaptureJPEGPicture(lUserID); |
| | | break; |
| | | } |
| | | case "5": |
| | | { |
| | | //适用NVR等硬盘录像机设备 |
| | | System.out.println("\n[Module]查询设备通道状态代码"); |
| | | ChannelParamCfg.GetIPChannelInfo(lUserID); |
| | | break; |
| | | } |
| | | case "6": |
| | | { |
| | | //获取和设置前端扩展参数 |
| | | System.out.println("\n[Module]获取和设置前端扩展参数"); |
| | | ChannelParamCfg.GetCameraPara(lUserID); |
| | | break; |
| | | } |
| | | case "7": |
| | | { |
| | | //获取和设置网络参数 |
| | | System.out.println("\n[Module]获取和设置网络参数"); |
| | | ChannelParamCfg.GetNetCfg(lUserID); |
| | | break; |
| | | } |
| | | case "8": |
| | | { |
| | | //获取和设置录像参数 |
| | | System.out.println("\n[Module]获取和设置录像参数"); |
| | | ChannelParamCfg.GetRecordCfg(lUserID); |
| | | break; |
| | | } |
| | | case "9": |
| | | { |
| | | //获取和设置图像参数 |
| | | System.out.println("\n[Module]获取和设置图像参数"); |
| | | ChannelParamCfg.GetandSetPicCfg(lUserID); |
| | | break; |
| | | } |
| | | case "10": |
| | | { |
| | | //获取和设置时间参数 |
| | | System.out.println("\n[Module]获取和设置时间参数"); |
| | | SdkSysCfg.GetandSetDevTime(lUserID); |
| | | break; |
| | | } |
| | | case "11": |
| | | { |
| | | //获取设备软硬件能力信息 |
| | | System.out.println("\n[Module]获取设备软硬件能力"); |
| | | DevManager.GetSofthardware_Ability(lUserID); |
| | | break; |
| | | } |
| | | case "12": |
| | | { |
| | | //获取设备JPEG抓图能力 |
| | | System.out.println("\n[Module]获取设备JPEG抓图能力"); |
| | | DevManager.GetJPEG_Cap_Ability(lUserID); |
| | | break; |
| | | } |
| | | case "13": |
| | | { |
| | | //日志查找 |
| | | System.out.println("\n[Module]日志查找"); |
| | | DevManager.FindLog(lUserID); |
| | | break; |
| | | } |
| | | default: |
| | | { |
| | | System.out.println("\n未知的指令操作!请重新输入!\n"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | Thread.sleep(2000); |
| | | //程序退出的时候调用注销登录接口,每一台设备分别调用一次 |
| | | if (hCNetSDK.NET_DVR_Logout(lUserID)) { |
| | | System.out.println("注销成功"); |
| | | } |
| | | |
| | | //释放SDK资源,程序退出时调用,只需要调用一次 |
| | | hCNetSDK.NET_DVR_Cleanup(); |
| | | return; |
| | | } |
| | | |
| | | public static void analyzeData(int dwP2PDataLen, String cFilename, String cFilename2) throws IOException { |
| | | // 打开本地保存的文件 |
| | | String inputFilename = cFilename; |
| | | String outputFilename = cFilename2; |
| | | |
| | | int m_AnalysisHotPic_W = 384; // 根据抓热图接口返回的图像宽dwJpegPicWidth进行赋值 |
| | | int m_AnalysisHotPic_H = 288; // 根据抓热图接口返回的图像高dwJpegPicHeight进行赋值 |
| | | int bufSize = m_AnalysisHotPic_H * m_AnalysisHotPic_W * 4; |
| | | |
| | | try (RandomAccessFile datafilefp = new RandomAccessFile(inputFilename, "r"); |
| | | FileOutputStream fp = new FileOutputStream(outputFilename)) { |
| | | |
| | | // 读取文件里面所有数据 |
| | | byte[] pDataBuf = new byte[bufSize]; |
| | | int bytesRead = datafilefp.read(pDataBuf); |
| | | if (bytesRead != bufSize) { |
| | | System.out.println("Failed to read the entire file"); |
| | | return; |
| | | } |
| | | |
| | | float minTemp = 10000.0f; |
| | | float maxTemp = -10000.0f; |
| | | //存储极值温度的坐标,如果是相同的极值温度,就也同步添加坐标点 |
| | | TempPoint minTempPoint = new TempPoint(); |
| | | TempPoint maxTempPoint = new TempPoint(); |
| | | |
| | | ByteBuffer buffer = ByteBuffer.wrap(pDataBuf); |
| | | buffer.order(ByteOrder.LITTLE_ENDIAN); // 根据实际情况调整字节序 |
| | | |
| | | for (int iWriteHeight = 0; iWriteHeight < m_AnalysisHotPic_H; ++iWriteHeight) { |
| | | for (int iWriteWidth = 0; iWriteWidth < m_AnalysisHotPic_W; ++iWriteWidth) { |
| | | float fTemp = buffer.getFloat(); |
| | | // 判断fTemp是否是一个正常值,不是则赋值最大或最小,防止设备崩溃 |
| | | fTemp = (9999 < fTemp) ? 9999 : ((-9999 > fTemp) ? -9999 : fTemp); |
| | | //只保留以为小数 |
| | | fTemp = BigDecimal.valueOf(fTemp).setScale(1, BigDecimal.ROUND_HALF_UP).floatValue(); |
| | | |
| | | //minTemp = (minTemp > fTemp) ? fTemp : minTemp; |
| | | if(minTemp >= fTemp){ |
| | | minTemp = fTemp; |
| | | //查看存的最低温度是不是当前温度,不是的话,要清空最低温度map, |
| | | //同时把最新的最低温度和坐标保存 |
| | | Float minTempOld = minTempPoint.getTemp(); |
| | | if(minTempOld == null || minTempOld!=minTemp){ //首次赋值 或者 需要重置最低温度 |
| | | minTempPoint.setTemp(minTemp); |
| | | List<Point> points = new ArrayList<>(); |
| | | Point point = new Point(iWriteWidth,iWriteHeight); |
| | | points.add(point); |
| | | minTempPoint.setPoints(points); |
| | | }else { //存在最低温度相同的另外一个点,保存下来进入最低温度列表 |
| | | List<Point> points = minTempPoint.getPoints(); |
| | | points.add(new Point(iWriteWidth,iWriteHeight)); |
| | | } |
| | | } |
| | | //maxTemp = (maxTemp < fTemp) ? fTemp : maxTemp; |
| | | if(maxTemp <= fTemp){ |
| | | maxTemp = fTemp; |
| | | //查看存的最高温度是不是当前温度,不是的话,要清空最高温度map, |
| | | //同时把最新的最高温度和坐标保存 |
| | | Float maxTempOld = maxTempPoint.getTemp(); |
| | | if(maxTempOld == null || maxTempOld!=maxTemp){ //首次赋值 或者 需要重置最高温度 |
| | | maxTempPoint.setTemp(maxTemp); |
| | | List<Point> points = new ArrayList<>(); |
| | | Point point = new Point(iWriteWidth,iWriteHeight); |
| | | points.add(point); |
| | | maxTempPoint.setPoints(points); |
| | | }else { //存在最高温度相同的另外一个点,保存下来进入最高温度列表 |
| | | List<Point> points = maxTempPoint.getPoints(); |
| | | points.add(new Point(iWriteWidth,iWriteHeight)); |
| | | } |
| | | } |
| | | |
| | | String temp = String.format("%.2f,", fTemp); |
| | | |
| | | fp.write(temp.getBytes()); |
| | | } |
| | | |
| | | fp.write("\n".getBytes()); |
| | | } |
| | | |
| | | System.out.println("Min Temperature: " + minTempPoint); |
| | | System.out.println("Max Temperature: " + maxTempPoint); |
| | | |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); // 捕获并处理异常 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 设备登录V30 |
| | | * |
| | | * @param ip 设备IP |
| | | * @param port SDK端口,默认设备的8000端口 |
| | | * @param user 设备用户名 |
| | | * @param psw 设备密码 |
| | | */ |
| | | public static int login_V30(String ip, short port, String user, String psw) { |
| | | HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30(); |
| | | int iUserID = hCNetSDK.NET_DVR_Login_V30(ip, port, user, psw, m_strDeviceInfo); |
| | | System.out.println("UserID:" + lUserID); |
| | | if ((iUserID == -1) || (iUserID == 0xFFFFFFFF)) { |
| | | System.out.println("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError()); |
| | | return iUserID; |
| | | } else { |
| | | System.out.println(ip + ":设备登录成功!"); |
| | | return iUserID; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 登录设备,支持 V40 和 V30 版本,功能一致。 |
| | | * |
| | | * @param ip 设备IP地址 |
| | | * @param port SDK端口,默认为设备的8000端口 |
| | | * @param user 设备用户名 |
| | | * @param psw 设备密码 |
| | | * @return 登录成功返回用户ID,失败返回-1 |
| | | */ |
| | | public static int loginDevice(String ip, short port, String user, String psw) { |
| | | // 创建设备登录信息和设备信息对象 |
| | | HCNetSDK.NET_DVR_USER_LOGIN_INFO loginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO(); |
| | | HCNetSDK.NET_DVR_DEVICEINFO_V40 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40(); |
| | | |
| | | // 设置设备IP地址 |
| | | byte[] deviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN]; |
| | | byte[] ipBytes = ip.getBytes(); |
| | | System.arraycopy(ipBytes, 0, deviceAddress, 0, Math.min(ipBytes.length, deviceAddress.length)); |
| | | loginInfo.sDeviceAddress = deviceAddress; |
| | | |
| | | // 设置用户名和密码 |
| | | byte[] userName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN]; |
| | | byte[] password = psw.getBytes(); |
| | | System.arraycopy(user.getBytes(), 0, userName, 0, Math.min(user.length(), userName.length)); |
| | | System.arraycopy(password, 0, loginInfo.sPassword, 0, Math.min(password.length, loginInfo.sPassword.length)); |
| | | loginInfo.sUserName = userName; |
| | | |
| | | // 设置端口和登录模式 |
| | | loginInfo.wPort = port; |
| | | loginInfo.bUseAsynLogin = false; // 同步登录 |
| | | loginInfo.byLoginMode = 0; // 使用SDK私有协议 |
| | | |
| | | // 执行登录操作 |
| | | int userID = hCNetSDK.NET_DVR_Login_V40(loginInfo, deviceInfo); |
| | | if (userID == -1) { |
| | | System.err.println("登录失败,错误码为: " + hCNetSDK.NET_DVR_GetLastError()); |
| | | } else { |
| | | System.out.println(ip + " 设备登录成功!"); |
| | | // 处理通道号逻辑 |
| | | int startDChan = deviceInfo.struDeviceV30.byStartDChan; |
| | | System.out.println("预览起始通道号: " + startDChan); |
| | | } |
| | | return userID; // 返回登录结果 |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | |
New file |
| | |
| | | package com.whyc.service; |
| | | |
| | | import com.sun.jna.Native; |
| | | import com.sun.jna.Pointer; |
| | | import com.whyc.dto.Point; |
| | | import com.whyc.dto.Response; |
| | | import com.whyc.dto.TempPoint; |
| | | import com.whyc.hik.ChannelParamCfg; |
| | | import com.whyc.hik.Commom.osSelect; |
| | | import com.whyc.hik.DevManager; |
| | | import com.whyc.hik.NetSDKDemo.HCNetSDK; |
| | | import com.whyc.hik.SdkSysCfg; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.io.FileOutputStream; |
| | | import java.io.IOException; |
| | | import java.io.RandomAccessFile; |
| | | import java.math.BigDecimal; |
| | | import java.nio.ByteBuffer; |
| | | import java.nio.ByteOrder; |
| | | import java.util.*; |
| | | |
| | | @Service |
| | | public class HikTempService { |
| | | |
| | | |
| | | |
| | | static HCNetSDK hCNetSDK = null; |
| | | static int lUserID = -1; //用户句柄 |
| | | public static FExceptionCallBack_Imp fExceptionCallBack; |
| | | |
| | | public Response getTempPoint(String ip) throws IOException, InterruptedException { |
| | | if (hCNetSDK == null) { |
| | | if (!createSDKInstance()) { |
| | | System.out.println("Load SDK fail"); |
| | | return new Response().set(1,false,"Load SDK fail"); |
| | | } |
| | | } |
| | | //linux系统建议调用以下接口加载组件库 |
| | | if (osSelect.isLinux()) { |
| | | HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256); |
| | | HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256); |
| | | //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限 |
| | | String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1"; |
| | | String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1"; |
| | | System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length()); |
| | | ptrByteArray1.write(); |
| | | hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_LIBEAY_PATH, ptrByteArray1.getPointer()); |
| | | System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length()); |
| | | ptrByteArray2.write(); |
| | | hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SSLEAY_PATH, ptrByteArray2.getPointer()); |
| | | String strPathCom = System.getProperty("user.dir") + "/lib/"; |
| | | HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH(); |
| | | System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length()); |
| | | struComPath.write(); |
| | | hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SDK_PATH, struComPath.getPointer()); |
| | | } |
| | | |
| | | //SDK初始化,一个程序进程只需要调用一次 |
| | | hCNetSDK.NET_DVR_Init(); |
| | | |
| | | if (fExceptionCallBack == null) { |
| | | fExceptionCallBack = new FExceptionCallBack_Imp(); |
| | | } |
| | | Pointer pUser = null; |
| | | if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, pUser)) { |
| | | return new Response().set(1,false,"设置异常消息回调失败"); |
| | | } |
| | | System.out.println("设置异常消息回调成功"); |
| | | |
| | | //启用SDK写日志 |
| | | hCNetSDK.NET_DVR_SetLogToFile(3, "./sdkLog", false); |
| | | |
| | | |
| | | //登录设备,每一台设备只需要登录一次 |
| | | //lUserID = TestDemo.loginDevice("10.9.137.21", (short) 8000, "admin", "Cpfwb518+"); |
| | | lUserID = HikTempService.loginDevice("192.168.10.16", (short) 8000, "admin", "fg001@hdw"); |
| | | //hCNetSDK.NET_DVR_STDXMLConfig(lUserID, "<?xml version=\"1.0\" encoding=\"GB2312\"?><GetDeviceInfo><dwSize>0</dwSize></GetDeviceInfo>", "GetDeviceInfo", 1000); |
| | | |
| | | /*========== 红外 抓图测温 Start==========*/ |
| | | //抓热图 |
| | | HCNetSDK.NET_DVR_JPEGPICTURE_WITH_APPENDDATA m_strJpegWithAppendData = new HCNetSDK.NET_DVR_JPEGPICTURE_WITH_APPENDDATA(); |
| | | m_strJpegWithAppendData.dwSize = m_strJpegWithAppendData.size(); |
| | | HCNetSDK.BYTE_ARRAY ptrJpegByte = new HCNetSDK.BYTE_ARRAY(2*1024*1024); |
| | | HCNetSDK.BYTE_ARRAY ptrP2PDataByte = new HCNetSDK.BYTE_ARRAY(2*1024*1024); |
| | | m_strJpegWithAppendData.pJpegPicBuff = ptrJpegByte.getPointer(); |
| | | m_strJpegWithAppendData.pP2PDataBuff = ptrP2PDataByte.getPointer(); |
| | | m_strJpegWithAppendData.dwJpegPicLen = 2*1024*1024; |
| | | m_strJpegWithAppendData.dwP2PDataLen = 2*1024*1024; |
| | | m_strJpegWithAppendData.write(); |
| | | Map<String, TempPoint> tempPointMap; |
| | | boolean resBoolean = hCNetSDK.NET_DVR_CaptureJPEGPicture_WithAppendData(lUserID, 2, m_strJpegWithAppendData); |
| | | if (resBoolean) { |
| | | System.out.println("抓图成功"); |
| | | //m_strJpegWithAppendData.read(); |
| | | // 定义文件名 |
| | | String cFilename = "Jpegwithappend_"+ip+".data"; |
| | | String cFilename2 = "Jpegwithappend_"+ip+".csv"; |
| | | |
| | | // 创建文件输出流 |
| | | FileOutputStream fos = new FileOutputStream(cFilename); |
| | | // 将数据写入文件 |
| | | //fos.write(m_strJpegWithAppendData.pP2PDataBuff, 0, m_strJpegWithAppendData.dwP2PDataLen); |
| | | Pointer pP2PDataBuff = m_strJpegWithAppendData.pP2PDataBuff; |
| | | fos.write(pP2PDataBuff.getByteArray(0, m_strJpegWithAppendData.dwP2PDataLen), 0, m_strJpegWithAppendData.dwP2PDataLen); |
| | | |
| | | //获取红外结果并解析 |
| | | tempPointMap = analyzeData(m_strJpegWithAppendData.dwP2PDataLen, cFilename, cFilename2); |
| | | }else { |
| | | System.out.printf("抓热图失败:%s",hCNetSDK.NET_DVR_GetLastError()); |
| | | return new Response().set(1,false,String.format("抓热图失败:%s",hCNetSDK.NET_DVR_GetLastError())); |
| | | } |
| | | /*========== 红外 抓图测温 End==========*/ |
| | | /*for (boolean exit = false; !exit; ) { |
| | | System.out.println("请输入您想要执行的demo实例! (退出请输入yes)"); |
| | | Scanner input = new Scanner(System.in); |
| | | String str = input.next(); |
| | | // 转换为标准输入 |
| | | str = str.toLowerCase(); |
| | | if (str.equals("yes")) { |
| | | // 退出程序 |
| | | exit = true; |
| | | break; |
| | | } |
| | | switch (str) { |
| | | case "1": |
| | | { |
| | | System.out.println("\n[Module]手动获取设备在线状态"); |
| | | DevManager.getDeviceStatus(lUserID); |
| | | break; |
| | | } |
| | | case "2": |
| | | { |
| | | System.out.println("\n[Module]获取设备工作状态代码"); |
| | | DevManager.getWorkS(lUserID); |
| | | break; |
| | | } |
| | | case "3": |
| | | { |
| | | System.out.println("\n[Module]获取设备基本信息"); |
| | | DevManager.getDeviceInfo(lUserID); |
| | | break; |
| | | } |
| | | |
| | | case "4": |
| | | { |
| | | |
| | | System.out.println("\n[Module]设备抓图代码"); |
| | | ChannelParamCfg.CaptureJPEGPicture(lUserID); |
| | | break; |
| | | } |
| | | case "5": |
| | | { |
| | | //适用NVR等硬盘录像机设备 |
| | | System.out.println("\n[Module]查询设备通道状态代码"); |
| | | ChannelParamCfg.GetIPChannelInfo(lUserID); |
| | | break; |
| | | } |
| | | case "6": |
| | | { |
| | | //获取和设置前端扩展参数 |
| | | System.out.println("\n[Module]获取和设置前端扩展参数"); |
| | | ChannelParamCfg.GetCameraPara(lUserID); |
| | | break; |
| | | } |
| | | case "7": |
| | | { |
| | | //获取和设置网络参数 |
| | | System.out.println("\n[Module]获取和设置网络参数"); |
| | | ChannelParamCfg.GetNetCfg(lUserID); |
| | | break; |
| | | } |
| | | case "8": |
| | | { |
| | | //获取和设置录像参数 |
| | | System.out.println("\n[Module]获取和设置录像参数"); |
| | | ChannelParamCfg.GetRecordCfg(lUserID); |
| | | break; |
| | | } |
| | | case "9": |
| | | { |
| | | //获取和设置图像参数 |
| | | System.out.println("\n[Module]获取和设置图像参数"); |
| | | ChannelParamCfg.GetandSetPicCfg(lUserID); |
| | | break; |
| | | } |
| | | case "10": |
| | | { |
| | | //获取和设置时间参数 |
| | | System.out.println("\n[Module]获取和设置时间参数"); |
| | | SdkSysCfg.GetandSetDevTime(lUserID); |
| | | break; |
| | | } |
| | | case "11": |
| | | { |
| | | //获取设备软硬件能力信息 |
| | | System.out.println("\n[Module]获取设备软硬件能力"); |
| | | DevManager.GetSofthardware_Ability(lUserID); |
| | | break; |
| | | } |
| | | case "12": |
| | | { |
| | | //获取设备JPEG抓图能力 |
| | | System.out.println("\n[Module]获取设备JPEG抓图能力"); |
| | | DevManager.GetJPEG_Cap_Ability(lUserID); |
| | | break; |
| | | } |
| | | case "13": |
| | | { |
| | | //日志查找 |
| | | System.out.println("\n[Module]日志查找"); |
| | | DevManager.FindLog(lUserID); |
| | | break; |
| | | } |
| | | default: |
| | | { |
| | | System.out.println("\n未知的指令操作!请重新输入!\n"); |
| | | } |
| | | } |
| | | }*/ |
| | | |
| | | //程序退出的时候调用注销登录接口,每一台设备分别调用一次 |
| | | if (hCNetSDK.NET_DVR_Logout(lUserID)) { |
| | | System.out.println("注销成功"); |
| | | } |
| | | |
| | | //释放SDK资源,程序退出时调用,只需要调用一次 |
| | | hCNetSDK.NET_DVR_Cleanup(); |
| | | return new Response().setII(1,true,tempPointMap,null); |
| | | } |
| | | |
| | | static class FExceptionCallBack_Imp implements HCNetSDK.FExceptionCallBack { |
| | | public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) { |
| | | System.out.println("异常事件类型:" + dwType); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 动态库加载 |
| | | * |
| | | * @return |
| | | */ |
| | | private static boolean createSDKInstance() { |
| | | if (hCNetSDK == null) { |
| | | synchronized (HCNetSDK.class) { |
| | | String strDllPath = ""; |
| | | try { |
| | | if (osSelect.isWindows()) { |
| | | //win系统加载SDK库路径 |
| | | strDllPath = System.getProperty("user.dir") + "\\src\\main\\resources\\lib\\Hik\\HCNetSDK.dll"; |
| | | } |
| | | else if (osSelect.isLinux()) { |
| | | //Linux系统加载SDK库路径 |
| | | strDllPath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so"; |
| | | } |
| | | hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class); |
| | | } catch (Exception ex) { |
| | | System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage()); |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | public Map<String,TempPoint> analyzeData(int dwP2PDataLen, String cFilename, String cFilename2) throws IOException { |
| | | Map<String,TempPoint> tempMap = new HashMap<String, TempPoint>(); |
| | | // 打开本地保存的文件 |
| | | String inputFilename = cFilename; |
| | | String outputFilename = cFilename2; |
| | | |
| | | int m_AnalysisHotPic_W = 384; // 根据抓热图接口返回的图像宽dwJpegPicWidth进行赋值 |
| | | int m_AnalysisHotPic_H = 288; // 根据抓热图接口返回的图像高dwJpegPicHeight进行赋值 |
| | | int bufSize = m_AnalysisHotPic_H * m_AnalysisHotPic_W * 4; |
| | | |
| | | try (RandomAccessFile datafilefp = new RandomAccessFile(inputFilename, "r"); |
| | | FileOutputStream fp = new FileOutputStream(outputFilename)) { |
| | | |
| | | // 读取文件里面所有数据 |
| | | byte[] pDataBuf = new byte[bufSize]; |
| | | int bytesRead = datafilefp.read(pDataBuf); |
| | | if (bytesRead != bufSize) { |
| | | System.out.println("Failed to read the entire file"); |
| | | return tempMap; |
| | | } |
| | | |
| | | float minTemp = 10000.0f; |
| | | float maxTemp = -10000.0f; |
| | | //存储极值温度的坐标,如果是相同的极值温度,就也同步添加坐标点 |
| | | TempPoint minTempPoint = new TempPoint(); |
| | | TempPoint maxTempPoint = new TempPoint(); |
| | | |
| | | ByteBuffer buffer = ByteBuffer.wrap(pDataBuf); |
| | | buffer.order(ByteOrder.LITTLE_ENDIAN); // 根据实际情况调整字节序 |
| | | |
| | | for (int iWriteHeight = 0; iWriteHeight < m_AnalysisHotPic_H; ++iWriteHeight) { |
| | | for (int iWriteWidth = 0; iWriteWidth < m_AnalysisHotPic_W; ++iWriteWidth) { |
| | | float fTemp = buffer.getFloat(); |
| | | // 判断fTemp是否是一个正常值,不是则赋值最大或最小,防止设备崩溃 |
| | | fTemp = (9999 < fTemp) ? 9999 : ((-9999 > fTemp) ? -9999 : fTemp); |
| | | //只保留以为小数 |
| | | fTemp = BigDecimal.valueOf(fTemp).setScale(1, BigDecimal.ROUND_HALF_UP).floatValue(); |
| | | |
| | | //minTemp = (minTemp > fTemp) ? fTemp : minTemp; |
| | | if(minTemp >= fTemp){ |
| | | minTemp = fTemp; |
| | | //查看存的最低温度是不是当前温度,不是的话,要清空最低温度map, |
| | | //同时把最新的最低温度和坐标保存 |
| | | Float minTempOld = minTempPoint.getTemp(); |
| | | if(minTempOld == null || minTempOld!=minTemp){ //首次赋值 或者 需要重置最低温度 |
| | | minTempPoint.setTemp(minTemp); |
| | | List<Point> points = new ArrayList<>(); |
| | | Point point = new Point(iWriteWidth,iWriteHeight); |
| | | points.add(point); |
| | | minTempPoint.setPoints(points); |
| | | }else { //存在最低温度相同的另外一个点,保存下来进入最低温度列表 |
| | | List<Point> points = minTempPoint.getPoints(); |
| | | points.add(new Point(iWriteWidth,iWriteHeight)); |
| | | } |
| | | } |
| | | //maxTemp = (maxTemp < fTemp) ? fTemp : maxTemp; |
| | | if(maxTemp <= fTemp){ |
| | | maxTemp = fTemp; |
| | | //查看存的最高温度是不是当前温度,不是的话,要清空最高温度map, |
| | | //同时把最新的最高温度和坐标保存 |
| | | Float maxTempOld = maxTempPoint.getTemp(); |
| | | if(maxTempOld == null || maxTempOld!=maxTemp){ //首次赋值 或者 需要重置最高温度 |
| | | maxTempPoint.setTemp(maxTemp); |
| | | List<Point> points = new ArrayList<>(); |
| | | Point point = new Point(iWriteWidth,iWriteHeight); |
| | | points.add(point); |
| | | maxTempPoint.setPoints(points); |
| | | }else { //存在最高温度相同的另外一个点,保存下来进入最高温度列表 |
| | | List<Point> points = maxTempPoint.getPoints(); |
| | | points.add(new Point(iWriteWidth,iWriteHeight)); |
| | | } |
| | | } |
| | | |
| | | String temp = String.format("%.2f,", fTemp); |
| | | |
| | | fp.write(temp.getBytes()); |
| | | } |
| | | |
| | | fp.write("\n".getBytes()); |
| | | } |
| | | |
| | | System.out.println("Min Temperature: " + minTempPoint); |
| | | System.out.println("Max Temperature: " + maxTempPoint); |
| | | tempMap.put("minTempPoint",minTempPoint); |
| | | tempMap.put("maxTempPoint",maxTempPoint); |
| | | } |
| | | |
| | | return tempMap; |
| | | } |
| | | |
| | | /** |
| | | * 设备登录V30 |
| | | * |
| | | * @param ip 设备IP |
| | | * @param port SDK端口,默认设备的8000端口 |
| | | * @param user 设备用户名 |
| | | * @param psw 设备密码 |
| | | */ |
| | | public static int login_V30(String ip, short port, String user, String psw) { |
| | | HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30(); |
| | | int iUserID = hCNetSDK.NET_DVR_Login_V30(ip, port, user, psw, m_strDeviceInfo); |
| | | System.out.println("UserID:" + lUserID); |
| | | if ((iUserID == -1) || (iUserID == 0xFFFFFFFF)) { |
| | | System.out.println("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError()); |
| | | return iUserID; |
| | | } else { |
| | | System.out.println(ip + ":设备登录成功!"); |
| | | return iUserID; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 登录设备,支持 V40 和 V30 版本,功能一致。 |
| | | * |
| | | * @param ip 设备IP地址 |
| | | * @param port SDK端口,默认为设备的8000端口 |
| | | * @param user 设备用户名 |
| | | * @param psw 设备密码 |
| | | * @return 登录成功返回用户ID,失败返回-1 |
| | | */ |
| | | public static int loginDevice(String ip, short port, String user, String psw) { |
| | | // 创建设备登录信息和设备信息对象 |
| | | HCNetSDK.NET_DVR_USER_LOGIN_INFO loginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO(); |
| | | HCNetSDK.NET_DVR_DEVICEINFO_V40 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40(); |
| | | |
| | | // 设置设备IP地址 |
| | | byte[] deviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN]; |
| | | byte[] ipBytes = ip.getBytes(); |
| | | System.arraycopy(ipBytes, 0, deviceAddress, 0, Math.min(ipBytes.length, deviceAddress.length)); |
| | | loginInfo.sDeviceAddress = deviceAddress; |
| | | |
| | | // 设置用户名和密码 |
| | | byte[] userName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN]; |
| | | byte[] password = psw.getBytes(); |
| | | System.arraycopy(user.getBytes(), 0, userName, 0, Math.min(user.length(), userName.length)); |
| | | System.arraycopy(password, 0, loginInfo.sPassword, 0, Math.min(password.length, loginInfo.sPassword.length)); |
| | | loginInfo.sUserName = userName; |
| | | |
| | | // 设置端口和登录模式 |
| | | loginInfo.wPort = port; |
| | | loginInfo.bUseAsynLogin = false; // 同步登录 |
| | | loginInfo.byLoginMode = 0; // 使用SDK私有协议 |
| | | |
| | | // 执行登录操作 |
| | | int userID = hCNetSDK.NET_DVR_Login_V40(loginInfo, deviceInfo); |
| | | if (userID == -1) { |
| | | System.err.println("登录失败,错误码为: " + hCNetSDK.NET_DVR_GetLastError()); |
| | | } else { |
| | | System.out.println(ip + " 设备登录成功!"); |
| | | // 处理通道号逻辑 |
| | | int startDChan = deviceInfo.struDeviceV30.byStartDChan; |
| | | System.out.println("预览起始通道号: " + startDChan); |
| | | } |
| | | return userID; // 返回登录结果 |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | |