package com.netsdk.demo.customize.fireDetectionDemo; import static com.netsdk.lib.Utils.getOsPrefix; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.Objects; import java.util.Scanner; 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.enumeration.EM_COMPLIANCE_STATE; import com.netsdk.lib.enumeration.EM_EVENT_IVS_TYPE; import com.netsdk.lib.enumeration.EM_LEAVEDETECTION_STATE; import com.netsdk.lib.enumeration.EM_LEAVEDETECTION_TRIGGER_MODE; import com.netsdk.lib.enumeration.EM_WEARING_STATE; import com.netsdk.lib.structure.ALARM_FIRE_DETECTION_INFO; import com.netsdk.lib.structure.DEV_EVENT_ANYTHING_DETECT_INFO; import com.netsdk.lib.structure.DEV_EVENT_FIRE_EXTINGUISHER_DETECTION_INFO; import com.netsdk.lib.structure.DEV_EVENT_FIRE_INFO; import com.netsdk.lib.structure.DEV_EVENT_FIRE_LANE_DETECTION_INFO; import com.netsdk.lib.structure.DEV_EVENT_RIDING_MOTOR_CYCLE_INFO; import com.netsdk.lib.structure.DEV_EVENT_SMOKE_INFO; import com.netsdk.lib.structure.NET_MASK_ATTRIBUTE; import com.netsdk.lib.structure.NET_VAGEOBJECT_INFO; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; /** * 事件:智能周界、作业管控、烟火检测等事件 * * @author 251823 */ public class FireDetectionDemo { static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE; static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE; private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); // 登陆句柄 private static LLong loginHandle = new LLong(0); // 智能订阅句柄 private LLong attachHandle = new NetSDKLib.LLong(0); private static class DisconnectCallback implements NetSDKLib.fDisConnect { private static DisconnectCallback instance = new DisconnectCallback(); private DisconnectCallback() { } public static DisconnectCallback getInstance() { return instance; } public void invoke(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(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("Device[%s:%d] HaveReconnected!\n", pchDVRIP, nDVRPort); } } 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(DisconnectCallback.getInstance(), null); // 设置断线自动重练功能 netsdkApi.CLIENT_SetAutoReconnect(HaveReconnectCallback.getInstance(), null); // 向设备登入 int nSpecCap = 0; IntByReference nError = new IntByReference(0); loginHandle = netsdkApi.CLIENT_LoginEx2(address, port, username, password, nSpecCap, null, deviceInfo, nError); if (loginHandle.longValue() == 0) { System.err.printf("Login Device [%s:%d] Failed ! Last Error[%x]\n", address, port, netsdkApi.CLIENT_GetLastError()); EndTest(); return; } System.out.printf("Login Device [%s:%d] Success. \n", address, port); } // 编码格式 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"; } } /** * 订阅报警信息 * */ public void startListen() { // 设置报警回调函数 netsdkApi.CLIENT_SetDVRMessCallBack(fAlarmAccessDataCB.getInstance(), null); // 订阅报警 boolean bRet = netsdkApi.CLIENT_StartListenEx(loginHandle); if (!bRet) { System.err.println("订阅报警失败! LastError = 0x%x\n" + netsdkApi.CLIENT_GetLastError()); } else { System.out.println("订阅报警成功."); } } /** * 报警事件回调 */ private static class fAlarmAccessDataCB implements NetSDKLib.fMessCallBack { private static fAlarmAccessDataCB instance = new fAlarmAccessDataCB(); private fAlarmAccessDataCB() { } public static fAlarmAccessDataCB getInstance() { return instance; } public boolean invoke(int lCommand, LLong lLoginID, Pointer pStuEvent, int dwBufLen, String strDeviceIP, NativeLong nDevicePort, Pointer dwUser) { switch (lCommand) { case NetSDKLib.NET_ALARM_FIRE_DETECTION: {// 火警事件(对于的结构体 ALARM_FIRE_DETECTION_INFO) ALARM_FIRE_DETECTION_INFO msg = new ALARM_FIRE_DETECTION_INFO(); ToolKits.GetPointerData(pStuEvent, msg); System.out.println("通道号:" + msg.nChannelID); System.out.println("事件动作:" + msg.nAction); System.out.println("事件发生的时间:" + msg.UTC); break; } } return true; } } /** * 取消订阅报警信息 * * @return */ public void stopListen() { // 停止订阅报警 boolean bRet = netsdkApi.CLIENT_StopListen(loginHandle); if (bRet) { System.out.println("取消订阅报警信息."); } } /** * 选择通道 */ private int channel = 0; public void setChannelID() { System.out.println("请输入通道,从0开始计数,-1表示全部"); Scanner sc = new Scanner(System.in); this.channel = sc.nextInt(); } /** * 订阅智能任务 */ public void AttachEventRealLoadPic() { // 先退订,设备不会对重复订阅作校验,重复订阅后会有重复的事件返回 this.DetachEventRealLoadPic(); // 需要图片 int bNeedPicture = 1; attachHandle = netsdkApi.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(LLong lAnalyzerHandle, int dwAlarmType, Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize, Pointer dwUser, int nSequence, Pointer reserved) { if (lAnalyzerHandle == null || lAnalyzerHandle.longValue() == 0) { return -1; } System.out.println("dwAlarmType:"+dwAlarmType); switch (Objects.requireNonNull(EM_EVENT_IVS_TYPE.getEventType(dwAlarmType))) { case EVENT_IVS_CROSSREGIONDETECTION: {// 警戒区事件(对应 DEV_EVENT_CROSSREGION_INFO) NetSDKLib.DEV_EVENT_CROSSREGION_INFO msg = new NetSDKLib.DEV_EVENT_CROSSREGION_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); String Picture = picturePath + "\\" + "EVENT_IVS_CROSSREGIONDETECTION" + System.currentTimeMillis() + ".jpg"; if (dwBufSize > 0) { ToolKits.savePicture(pBuffer, 0, dwBufSize, Picture); } System.out.println(" 警戒区事件 时间(UTC):" + msg.UTC + " 通道号:" + msg.nChannelID + " 开始时间:" + msg.stuObject.stuStartTime + " 结束时间:" + msg.stuObject.stuEndTime + " 事件ID:" + msg.nEventID); break; } case EVENT_IVS_FIREDETECTION: {// 火警事件(对应 DEV_EVENT_FIRE_INFO) DEV_EVENT_FIRE_INFO msg = new DEV_EVENT_FIRE_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); // 全景广角图 if (msg.stuSceneImage != null && msg.stuSceneImage.nLength > 0) { String bigPicture = picturePath + "\\" + "EVENT_IVS_FIREDETECTION" + System.currentTimeMillis() + ".jpg"; ToolKits.savePicture(pBuffer, msg.stuSceneImage.nOffSet, msg.stuSceneImage.nLength, bigPicture); } System.out.println(" 火警事件 时间(UTC):" + msg.UTC + " 通道号:" + msg.nChannelID + " 开始时间:" + msg.stuObject.stuStartTime + " 结束时间:" + msg.stuObject.stuEndTime + " 事件ID:" + msg.nEventID + " 抓拍过程:" + msg.emCaptureProcess); break; } case EVENT_IVS_SMOKEDETECTION: {// 烟雾报警事件(对应 DEV_EVENT_SMOKE_INFO) DEV_EVENT_SMOKE_INFO msg = new DEV_EVENT_SMOKE_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); // 全景广角图 if (msg.stuSceneImage != null && msg.stuSceneImage.nLength > 0) { String bigPicture = picturePath + "\\" + "EVENT_IVS_SMOKEDETECTION" + System.currentTimeMillis() + ".jpg"; ToolKits.savePicture(pBuffer, msg.stuSceneImage.nOffSet, msg.stuSceneImage.nLength, bigPicture); } System.out.println(" 烟雾报警事件 时间(UTC):" + msg.UTC + " 通道号:" + msg.nChannelID + " 开始时间:" + msg.stuObject.stuStartTime + " 结束时间:" + msg.stuObject.stuEndTime + " 事件ID:" + msg.nEventID); break; } case EVENT_IVS_SMOKING_DETECT: {// 吸烟检测事件(对应 DEV_EVENT_SMOKING_DETECT_INFO) NetSDKLib.DEV_EVENT_SMOKING_DETECT_INFO msg = new NetSDKLib.DEV_EVENT_SMOKING_DETECT_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); String Picture = picturePath + "\\" + "EVENT_IVS_SMOKING_DETECT" + System.currentTimeMillis()+ ".jpg"; if (dwBufSize > 0) { ToolKits.savePicture(pBuffer, 0, dwBufSize, Picture); } System.out.println("吸烟检测事件 时间(UTC):" + msg.UTC + " 开始时间:" + msg.stuObject.stuStartTime + " 结束时间:" + msg.stuObject.stuEndTime); break; } case EVENT_IVS_LEAVEDETECTION: {// 离岗检测事件(对应 DEV_EVENT_IVS_LEAVE_INFO) NetSDKLib.DEV_EVENT_IVS_LEAVE_INFO msg = new NetSDKLib.DEV_EVENT_IVS_LEAVE_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); System.out.printf("【离岗检测事件】 时间(UTC):%s 通道号:%d 开始时间:%s 结束时间:%s \n", msg.UTC, msg.nChannelID, msg.stuObject.stuStartTime, msg.stuObject.stuEndTime); System.out.println("离岗的触发模式:"+EM_LEAVEDETECTION_TRIGGER_MODE.getNoteByValue(msg.emTriggerMode)); System.out.println("检测状态:"+EM_LEAVEDETECTION_STATE.getNoteByValue(msg.emState)); System.out.println("stuSceneImage 是否有效:"+msg.bSceneImage); // 全景广角图 if (msg.stuSceneImage != null && msg.stuSceneImage.nLength > 0) { String bigPicture = picturePath + "\\" + "EVENT_IVS_LEAVEDETECTION" + System.currentTimeMillis() + ".jpg"; ToolKits.savePicture(pBuffer, msg.stuSceneImage.nOffSet, msg.stuSceneImage.nLength, bigPicture); } break; } case EVENT_IVS_FIRE_LANE_DETECTION: {// 消防占道检测事件(对应DEV_EVENT_FIRE_LANE_DETECTION_INFO) DEV_EVENT_FIRE_LANE_DETECTION_INFO msg = new DEV_EVENT_FIRE_LANE_DETECTION_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); try { System.out.println("消防占道检测事件 时间(UTC):" + msg.UTC + " 事件名称:" + new String(msg.szName,encode).trim() + " 通道号:" + msg.nChannelID + " 事件ID:" + msg.nEventID); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } System.out.println("检测到的物体个数:" + msg.nObjectNum); System.out.println("stuSceneImage 是否有效:" + msg.bSceneImage); if (msg.stuSceneImage != null && msg.stuSceneImage.nLength > 0) { String bigPicture = picturePath + "\\" + "EVENT_IVS_FIRE_LANE_DETECTION" + System.currentTimeMillis() + ".jpg"; ToolKits.savePicture(pBuffer, msg.stuSceneImage.nOffSet, msg.stuSceneImage.nLength, bigPicture); } break; } case EVENT_IVS_ANYTHING_DETECT: {// 全物体类型检测事件 ( 对应 DEV_EVENT_ANYTHING_DETECT_INFO ) DEV_EVENT_ANYTHING_DETECT_INFO msg = new DEV_EVENT_ANYTHING_DETECT_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); // 图片 String Picture = picturePath + "\\" + "big_EVENT_IVS_ANYTHING_DETECT" + System.currentTimeMillis()+ ".jpg"; if (dwBufSize > 0) { ToolKits.savePicture(pBuffer, 0, dwBufSize, Picture); } System.out.println("全物体类型检测事件 时间(UTC):" + msg.UTC + " 事件名称:" + new String(msg.szName) + " 通道号:" + msg.nChannelID + " 事件ID:" + msg.nEventID); // 全景广角图 if (msg.stuSceneImage != null && msg.stuSceneImage.nLength > 0) { String bigPicture = picturePath + "\\" + "EVENT_IVS_ANYTHING_DETECT" + System.currentTimeMillis() + ".jpg"; ToolKits.savePicture(pBuffer, msg.stuSceneImage.nOffSet, msg.stuSceneImage.nLength, bigPicture); } System.out.println("检测到的物体个数:" + msg.nObjectNum); if(msg.nObjectNum > 0) { NET_VAGEOBJECT_INFO[] pstuObjects = new NET_VAGEOBJECT_INFO[msg.nObjectNum]; for (int i = 0; i < msg.nObjectNum; i++) { pstuObjects[i] = new NET_VAGEOBJECT_INFO(); } ToolKits.GetPointerDataToStructArr(msg.pstuObjects, pstuObjects); for (int i = 0; i < msg.nObjectNum; i++) { System.out.println("第" +(i+1) + "个物体------------"); System.out.println("物体ID: " + pstuObjects[i].nObjectID); System.out.println("模型支持的泛类型物体类型编号: " + pstuObjects[i].nTypeIndex); try { System.out.println("模型支持的泛类型物体类型: " + new String (pstuObjects[i].szTypeName,encode)); } catch (UnsupportedEncodingException e) { } System.out.println("当前时间戳: " + pstuObjects[i].stuCurrentTimeStamp.toString()); // 物体截图 if(pstuObjects[i].stuImage != null && pstuObjects[i].stuImage.nLength > 0) { String bigPicture1 = picturePath + "\\" + i+"__" + System.currentTimeMillis() + ".jpg"; ToolKits.savePicture(pBuffer, pstuObjects[i].stuImage.nOffset, pstuObjects[i].stuImage.nLength, bigPicture1); } } } break; } case EVENT_IVS_WORKCLOTHES_DETECT: {// 工装(安全帽/工作服等)检测事件(对应 DEV_EVENT_WORKCLOTHES_DETECT_INFO) NetSDKLib.DEV_EVENT_WORKCLOTHES_DETECT_INFO msg = new NetSDKLib.DEV_EVENT_WORKCLOTHES_DETECT_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); if (msg.stuSceneImage != null && msg.stuSceneImage.nLength > 0) { String bigPicture = picturePath + "\\" + "EVENT_IVS_WORKCLOTHES_DETECT" + System.currentTimeMillis() + ".jpg"; ToolKits.savePicture(pBuffer, msg.stuSceneImage.nOffSet, msg.stuSceneImage.nLength, bigPicture); if (msg.stuHumanImage != null && msg.stuHumanImage.nLength > 0) { String smallPicture = picturePath + "\\" + "EVENT_IVS_WORKCLOTHES_DETECT" + System.currentTimeMillis() + "small.jpg"; ToolKits.savePicture(pBuffer, msg.stuHumanImage.nOffSet, msg.stuHumanImage.nLength, smallPicture); } } System.out.println(" 工装(安全帽/工作服等)检测事件(UTC):" + msg.UTC + " 通道号:" + msg.nChannelID + " 工作裤属性顏色:" + msg.stuWorkPantsAttribute.emWorkPantsColor + " 事件ID:" + msg.nEventID); // 口罩相关属性状态信息 System.out.println("口罩相关属性状态信息----"); NET_MASK_ATTRIBUTE stuMask = msg.stuMask; System.out.println("是否有戴口罩:"+EM_WEARING_STATE.getNoteByValue(stuMask.emHasMask));// 是否有戴口罩,{@link EM_WEARING_STATE} System.out.println("口罩检测结果:"+EM_COMPLIANCE_STATE.getNoteByValue(stuMask.emHasLegalMask));// 口罩检测结果,{@link EM_COMPLIANCE_STATE} break; } case EVENT_IVS_CITY_MOTORPARKING: {// 城市机动车违停事件(对应 DEV_EVENT_CITY_MOTORPARKING_INFO) NetSDKLib.DEV_EVENT_CITY_MOTORPARKING_INFO msg = new NetSDKLib.DEV_EVENT_CITY_MOTORPARKING_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); String Picture = picturePath + "\\" + "EVENT_IVS_CITY_MOTORPARKING" + System.currentTimeMillis() + ".jpg"; if (dwBufSize > 0) { ToolKits.savePicture(pBuffer, 0, dwBufSize, Picture); } System.out.println(" 城市机动车违停事件 时间(UTC):" + msg.UTC + " 通道号:" + msg.nChannelID + " 是否为违规预警图片:" + msg.emPreAlarm + " 事件ID:" + msg.nEventID); break; } case EVENT_IVS_RIDING_MOTOR_CYCLE: {// 摩托车骑跨检测事件(对应 DEV_EVENT_RIDING_MOTOR_CYCLE_INFO) DEV_EVENT_RIDING_MOTOR_CYCLE_INFO msg = new DEV_EVENT_RIDING_MOTOR_CYCLE_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); String Picture = picturePath + "\\" + "EVENT_IVS_RIDING_MOTOR_CYCLE" + System.currentTimeMillis() + ".jpg"; if (dwBufSize > 0) { ToolKits.savePicture(pBuffer, 0, dwBufSize, Picture); } System.out.println(" 摩托车骑跨检测事件 时间(UTC):" + msg.stuUTC + " 通道号:" + msg.nChannelID + " 事件ID:" + msg.nEventID); break; } case EVENT_IVS_FIRE_EXTINGUISHER_DETECTION: {// 灭火器检测事件(对应 DEV_EVENT_FIRE_EXTINGUISHER_DETECTION_INFO) DEV_EVENT_FIRE_EXTINGUISHER_DETECTION_INFO msg = new DEV_EVENT_FIRE_EXTINGUISHER_DETECTION_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); String Picture = picturePath + "\\" + "EVENT_IVS_FIRE_EXTINGUISHER_DETECTION" + System.currentTimeMillis() + ".jpg"; if (dwBufSize > 0) { ToolKits.savePicture(pBuffer, 0, dwBufSize, Picture); } System.out.println(" 灭火器检测事件 时间(UTC):" + msg.stuUTC + " 通道号:" + msg.nChannelID + " 事件ID:" + msg.nEventID); break; } default: System.out.println("其他事件--------------------" + dwAlarmType); break; } return 0; } } /** * 停止侦听智能事件 */ public void DetachEventRealLoadPic() { if (attachHandle.longValue() != 0) { netsdkApi.CLIENT_StopLoadPic(attachHandle); } } /******************************** 测试控制台 ***************************************/ // 配置登陆地址,端口,用户名,密码 String address = "20.2.47.15"; // 172.24.1.229 172.24.31.180 //172.12.66.45 int port = 37777; String username = "admin"; String password = "admin123"; public static void main(String[] args) { FireDetectionDemo demo = new FireDetectionDemo(); demo.InitTest(); demo.RunTest(); demo.EndTest(); } /** * 加载测试内容 */ public void RunTest() { CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this, "订阅报警信息", "startListen")); menu.addItem(new CaseMenu.Item(this, "取消订阅报警信息", "stopListen")); menu.addItem(new CaseMenu.Item(this, "选择通道", "setChannelID")); menu.addItem(new CaseMenu.Item(this, "订阅智能事件", "AttachEventRealLoadPic")); menu.addItem(new CaseMenu.Item(this, "停止侦听智能事件", "DetachEventRealLoadPic")); menu.run(); } /******************************** 结束 ***************************************/ }