package com.netsdk.demo.customize; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.callback.impl.DefaultHaveReconnectCallBack; import com.netsdk.lib.enumeration.EM_SLOPE_RESULT; import com.netsdk.lib.structure.*; import com.sun.jna.Memory; import com.sun.jna.Pointer; import java.io.File; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; import static com.netsdk.lib.Utils.getOsPrefix; public class ThermalImagingDemo { // SDk对象初始化 public static final NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE; public static final NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE; //通道号 private static int nChannel = 1; // 判断是否初始化 private static boolean bInit = false; // 判断log是否打开 private static boolean bLogOpen = false; // 设备信息 private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); // 登录句柄 private NetSDKLib.LLong loginHandle = new NetSDKLib.LLong(0); //实现断线重连静态单例 public static class DefaultDisconnectCallback implements NetSDKLib.fDisConnect { private static volatile DefaultDisconnectCallback INSTANCE; private DefaultDisconnectCallback() {} public static DefaultDisconnectCallback getINSTANCE() { if (INSTANCE == null) { synchronized (DefaultDisconnectCallback.class){ if (INSTANCE == null){ INSTANCE = new DefaultDisconnectCallback(); } } } return INSTANCE; } @Override public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("Device[%s] Port[%d] DisConnected!\n", pchDVRIP, nDVRPort); } } // 回调函数需要是静态的,防止被系统回收 // 断线回调 private static NetSDKLib.fDisConnect disConnectCB = MultiTalkDevDemo.DefaultDisconnectCallback.getINSTANCE(); // 重连回调 private static NetSDKLib.fHaveReConnect haveReConnectCB = DefaultHaveReconnectCallBack.getINSTANCE(); // 编码格式 public static String encode; static { String osPrefix = getOsPrefix(); if (osPrefix.toLowerCase().startsWith("win32-amd64")) { encode = "GBK"; } else if (osPrefix.toLowerCase().startsWith("linux-amd64")) { encode = "UTF-8"; } } /** * 按照指定格式,获取当前时间 */ public static String getDate() { SimpleDateFormat simpleDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return simpleDate.format(new Date()).replaceAll("[^0-9]", "-"); } /** * 初始化SDK库 */ public static boolean initSdk() { bInit = netsdk.CLIENT_Init(disConnectCB, null);// 进程启动时,初始化一次 if (!bInit) { System.out.println("Initialize SDK failed"); return false; } // 配置日志 enableLog(); // 设置断线重连回调接口, 此操作为可选操作,但建议用户进行设置 netsdk.CLIENT_SetAutoReconnect(haveReConnectCB, null); // 设置登录超时时间和尝试次数,可选 // 登录请求响应超时时间设置为3S int waitTime = 3000; //单位为ms // 登录时尝试建立链接 1 次 int tryTimes = 1; // 设置连接设备超时时间和尝试次数 netsdk.CLIENT_SetConnectTime(waitTime, tryTimes); // 设置更多网络参数, NET_PARAM 的nWaittime , nConnectTryNum 成员与 CLIENT_SetConnectTime // 接口设置的登录设备超时时间和尝试次数意义相同,可选 NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM(); // 登录时尝试建立链接的超时时间 netParam.nConnectTime = 10000; // 设置子连接的超时时间 netParam.nGetConnInfoTime = 3000; //设置登陆网络环境 netsdk.CLIENT_SetNetworkParam(netParam); return true; } /** * 打开 sdk log */ private static void enableLog() { // SDK全局日志打印信息 NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO(); //设置日志路径 File path = new File("sdklog/"); //判断日志路径是否存在,若不存在则创建 if (!path.exists()){ path.mkdir(); } // 这里的log保存地址依据实际情况自己调整 String logPath = path.getAbsoluteFile().getParent() + "\\sdklog\\" + "sdklog" + getDate() + ".log"; //日志输出策略,0:输出到文件(默认); 1:输出到窗口, setLog.nPrintStrategy = 0; //是否重设日志路径, 取值0否 ,1是 setLog.bSetFilePath = 1; //日志路径(默认"./sdk_log/sdk_log.log") byte[] szLogFilePath = setLog.szLogFilePath; //自定义log保存地址,将数据logPath数据copy到LOG_SET_PRINT_INFO-->szLogFilePath变量中 System.arraycopy(logPath.getBytes(), 0, szLogFilePath, 0, logPath.getBytes().length); //是否重设日志打印输出策略 取值0否 ,1是 setLog.bSetPrintStrategy = 1; // 打开日志功能 bLogOpen = netsdk.CLIENT_LogOpen(setLog); if (!bLogOpen){ System.err.println("Failed to open NetSDK log "+ ToolKits.getErrorCode()); }else { System.out.println("Success to open NetSDK log "); } } /** * 高安全登录 */ public void loginWithHighLevel() { // 输入结构体参数 NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstlnParam = new NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY() { { // IP szIP = m_strIpAddr.getBytes(); // 端口 nPort = m_nPort; // 用户名 szUserName = m_strUser.getBytes(); // 密码 szPassword = m_strPassword.getBytes(); } }; // 登录的输出结构体参数 NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam = new NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY(); // 高安全级别登陆 loginHandle = netsdk.CLIENT_LoginWithHighLevelSecurity(pstlnParam, pstOutParam); if (loginHandle.longValue() == 0) { //登陆失败 System.err.printf("Login Device[%s] Port[%d]Failed. %s\n", m_strIpAddr, m_nPort, ToolKits.getErrorCode()); } else { //登陆成功 // 获取设备信息 deviceInfo = pstOutParam.stuDeviceInfo; System.out.printf("Login Success Device Address[%s] 设备包含[%d]个通道 \n",m_strIpAddr,deviceInfo.byChanNum); } } /** * 退出 */ public void logOut() { //判断是否已登录 if (loginHandle.longValue() != 0) { netsdk.CLIENT_Logout(loginHandle); System.out.println("LogOut Success"); } } /** * 清理sdk环境并退出 */ public static void cleanAndExit() { //判断log是否打开 if (bLogOpen) { // 关闭sdk日志打印 netsdk.CLIENT_LogClose(); } // 进程关闭时,调用一次 netsdk.CLIENT_Cleanup(); System.exit(0); } /** * 初始化测试 */ public void initTest() { initSdk(); this.loginWithHighLevel(); } /** * 结束测试 */ public void endTest() { System.out.println("End Test"); this.logOut(); // 登出设备 System.out.println("See You..."); cleanAndExit(); // 清理资源并退出 } public void runTest() { System.out.println("Run Test"); CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this, "获取当前预置点下对应的温度信息", "getCurTemperAll")); menu.addItem(new CaseMenu.Item(this, "更新预置点下的测温规则", "setRadiometryRule")); menu.run(); } public void getCurTemperAll(){ // 入参 NET_IN_RADIOMETRY_GET_CUR_TEMPER_ALL_INFO inPut = new NET_IN_RADIOMETRY_GET_CUR_TEMPER_ALL_INFO(); inPut.nChannel = nChannel; inPut.write(); // 出参 NET_OUT_RADIOMETRY_GET_CUR_TEMPER_ALL_INFO outPut = new NET_OUT_RADIOMETRY_GET_CUR_TEMPER_ALL_INFO(); int nMaxTempInfoNum = 10;//最大区域数 outPut.nMaxTempInfoNum = nMaxTempInfoNum; // 初始化 NET_RADIOMETRY_TEMP_INFO[] tempInfos = new NET_RADIOMETRY_TEMP_INFO[nMaxTempInfoNum]; for (int i = 0; i < nMaxTempInfoNum; i++) { tempInfos[i] = new NET_RADIOMETRY_TEMP_INFO(); } outPut.pstTempInfo = new Memory( tempInfos[0].size() * nMaxTempInfoNum); outPut.pstTempInfo.clear(tempInfos[0].size() * nMaxTempInfoNum); outPut.write(); boolean ret = netsdk.CLIENT_RadiometryGetCurTemperAll(loginHandle , inPut.getPointer() , outPut.getPointer() , 3000); if(ret) { System.out.println("CLIENT_RadiometryGetCurTemperAll Success \n"); } else { System.out.println("CLIENT_RadiometryGetCurTemperAll Failed \n" + ToolKits.getErrorCode()); return; } inPut.read(); outPut.read(); ToolKits.GetPointerDataToStructArr(outPut.pstTempInfo, tempInfos); for (int i = 0;i < outPut.nRetTempInfoNum; i++){ try { System.out.println("第" + i + "组数据"); System.out.println("实际返回的规则温度信息数量:" + outPut.nRetTempInfoNum); System.out.println("测温类型:" + new String(tempInfos[i].szType ,encode)); System.out.println("温度单位:" + new String(tempInfos[i].szTemperatureUnit ,encode)); System.out.println("规则名称:" + new String(tempInfos[i].szName ,encode)); System.out.println("点的温度或者平均温度:" + tempInfos[i].fTemperAver); System.out.println("最高温度:" + tempInfos[i].fTemperMax); System.out.println("最低温度:" + tempInfos[i].fTemperMin); System.out.println("预置点编号:" + tempInfos[i].nPresetId); System.out.println("规则编号:" + tempInfos[i].nRuleId); System.out.println("规则框里面黑体靶面大小:" + tempInfos[i].nBlackBodySize); NET_IN_RADIOMETRY_GET_TEMPER_INFO inPutTempInfo = new NET_IN_RADIOMETRY_GET_TEMPER_INFO(); NET_OUT_RADIOMETRY_GET_TEMPER_INFO outPutTempInfo = new NET_OUT_RADIOMETRY_GET_TEMPER_INFO(); inPutTempInfo.stCondition.szName = tempInfos[i].szName;//测温类型 inPutTempInfo.stCondition.nPresetId = tempInfos[i].nPresetId;//预置点编号 inPutTempInfo.stCondition.nRuleId = tempInfos[i].nRuleId;//规则编号 inPutTempInfo.stCondition.nChannel = nChannel;//通道号 String type = new String(tempInfos[i].szType,encode).trim();//测温类型 System.out.println("type:" + type); if(("Area").equals(type)){ inPutTempInfo.stCondition.emType = 2; }else if("Line".equals(type)){ inPutTempInfo.stCondition.emType = 3; }else if("Spot".equals(type)){ inPutTempInfo.stCondition.emType = 1; } inPutTempInfo.write(); outPutTempInfo.write(); int nWaitTime = 3000; ret = netsdk.CLIENT_RadiometryGetTemper(loginHandle,inPutTempInfo.getPointer(), outPutTempInfo.getPointer(), nWaitTime); if(ret) { System.out.println("getCurTemper Success \n"); } else { System.out.println("getCurTemper Failed \n" + ToolKits.getErrorCode()); } inPutTempInfo.read(); outPutTempInfo.read(); ToolKits.GetPointerData(outPutTempInfo.getPointer(), outPutTempInfo); try { System.out.println("测温类型:" + new String(outPutTempInfo.stTempInfo.szType ,encode)); System.out.println("温度单位:" + new String(outPutTempInfo.stTempInfo.szTemperatureUnit ,encode)); System.out.println("规则名称:" + new String(outPutTempInfo.stTempInfo.szName ,encode)); System.out.println("点的温度或者平均温度:" + outPutTempInfo.stTempInfo.fTemperAver); System.out.println("最高温度:" + outPutTempInfo.stTempInfo.fTemperMax); System.out.println("最低温度:" + outPutTempInfo.stTempInfo.fTemperMin); System.out.println("预置点编号:" + outPutTempInfo.stTempInfo.nPresetId); System.out.println("规则编号:" + outPutTempInfo.stTempInfo.nRuleId); System.out.println("规则框里面黑体靶面大小:" + outPutTempInfo.stTempInfo.nBlackBodySize); System.out.println("-----------------------------------"); }catch (UnsupportedEncodingException e){ System.out.println(e.toString()); } }catch (UnsupportedEncodingException e){ System.out.println(e.toString()); } } } public void setRadiometryRule(){ NET_IN_SET_RADIOMETRY_RULE_INFO inPut = new NET_IN_SET_RADIOMETRY_RULE_INFO(); NET_OUT_SET_RADIOMETRY_RULE_INFO outPut = new NET_OUT_SET_RADIOMETRY_RULE_INFO(); // 通道号 inPut.nChannel = 1; // 预置点 inPut.nPresetId = 1; // 规则编号 inPut.nRuleId = 12; // 测温点报警个数 inPut.stuRuleInfo.nAlarmSettingNum = 1; // 报警条件,"Below", 低于;"Match", 匹配;"Above" 高于 String szAlarmCondition="Below"; ToolKits.StringToByteArr(szAlarmCondition,inPut.stuRuleInfo.stuAlarmSetting[0].szAlarmCondition); // 阈值温度持续时间,单位:秒 inPut.stuRuleInfo.stuAlarmSetting[0].nDuration = 30; // 是否开启该点报警 inPut.stuRuleInfo.stuAlarmSetting[0].bEnable = 1; // 温度误差,应该表示正负误差在0.1范围内 inPut.stuRuleInfo.stuAlarmSetting[0].fHysteresis = 0.1f; // 报警唯一编号 inPut.stuRuleInfo.stuAlarmSetting[0].nId = 0; // 预报警温度持续时间;单位:秒 inPut.stuRuleInfo.stuAlarmSetting[0].nPreDuration = 30; // 预报警阈值 inPut.stuRuleInfo.stuAlarmSetting[0].fPreThreshold = 30; // 测温报警结果 String szResult="Value"; ToolKits.StringToByteArr(szResult,inPut.stuRuleInfo.stuAlarmSetting[0].szResult); // 斜率报警采样类型;平均值、最小值,最大值;,参见枚举定义 {@link com.netsdk.lib.enumeration.EM_SLOPE_RESULT} inPut.stuRuleInfo.stuAlarmSetting[0].emSlopeResult = EM_SLOPE_RESULT.getValueByNote("平均值"); // 报警阈值温度/温度斜率(每分钟) inPut.stuRuleInfo.stuAlarmSetting[0].fThreshold = 20; // 区域测温的子类型 String szAreaSubType="Polygon"; ToolKits.StringToByteArr(szAreaSubType,inPut.stuRuleInfo.szAreaSubType); // 测温使能 inPut.stuRuleInfo.bEnable = 1; // 物体距离(小数部分) inPut.stuRuleInfo.stuLocalParameters.fDistanceDecimalPart = 0; // 是否启用本地配置 inPut.stuRuleInfo.stuLocalParameters.bEnable = 1; // 目标距离 inPut.stuRuleInfo.stuLocalParameters.nObjectDistance = 2; // 目标辐射系数 inPut.stuRuleInfo.stuLocalParameters.fObjectEmissivity = 0.97f; // 目标反射温度 inPut.stuRuleInfo.stuLocalParameters.fReflectedTemp = 25; // 测温点坐标个数 inPut.stuRuleInfo.nCoordinatesNum = 1; inPut.stuRuleInfo.stuCoordinates[0].nx = 4379; inPut.stuRuleInfo.stuCoordinates[0].ny = 4390; // 自定义名称 String szName="spot11"; ToolKits.StringToByteArr(szName,inPut.stuRuleInfo.szName); // 温度采样周期 inPut.stuRuleInfo.nT = 3; // 测温的类型 String szType="Spot"; ToolKits.StringToByteArr(szType,inPut.stuRuleInfo.szType); inPut.write(); outPut.write(); boolean ret = netsdk.CLIENT_SetRadiometryRule(loginHandle , inPut.getPointer() , outPut.getPointer() , 3000); if(ret) { System.out.println("CLIENT_SetRadiometryRule Success \n"); } else { System.out.println("CLIENT_SetRadiometryRule Failed \n" + ToolKits.getErrorCode()); return; } } // 配置登陆地址,端口,用户名,密码 private String m_strIpAddr = "10.35.248.68"; private int m_nPort = 37777; private String m_strUser = "admin"; private String m_strPassword = "admin123"; public static void main(String[] args) { ThermalImagingDemo demo=new ThermalImagingDemo(); demo.initTest(); demo.runTest(); demo.endTest(); } }