package com.netsdk.demo.customize; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.Arrays; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.ImageAlgLib; import com.netsdk.lib.LibraryLoad; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.NetSDKLib.*; import com.netsdk.lib.structure.NET_IN_RADIOMETRY_RANDOM_REGION_TEMPER; import com.netsdk.lib.structure.NET_OUT_RADIOMETRY_RANDOM_REGION_TEMPER; import com.sun.jna.Memory; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; // 热成像 public class Radiometry { static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE; static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE; static ImageAlgLib imageAlgApi = ImageAlgLib.imageAlgApi; //////////////////////////////////////////////////////////////// // String m_strIp = "172.11.4.18"; // 热成像 172.32.101.81 172.12.18.22 172.12.4.85 172.32.102.146 String m_strIp = "10.35.248.168"; // 172.32.103.7 172.32.103.3 int m_nPort = 37777; String m_strUser = "admin"; String m_strPassword = "admin123"; //////////////////////////////////////////////////////////////// private int nQueryChannel = 1; private NetSDKLib.NET_DEVICEINFO_Ex deviceinfo = new NetSDKLib.NET_DEVICEINFO_Ex(); private static LLong loginHandle = new LLong(0); //登陆句柄 private static LLong m_lRadiometryHandle = new LLong(0); private static final int MAX_QUERY_PRESET_NUM = 20; // 目前设置的最大查询预置点个数,根据实际调整 // 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数 public static class fDisConnectCB implements NetSDKLib.fDisConnect{ public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){ System.out.printf("Device[%s] Port[%d] Disconnect!\n" , pchDVRIP , nDVRPort); } } // 网络连接恢复,设备重连成功回调 // 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数 public static class HaveReConnect implements NetSDKLib.fHaveReConnect { public void invoke(LLong loginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); } } private static fDisConnectCB m_DisConnectCB = new fDisConnectCB(); private static HaveReConnect haveReConnect = new HaveReConnect(); public void EndTest() { System.out.println("End Test"); if( loginHandle.longValue() != 0) { netsdkApi.CLIENT_Logout(loginHandle); } System.out.println("See You..."); netsdkApi.CLIENT_Cleanup(); System.exit(0); } public void InitTest() { // 初始化SDK库, 在启动工程的时候调用,只需要调用一次即可,属于初始化sdk的库 netsdkApi.CLIENT_Init(m_DisConnectCB, null); // 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作 // 此操作为可选操作,但建议用户进行设置 netsdkApi.CLIENT_SetAutoReconnect(haveReConnect, null); //设置登录超时时间和尝试次数,可选 int waitTime = 5000; //登录请求响应超时时间设置为5S int tryTimes = 3; //登录时尝试建立链接3次 netsdkApi.CLIENT_SetConnectTime(waitTime, tryTimes); // 设置更多网络参数,NET_PARAM的nWaittime,nConnectTryNum成员与CLIENT_SetConnectTime // 接口设置的登录设备超时时间和尝试次数意义相同,可选 NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM(); netParam.nConnectTime = 10000; //登录时尝试建立链接的超时时间 netsdkApi.CLIENT_SetNetworkParam(netParam); // 打开日志,可选 NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO(); File path = new File("."); String logPath = path.getAbsoluteFile().getParent() + "\\sdk_log\\" + System.currentTimeMillis() + ".log"; setLog.bSetFilePath = 1; System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length); setLog.bSetPrintStrategy = 1; setLog.nPrintStrategy = 0; boolean bLogopen = netsdkApi.CLIENT_LogOpen(setLog); if (!bLogopen) { System.err.println("Failed to open NetSDK log !!!"); } // 向设备登入 int nSpecCap = 0; Pointer pCapParam = null; IntByReference nError = new IntByReference(0); loginHandle = netsdkApi.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser , m_strPassword ,nSpecCap,pCapParam, deviceinfo,nError); if(loginHandle.longValue() != 0) { System.out.printf("Login Device[%s] Port[%d]Success!\n" , m_strIp , m_nPort); } else { System.out.printf("Login Device[%s] Port[%d]Fail.Last Error[0x%x]\n" , m_strIp , m_nPort , netsdkApi.CLIENT_GetLastError()); // 此方法里的 netsdkApi.CLIENT_Cleanup(); 在关闭工程的时候调用 EndTest(); } } /** * 获取接口错误码 * @return */ public String getErrorCode() { return " { error code: ( 0x80000000|" + (netsdkApi.CLIENT_GetLastError() & 0x7fffffff) +" ). 参考 NetSDKLib.java }"; } /** * 获取测温区域的参数值 */ public void RadiometryGetRandomRegionTemper(){ NET_IN_RADIOMETRY_RANDOM_REGION_TEMPER stIn = new NET_IN_RADIOMETRY_RANDOM_REGION_TEMPER(); NET_OUT_RADIOMETRY_RANDOM_REGION_TEMPER stOut = new NET_OUT_RADIOMETRY_RANDOM_REGION_TEMPER(); stIn.nChannel = 1; stIn.nPointNum = 1; stIn.stuPolygon[0].nx = 100; stIn.stuPolygon[0].ny = 100; stIn.write(); stOut.write(); boolean bet = netsdkApi.CLIENT_RadiometryGetRandomRegionTemper(loginHandle,stIn.getPointer(),stOut.getPointer(), 3000); stIn.read(); stOut.read(); if(bet) { System.out.println("获取测温区域的参数值成功" ); System.out.println("温度单位:" + stOut.stuRegionTempInfo.emTemperatureUnit); System.out.println("平均温度:" + stOut.stuRegionTempInfo.nTemperAver); System.out.println("最高温度:" + stOut.stuRegionTempInfo.nTemperMax); System.out.println("最低温度:" + stOut.stuRegionTempInfo.nTemperMin); System.out.println("最高温坐标:" + stOut.stuRegionTempInfo.stuTemperMaxPoint.nx + ":" + stOut.stuRegionTempInfo.stuTemperMaxPoint.ny); System.out.println("最低温坐标:" + stOut.stuRegionTempInfo.stuTemperMinPoint.nx + ":" + stOut.stuRegionTempInfo.stuTemperMinPoint.ny); }else { System.err.println("获取测温区域的参数值失败," + getErrorCode()); } } /** * 订阅温度分布数据(热图) */ public void RadiometryAttach() { /* * 入参 */ NET_IN_RADIOMETRY_ATTACH stIn = new NET_IN_RADIOMETRY_ATTACH(); stIn.nChannel = nQueryChannel; // 通道号 stIn.cbNotify = RadiometryAttachCB.getInstance(); // 回调函数 /* * 出参 */ NET_OUT_RADIOMETRY_ATTACH stOut = new NET_OUT_RADIOMETRY_ATTACH(); m_lRadiometryHandle = netsdkApi.CLIENT_RadiometryAttach(loginHandle, stIn, stOut, 3000); if(m_lRadiometryHandle.longValue() != 0) { System.out.println("订阅温度分布数据成功!"); } else { System.err.println("订阅温度分布数据失败, " + getErrorCode()); } } /** * 开始获取热图数据 */ String[] status = {"未知", "空闲", "获取热图中"}; public void RadiometryFetch() { /* * 入参 */ NET_IN_RADIOMETRY_FETCH stIn = new NET_IN_RADIOMETRY_FETCH(); stIn.nChannel = nQueryChannel; // 通道号 /* * 出参 */ NET_OUT_RADIOMETRY_FETCH stOut = new NET_OUT_RADIOMETRY_FETCH(); if(netsdkApi.CLIENT_RadiometryFetch(loginHandle, stIn, stOut, 3000)) { System.out.println("开始获取热图数据, 状态 : " + status[stOut.nStatus]); }else { System.err.println("开始获取热图数据失败, " + getErrorCode()); } } /** * 订阅回调 */ private static class RadiometryAttachCB implements fRadiometryAttachCB { private RadiometryAttachCB() {} private static class RadiometryAttachCBHolder { private static RadiometryAttachCB instance = new RadiometryAttachCB(); } public static RadiometryAttachCB getInstance() { return RadiometryAttachCBHolder.instance; } @Override public void invoke(LLong lAttachHandle, final NET_RADIOMETRY_DATA pBuf, int nBufLen, Pointer dwUser) { /*new Thread() { final NET_RADIOMETRY_DATA stuData = pBuf; public void run() { try { sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } dealRadiometryData(stuData); // 此处同步处理,如需异步,需要拷贝pBuf }; }.start();*/ dealRadiometryData(pBuf); // 此处同步处理,如需异步,需要拷贝pBuf } } /** * 处理回调数据(热图) */ private static void dealRadiometryData(NET_RADIOMETRY_DATA pBuf) { System.out.println(" 解析开始 "); int nWidth = pBuf.stMetaData.nWidth; int nHeight = pBuf.stMetaData.nHeight; System.out.println("nWidth " + nWidth + " nHeight " + nHeight); System.out.println("time " + pBuf.stMetaData.stTime.toStringTime()); short[] pGrayImg = new short[nWidth * nHeight]; float[] pTempForPixels = new float[nWidth * nHeight]; if(netsdkApi.CLIENT_RadiometryDataParse(pBuf, pGrayImg, pTempForPixels)) { byte[] pYData = new byte[nWidth*nHeight*2]; imageAlgApi.drcTable(pGrayImg, (short)nWidth, (short)nHeight, 0, pYData, null); ToolKits.savePicture(pYData, "./RAW.yuv"); Arrays.sort(pTempForPixels); System.out.println("最低温度:"+pTempForPixels[0]); System.out.println("最高温度:"+pTempForPixels[nWidth * nHeight-1]); } else { System.err.println("解析失败"); return; } System.out.println(" 解析完成 "); } /** * 取消订阅温度分布数据 */ public void RadiometryDetach() { if(m_lRadiometryHandle.longValue() != 0) { netsdkApi.CLIENT_RadiometryDetach(m_lRadiometryHandle); m_lRadiometryHandle.setValue(0); } } /** * 查询热成像预设信息 */ public void QueryPresetInfo() { int nQueryType = NetSDKLib.NET_QUERY_DEV_THERMO_GRAPHY_PRESET; // 入参 NET_IN_THERMO_GET_PRESETINFO stIn = new NET_IN_THERMO_GET_PRESETINFO(); stIn.nChannel = nQueryChannel; stIn.emMode = NET_THERMO_MODE.NET_THERMO_MODE_DEFAULT; // 默认 // 出参 NET_OUT_THERMO_GET_PRESETINFO stOut = new NET_OUT_THERMO_GET_PRESETINFO(); stIn.write(); stOut.write(); boolean bRet = netsdkApi.CLIENT_QueryDevInfo(loginHandle, nQueryType, stIn.getPointer(), stOut.getPointer(), null, 3000); if(bRet) { stOut.read(); PrintStruct.FIELD_NOT_PRINT = "stCustomRegions"; PrintStruct.print(stOut); } else { System.err.println("QueryDev Failed!" + ToolKits.getErrorCode()); } } /** * 查询热成像感兴趣区域信息 */ public void QueryOptRegion() { int nQueryType = NetSDKLib.NET_QUERY_DEV_THERMO_GRAPHY_OPTREGION; // 入参 NET_IN_THERMO_GET_OPTREGION stIn = new NET_IN_THERMO_GET_OPTREGION(); stIn.nChannel = nQueryChannel; // 出参 NET_OUT_THERMO_GET_OPTREGION stOut = new NET_OUT_THERMO_GET_OPTREGION(); stIn.write(); stOut.write(); boolean bRet = netsdkApi.CLIENT_QueryDevInfo(loginHandle, nQueryType, stIn.getPointer(), stOut.getPointer(), null, 3000); if(bRet) { stOut.read(); PrintStruct.print(stOut); } else { System.err.println("QueryDev Failed!" + ToolKits.getErrorCode()); } } /** * 查询热成像外部系统信息 */ public void QueryExtSysInfo() { int nQueryType = NetSDKLib.NET_QUERY_DEV_THERMO_GRAPHY_EXTSYSINFO; // 入参 NET_IN_THERMO_GET_EXTSYSINFO stIn = new NET_IN_THERMO_GET_EXTSYSINFO(); stIn.nChannel = nQueryChannel; // 出参 NET_OUT_THERMO_GET_EXTSYSINFO stOut = new NET_OUT_THERMO_GET_EXTSYSINFO(); stIn.write(); stOut.write(); boolean bRet = netsdkApi.CLIENT_QueryDevInfo(loginHandle, nQueryType, stIn.getPointer(), stOut.getPointer(), null, 3000); if(bRet) { stOut.read(); PrintStruct.print(stOut); } else { System.err.println("QueryDev Failed!" + ToolKits.getErrorCode()); } } /** * 查询测温点的参数值 */ public void QueryPointTemper() { int nQueryType = NetSDKLib.NET_QUERY_DEV_RADIOMETRY_POINT_TEMPER; // 入参 NET_IN_RADIOMETRY_GETPOINTTEMPER stIn = new NET_IN_RADIOMETRY_GETPOINTTEMPER(); stIn.nChannel = nQueryChannel; stIn.stCoordinate.nx = 10; stIn.stCoordinate.nx = 10; // 出参 NET_OUT_RADIOMETRY_GETPOINTTEMPER stOut = new NET_OUT_RADIOMETRY_GETPOINTTEMPER(); stIn.write(); stOut.write(); boolean bRet = netsdkApi.CLIENT_QueryDevInfo(loginHandle, nQueryType, stIn.getPointer(), stOut.getPointer(), null, 3000); if(bRet) { stOut.read(); PrintStruct.print(stOut); } else { System.err.println("QueryDev Failed!" + ToolKits.getErrorCode()); } } /** * 查询测温项的参数值 */ public void QueryGetTemper() { int nQueryType = NetSDKLib.NET_QUERY_DEV_RADIOMETRY_TEMPER; // 入参 NET_IN_RADIOMETRY_GETTEMPER stIn = new NET_IN_RADIOMETRY_GETTEMPER(); stIn.stCondition.nPresetId = 1; stIn.stCondition.nRuleId = 0; stIn.stCondition.nMeterType = NET_RADIOMETRY_METERTYPE.NET_RADIOMETRY_METERTYPE_AREA; stIn.stCondition.nChannel = nQueryChannel; // 出参 NET_OUT_RADIOMETRY_GETTEMPER stOut = new NET_OUT_RADIOMETRY_GETTEMPER(); stIn.write(); stOut.write(); boolean bRet = netsdkApi.CLIENT_QueryDevInfo(loginHandle, nQueryType, stIn.getPointer(), stOut.getPointer(), null, 3000); if(bRet) { stOut.read(); PrintStruct.print(stOut); } else { System.err.println("QueryDev Failed!" + ToolKits.getErrorCode()); } } /** * 热成像摄像头属性配置 */ public boolean ConfigThermographyOptions() { String command = NetSDKLib.CFG_CMD_THERMO_GRAPHY; CFG_THERMOGRAPHY_INFO cfg = new CFG_THERMOGRAPHY_INFO(); if(ToolKits.GetDevConfig(loginHandle, nQueryChannel, command, cfg)) { // 获取 PrintStruct.FIELD_NOT_PRINT = "stCustomRegions"; PrintStruct.print(cfg); if(ToolKits.SetDevConfig(loginHandle, nQueryChannel, command, cfg)) { System.out.println("设置热成像摄像头属性成功!"); return true; } else { System.err.println("设置热成像摄像头属性失败!" + ToolKits.getErrorCode()); } } else { System.err.println("获取热成像摄像头属性失败!" + ToolKits.getErrorCode()); } return false; } /** * 获取当前云台的预置点列表 */ public void GetPresetList() { int nType = NetSDKLib.NET_DEVSTATE_PTZ_PRESET_LIST; NET_PTZ_PRESET_LIST stuPresetList = new NET_PTZ_PRESET_LIST(); NET_PTZ_PRESET[] arrPreset = new NET_PTZ_PRESET[MAX_QUERY_PRESET_NUM]; for(int i = 0; i < arrPreset.length; i++) { arrPreset[i] = new NET_PTZ_PRESET(); } stuPresetList.dwMaxPresetNum = arrPreset.length; int nMemoryLen = arrPreset[0].size() * stuPresetList.dwMaxPresetNum; stuPresetList.pstuPtzPorsetList = new Memory(nMemoryLen); // 申请内存 stuPresetList.pstuPtzPorsetList.clear(nMemoryLen); ToolKits.SetStructArrToPointerData(arrPreset, stuPresetList.pstuPtzPorsetList); // 将数组内存拷贝到Pointer stuPresetList.write(); IntByReference intRetLen = new IntByReference(); // if(netsdkApi.CLIENT_QueryDevState(loginHandle, // nType, // stuPresetList.getPointer(), // stuPresetList.size(), // intRetLen, // 5000)) { if (netsdkApi.CLIENT_QueryRemotDevState(loginHandle, nType, nQueryChannel, stuPresetList.getPointer(), stuPresetList.size(), intRetLen, 5000)) { stuPresetList.read(); ToolKits.GetPointerDataToStructArr(stuPresetList.pstuPtzPorsetList, arrPreset); System.out.println("返回预置点个数: " + stuPresetList.dwRetPresetNum); for (int i = 0; i < stuPresetList.dwRetPresetNum; ++i) { try { System.out.println(new String(arrPreset[i].szName, "GBK")); } catch (UnsupportedEncodingException e) { System.out.println(new String(arrPreset[i].szName)); } // PrintStruct.print(arrPreset[i]); } } else { System.err.println("QueryDevState Failed!" + ToolKits.getErrorCode()); } } /** * 设置预置点 */ public void SetPreset() { int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_SET_CONTROL; int nPresetIndex = 7; // 预置点值,从1开始 String name = "Preset7"; // 预置点名称 TIPS:热成像预置点名称无法修改 if(PTZControl(dwPTZCommand, 0, nPresetIndex, 0, 0, ToolKits.GetGBKStringToPointer(name))) { System.out.println("SetPreset success!"); } else { System.err.println("SetPreset Failed!" + ToolKits.getErrorCode()); } } /** * 转至预置点 */ public void MovePreset() { int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_MOVE_CONTROL; int nPresetIndex = 7; // 预置点值,从1开始 if(PTZControl(dwPTZCommand, 0, nPresetIndex, 0, 0, null)) { System.out.println("MovePreset success!"); } else { System.err.println("MovePreset Failed!" + ToolKits.getErrorCode()); } } /** * 删除预置点 */ public void DeletePreset() { int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_DEL_CONTROL; int nPresetIndex = 7; // 预置点值,从1开始 if(PTZControl(dwPTZCommand, 0, nPresetIndex, 0, 0, null)) { System.out.println("DeletePreset success!"); } else { System.err.println("DeletePreset Failed!" + ToolKits.getErrorCode()); } } /** * 加入预置点到巡航 */ public void AddToLoop() { int dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_ADDTOLOOP; int nTourGroup = 1; // 巡航线路(0-7) int nPresetIndex = 7; // 预置点值,从1开始 if(PTZControl(dwPTZCommand, nTourGroup, nPresetIndex, 0, 0, null)) { System.out.println("AddToLoop success!"); } else { System.err.println("AddToLoop Failed!" + ToolKits.getErrorCode()); } } /** * 删除巡航中预置点 */ public void DeleteFromLoop() { int dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_DELFROMLOOP; int nTourGroup = 1; // 巡航线路(0-7) int nPresetIndex = 7; // 预置点值,从1开始 if(PTZControl(dwPTZCommand, nTourGroup, nPresetIndex, 0, 0, null)) { System.out.println("DeleteFromLoop success!"); } else { System.err.println("DeleteFromLoop Failed!" + ToolKits.getErrorCode()); } } /** * 清除巡航巡航线路 */ public void ClearLoop() { int dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_CLOSELOOP; int nTourGroup = 1; // 巡航线路(0-7) if(PTZControl(dwPTZCommand, nTourGroup, 0, 0, 0, null)) { System.out.println("ClearLoop success!"); } else { System.err.println("ClearLoop Failed!" + ToolKits.getErrorCode()); } } /** * 开始点间巡航 */ public void StartTour() { int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_LOOP_CONTROL; int nTourGroup = 1; // 巡航线路(0-7) if(PTZControl(dwPTZCommand, nTourGroup, 0, 76, 0, null)) { System.out.println("StartTour success!"); } else { System.err.println("StartTour Failed!" + ToolKits.getErrorCode()); } } /** * 停止点间巡航 */ public void StopTour() { int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_LOOP_CONTROL; int nTourGroup = 1; // 巡航线路(0-7) if(PTZControl(dwPTZCommand, nTourGroup, 0, 96, 0, null)) { System.out.println("StopTour success!"); } else { System.err.println("StopTour Failed!" + ToolKits.getErrorCode()); } } public void OpenLamp() { int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LAMP_CONTROL; int open = 0x01; if(PTZControl(dwPTZCommand, open, 0, 0, 0, null)) { System.out.println("OpenLamp success!"); } else { System.err.println("OpenLamp Failed!" + ToolKits.getErrorCode()); } } public void CloseLamp() { int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LAMP_CONTROL; int close = 0x00; if(PTZControl(dwPTZCommand, close, 0, 0, 0, null)) { System.out.println("CloseLamp success!"); } else { System.err.println("CloseLamp Failed!" + ToolKits.getErrorCode()); } } public boolean PTZControl(int dwPTZCommand, int lParam1, int lParam2, int lParam3, int dwStop, Pointer param4) { return netsdkApi.CLIENT_DHPTZControlEx2(loginHandle, nQueryChannel, dwPTZCommand, lParam1, lParam2, lParam3, dwStop,param4); } /** * 热成像测温规则配置 */ public void ConfigThermometryRule() { String command = NetSDKLib.CFG_CMD_THERMOMETRY_RULE; CFG_RADIOMETRY_RULE_INFO cfg = new CFG_RADIOMETRY_RULE_INFO(); if(ToolKits.GetDevConfig(loginHandle, nQueryChannel, command, cfg)) { // 获取 // PrintStruct.FIELD_NOT_PRINT = "stCoordinates nCoordinateCnt nSamplePeriod stAlarmSetting nAlarmSettingCnt stLocalParameters emAreaSubType"; // PrintStruct.print(cfg); String []arrMeterType = {"未知", "点", "线", "区域"}; for (int i = 0; i < cfg.nCount; ++i) { try { System.out.printf("预置点编号:%-2d 规则编号:%-2d 名称:%s 测温模式:%s\n", cfg.stRule[i].nPresetId, cfg.stRule[i].nRuleId, new String(cfg.stRule[i].szName, "GBK").trim(), arrMeterType[cfg.stRule[i].nMeterType]); }catch(Exception e) { } } /*if(ToolKits.SetDevConfig(loginHandle, nQueryChannel, command, cfg)) { System.out.println("设置热成像测温规则成功!"); } else { System.err.println("设置热成像测温规则失败!" + ToolKits.getErrorCode()); }*/ } else { System.err.println("获取热成像测温规则配置失败!" + ToolKits.getErrorCode()); } } /** * 温度统计配置 */ public void ConfigTemperatureStatistics() { String command = NetSDKLib.CFG_CMD_TEMP_STATISTICS; CFG_TEMP_STATISTICS_INFO cfg = new CFG_TEMP_STATISTICS_INFO(); if(ToolKits.GetDevConfig(loginHandle, nQueryChannel, command, cfg)) { // 获取 PrintStruct.print(cfg); if(ToolKits.SetDevConfig(loginHandle, nQueryChannel, command, cfg)) { System.out.println("设置温度统计成功!"); } else { System.err.println("设置温度统计失败!" + ToolKits.getErrorCode()); } } else { System.err.println("获取温度统计配置失败!" + ToolKits.getErrorCode()); } } /** * 热成像测温全局配置 */ public void ConfigHeatImagingThermometry() { String command = NetSDKLib.CFG_CMD_THERMOMETRY; CFG_THERMOMETRY_INFO cfg = new CFG_THERMOMETRY_INFO(); if(ToolKits.GetDevConfig(loginHandle, nQueryChannel, command, cfg)) { // 获取 PrintStruct.print(cfg); if(ToolKits.SetDevConfig(loginHandle, nQueryChannel, command, cfg)) { System.out.println("设置热成像测温全局配置成功!"); } else { System.err.println("设置热成像测温全局配置失败!" + ToolKits.getErrorCode()); } } else { System.err.println("获取热成像测温全局配置失败!" + ToolKits.getErrorCode()); } } // 获取远程设备的信息 public void GetCameraInfo() { int []statusTable = new int[deviceinfo.byChanNum]; Arrays.fill(statusTable, -1); //初始化状态为-1 if (!getCameraState(statusTable)) { System.out.println("获取状态信息失败!"); } String []nameTable = new String[deviceinfo.byChanNum]; if(!getChannelName(nameTable)) { System.out.println("获取通道名称失败!"); } int cameraCount = deviceinfo.byChanNum; // 通道号个数 NetSDKLib.NET_MATRIX_CAMERA_INFO[] cameraInfo = new NetSDKLib.NET_MATRIX_CAMERA_INFO[cameraCount]; for(int i = 0; i < cameraCount; i++) { cameraInfo[i] = new NetSDKLib.NET_MATRIX_CAMERA_INFO(); } // 入参 NetSDKLib.NET_IN_MATRIX_GET_CAMERAS inMatrix = new NetSDKLib.NET_IN_MATRIX_GET_CAMERAS(); // 出参 NetSDKLib.NET_OUT_MATRIX_GET_CAMERAS outMatrix = new NetSDKLib.NET_OUT_MATRIX_GET_CAMERAS(); outMatrix.nMaxCameraCount = cameraCount; outMatrix.pstuCameras = new Memory(cameraInfo[0].size() * cameraCount); outMatrix.pstuCameras.clear(cameraInfo[0].size() * cameraCount); ToolKits.SetStructArrToPointerData(cameraInfo, outMatrix.pstuCameras); // 将数组内存拷贝到Pointer if(netsdkApi.CLIENT_MatrixGetCameras(loginHandle, inMatrix, outMatrix, 5000)) { ToolKits.GetPointerDataToStructArr(outMatrix.pstuCameras, cameraInfo); // 将 Pointer 的内容 输出到 数组 String []arrStatusName = {"未知", "正在连接", "已连接", "未连接", "通道未配置,无信息", "通道有配置,但被禁用"}; int i = 0; for(int j = 0; j < outMatrix.nRetCameraCount; j++) { if(cameraInfo[j].bRemoteDevice == 0) { // 过滤远程设备 System.err.println("非远程设备过滤..."); continue; } int emConnectionState = statusTable[cameraInfo[j].nUniqueChannel]; if (emConnectionState == -1 || emConnectionState == EM_CAMERA_STATE_TYPE.EM_CAMERA_STATE_TYPE_UNKNOWN || emConnectionState == EM_CAMERA_STATE_TYPE.EM_CAMERA_STATE_TYPE_EMPTY) { // 只显示能获取设备状态的 continue; } // System.out.println("————————————第 " + (++i) + " 个 远程设备————————————"); // PrintStruct.print(cameraInfo[j]); try { System.out.println("通道: " + cameraInfo[j].nUniqueChannel); // System.out.println("通道名称: " + new String(cameraInfo[j].szName, "GBK")); System.out.println("通道名称: " + nameTable[cameraInfo[j].nUniqueChannel]); System.out.println("状态: " + arrStatusName[emConnectionState]); System.out.println("Ip地址: " + new String(cameraInfo[j].stuRemoteDevice.szIp)); System.out.println("端口: " + cameraInfo[j].stuRemoteDevice.nPort); System.out.println("设备名称: " + new String(cameraInfo[j].stuRemoteDevice.szDevName, "GBK")); System.out.println("远程通道号: " + cameraInfo[j].nChannelID); System.out.println("设备类型: " + new String(cameraInfo[j].stuRemoteDevice.szDevClass)); System.out.println("设备具体类型: " + new String(cameraInfo[j].stuRemoteDevice.szDevType)); // System.out.println("是否支持云台控制: " + getPtzEnable(cameraInfo[j].nUniqueChannel)); System.out.println(); }catch(Exception e) { } } } else { System.err.println("MatrixGetCameras Failed." + ToolKits.getErrorCode()); } } private boolean getCameraState(int []statusTable) { int nQueryType = NetSDKLib.NET_QUERY_GET_CAMERA_STATE; NET_CAMERA_STATE_INFO[] arrStatus = new NET_CAMERA_STATE_INFO[deviceinfo.byChanNum]; for(int i = 0; i < arrStatus.length; i++) { arrStatus[i] = new NET_CAMERA_STATE_INFO(); } // 入参 NET_IN_GET_CAMERA_STATEINFO stIn = new NET_IN_GET_CAMERA_STATEINFO(); stIn.bGetAllFlag = 1; // 全部 // 出参 NET_OUT_GET_CAMERA_STATEINFO stOut = new NET_OUT_GET_CAMERA_STATEINFO(); stOut.nMaxNum = deviceinfo.byChanNum; stOut.pCameraStateInfo = new Memory(arrStatus[0].size() * deviceinfo.byChanNum); stOut.pCameraStateInfo.clear(arrStatus[0].size() * deviceinfo.byChanNum); ToolKits.SetStructArrToPointerData(arrStatus, stOut.pCameraStateInfo); // 将数组内存拷贝到Pointer stIn.write(); stOut.write(); boolean bRet = netsdkApi.CLIENT_QueryDevInfo(loginHandle, nQueryType, stIn.getPointer(), stOut.getPointer(), null, 3000); if(bRet) { stOut.read(); ToolKits.GetPointerDataToStructArr(stOut.pCameraStateInfo, arrStatus); // 将Pointer拷贝到数组内存 for (int i = 0; i < stOut.nValidNum; ++i) { if (arrStatus[i].nChannel >= 0 && arrStatus[i].nChannel < deviceinfo.byChanNum) { statusTable[arrStatus[i].nChannel] = arrStatus[i].emConnectionState; } } } else { System.err.println("getCameraState Failed!" + ToolKits.getErrorCode()); } return bRet; } public boolean getChannelName(String [] arrChannelName) { int nChnCount = deviceinfo.byChanNum; NetSDKLib.CFG_VIDEO_IN_INFO deviceInfo[] = new NetSDKLib.CFG_VIDEO_IN_INFO[nChnCount]; for (int i = 0; i < nChnCount; ++ i) { deviceInfo[i] = new NetSDKLib.CFG_VIDEO_IN_INFO(); } int realCount = ToolKits.GetDevConfig(loginHandle, -1, NetSDKLib.CFG_CMD_VIDEOIN, deviceInfo); if (realCount <= 0) { System.err.println("Get Video In Failed." + ToolKits.getErrorCode()); return false; } for(int j = 0; j < realCount; ++ j) { try { arrChannelName[j] = new String(deviceInfo[j].szRemoteName, "GBK"); }catch(Exception e) { System.err.println("获取通道名称失败 通道: " + j); } } return true; } // 备用方案 public String getChannelName(int channel) { String channelName = ""; NetSDKLib.AV_CFG_ChannelName channelTitleName = new NetSDKLib.AV_CFG_ChannelName(); if (ToolKits.GetDevConfig(loginHandle, channel, NetSDKLib.CFG_CMD_CHANNELTITLE, channelTitleName)) { try { channelName = new String(channelTitleName.szName, "GBK"); }catch(Exception e) { System.err.println("getChannelName Failed!"); } }else { System.err.println("Get Channel Name Failed." + ToolKits.getErrorCode()); } // System.out.println(channelName); return channelName; } /** * 设置摄像头显示源 */ public void SetCameras() { // 设置的显示源个数 int nCameraCount = 1; // 显示源信息数组初始化 NET_MATRIX_CAMERA_INFO[] cameras = new NET_MATRIX_CAMERA_INFO[nCameraCount]; for(int i = 0; i < nCameraCount; i++) { cameras[i] = new NET_MATRIX_CAMERA_INFO(); } cameras[0].nUniqueChannel = nQueryChannel; // 挂载通道 cameras[0].nChannelID = 1; // 通道号 // try { // String name = "上山打老虎"; // 名称无法自己设置?? // System.arraycopy(name.getBytes("GBK"), 0, cameras[0].szName, 0, name.getBytes("GBK").length); // } catch (UnsupportedEncodingException e) { // e.printStackTrace(); // } cameras[0].bRemoteDevice = 1; String ip = "172.32.103.7"; int port = 37777; String username = "admin"; String password = "admin12345"; cameras[0].stuRemoteDevice.bEnable = 1; System.arraycopy(ip.getBytes(), 0, cameras[0].stuRemoteDevice.szIp, 0, ip.getBytes().length); cameras[0].stuRemoteDevice.nPort = port; System.arraycopy(username.getBytes(), 0, cameras[0].stuRemoteDevice.szUserEx, 0, username.getBytes().length); System.arraycopy(password.getBytes(), 0, cameras[0].stuRemoteDevice.szPwdEx, 0, password.getBytes().length); System.arraycopy(ip.getBytes(), 0, cameras[0].stuRemoteDevice.szDevName, 0, ip.getBytes().length); /* * 入参 */ NET_IN_MATRIX_SET_CAMERAS stuIn = new NET_IN_MATRIX_SET_CAMERAS(); stuIn.nCameraCount = nCameraCount; stuIn.pstuCameras = new Memory(cameras[0].size() * nCameraCount); stuIn.pstuCameras.clear(cameras[0].size() * nCameraCount); ToolKits.SetStructArrToPointerData(cameras, stuIn.pstuCameras); // 将数组内存拷贝到Pointer /* * 出参 */ NET_OUT_MATRIX_SET_CAMERAS stuOut = new NET_OUT_MATRIX_SET_CAMERAS(); if(netsdkApi.CLIENT_MatrixSetCameras(loginHandle, stuIn, stuOut, 5000)) { System.out.println("设置摄像头显示源成功!"); } else { System.err.println("设置摄像头显示源失败!" + ToolKits.getErrorCode()); } } /** * 删除摄像头显示源 */ public void DeleteCameras() { // 设置的显示源个数 int nCameraCount = 1; // 显示源信息数组初始化 NET_MATRIX_CAMERA_INFO[] cameras = new NET_MATRIX_CAMERA_INFO[nCameraCount]; for(int i = 0; i < nCameraCount; i++) { cameras[i] = new NET_MATRIX_CAMERA_INFO(); } cameras[0].nUniqueChannel = nQueryChannel; // 挂载通道 cameras[0].nChannelID = 0; // 通道号 cameras[0].bRemoteDevice = 1; cameras[0].stuRemoteDevice.bEnable = 0; /* * 入参 */ NET_IN_MATRIX_SET_CAMERAS stuIn = new NET_IN_MATRIX_SET_CAMERAS(); stuIn.nCameraCount = nCameraCount; stuIn.pstuCameras = new Memory(cameras[0].size() * nCameraCount); stuIn.pstuCameras.clear(cameras[0].size() * nCameraCount); ToolKits.SetStructArrToPointerData(cameras, stuIn.pstuCameras); // 将数组内存拷贝到Pointer /* * 出参 */ NET_OUT_MATRIX_SET_CAMERAS stuOut = new NET_OUT_MATRIX_SET_CAMERAS(); if(netsdkApi.CLIENT_MatrixSetCameras(loginHandle, stuIn, stuOut, 5000)) { System.out.println("删除摄像头显示源成功!"); } else { System.err.println("删除摄像头显示源失败!" + ToolKits.getErrorCode()); } } public void GetRemoteDevice() { int nChnCount = deviceinfo.byChanNum; NetSDKLib.AV_CFG_RemoteDevice deviceInfo[] = new NetSDKLib.AV_CFG_RemoteDevice[nChnCount]; for (int i = 0; i < nChnCount; ++ i) { deviceInfo[i] = new NetSDKLib.AV_CFG_RemoteDevice(); } /// 获取服务器所有远程设备的信息 int realCount = ToolKits.GetDevConfig(loginHandle, -1, NetSDKLib.CFG_CMD_REMOTEDEVICE, deviceInfo); if (realCount <= 0) { System.err.println("Get Remote Device Failed." + ToolKits.getErrorCode()); return; } for(int j = 0; j < realCount; ++ j) { System.out.println("————————————第 " + (j+1) + " 个 远程设备————————————"); PrintStruct.print(deviceInfo[j]); } } public void GetRadiometryCaps() { int nType = NetSDKLib.NET_RADIOMETRY_CAPS; // 入参 NET_IN_RADIOMETRY_GETCAPS stIn = new NET_IN_RADIOMETRY_GETCAPS(); stIn.nChannel = nQueryChannel; // 出参 NET_OUT_RADIOMETRY_GETCAPS stOut = new NET_OUT_RADIOMETRY_GETCAPS(); stIn.write(); stOut.write(); boolean bRet = netsdkApi.CLIENT_GetDevCaps(loginHandle, nType, stIn.getPointer(), stOut.getPointer(), 3000); if(bRet) { stOut.read(); PrintStruct.print(stOut); } else { System.err.println("GetDevCaps Failed!" + ToolKits.getErrorCode()); } } public void cfgPTZTour() { CFG_PTZTOUR_INFO stuPTZTour = new CFG_PTZTOUR_INFO(); if (ToolKits.GetDevConfig(loginHandle, 0, NetSDKLib.CFG_CMD_PTZTOUR, stuPTZTour)) { for (int i = 0 ; i < stuPTZTour.nCount; ++i) { System.out.println("------------" + (i+1) + "----------------"); System.out.println("bEnable: " + stuPTZTour.stTours[i].bEnable); try { System.out.println("szName: " + new String(stuPTZTour.stTours[i].szName, "GBK").trim()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } System.out.println("nPresetsNum: " + stuPTZTour.stTours[i].nPresetsNum); // for (int j = 0 ; j < stuPTZTour.stTours[i].nPresetsNum; ++j) { // PrintStruct.print(stuPTZTour.stTours[i].stPresets[j]); // } } }else { System.err.println("get ptzTour Failed!" + ToolKits.getErrorCode()); } String name = "预置点名称1"; try { System.arraycopy(name.getBytes("GBK"), 0, stuPTZTour.stTours[0].szName, 0, name.getBytes("GBK").length); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (!ToolKits.SetDevConfig(loginHandle, 0, NetSDKLib.CFG_CMD_PTZTOUR, stuPTZTour)) { System.err.println("set ptzTour Failed!" + ToolKits.getErrorCode()); } } /** * 获取云台支持能力 */ public boolean getPtzEnable(int chn) { IntByReference error = new IntByReference(0); byte[] buffer = new byte[1024]; if (!netsdkApi.CLIENT_QueryNewSystemInfo(loginHandle, NetSDKLib.CFG_CAP_CMD_PTZ_ENABLE, chn, buffer, buffer.length, error, 3000)) { System.err.println("CLIENT_QueryNewSystemInfo Failed!" + ToolKits.getErrorCode()); return false; } NetSDKLib.CFG_CAP_PTZ_ENABLEINFO ptzCap = new NetSDKLib.CFG_CAP_PTZ_ENABLEINFO(); ptzCap.write(); if (!configApi.CLIENT_ParseData(NetSDKLib.CFG_CAP_CMD_PTZ_ENABLE, buffer, ptzCap.getPointer(), ptzCap.size(), null)) { System.err.println("CLIENT_ParseData Failed!" + ToolKits.getErrorCode()); return false; } ptzCap.read(); System.out.println(ptzCap.bEnable); return ptzCap.bEnable == 1; } /** * 查询视频通道信息 */ public void QueryVideoChnInfo() { int nQueryType = NetSDKLib.NET_QUERY_VIDEOCHANNELSINFO; // 入参 NET_IN_GET_VIDEOCHANNELSINFO stIn = new NET_IN_GET_VIDEOCHANNELSINFO(); stIn.emType = NET_VIDEO_CHANNEL_TYPE.NET_VIDEO_CHANNEL_TYPE_INPUT; // 默认 // 出参 NET_OUT_GET_VIDEOCHANNELSINFO stOut = new NET_OUT_GET_VIDEOCHANNELSINFO(); stIn.write(); stOut.write(); boolean bRet = netsdkApi.CLIENT_QueryDevInfo(loginHandle, nQueryType, stIn.getPointer(), stOut.getPointer(), null, 3000); if(!bRet) { System.err.println("查询视频通道信息失败!" + ToolKits.getErrorCode()); return; } stOut.read(); PrintStruct.print(stOut.stInputChannels); } public void RunTest() { System.out.println("Run Test"); CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this , "获取测温区域的参数值" , "RadiometryGetRandomRegionTemper")); menu.addItem(new CaseMenu.Item(this , "订阅温度分布数据" , "RadiometryAttach")); menu.addItem(new CaseMenu.Item(this , "开始获取热图数据" , "RadiometryFetch")); menu.addItem(new CaseMenu.Item(this , "取消订阅温度分布数据" , "RadiometryDetach")); menu.addItem(new CaseMenu.Item(this , "查询热成像预设信息" , "QueryPresetInfo")); menu.addItem(new CaseMenu.Item(this , "查询热成像感兴趣区域信息" , "QueryOptRegion")); menu.addItem(new CaseMenu.Item(this , "查询热成像外部系统信息" , "QueryExtSysInfo")); menu.addItem(new CaseMenu.Item(this , "查询测温点的参数值" , "QueryPointTemper")); menu.addItem(new CaseMenu.Item(this , "查询测温项的参数值" , "QueryGetTemper")); menu.addItem(new CaseMenu.Item(this , "转至预置点" , "MovePreset")); menu.addItem(new CaseMenu.Item(this , "加入预置点到巡航" , "AddToLoop")); menu.addItem(new CaseMenu.Item(this , "删除巡航中预置点" , "DeleteFromLoop")); menu.addItem(new CaseMenu.Item(this , "清除巡航巡航线路" , "ClearLoop")); menu.addItem(new CaseMenu.Item(this , "开始点间巡航" , "StartTour")); menu.addItem(new CaseMenu.Item(this , "停止点间巡航" , "StopTour")); menu.addItem(new CaseMenu.Item(this , "开启雨刷" , "OpenLamp")); menu.addItem(new CaseMenu.Item(this , "关闭雨刷" , "CloseLamp")); menu.addItem(new CaseMenu.Item(this , "设置摄像头显示源" , "SetCameras")); menu.addItem(new CaseMenu.Item(this , "删除摄像头显示源" , "DeleteCameras")); menu.addItem(new CaseMenu.Item(this , "获取远程设备的信息" , "GetCameraInfo")); menu.addItem(new CaseMenu.Item(this , "获取当前云台的预置点列表" , "GetPresetList")); menu.addItem(new CaseMenu.Item(this , "设置预置点" , "SetPreset")); menu.addItem(new CaseMenu.Item(this , "删除预置点" , "DeletePreset")); menu.addItem(new CaseMenu.Item(this , "热成像测温规则配置" , "ConfigThermometryRule")); menu.addItem(new CaseMenu.Item(this , "热成像摄像头属性配置" , "ConfigThermographyOptions")); menu.addItem(new CaseMenu.Item(this , "温度统计配置" , "ConfigTemperatureStatistics")); menu.addItem(new CaseMenu.Item(this , "热成像测温全局配置" , "ConfigHeatImagingThermometry")); menu.addItem(new CaseMenu.Item(this , "获取设备能力" , "GetRadiometryCaps")); menu.addItem(new CaseMenu.Item(this , "QueryVideoChnInfo" , "QueryVideoChnInfo")); menu.run(); } public static void main(String[]args) { Radiometry demo = new Radiometry(); demo.InitTest(); demo.RunTest(); demo.EndTest(); } }