package com.netsdk.demo.customize; import java.io.File; import java.util.Vector; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.NetSDKLib.LLong; import com.netsdk.lib.NetSDKLib.NET_DEVICE_TYPE; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; public class EventAlarmDemo { /* * static { System.setProperty("java.io.tmpdir", "D:/"); } */ static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE; static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE; // ////////////////////////////////////////////////////////////// String m_strIp = "172.12.250.248"; int m_nPort = 37777; String m_strUser = "admin"; String m_strPassword = "admin123"; // ////////////////////////////////////////////////////////////// private NetSDKLib.NET_DEVICEINFO_Ex deviceinfo = new NetSDKLib.NET_DEVICEINFO_Ex(); private static LLong loginHandle = new LLong(0); // 登陆句柄 private LLong m_hAttachHandle = new LLong(0); private LLong m_hAttachParkHandle = new LLong(0); private LLong m_hFindHandle = new LLong(0); private LLong m_lAttachHandle = new LLong(0); private LLong m_TransComChannel = new LLong(0); private LLong m_lSearchHandle = new LLong(0); private Vector lstAttachHandle = new Vector(); private static LLong nlRealPlay = new LLong(0); // 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数 public 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 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 fDisConnectCB m_DisConnectCB = new fDisConnectCB(); private 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库 netsdkApi.CLIENT_Init(m_DisConnectCB, null); // 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作 // 此操作为可选操作,但建议用户进行设置 netsdkApi.CLIENT_SetAutoReconnect(haveReConnect, null); // 设置登录超时时间和尝试次数,可选 int waitTime = 10000; // 登录请求响应超时时间设置为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() + File.separator + "sdklog"; File file = new File(logPath); if (!file.exists()) { file.mkdir(); } logPath = file + File.separator + "123456789.log"; setLog.bSetFilePath = 1; System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length); System.out.println(); 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()); EndTest(); } } /** * 获取接口错误码 * * @return */ public static String getErrorCode() { return " { error code: ( 0x80000000|" + (netsdkApi.CLIENT_GetLastError() & 0x7fffffff) + " ). 参考 NetSDKLib.java }"; } // /////////////////////////////////////////////////////////////////////////////////////////////////////// /** * 订阅智能分析数据-图片 */ public void flowstateIVSEvent() { if (deviceinfo.byDVRType == NET_DEVICE_TYPE.NET_TPC_SERIAL) { // 热成像设备特殊处理 for (int i = 0; i < deviceinfo.byChanNum; ++i) { lstAttachHandle.add(flowstateIVSEvent(i)); } } else { int ChannelId = deviceinfo.byChanNum == 1 ? 0 : -1; // 通道 m_hAttachHandle = flowstateIVSEvent(ChannelId); } } public LLong flowstateIVSEvent(int ChannelId) { int bNeedPicture = 1; // 是否需要图片 LLong hAttachHandle = netsdkApi.CLIENT_RealLoadPictureEx(loginHandle, ChannelId, NetSDKLib.EVENT_IVS_ALL, bNeedPicture, m_AnalyzerDataCB, null, null); if (hAttachHandle.longValue() != 0) { System.out.println("CLIENT_RealLoadPictureEx Success Channel: " + ChannelId); } else { System.err .printf("CLIENT_RealLoadPictureEx Failed! Channel:%d LastError = %x\n", ChannelId, netsdkApi.CLIENT_GetLastError()); } return hAttachHandle; } /** * 停止上传智能分析数据-图片 */ public void detachIVSEvent() { if (0 != m_hAttachHandle.longValue()) { netsdkApi.CLIENT_StopLoadPic(m_hAttachHandle); System.out.println("Stop detach IVS event"); m_hAttachHandle.setValue(0); } for (LLong lAttachHandle : lstAttachHandle) { if (0 != lAttachHandle.longValue()) { netsdkApi.CLIENT_StopLoadPic(lAttachHandle); } } lstAttachHandle.clear(); } private fAnalyzerDataCB m_AnalyzerDataCB = new fAnalyzerDataCB(); /* 智能报警事件回调 */ public class fAnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack/*, StdCallCallback */{ boolean msgFlags = false; @Override public int invoke(LLong lAnalyzerHandle, int dwAlarmType, Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize, Pointer dwUser, int nSequence, Pointer reserved) { if (pAlarmInfo == null) { return 0; } File path = new File("D:/EventPicture/"); if (!path.exists()) { path.mkdir(); } System.out.println("dwAlarmType:" + dwAlarmType); switch (dwAlarmType) { case NetSDKLib.EVENT_IVS_SHOPPRESENCE: // /< // 商铺占道经营事件 { NetSDKLib.DEV_EVENT_SHOPPRESENCE_INFO msg = new NetSDKLib.DEV_EVENT_SHOPPRESENCE_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); // 保存大图 if (pBuffer != null && dwBufSize > 0) { // pBuffer收到的图片数据 // 保存图片到本地文件 String strFileName = path + "\\" + System.currentTimeMillis() + ".jpg"; ToolKits.savePicture(pBuffer, dwBufSize, strFileName); System.out.println("strFileName : " + strFileName); } System.out.println("商铺占道经营事件(UTC):" + msg.UTC + " 通道号:" + msg.nChannelID + "商铺地址: " + new String(msg.szShopAddress).trim()); break; } case NetSDKLib.EVENT_IVS_FLOWBUSINESS: // /< // 流动摊贩事件 { NetSDKLib.DEV_EVENT_FLOWBUSINESS_INFO msg = new NetSDKLib.DEV_EVENT_FLOWBUSINESS_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); // 保存大图 if (pBuffer != null && dwBufSize > 0) { // pBuffer收到的图片数据 // 保存图片到本地文件 String strFileName = path + "\\" + System.currentTimeMillis() + ".jpg"; ToolKits.savePicture(pBuffer, dwBufSize, strFileName); System.out.println("strFileName : " + strFileName); } System.out.println("流动摊贩事件(UTC):" + new String(msg.szName).trim() + " 事件发生的时间:" + msg.UTC + " 通道号:" + msg.nChannelID + "车牌号: " + "违法时长:" + msg.nViolationDuration); break; } default: break; } return 0; } } public void RunTest() { System.out.println("Run Test"); CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this , "flowstateIVSEvent", "flowstateIVSEvent")); menu.run(); } public static void main(String[]args) { EventAlarmDemo demo = new EventAlarmDemo(); demo.InitTest(); demo.RunTest(); demo.EndTest(); } }