package com.netsdk.demo.units; import java.io.File; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.NetSDKLib.DEV_EVENT_CLASSROOM_BEHAVIOR_INFO; import com.netsdk.lib.NetSDKLib.DEV_EVENT_MANSTAND_DETECTION_INFO; import com.netsdk.lib.ToolKits; import com.netsdk.lib.NetSDKLib.ALARM_ENGINE_FAILURE_STATUS_INFO; import com.netsdk.lib.NetSDKLib.LLong; import com.netsdk.lib.NetSDKLib.LOG_SET_PRINT_INFO; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; public class ClassRoomUnit { //实体化 SDK 调用对象 static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE; static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE; //Begin:设备登入信息------------ private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); private static LLong loginHandle = new LLong(0); String address = "10.34.3.60"; // IP int port = 37777; // 端口 String username = "admin"; // 登入用户名 String password = "admin"; // 登入密码 //Finish:设备登入信息------------ //Begin:回调事件设置------------ //断线回调 private static class DisconnectCallback implements NetSDKLib.fDisConnect { private static DisconnectCallback instance = new DisconnectCallback(); private DisconnectCallback() {} public static DisconnectCallback getInstance() { return instance; } public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){ System.out.printf("Device Disconnect [%s:%d] Disconnect!\n" , pchDVRIP , nDVRPort); } } //断线重练回调 private static class HaveReconnectCallback implements NetSDKLib.fHaveReConnect { private static HaveReconnectCallback instance = new HaveReconnectCallback(); private HaveReconnectCallback() {} public static HaveReconnectCallback getInstance() { return instance; } public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){ System.out.printf("Device[%s:%d] HaveReconnected!\n" , pchDVRIP , nDVRPort); } } //告警回调事件 private static class fAlarmDataCB implements NetSDKLib.fMessCallBack { private fAlarmDataCB(){} private static class fAlarmDataCBHolder { private static fAlarmDataCB callback = new fAlarmDataCB(); } public static fAlarmDataCB getCallBack() { return fAlarmDataCBHolder.callback; } public boolean invoke(int lCommand, LLong lLoginID, Pointer pStuEvent, int dwBufLen, String strDeviceIP, NativeLong nDevicePort, Pointer dwUser){ switch (lCommand) { case NetSDKLib.EVENT_IVS_CLASSROOM_BEHAVIOR : //课堂行为分析 { DEV_EVENT_CLASSROOM_BEHAVIOR_INFO msg = new DEV_EVENT_CLASSROOM_BEHAVIOR_INFO(); ToolKits.GetPointerData(pStuEvent, msg); System.out.printf("【课堂行为分析】 UTC:%s 通道号:%d ",msg.UTC, msg.nChannelID); break; } case NetSDKLib.EVENT_IVS_MAN_STAND_DETECTION : //立体视觉站立事件 { DEV_EVENT_MANSTAND_DETECTION_INFO msg = new DEV_EVENT_MANSTAND_DETECTION_INFO(); ToolKits.GetPointerData(pStuEvent, msg); System.out.printf("【立体视觉站立事件】 UTC:%s 通道号:%d ",msg.UTC, msg.nChannelID); break; } case NetSDKLib.EVENT_IVS_FACERECOGNITION : //目标识别事件 { ALARM_ENGINE_FAILURE_STATUS_INFO msg = new ALARM_ENGINE_FAILURE_STATUS_INFO(); ToolKits.GetPointerData(pStuEvent, msg); System.out.printf("【目标识别事件】 UTC:%s 通道号:%d ",msg.UTC, msg.nChannelID); break; } default: break; } return true; } } //Finish:回调事件设置------------ //开启设备 public void BeginTest() { // SDK资源初始化 netsdkApi.CLIENT_Init(DisconnectCallback.getInstance(), null); // 设置断线重连回调,当设备断线后会自动重连并在重连后自动调用HaveReConnect(可选) netsdkApi.CLIENT_SetAutoReconnect(HaveReconnectCallback.getInstance(), null); // 向设备登入 int nSpecCap = 0; IntByReference nError = new IntByReference(0); loginHandle = netsdkApi.CLIENT_LoginEx2(address, port, username, password, nSpecCap, null, deviceInfo, nError); if(loginHandle.longValue() == 0) { System.err.printf("Login Device [%s:%d] Failed ! Last Error[%x]\n", address, port, netsdkApi.CLIENT_GetLastError()); FinishTest(); return; } System.out.printf("Login Device [%s:%d] Success. \n", address, port); // 打开SDK日志(可选) LOG_SET_PRINT_INFO setLog = new 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 (!netsdkApi.CLIENT_LogOpen(setLog)) { System.err.println("Failed to open NetSDK log !!!"); } // 设置报警回调函数 netsdkApi.CLIENT_SetDVRMessCallBack(fAlarmDataCB.getCallBack(), null); // 订阅报警 boolean bRet = netsdkApi.CLIENT_StartListenEx(loginHandle); if (!bRet) { System.err.println("订阅报警失败! LastError = 0x%x\n" + netsdkApi.CLIENT_GetLastError()); } else { System.out.println("订阅报警成功."); } } //关闭设备 public void FinishTest() { // 停止订阅报警 if (netsdkApi.CLIENT_StopListen(loginHandle)) { System.out.println("取消订阅报警信息."); } System.out.println("Finish Test"); if( loginHandle.longValue() != 0) { netsdkApi.CLIENT_Logout(loginHandle); } System.out.println("See You..."); netsdkApi.CLIENT_Cleanup(); System.exit(0); } public static void main(String[]args) { ClassRoomUnit demo = new ClassRoomUnit(); demo.BeginTest(); demo.FinishTest(); } }