package com.netsdk.demo.accessControl; import com.netsdk.demo.customize.analyseTaskDemo.AnalyseTaskUtils; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import java.io.File; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Vector; public class AccessDwUser { public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE; // 登录句柄 public static Map lLongMap = new HashMap<>(); // 订阅句柄 public static Map attachLongMap = new HashMap<>(); // 设备记录集 public static Vector devInfo = new Vector<>(); private static boolean bInit = false; // 判断是否初始化 private static boolean bLogOpen = false; // 判断log是否打开 public static boolean Init() { bInit = netsdk.CLIENT_Init(DisconnectCallback.getInstance(), null); if (!bInit) { System.out.println("Initialize SDK failed"); return false; } enableLog(); // 配置日志 //设置登录超时时间和尝试次数,可选 int waitTime = 3000; //登录请求响应超时时间设置为3S 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; // 设置子连接的超时时间 netsdk.CLIENT_SetNetworkParam(netParam); return true; } /** * 打开 sdk log */ private static void enableLog() { NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO(); File path = new File("sdklog/"); if (!path.exists()) path.mkdir(); // 这里的log保存地址依据实际情况自己调整 String logPath = path.getAbsoluteFile().getParent() + "\\sdklog\\" + "sdklog" + AnalyseTaskUtils.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"); } /** * Cleanup. 清除 sdk 环境 */ public static void cleanup() { if (bLogOpen) { netsdk.CLIENT_LogClose(); } if (bInit) { netsdk.CLIENT_Cleanup(); } } /** * 清理并退出 */ public static void cleanAndExit() { netsdk.CLIENT_Cleanup(); System.exit(0); } // 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数 private static class DisconnectCallback implements NetSDKLib.fDisConnect { private static final DisconnectCallback instance = new DisconnectCallback(); private DisconnectCallback() { } public static DisconnectCallback getInstance() { return instance; } public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { // todo 回调里其他 netsdk 接口请开新线程 GateModule.stopRealLoadPic(attachLongMap.get(deviceId)); } } /** * 需要下发的结构体请使用基本数据类型,避免使用String */ public static class CDevInfo extends NetSDKLib.SdkStructure { public byte[] address = new byte[30]; public int port; // 设备序列号 public byte[] szSN = new byte[32]; public NetSDKLib.LLong hLogin; //登录句柄 public int nChannel; public CDevInfo() { } public CDevInfo(String strAddr, int nPort, String strSN) { System.arraycopy(strAddr.getBytes(), 0, address, 0, strAddr.length()); port = nPort; System.arraycopy(strSN.getBytes(), 0, szSN, 0, strSN.length()); } @Override public String toString() { return "CDevInfo [szSN=" + new String(szSN).trim() + ", hLogin=" + hLogin.longValue() + ", nChannel=" + nChannel + "]"; } } // 全登录与全订阅 public void loginAndAttach() { if ((devInfo != null && devInfo.size() > 0)) { System.out.println("设备登入,设备总数:" + devInfo.size()); for (CDevInfo dev : devInfo) { String szNo = new String(dev.szSN).trim(); if (!lLongMap.containsKey(szNo)) { doLoginAndAttach(dev); } } } } // 全退订与全登出 public void detachAndLogout() { this.detachAll(); this.logoutAll(); } // 全登出 public void logoutAll(){ if ((devInfo != null && devInfo.size() > 0)) { System.out.println("设备登出,设备总数:" + devInfo.size()); for (CDevInfo dev : devInfo) { String szNo = new String(dev.szSN).trim(); if (!lLongMap.containsKey(szNo)) { doLogOut(dev); } } } } // 全退订 public void detachAll() { if ((attachLongMap != null && attachLongMap.size() > 0)) { System.out.println("需要订阅设备总数:" + attachLongMap.size()); for (String key : attachLongMap.keySet()) { NetSDKLib.LLong m_hAttachHandle = attachLongMap.get(key); if (m_hAttachHandle.longValue() != 0) { netsdk.CLIENT_StopLoadPic(m_hAttachHandle); } } } } // 全登录与全订阅 public void doLoginAndAttach(CDevInfo dev) { String address = new String(dev.address).trim(); int port = dev.port; String deviceId = new String(dev.szSN).trim(); Pointer pointer = ToolKits.GetGBKStringToPointer(deviceId); //0:tcp登入2:主动注册登入 final int nSpecCap = 0; final IntByReference error = new IntByReference(); final NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); /************************************************* 登录设备 ************************************************/ //登录设备 NetSDKLib.LLong m_hLoginHandle = netsdk.CLIENT_LoginEx2(address, (short) port, m_strUser, m_strPassword, nSpecCap, pointer, deviceInfo, error); if (m_hLoginHandle.longValue() == 0) { System.out.println(String.format("Login Device Failed ! deviceID: %s,address: %s,port: %d, Last Error: %s", deviceId, address, port, ToolKits.getErrorCode())); return; } System.out.println("登录设备成功,设备ID: " + deviceId); dev.nChannel = deviceInfo.byChanNum; dev.hLogin = m_hLoginHandle; /************************************************* 订阅设备 ************************************************/ //回调函数 AnalyzerDataCallBack analyzerDataCallBack = AnalyzerDataCallBack.getInstance(); int bNeedPicture = 1; // 是否需要图片 dev.write(); NetSDKLib.LLong hAttach = netsdk.CLIENT_RealLoadPictureEx(dev.hLogin, 0, NetSDKLib.EVENT_IVS_ALL, bNeedPicture, analyzerDataCallBack, dev.getPointer(), null); dev.read(); if (hAttach.longValue() == 0) { System.out.println("Failed to realLoad pic. deviceId;" + deviceId); return; } System.out.println("订阅成功,设备ID: " + deviceId); attachLongMap.put(deviceId, hAttach); //登录句柄 lLongMap.put(deviceId, m_hLoginHandle); } public void doLogOut(CDevInfo dev) { NetSDKLib.LLong m_hLoginHandle = dev.hLogin; if (m_hLoginHandle.longValue() != 0) { netsdk.CLIENT_Logout(m_hLoginHandle); System.out.println("LogOut Success " + Arrays.toString(dev.szSN)); } } /** * 订阅回调 */ private static class AnalyzerDataCallBack implements NetSDKLib.fAnalyzerDataCallBack { private static final AnalyzerDataCallBack instance = new AnalyzerDataCallBack(); private AnalyzerDataCallBack() { } public static AnalyzerDataCallBack getInstance() { return instance; } public int invoke(NetSDKLib.LLong lAnalyzerHandle, int dwAlarmType, Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize, Pointer dwUser, int nSequence, Pointer reserved) { if (lAnalyzerHandle.longValue() == 0 || pAlarmInfo == null) { return -1; } byte[] bufferBytes = new byte[dwBufSize]; pBuffer.read(0, bufferBytes, 0, dwBufSize); File path = new File(".\\FaceRecoder"); if (!path.exists()) { path.mkdir(); } ///< 门禁事件 if (dwAlarmType == NetSDKLib.EVENT_IVS_ACCESS_CTL) { NetSDKLib.DEV_EVENT_ACCESS_CTL_INFO msg = new NetSDKLib.DEV_EVENT_ACCESS_CTL_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); //卡号 String card = new String(msg.szCardNo).trim(); //开门用户 String userId = new String(msg.szUserID).trim(); //开门错误码 int messageCode = msg.nErrorCode; //设备ID CDevInfo data = new CDevInfo(); ToolKits.GetPointerData(dwUser, data); String szSn = new String(data.szSN).trim(); System.out.println(String.format("设备ID: %s", szSn)); } return 0; } } /////////////// 配置登陆地址,端口,用户名,密码 //////////////////////// private String m_strUser = "admin"; private String m_strPassword = "admin"; ////////////////////////////////////////////////////////////////////// public void InitTest(){ Init(); // 打开工程,初始化 this.loginAndAttach(); } // 加载测试内容 public void RunTest() { CaseMenu menu = new CaseMenu(); menu.run(); } // 结束测试 public void EndTest() { System.out.println("End Test"); this.detachAndLogout(); // 退订并退出 System.out.println("See You..."); cleanAndExit(); // 清理资源并退出 } public static void main(String[] args) { for (int i = 0; i < 100; i++) { devInfo.add(new CDevInfo("10.34.3.63", 37777 + i, "device:" + (37777 + i))); } AccessDwUser demo = new AccessDwUser(); demo.InitTest(); demo.RunTest(); demo.EndTest(); } }