package com.netsdk.demo.module; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.enumeration.DH_LOG_QUERY_TYPE; import com.netsdk.lib.structure.DH_DEVICE_LOG_ITEM_EX; import com.netsdk.lib.structure.NET_TIME; import com.netsdk.lib.structure.QUERY_DEVICE_LOG_PARAM; import com.sun.jna.Memory; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import java.nio.charset.Charset; public class DeviceLogModule { public static DH_DEVICE_LOG_ITEM_EX[] getSystemLog(NET_TIME startTime,NET_TIME endTime){ //查询条件,作为入参 QUERY_DEVICE_LOG_PARAM param=new QUERY_DEVICE_LOG_PARAM(); //要查询的日志类型 param.emLogType= DH_LOG_QUERY_TYPE.DHLOG_ALL.ordinal(); //通道号 param.nChannelID=0; //开始查询的条数 param.nStartNum=0; //结束查询的条数,30-1+1=30,查询的条数是30条 param.nEndNum=1024; int logNum=param.nEndNum-param.nStartNum+1; //日志数据结构体类型,写0 c层可能校验不通过,建议写1,使用DH_DEVICE_LOG_ITEM_EX作为日志数据的结构体, // 因为c层对出参buffer长度的校验是以DH_DEVICE_LOG_ITEM_EX结构体长度来校验的 // 而DH_DEVICE_LOG_ITEM_EX结构体的长度比DH_DEVICE_LOG_ITEM结构体要长得多 param.nLogStuType=1; //要查询的起始时间段 param.stuStartTime= startTime; //要查询的结束时间段 param.stuEndTime= endTime; //入参 Pointer queryParam=new Memory(param.size()); ToolKits.SetStructDataToPointer(param,queryParam,0); //日志数据结构体 DH_DEVICE_LOG_ITEM_EX logBuffer=new DH_DEVICE_LOG_ITEM_EX(); int totalSize = logBuffer.size() * logNum; //出参,分配内存 Pointer pointer=new Memory(totalSize); pointer.clear(totalSize); //出参,查询到的日志条数 IntByReference relogNum = new IntByReference(1); boolean bSet=LoginModule.netsdk.CLIENT_QueryDeviceLog(LoginModule.m_hLoginHandle,queryParam,pointer,totalSize,relogNum,3000); System.out.println("get system log is:"+bSet); if(bSet){ System.out.println("返回的log 条数:"+relogNum.getValue()); if(relogNum.getValue()>0){ DH_DEVICE_LOG_ITEM_EX[] arrays=(DH_DEVICE_LOG_ITEM_EX[])new DH_DEVICE_LOG_ITEM_EX().toArray(relogNum.getValue()); ToolKits.GetPointerDataToStructArr(pointer,arrays); for(DH_DEVICE_LOG_ITEM_EX item:arrays){ String time=item.getDate(); String operator=item.getOperator(Charset.forName("GBK")).trim(); String operation=item.getOperation(Charset.forName("GBK")).trim(); String log=item.getLog(Charset.forName("GBK")).trim(); String detailLog=item.getDetailLog(Charset.forName("GBK")).trim(); System.out.println(time+","+operator+","+operation+","+log+","+detailLog+",日志类型:"+item.nLogType); } return arrays; } }else{ System.out.println("get log error: the error code is "+ToolKits.getErrorCodePrint()); } return null; } public static DH_DEVICE_LOG_ITEM_EX[] getSystemLogV2(NetSDKLib.LLong m_hLoginHandle, NET_TIME startTime, NET_TIME endTime){ //查询条件,作为入参 QUERY_DEVICE_LOG_PARAM param=new QUERY_DEVICE_LOG_PARAM(); //要查询的日志类型 param.emLogType= DH_LOG_QUERY_TYPE.DHLOG_ALL.ordinal(); //通道号 param.nChannelID=0; //开始查询的条数 param.nStartNum=0; //结束查询的条数,30-1+1=30,查询的条数是30条 param.nEndNum=1024; int logNum=param.nEndNum-param.nStartNum+1; //日志数据结构体类型,写0 c层可能校验不通过,建议写1,使用DH_DEVICE_LOG_ITEM_EX作为日志数据的结构体, // 因为c层对出参buffer长度的校验是以DH_DEVICE_LOG_ITEM_EX结构体长度来校验的 // 而DH_DEVICE_LOG_ITEM_EX结构体的长度比DH_DEVICE_LOG_ITEM结构体要长得多 param.nLogStuType=1; //要查询的起始时间段 param.stuStartTime= startTime; //要查询的结束时间段 param.stuEndTime= endTime; //入参 Pointer queryParam=new Memory(param.size()); ToolKits.SetStructDataToPointer(param,queryParam,0); //日志数据结构体 DH_DEVICE_LOG_ITEM_EX logBuffer=new DH_DEVICE_LOG_ITEM_EX(); int totalSize = logBuffer.size() * logNum; //出参,分配内存 Pointer pointer=new Memory(totalSize); pointer.clear(totalSize); //出参,查询到的日志条数 IntByReference relogNum = new IntByReference(1); boolean bSet=LoginModule.netsdk.CLIENT_QueryDeviceLog(m_hLoginHandle,queryParam,pointer,totalSize,relogNum,3000); System.out.println("get system log is:"+bSet); if(bSet){ System.out.println("返回的log 条数:"+relogNum.getValue()); if(relogNum.getValue()>0){ DH_DEVICE_LOG_ITEM_EX[] arrays=(DH_DEVICE_LOG_ITEM_EX[])new DH_DEVICE_LOG_ITEM_EX().toArray(relogNum.getValue()); ToolKits.GetPointerDataToStructArr(pointer,arrays); for(DH_DEVICE_LOG_ITEM_EX item:arrays){ String time=item.getDate(); String operator=item.getOperator(Charset.forName("GBK")).trim(); String operation=item.getOperation(Charset.forName("GBK")).trim(); String log=item.getLog(Charset.forName("GBK")).trim(); String detailLog=item.getDetailLog(Charset.forName("GBK")).trim(); System.out.println(time+","+operator+","+operation+","+log+","+detailLog+",日志类型:"+item.nLogType); } return arrays; } }else{ System.out.println("get log error: the error code is "+ToolKits.getErrorCodePrint()); } return null; } }