package com.netsdk.demo.customize; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.enumeration.EM_SDK_LOG_QUERY_TYPE; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.structure.SDK_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.io.File; import java.nio.charset.Charset; /** * 设备系统日志查询Demo * @author 47081 */ public class QueryDeviceLog { /** * sdk接口 */ public static final NetSDKLib netSdk = NetSDKLib.NETSDK_INSTANCE; /** * 登陆句柄 */ private NetSDKLib.LLong loginHandle = new NetSDKLib.LLong(0); /** * 设备信息扩展结构体 */ private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); /** * sdk初始化操作 */ public void initTest(){ // 初始化SDK库 netSdk.CLIENT_Init(QueryDeviceLog.DisConnectCallBack.getInstance(), null); // 设置断线重连成功回调函数 netSdk.CLIENT_SetAutoReconnect(QueryDeviceLog.HaveReConnectCallBack.getInstance(), null); //打开日志,可选 NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO(); String logPath = new File(".").getAbsoluteFile().getParent() + File.separator + "sdk_log" + File.separator + "sdk.log"; setLog.bSetFilePath = 1; System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length); setLog.bSetPrintStrategy = 1; setLog.nPrintStrategy = 0; if (!netSdk.CLIENT_LogOpen(setLog)){ System.err.println("Open SDK Log Failed!!!"); } } /** * 登录设备 */ public void login(){ // 以TCP方式登入 int nSpecCap = NetSDKLib.EM_LOGIN_SPAC_CAP_TYPE.EM_LOGIN_SPEC_CAP_TCP; IntByReference nError = new IntByReference(0); loginHandle = netSdk.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword ,nSpecCap, null, deviceInfo, nError); if (loginHandle.longValue() != 0) { System.out.printf("Login Device[%s] Success!\n", m_strIp); } else { System.err.printf("Login Device[%s] Fail.Error[%s]\n", m_strIp, ToolKits.getErrorCode()); loginOut(); } } /** * 登出设备 */ public void loginOut(){ System.out.println("End Test"); if( loginHandle.longValue() != 0) { netSdk.CLIENT_Logout(loginHandle); } System.out.println("See You..."); netSdk.CLIENT_Cleanup(); System.exit(0); } /** * 设备断线回调 */ private static class DisConnectCallBack implements NetSDKLib.fDisConnect { private DisConnectCallBack() { } private static class CallBackHolder { private static final DisConnectCallBack INSTANCE = new DisConnectCallBack(); } public static DisConnectCallBack getInstance() { return DisConnectCallBack.CallBackHolder.INSTANCE; } @Override public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort); } } /** * 设备重连回调 */ private static class HaveReConnectCallBack implements NetSDKLib.fHaveReConnect { private HaveReConnectCallBack() { } private static class CallBackHolder { private static final QueryDeviceLog.HaveReConnectCallBack INSTANCE = new HaveReConnectCallBack(); } public static QueryDeviceLog.HaveReConnectCallBack getInstance() { return QueryDeviceLog.HaveReConnectCallBack.CallBackHolder.INSTANCE; } @Override public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); } } /** * 设备系统日志 */ public void queryLog(){ //查询条件,作为入参 QUERY_DEVICE_LOG_PARAM param=new QUERY_DEVICE_LOG_PARAM(); //要查询的日志类型 param.emLogType= EM_SDK_LOG_QUERY_TYPE.DHLOG_ALL.ordinal(); //通道号 param.nChannelID=0; //开始查询的条数 param.nStartNum=31; //结束查询的条数,30-1+1=30,查询的条数是30条 param.nEndNum=60; 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= new NET_TIME("2020/1/1/0/0/0"); //要查询的结束时间段 param.stuEndTime= new NET_TIME("2020/5/20/12/20/23"); //入参 Pointer queryParam=new Memory(param.size()); ToolKits.SetStructDataToPointer(param,queryParam,0); //日志数据结构体 SDK_DEVICE_LOG_ITEM_EX logBuffer=new SDK_DEVICE_LOG_ITEM_EX(); //出参,分配内存 Pointer pointer=new Memory(logBuffer.size()*logNum); pointer.clear(logBuffer.size()*logNum); //出参,查询到的日志条数 IntByReference relogNum = new IntByReference(1); boolean bSet=netSdk.CLIENT_QueryDeviceLog(loginHandle,queryParam,pointer,logBuffer.size()*logNum,relogNum,3000); System.out.println("get system log is:"+bSet); if(bSet){ System.out.println("返回的log 条数:"+relogNum.getValue()); if(relogNum.getValue()>0){ SDK_DEVICE_LOG_ITEM_EX[] arrays=(SDK_DEVICE_LOG_ITEM_EX[])new SDK_DEVICE_LOG_ITEM_EX().toArray(relogNum.getValue()); ToolKits.GetPointerDataToStructArr(pointer,arrays); for(SDK_DEVICE_LOG_ITEM_EX item:arrays){ String time=item.getDate(); String operator=item.getOperator(Charset.forName("GBK")); String operation=item.getOperation(Charset.forName("GBK")); String log=item.getLog(Charset.forName("GBK")); String detailLog=item.getDetailLog(Charset.forName("GBK")); System.out.println(time+","+operator+","+operation+","+log+","+detailLog); } } }else{ System.out.println("get log error: the error code is "+ToolKits.getErrorCode()); } } /** * 控制台运行界面 */ public void runTest(){ CaseMenu menu=new CaseMenu(); menu.addItem((new CaseMenu.Item(this , "Login" , "login"))); menu.addItem((new CaseMenu.Item(this , "QueryDeviceLog" , "queryLog"))); menu.addItem(new CaseMenu.Item(this,"LoginOut","loginOut")); menu.run(); } //////////////////////////////////////////////////////////////// private String m_strIp = "172.23.12.14"; private int m_nPort = 37777; private String m_strUser = "admin"; private String m_strPassword = "admin123"; //////////////////////////////////////////////////////////////// public static void main(String[] args) { final QueryDeviceLog queryLog=new QueryDeviceLog(); queryLog.initTest(); queryLog.runTest(); } }