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("获取码流加密信息成功"); } }