package com.netsdk.demo.test; import com.netsdk.demo.util.CaseMenu; import com.netsdk.demo.util.ThreadPoolUtil; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.Utils; import com.sun.jna.Memory; import com.sun.jna.Pointer; import java.io.ByteArrayInputStream; import java.io.File; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * @author 291189 * @version 1.0 * @description jna性能优化 测试 * @date 2021/7/20 */ public class JnaXingNeng { private String m_strIpAddr = "10.34.3.219"; private String m_strIpAddr1="10.34.3.220"; private int m_nPort = 37777; private String m_strUser = "admin"; private String m_strPassword = "admin"; static NetSDKLib netSdk = NetSDKLib.NETSDK_INSTANCE; static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE; // public static final NetSDKLib netSdk = NetSDKLib.NETSDK_INSTANCE; // 登陆句柄 private static NetSDKLib.LLong loginHandle = new NetSDKLib.LLong(0); // 订阅句柄 private static NetSDKLib.LLong AttachHandle = new NetSDKLib.LLong(0); // 设备信息扩展 private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); /** * 设备断线回调 */ 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 void InitTest() { // 初始化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!!!"); } loginWithHighLevel(); } /** * 高安全登录 */ public void loginWithHighLevel() { // 输入结构体参数 NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstlnParam = new NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY() { { szIP = m_strIpAddr.getBytes(); nPort = m_nPort; szUserName = m_strUser.getBytes(); szPassword = m_strPassword.getBytes(); } }; // 输出结构体参数 NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam = new NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY(); // 写入sdk loginHandle = netSdk.CLIENT_LoginWithHighLevelSecurity(pstlnParam, pstOutParam); if (loginHandle.longValue() == 0) { System.err.printf("Login Device[%s] Port[%d]Failed. %s\n", m_strIpAddr, m_nPort, netSdk.CLIENT_GetLastError()); } else { deviceInfo = pstOutParam.stuDeviceInfo; // 获取设备信息 System.out.println("Login Success"); System.out.println("Device Address:" + m_strIpAddr); System.out.println("设备包含:" + deviceInfo.byChanNum + "个通道"); } // System.arraycopy(); } /** * 退出清理环境 */ 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); } // 编码格式 public static String encode; static { String osPrefix = Utils.getOsPrefix(); if (osPrefix.toLowerCase().startsWith("win64-amd64")) { encode = "GBK"; } else if (osPrefix.toLowerCase().startsWith("linux-amd64")) { encode = "UTF-8"; } } /** * 选择通道 */ private int channel = 0; /** * 订阅智能任务 */ public void attachIVSEvent() { // 先退订,设备不会对重复订阅作校验,重复订阅后会有重复的事件返回 this.DetachEventRealLoadPic(); // 需要图片 int bNeedPicture = 1; //订阅所有事件 AttachHandle = netSdk.CLIENT_RealLoadPictureEx(loginHandle, channel, NetSDKLib.EVENT_IVS_ALL, bNeedPicture, AnalyzerDataCB.getInstance(), null, null); if (AttachHandle.longValue() != 0) { System.out.printf("Chn[%d] CLIENT_RealLoadPictureEx Success\n", channel); } else { System.out.printf("Ch[%d] CLIENT_RealLoadPictureEx Failed!LastError = %s\n", channel, ToolKits.getErrorCode()); } } static int count=0; /** * 报警事件(智能)回调 */ private 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; } 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; }*/ /*NET_DEV_EVENT_FACERECOGNITION_INFO msg = new NET_DEV_EVENT_FACERECOGNITION_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg);*/ try { if(dwAlarmType==NetSDKLib.EVENT_IVS_FACERECOGNITION){ // NET_DEV_EVENT_FACERECOGNITION_INFO msg1 = new NET_DEV_EVENT_FACERECOGNITION_INFO(); // byte[] byteArray // = pAlarmInfo.getByteArray(0, msg1.size()); // ThreadPoolUtil.getThreadPool().execute(new MyThread(dwAlarmType,byteArray)); } }catch (Exception e){ e.printStackTrace(); } return 0; } } /** * 停止侦听智能事件 */ public void DetachEventRealLoadPic() { if (AttachHandle.longValue() != 0) { netSdk.CLIENT_StopLoadPic(AttachHandle); } } public void RunTest() { CaseMenu menu = new CaseMenu(); menu.addItem((new CaseMenu.Item(this, "attachIVSEvent", "attachIVSEvent"))); menu.addItem((new CaseMenu.Item(this, "DetachEventRealLoadPic", "DetachEventRealLoadPic"))); menu.run(); } public static void main(String[] args) { JnaXingNeng TD = new JnaXingNeng(); TD.InitTest(); TD.RunTest(); TD.LoginOut(); } public static class MyThread extends Thread { public int dwAlarmType; public byte[] pointer; public MyThread(int dwAlarmType, byte[] pointer) { this.dwAlarmType=dwAlarmType; this.pointer=pointer; } public MyThread() { } public void run() { new JnaXingNeng().handleData(dwAlarmType,pointer); } } public void handleData( int dwAlarmType, byte[] pointer) { Pointer m=new Memory(pointer.length); m.write(0, pointer, 0, pointer.length); Calendar cal = Calendar.getInstance(); count++; System.out.println("count:"+count); Date date1 = cal.getTime(); System.out.println("start:"+new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(date1)); System.out.println("dwAlarmType:" + dwAlarmType); switch (dwAlarmType) { /* case NetSDKLib.EVENT_IVS_FACEDETECT: System.out.println("人脸事件"); NetSDKLib.DEV_EVENT_FACEDETECT_INFO msg = new NetSDKLib.DEV_EVENT_FACEDETECT_INFO(); ToolKits.GetPointerData(pointer, msg); System.out.println("info:"+msg.nChannelID); Calendar cal1 = Calendar.getInstance(); Date date2 = cal1.getTime(); System.out.println("end:"+new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(date2)); break;*/ case NetSDKLib.EVENT_IVS_FACERECOGNITION: // NET_DEV_EVENT_FACERECOGNITION_INFO msg1 = new NET_DEV_EVENT_FACERECOGNITION_INFO(); // ToolKits.GetPointerData(m, msg1); // int bGlobalScenePic = msg1.bGlobalScenePic; // NetSDKLib.CANDIDATE_INFOEX[] stuCandidatesEx = msg1.stuCandidatesEx; // for (NetSDKLib.CANDIDATE_INFOEX candidate_infoex: stuCandidatesEx // ) { // System.out.println("candidate_infoex:"+candidate_infoex.stTime); // } // NetSDKLib.NET_PIC_INFO stuGlobalScenePicInfo = msg1.stuGlobalScenePicInfo; // System.out.println("stuGlobalScenePicInfo:"+stuGlobalScenePicInfo.dwFileLenth); //两种方式都要将结构体对象作为全局变量放在外面;避免每次进入回调都要进行初始化; //1:选择想要的字段进行复制,不再将结构体中所有的字段全都拷贝下来 //2:当前线程只进行不耗时write()操作,将read()放到另一条线程中进行 /*long time1=System.currentTimeMillis(); msg.getPointer().write(0, pAlarmInfo.getByteArray(0, msg.size()), 0, pAlarmInfo.getByteArray(0, msg.size()).length); new Thread(new Runnable() { @Override public void run() { msg.read(); System.out.println("szName : " + new String(msg.szName).trim() + "\n" ); } }).start(); long time2=System.currentTimeMillis(); System.out.println(time1-time2);*/ break; default: System.out.println("其他事件--------------------" + dwAlarmType); break; } Calendar cal2 = Calendar.getInstance(); Date date3 = cal2.getTime(); System.out.println("end:"+new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(date3)); // lock.unlock(); } }