package com.netsdk.demo; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.enumeration.EM_EVENT_IVS_TYPE; import com.netsdk.lib.enumeration.EM_EVENT_TYPE; import com.sun.jna.Memory; import com.sun.jna.Pointer; import java.io.File; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.*; import static com.netsdk.lib.Utils.getOsPrefix; /** * @author 291189 * @version 1.0 * @description 2022基线功能 * 多设备登录,智能订阅 ,取消智能订阅;以及智能订阅dwUser的使用。 * @date 2022/10/10 15:54 */ public class BaseMoreLoginDemo { public static NetSDKLib netSdk = NetSDKLib.NETSDK_INSTANCE; static List deviceList=new ArrayList<>(); static { // 初始化SDK库 netSdk.CLIENT_Init(DisconnectCallback.getInstance(), null); // 设置断线重连成功回调函数 netSdk.CLIENT_SetAutoReconnect(HaveReconnectCallback.getInstance(), null); //打开日志,可选0 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!!!"); } } /** * 设备断线回调 */ private static class DisconnectCallback implements NetSDKLib.fDisConnect { private static DisconnectCallback instance = new DisconnectCallback(); private DisconnectCallback() { } public static DisconnectCallback getInstance() { return instance; } public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("Device[%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(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("Device[%s:%d] HaveReconnected!\n", pchDVRIP, nDVRPort); } } /** * 高安全登录 */ public NetSDKLib.LLong loginWithHighLevel(String ip,int port,String user,String password) { // 输入结构体参数 NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstlnParam = new NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY() { { szIP = ip.getBytes(); nPort = port; szUserName = user.getBytes(); szPassword = password.getBytes(); } }; // 输出结构体参数 NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam = new NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY(); // 写入sdk NetSDKLib.LLong loginHandle = netSdk.CLIENT_LoginWithHighLevelSecurity(pstlnParam, pstOutParam); if (loginHandle.longValue() == 0) { // System.err.printf("Login Device[%s] Port[%d]Failed. %s\n", ip, port, netSdk.CLIENT_GetLastError()); System.out.println("Login Device[%s] Port[%d]Failed. "+ ip+":"+ port+":"+ netSdk.CLIENT_GetLastError()); } else { NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = pstOutParam.stuDeviceInfo; // 获取设备信息 System.out.println("Login Success"); System.out.println("Device Address:" + ip); System.out.println("设备包含:" + deviceInfo.byChanNum + "个通道"); } return loginHandle; } /** * 退出清理环境 */ public void LoginOut(NetSDKLib.LLong lLong){ System.out.println("End Test"); if( lLong.longValue() != 0) { netSdk.CLIENT_Logout(lLong); } System.out.println("See You..."); } public class Device{ public String ip; public int port; public NetSDKLib.LLong loginHandler=new NetSDKLib.LLong(0);//登录句柄 public List deviceHandlers=new ArrayList<>();//订阅句柄 public Device() { } @Override public String toString() { return "Device{" + "ip='" + ip + '\'' + ", port=" + port + ", loginHandler=" + loginHandler.longValue()+ '}'; } } public class DeviceHandler{ public int channel; public NetSDKLib.LLong attachHandler=new NetSDKLib.LLong(0);//订阅句柄 public String dwUser; @Override public String toString() { return "DeviceHandler{" + "channel=" + channel + ", attachHandler=" + attachHandler + ", dwUser=" + dwUser + '}'; } } /** * 订阅智能任务 */ //存储dwuser,防止回收 static HashMap pointers=new HashMap<>(); public NetSDKLib.LLong AttachEventRealLoadPic(NetSDKLib.LLong loginHandle,NetSDKLib.LLong attachHandle,int channel,String dwUser) { // 先退订,设备不会对重复订阅作校验,重复订阅后会有重复的事件返回 if(attachHandle.longValue()!=0){ this.DetachEventRealLoadPic(attachHandle); } Pointer dwUserData = GetStringToPointer(dwUser,encode); // 需要图片 int bNeedPicture = 1; attachHandle = netSdk.CLIENT_RealLoadPictureEx(loginHandle, channel, EM_EVENT_TYPE.EVENT_IVS_ALL.getType(), bNeedPicture, AnalyzerDataCB.getInstance(), dwUserData, null); if (attachHandle.longValue() != 0) { System.out.printf("Chn[%d] CLIENT_RealLoadPictureEx Success\n", channel); pointers.put(attachHandle,dwUserData); } else { System.out.printf("Chn[%d] CLIENT_RealLoadPictureEx Failed!LastError = %s\n", channel, ToolKits.getErrorCode()); } return attachHandle; } public static Pointer GetStringToPointer(String src,String charset) { Pointer pointer = null; try { byte[] b = src.getBytes(charset); pointer = new Memory(b.length + 1); pointer.clear(b.length + 1); pointer.write(0, b, 0, b.length); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return pointer; } public static String GetPointerDataToString(Pointer pointer,String charset) { String str = ""; if (pointer == null) { return str; } int length = 0; byte[] bufferPlace = new byte[1]; for (int i = 0; i < 2048; i++) { pointer.read(i, bufferPlace, 0, 1); if (bufferPlace[0] == '\0') { length = i; break; } } if (length > 0) { byte[] buffer = new byte[length]; pointer.read(0, buffer, 0, length); try { str = new String(buffer, charset).trim(); } catch (UnsupportedEncodingException e) { return str; } } return str; } /** * 报警事件(智能)回调 */ public static class AnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack { private final File picturePath; private static AnalyzerDataCB instance; private AnalyzerDataCB() { picturePath = new File("./AnalyzerPicture/"); if (!picturePath.exists()) { picturePath.mkdirs(); } } public static AnalyzerDataCB getInstance() { if (instance == null) { synchronized (AnalyzerDataCB.class) { if (instance == null) { instance = new AnalyzerDataCB(); } } } return instance; } @Override public int invoke(NetSDKLib.LLong lAnalyzerHandle, int dwAlarmType, Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize, Pointer dwUser, int nSequence, Pointer reserved) { if (lAnalyzerHandle == null || lAnalyzerHandle.longValue() == 0) { return -1; } String s = GetPointerDataToString(dwUser,encode); System.out.println("方法一 dwUser的值:"+s); for(int i=0;i deviceHandlers = device.deviceHandlers; for(DeviceHandler deviceHandler:deviceHandlers){ if(deviceHandler.attachHandler.longValue()==lAnalyzerHandle.longValue()){ System.out.println("方法二 根据句柄关联:"+ "订阅句柄:"+deviceHandler.attachHandler+ ",设备信息:"+device.ip+":"+device.port+",通道号:"+deviceHandler.channel); } } } switch (Objects.requireNonNull(EM_EVENT_IVS_TYPE.getEventType(dwAlarmType))) { case EVENT_IVS_FACEDETECT : { System.out.println("目标检测事件"); break; } //目标识别事件 case EVENT_IVS_FACERECOGNITION:{ System.out.println("目标识别事件"); break; } case EVENT_IVS_NUMBERSTAT:{ System.out.println("数量统计事件"); break; } default: System.out.println("其他事件--------------------"+ dwAlarmType); break; } return 0; } } /** * 停止侦听智能事件 */ public void DetachEventRealLoadPic( NetSDKLib.LLong attachHandle) { if (attachHandle.longValue() != 0) { boolean b = netSdk.CLIENT_StopLoadPic(attachHandle); if(b){ System.out.println("CLIENT_StopLoadPic success"); }else { System.out.println("CLIENT_StopLoadPic fail!"+ToolKits.getErrorCode()); } } } static Scanner scanner=new Scanner(System.in); public static void main(String[] args) { BaseMoreLoginDemo baseMoreLoginDemo=new BaseMoreLoginDemo(); baseMoreLoginDemo.runLogic(); } public void runLogic(){ while (true){ System.out.println("0.退出"); System.out.println("1.设备登录"); System.out.println("2.选择设备 通道 智能订阅"); System.out.println("3.选择设备 通道 取消订阅"); for(int i=0;i deviceHandlers = device.deviceHandlers; for(int j=0;j deviceHandlers = device.deviceHandlers; NetSDKLib.LLong attachHandler=new NetSDKLib.LLong(0); boolean flag=false; int m=-1; //轮询 设备的订阅通道 for( int i=0;i deviceHandlers = device.deviceHandlers; DeviceHandler deviceHandler = deviceHandlers.get(Integer.parseInt(split[1].trim())); DetachEventRealLoadPic(deviceHandler.attachHandler); pointers.remove(deviceHandler.attachHandler); deviceHandlers.remove(Integer.parseInt(split[1].trim())); }else { System.out.println("输入有误"); } }catch (Exception e){ e.printStackTrace(); } } Iterator iterator = deviceList.iterator(); while (iterator.hasNext()){ Device next = iterator.next(); if(next!=null&&next.loginHandler!=null&&next.loginHandler.longValue()!=0){ LoginOut(next.loginHandler); } } netSdk.CLIENT_Cleanup(); } // 编码格式 public static String encode; static { String osPrefix = getOsPrefix(); if (osPrefix.toLowerCase().startsWith("win32-amd64")) { encode = "GBK"; } else if (osPrefix.toLowerCase().startsWith("linux-amd64")) { encode = "UTF-8"; } } }