diff --git a/src/main/java/com/netsdk/SDKTest.java b/src/main/java/com/netsdk/SDKTest.java index ae4da4c..266544b 100644 --- a/src/main/java/com/netsdk/SDKTest.java +++ b/src/main/java/com/netsdk/SDKTest.java @@ -1,6 +1,5 @@ package com.netsdk; -import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.callback.impl.DefaultDisconnectCallback; import com.netsdk.lib.callback.impl.DefaultHaveReconnectCallBack; import com.netsdk.module.BaseModule; @@ -16,7 +15,8 @@ public class SDKTest { public static void main(String[] args) { BaseModule baseModule=new BaseModule(); baseModule.init(DefaultDisconnectCallback.getINSTANCE(), DefaultHaveReconnectCallBack.getINSTANCE(),true); - DeviceInfo info=baseModule.login("172.23.12.14",37777,"admin","admin123"); + DeviceInfo info=baseModule.login("192.168.1.221",37777,"admin","admin123"); + System.out.println(info.getLoginHandler()); baseModule.logout(info.getLoginHandler()); baseModule.clean(); } diff --git a/src/main/java/com/netsdk/lib/ToolKits.java b/src/main/java/com/netsdk/lib/ToolKits.java index ba349a4..fd3c08d 100644 --- a/src/main/java/com/netsdk/lib/ToolKits.java +++ b/src/main/java/com/netsdk/lib/ToolKits.java @@ -5,6 +5,7 @@ import java.math.BigInteger; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.security.MessageDigest; +import java.text.SimpleDateFormat; import com.netsdk.lib.NetSDKLib.*; import com.sun.jna.Memory; @@ -876,4 +877,20 @@ public class ToolKits { } } + + // 获取当前时间 + public static String getDate() { + SimpleDateFormat simpleDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String date = simpleDate.format(new java.util.Date()).replace(" ", "_").replace(":", "-"); + + return date; + } + + /** + * 获取接口错误码和错误信息,用于打印 + * @return + */ + public static String getErrorCodePrint() { + return ""; + } } diff --git a/src/main/java/com/netsdk/module/LoginModule.java b/src/main/java/com/netsdk/module/LoginModule.java new file mode 100644 index 0000000..e3e0fa9 --- /dev/null +++ b/src/main/java/com/netsdk/module/LoginModule.java @@ -0,0 +1,146 @@ +package com.netsdk.module; + +import com.netsdk.lib.NetSDKLib; +import com.netsdk.lib.NetSDKLib.LLong; +import com.netsdk.lib.NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY; +import com.netsdk.lib.NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY; +import com.netsdk.lib.ToolKits; + +import java.io.File; + +/** + * 登陆接口实现 + * 主要有 :初始化、登陆、登出功能 + */ +public class LoginModule { + + public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE; + public static NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE; + + // 设备信息 + public static NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); + + // 登陆句柄 + public static LLong m_hLoginHandle = new LLong(0); + + private static boolean bInit = false; + private static boolean bLogopen = false; + + /** + * \if ENGLISH_LANG + * Init + * \else + * 初始化 + * \endif + */ + public static boolean init(NetSDKLib.fDisConnect disConnect, NetSDKLib.fHaveReConnect haveReConnect) { + bInit = netsdk.CLIENT_Init(disConnect, null); + if(!bInit) { + System.out.println("Initialize SDK failed"); + return false; + } + + //打开日志,可选 + NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO(); + File path = new File("./sdklog/"); + if (!path.exists()) { + path.mkdir(); + } + String logPath = path.getAbsoluteFile().getParent() + "\\sdklog\\" + ToolKits.getDate() + ".log"; + setLog.nPrintStrategy = 0; + setLog.bSetFilePath = 1; + System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length); + System.out.println(logPath); + setLog.bSetPrintStrategy = 1; + bLogopen = netsdk.CLIENT_LogOpen(setLog); + if(!bLogopen ) { + System.err.println("Failed to open NetSDK log"); + } + + // 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作 + // 此操作为可选操作,但建议用户进行设置 + netsdk.CLIENT_SetAutoReconnect(haveReConnect, null); + + //设置登录超时时间和尝试次数,可选 + int waitTime = 5000; //登录请求响应超时时间设置为5S + int tryTimes = 1; //登录时尝试建立链接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; // 设置子连接的超时时间 + netParam.nGetDevInfoTime = 3000;//获取设备信息超时时间,为0默认1000ms + netsdk.CLIENT_SetNetworkParam(netParam); + + return true; + } + + /** + * \if ENGLISH_LANG + * CleanUp + * \else + * 清除环境 + * \endif + */ + public static void cleanup() { + if(bLogopen) { + netsdk.CLIENT_LogClose(); + } + + if(bInit) { + netsdk.CLIENT_Cleanup(); + } + } + + /** + * \if ENGLISH_LANG + * Login Device + * \else + * 登录设备 + * \endif + */ + public static boolean login(String m_strIp, int m_nPort, String m_strUser, String m_strPassword) { + //IntByReference nError = new IntByReference(0); + //入参 + NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstInParam=new NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY(); + pstInParam.nPort=m_nPort; + pstInParam.szIP=m_strIp.getBytes(); + pstInParam.szPassword=m_strPassword.getBytes(); + pstInParam.szUserName=m_strUser.getBytes(); + //出参 + NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam=new NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY(); + pstOutParam.stuDeviceInfo=m_stDeviceInfo; + //m_hLoginHandle = netsdk.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword, 0, null, m_stDeviceInfo, nError); + m_hLoginHandle=netsdk.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam); + if(m_hLoginHandle.longValue() == 0) { + System.err.printf("Login Device[%s] Port[%d]Failed. %s\n", m_strIp, m_nPort, ToolKits.getErrorCodePrint()); + } else { + System.out.println("Login Success [ " + m_strIp + " ]"); + } + + return m_hLoginHandle.longValue() == 0? false:true; + } + + /** + * \if ENGLISH_LANG + * Logout Device + * \else + * 登出设备 + * \endif + */ + public static boolean logout() { + if(m_hLoginHandle.longValue() == 0) { + return false; + } + + boolean bRet = netsdk.CLIENT_Logout(m_hLoginHandle); + if(bRet) { + m_hLoginHandle.setValue(0); + } + + return bRet; + } +} diff --git a/src/main/java/com/netsdk/module/ThermalCameraModule.java b/src/main/java/com/netsdk/module/ThermalCameraModule.java new file mode 100644 index 0000000..555bb35 --- /dev/null +++ b/src/main/java/com/netsdk/module/ThermalCameraModule.java @@ -0,0 +1,305 @@ +package com.netsdk.module; + +import com.netsdk.lib.ImageAlgLib; +import com.netsdk.lib.NetSDKLib; +import com.netsdk.lib.NetSDKLib.*; +import com.netsdk.lib.ToolKits; +import com.netsdk.lib.structure.NET_IN_RADIOMETRY_RANDOM_REGION_TEMPER; +import com.netsdk.lib.structure.NET_OUT_RADIOMETRY_RANDOM_REGION_TEMPER; + +import java.io.IOException; + +public class ThermalCameraModule { + + static ImageAlgLib imageAlgApi = ImageAlgLib.IMAGEALG_INSTANCE; + + public static class ThermalCameraStatus { + public boolean bSearching = false; // 是否正在查找 + public int nFinderHanle; // 取到的查询句柄 + public int nTotalCount; // 符合此次查询条件的结果总条数 + public LLong hRadiometryHandle = new LLong(0); // 订阅句柄 + } + + private static ThermalCameraStatus status = new ThermalCameraStatus(); + + /** + * 订阅温度分布数据(热图) + */ + public static boolean radiometryAttach(int nChannel, fRadiometryAttachCB cbNotify) { + /* + * 入参 + */ + NET_IN_RADIOMETRY_ATTACH stIn = new NET_IN_RADIOMETRY_ATTACH(); + stIn.nChannel = nChannel; // 通道号 + stIn.cbNotify = cbNotify; // 回调函数 + + /* + * 出参 + */ + NET_OUT_RADIOMETRY_ATTACH stOut = new NET_OUT_RADIOMETRY_ATTACH(); + status.hRadiometryHandle = LoginModule.netsdk.CLIENT_RadiometryAttach(LoginModule.m_hLoginHandle, stIn, stOut, 3000); + + if(status.hRadiometryHandle.longValue() == 0) { + System.err.printf("RadiometryAttach Failed!" + ToolKits.getErrorCodePrint()); + } + + return status.hRadiometryHandle.longValue() != 0; + } + + /** + * 获取查询总个数 + */ + public static boolean isAttaching() { + return status.hRadiometryHandle.longValue() != 0; + } + + /** + * 开始获取热图数据 + */ + public static int radiometryFetch(int nChannel) { + + int nStatus = -1; + + /* + * 入参 + */ + NET_IN_RADIOMETRY_FETCH stIn = new NET_IN_RADIOMETRY_FETCH(); + stIn.nChannel = nChannel; // 通道号 + + /* + * 出参 + */ + NET_OUT_RADIOMETRY_FETCH stOut = new NET_OUT_RADIOMETRY_FETCH(); + + if(!LoginModule.netsdk.CLIENT_RadiometryFetch(LoginModule.m_hLoginHandle, stIn, stOut, 3000)) { + System.err.printf("RadiometryFetch Failed!" + ToolKits.getErrorCodePrint()); + } else { + nStatus = stOut.nStatus; + } + + return nStatus; + } + + /** + * 处理回调数据(热图) + * @throws IOException + */ + public static boolean saveData(NET_RADIOMETRY_DATA radiometryData) throws IOException { + + if (radiometryData == null) { + return false; + } + + int nWidth = radiometryData.stMetaData.nWidth; + int nHeight = radiometryData.stMetaData.nHeight; + + short[] pGrayImg = new short[nWidth * nHeight]; + float[] pTempForPixels = new float[nWidth * nHeight]; + + if(LoginModule.netsdk.CLIENT_RadiometryDataParse(radiometryData, pGrayImg, pTempForPixels)) { + byte[] pYData = new byte[nWidth*nHeight*2]; + imageAlgApi.drcTable(pGrayImg, (short)nWidth, (short)nHeight, 0, pYData, null); + ToolKits.savePicture(pYData, "./GrayscaleMap.yuv"); + } else { + System.err.println("saveData failed!" + ToolKits.getErrorCodePrint()); + return false; + } + + return true; + } + + /** + * 取消订阅温度分布数据 + */ + public static void radiometryDetach() { + if(status.hRadiometryHandle.longValue() != 0) { + LoginModule.netsdk.CLIENT_RadiometryDetach(status.hRadiometryHandle); + status.hRadiometryHandle.setValue(0); + } + } + + /** + * 查询测温点 + */ + public static NET_RADIOMETRYINFO queryPointTemper(int nChannel, short x, short y) { + int nQueryType = NetSDKLib.NET_QUERY_DEV_RADIOMETRY_POINT_TEMPER; + + // 入参 + NET_IN_RADIOMETRY_GETPOINTTEMPER stIn = new NET_IN_RADIOMETRY_GETPOINTTEMPER(); + stIn.nChannel = nChannel; + stIn.stCoordinate.nx = x; + stIn.stCoordinate.ny = y; + + // 出参 + NET_OUT_RADIOMETRY_GETPOINTTEMPER stOut = new NET_OUT_RADIOMETRY_GETPOINTTEMPER(); + + stIn.write(); + stOut.write(); + boolean bRet = LoginModule.netsdk.CLIENT_QueryDevInfo(LoginModule.m_hLoginHandle, nQueryType, stIn.getPointer(), stOut.getPointer(), null, 3000); + if(!bRet) { + System.err.printf("QueryPointTemper Failed!" + ToolKits.getErrorCodePrint()); + return null; + } + + stOut.read(); + return stOut.stPointTempInfo; + } + + + /** + * 获取测温区域 + */ + public static NET_OUT_RADIOMETRY_RANDOM_REGION_TEMPER radiometryGetRandomRegionTemper(int channel, int pointNum, short[][] nPoints){ + + 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 = channel; + stIn.nPointNum = pointNum; + for(int i = 0;i < pointNum;i++){ + stIn.stuPolygon[i].nx = nPoints[i][0]; + stIn.stuPolygon[i].ny = nPoints[i][1]; + } + + stIn.write(); + stOut.write(); + + boolean bet = LoginModule.netsdk.CLIENT_RadiometryGetRandomRegionTemper(LoginModule.m_hLoginHandle,stIn.getPointer(),stOut.getPointer(), 3000); + + stIn.read(); + stOut.read(); + + if(bet) { + + }else { + System.err.println("获取测温区域的参数值失败," + ToolKits.getErrorCodePrint()); + } + return stOut; + } + + /** + * 查询测温项 + */ + public static NET_RADIOMETRYINFO queryItemTemper(int nChannel, int nPresetId, int nRuleId, int nMeterType) { + int nQueryType = NetSDKLib.NET_QUERY_DEV_RADIOMETRY_TEMPER; + + // 入参 + NET_IN_RADIOMETRY_GETTEMPER stIn = new NET_IN_RADIOMETRY_GETTEMPER(); + stIn.stCondition.nPresetId = nPresetId; + stIn.stCondition.nRuleId = nRuleId; + stIn.stCondition.nMeterType = nMeterType; // eg: NET_RADIOMETRY_METERTYPE.NET_RADIOMETRY_METERTYPE_AREA; + stIn.stCondition.nChannel = nChannel; + + // 出参 + NET_OUT_RADIOMETRY_GETTEMPER stOut = new NET_OUT_RADIOMETRY_GETTEMPER(); + + stIn.write(); + stOut.write(); + boolean bRet = LoginModule.netsdk.CLIENT_QueryDevInfo(LoginModule.m_hLoginHandle, nQueryType, stIn.getPointer(), stOut.getPointer(), null, 3000); + if(!bRet) { + System.err.printf("QueryPointTemper Failed!" + ToolKits.getErrorCodePrint()); + return null; + } + + stOut.read(); + return stOut.stTempInfo; + } + + /** + * 开始查询信息 + */ + public static boolean startFind(NET_IN_RADIOMETRY_STARTFIND stuIn) { + if(status.bSearching) { + stopFind(); + } + + /* + * 出参 + */ + NET_OUT_RADIOMETRY_STARTFIND stuOut = new NET_OUT_RADIOMETRY_STARTFIND(); + stuIn.write(); + stuOut.write(); + status.bSearching = LoginModule.netsdk.CLIENT_StartFind(LoginModule.m_hLoginHandle, + NET_FIND.NET_FIND_RADIOMETRY, stuIn.getPointer(), stuOut.getPointer(), 5000); + if (status.bSearching) { + stuOut.read(); + status.nFinderHanle = stuOut.nFinderHanle; + status.nTotalCount = stuOut.nTotalCount; + }else { + System.err.printf("startFind Failed!" + ToolKits.getErrorCodePrint()); + } + + return status.bSearching; + } + + /** + * 获取查询总个数 + */ + public static int getTotalCount() { + return status.nTotalCount; + } + + /** + * 查询信息 + */ + public static NET_OUT_RADIOMETRY_DOFIND doFind(int nOffset, int nCount) { + if(!status.bSearching) { + System.err.printf("DoFind Failed! [need startFind]"); + return null; + } + + /* + * 入参 + */ + NET_IN_RADIOMETRY_DOFIND stuIn = new NET_IN_RADIOMETRY_DOFIND(); + stuIn.nFinderHanle = status.nFinderHanle; + stuIn.nBeginNumber = nOffset; + stuIn.nCount = nCount; + + /* + * 出参 + */ + NET_OUT_RADIOMETRY_DOFIND stuOut = new NET_OUT_RADIOMETRY_DOFIND(); + + stuIn.write(); + stuOut.write(); + if (!LoginModule.netsdk.CLIENT_DoFind(LoginModule.m_hLoginHandle, + NET_FIND.NET_FIND_RADIOMETRY, stuIn.getPointer(), stuOut.getPointer(), 5000)) { + System.err.printf("DoFind Failed!" + ToolKits.getErrorCodePrint()); + return null; + } + + stuOut.read(); + return stuOut; + } + + /** + * 停止查询信息 + */ + public static void stopFind() { + if(!status.bSearching) { + return; + } + + /* + * 入参 + */ + NET_IN_RADIOMETRY_STOPFIND stuIn = new NET_IN_RADIOMETRY_STOPFIND(); + stuIn.nFinderHanle = status.nFinderHanle; + + /* + * 出参 + */ + NET_OUT_RADIOMETRY_STOPFIND stuOut = new NET_OUT_RADIOMETRY_STOPFIND(); + + stuIn.write(); + stuOut.write(); + LoginModule.netsdk.CLIENT_StopFind(LoginModule.m_hLoginHandle, + NET_FIND.NET_FIND_RADIOMETRY, stuIn.getPointer(), stuOut.getPointer(), 5000); + + status.bSearching = false; + status.nFinderHanle = 0; +// status.nTotalCount = 0; + + return; + } +}