package com.netsdk.demo.customize.securityCheck; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.enumeration.EM_EVENT_IVS_TYPE; import com.netsdk.lib.structure.DEV_EVENT_SECURITYGATE_PERSONALARM_INFO; import com.netsdk.lib.structure.NET_SECURITYGATE_ALARM_FACE_INFO; import com.netsdk.lib.structure.NET_TIME_EX; import com.sun.jna.Pointer; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.Objects; import static com.netsdk.lib.Utils.getOsPrefix; /** * @author 291189 * @version 1.0 * @description 安检门温度检测 安检门事件 * @date 2021/6/30 */ public class TemperatureDetectionDemo { /** * 安检门 */ private String m_strIpAddr = "10.35.232.160"; private int m_nPort = 37777; private String m_strUser = "admin"; private String m_strPassword = "admin123"; 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 TemperatureDetectionDemo.DisconnectCallback instance = new TemperatureDetectionDemo.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 TemperatureDetectionDemo.HaveReconnectCallback instance = new TemperatureDetectionDemo.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(TemperatureDetectionDemo.DisconnectCallback.getInstance(), null); // 设置断线重连成功回调函数 netSdk.CLIENT_SetAutoReconnect(TemperatureDetectionDemo.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 + "个通道"); } } /** * 退出清理环境 */ 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 = 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()); } } /** * 报警事件(智能)回调 */ 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; } switch (Objects.requireNonNull(EM_EVENT_IVS_TYPE.getEventType(dwAlarmType))) { case EVENT_IVS_ANATOMY_TEMP_DETECT: {// 人体温智能检测事件(对应 DEV_EVENT_ANATOMY_TEMP_DETECT_INFO) NetSDKLib.DEV_EVENT_ANATOMY_TEMP_DETECT_INFO msg = new NetSDKLib.DEV_EVENT_ANATOMY_TEMP_DETECT_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); System.out.println("人体温智能检测事件"); // 通道号 int nChannelID = msg.nChannelID; System.out.println("nChannelID:"+nChannelID); // 1:开始 2:停止 int nAction = msg.nAction; System.out.println("nAction:"+nAction); // 事件名称 byte[] szName = msg.szName; try { String name = new String(szName, "gbk"); System.out.println("szName:"+name); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 时间戳(单位是毫秒) double pts = msg.PTS; System.out.println("pts:"+pts); // 事件发生的时间 NetSDKLib.NET_TIME_EX utc = msg.UTC; System.out.println("utc:"+utc); // 事件ID int nEventID = msg.nEventID; System.out.println("nEventID:"+nEventID); //智能事件所属大类(对应枚举类型EM_CLASS_TYPE) int emClassType = msg.emClassType; System.out.println("emClassType:"+emClassType); // 事件触发的预置点号, 从1开始, 没有该字段,表示预置点未知 int nPresetID = msg.nPresetID; System.out.println("nPresetID:"+nPresetID); NetSDKLib.NET_MAN_TEMP_INFO stManTempInfo = msg.stManTempInfo; System.out.printf("【区域内人员体温信息】:nObjectID="+stManTempInfo.nObjectID+",dbHighTemp=" +stManTempInfo.dbHighTemp+",nTempUnit="+stManTempInfo.nTempUnit +",bIsOverTemp="+stManTempInfo.bIsOverTemp+",bIsUnderTemp=" +stManTempInfo.bIsUnderTemp+",emMaskDetectResult="+stManTempInfo.emMaskDetectResult+ ",nAge="+stManTempInfo.nAge+",emSex="+stManTempInfo.emSex +",stThermalRect_top="+stManTempInfo.stThermalRect.top +",stThermalRect_left="+stManTempInfo.stThermalRect.left +",stThermalRect_right="+stManTempInfo.stThermalRect.right +",stThermalRect_bottom="+stManTempInfo.stThermalRect.bottom+"\n"); //可见光全景图 if(msg.stVisSceneImage!=null && msg.stVisSceneImage.nLength> 0){ String visibleLightPicture = picturePath + "\\" + System.currentTimeMillis() + "visibleLight.jpg"; ToolKits.savePicture(pBuffer, msg.stVisSceneImage.nOffset, msg.stVisSceneImage.nLength, visibleLightPicture); } //热成像全景图 if(msg.stThermalSceneImage!=null && msg.stThermalSceneImage.nLength> 0){ String thermographyPicture = picturePath + "\\" + System.currentTimeMillis() + "thermography.jpg"; ToolKits.savePicture(pBuffer, msg.stThermalSceneImage.nOffset, msg.stThermalSceneImage.nLength, thermographyPicture); } break; } case EVENT_IVS_SECURITYGATE_PERSONALARM: { //安检门人员报警事件 System.out.println("安检门人员报警事件"); DEV_EVENT_SECURITYGATE_PERSONALARM_INFO msg = new DEV_EVENT_SECURITYGATE_PERSONALARM_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); // 通道号 int nChannelID = msg.nChannelID; System.out.println("nChannelID:" + nChannelID); // 0:脉冲 1:开始 2:停止 int nAction = msg.nAction; System.out.println("nAction:" + nAction); // 事件名称 byte[] szName = msg.szName; try { String name = new String(szName, "gbk"); System.out.println("szName:" + name); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 时间戳(单位是毫秒) double pts = msg.PTS; System.out.println("pts:" + pts); // 事件发生的时间 NET_TIME_EX utc = msg.UTC; System.out.println("utc:" + utc); // 事件ID int nEventID = msg.nEventID; System.out.println("nEventID:" + nEventID); /** * 人员通过方向枚举,参考枚举{@link com.netsdk.lib.enumeration.EM_SECURITYGATE_PERSON_PASS_DIRECTION } */ int emDirection = msg.emDirection; System.out.println("emDirection:" + emDirection); /** * 报警级别,参考枚举{@link com.netsdk.lib.enumeration.EM_SECURITYGATE_ALARM_LEVEL } */ int emAlarmLevel = msg.emAlarmLevel; System.out.println("emAlarmLevel:" + emAlarmLevel); // 关联进入通道 int nChannelIn = msg.nChannelIn; System.out.println("nChannelIn:" + nChannelIn); // 关联离开通道 int channelOut = msg.ChannelOut; System.out.println("ChannelOut:" + channelOut); // 报警位置个数 int nAlarmPositionNum = msg.nAlarmPositionNum; System.out.println("nAlarmPositionNum:" + nAlarmPositionNum); // 人脸信息 NET_SECURITYGATE_ALARM_FACE_INFO faceInfo = msg.stuSecurityGateFaceInfo; System.out.println("【人脸信息】:emSex=" + faceInfo.emSex + ",nAge=" + faceInfo.nAge + ",emEmotion=" + faceInfo.emEmotion + ",emGlasses=" + faceInfo.emGlasses + ",emMask=" + faceInfo.emMask + ",emBeard=" + faceInfo.emBeard + ",nAttractive=" + faceInfo.nAttractive + ",emMouth=" + faceInfo.emMouth + ",emEye=" + faceInfo.emEye + ",fTemperature=" + faceInfo.fTemperature + ",emTempUnit=" + faceInfo.emTempUnit + ",emTempType=" + faceInfo.emTempType); /** * 报警位置,参考枚举{@link com.netsdk.lib.enumeration.EM_SECURITYGATE_ALARM_POSITION } */ // 报警位置 int[] emAlarmPosition = msg.emAlarmPosition; for (int i = 0; i < emAlarmPosition.length; i++) { System.out.println("报警位置:" + i + "[" + emAlarmPosition[i] + "]"); } //人脸图片信息 if (msg.stuImageInfo != null && msg.stuImageInfo.nLength > 0) { String facePicture = picturePath + "\\" + System.currentTimeMillis() + "face.jpg"; ToolKits.savePicture(pBuffer, msg.stuImageInfo.nOffSet, msg.stuImageInfo.nLength, facePicture); } //人脸小图 if (msg.stuFaceImageInfo != null && msg.stuFaceImageInfo.nLength > 0) { String faceSmallPicture = picturePath + "\\" + System.currentTimeMillis() + "faceSmall.jpg"; ToolKits.savePicture(pBuffer, msg.stuFaceImageInfo.nOffSet, msg.stuFaceImageInfo.nLength, faceSmallPicture); } break; } default: System.out.println("其他事件--------------------" + dwAlarmType); break; } 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){ TemperatureDetectionDemo TD=new TemperatureDetectionDemo(); TD.InitTest(); TD.RunTest(); TD.LoginOut(); } }