From ad89fdba09b8f0596ed41c5b31de6f34fe1ce620 Mon Sep 17 00:00:00 2001 From: ‘liusuyi’ <1951119284@qq.com> Date: 星期四, 10 八月 2023 17:20:41 +0800 Subject: [PATCH] 优化行为分析信息报警 --- src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java | 352 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 318 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java b/src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java index b2e594c..898dc85 100644 --- a/src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java +++ b/src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java @@ -3,20 +3,24 @@ import com.alibaba.fastjson2.JSON; import com.ard.alarm.camera.domain.ArdCameras; import com.ard.alarm.camera.domain.CameraCmd; -import com.ard.alarm.camera.service.impl.ArdCamerasServiceImpl; +import com.ard.alarm.camera.service.IArdCamerasService; +import com.ard.alarm.external.domain.ArdEquipExternal; +import com.ard.alarm.external.service.IArdEquipExternalService; import com.ard.config.MinioClientSingleton; +import com.ard.utils.other.ByteUtils; import com.ard.utils.hiksdk.common.GlobalVariable; -import com.ard.utils.hiksdk.domain.alarmEventInfo; +import com.ard.utils.hiksdk.domain.AccessControlHostEventInfo; +import com.ard.utils.hiksdk.domain.CameraEventInfo; +import com.ard.utils.hiksdk.domain.ExternalAlarmEventInfo; import com.ard.utils.hiksdk.util.hikSdkUtil.HCNetSDK; import com.ard.utils.hiksdk.util.minio.MinioUtils; -import com.ard.utils.DateUtils; -import com.ard.utils.SpringTool; +import com.ard.utils.other.DateUtils; +import com.ard.utils.other.SpringTool; import com.ard.utils.mqtt.MqttConsumer; import com.sun.jna.Pointer; import lombok.extern.slf4j.Slf4j; -import java.io.ByteArrayInputStream; -import java.io.InputStream; +import java.io.*; import java.nio.ByteBuffer; import java.text.SimpleDateFormat; import java.util.Date; @@ -28,7 +32,7 @@ * @Date: 2023骞�02鏈�15鏃� 12:16 * @Version: 1.0 **/ -@Slf4j(topic = "hiksdk") +@Slf4j(topic = "hikSdk") public class FMSGCallBack implements HCNetSDK.FMSGCallBack_V31 { /** @@ -42,29 +46,37 @@ */ @Override public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) { - ArdCamerasServiceImpl ardCamerasService = SpringTool.getApplicationContext().getBean(ArdCamerasServiceImpl.class); + String sDeviceIP = ByteUtils.bytesToStringZh(pAlarmer.sDeviceIP); + Integer wLinkPort = Integer.valueOf(pAlarmer.wLinkPort); + CameraEventInfo info; String sTime;//浜嬩欢鏃堕棿 - String url;//浜嬩欢鍥剧墖 - alarmEventInfo info;//浜嬩欢淇℃伅 + String url = "";//浜嬩欢鍥剧墖 + Boolean isSnapPic=true; //lCommand鏄紶鐨勬姤璀︾被鍨� + log.debug("鎶ヨ浜嬩欢绫诲瀷:lCommand:" + Integer.toHexString(lCommand)); switch (lCommand) { + case HCNetSDK.COMM_ALARM_V30: + log.debug("绉诲姩渚︽祴銆佽棰戜涪澶便�侀伄鎸°�両O淇″彿閲忕瓑鎶ヨ淇℃伅(鏆備笉瑙f瀽)"); case HCNetSDK.COMM_ALARM_RULE: + log.debug("琛屼负鍒嗘瀽淇℃伅鎶ヨ淇℃伅涓婃姤"); //region 琛屼负鍒嗘瀽淇℃伅 - log.info("鎶ヨ浜嬩欢绫诲瀷:lCommand:" + Integer.toHexString(lCommand)); + ArdCameras ardCameras = new ArdCameras(); + ardCameras.setIp(sDeviceIP); + ardCameras.setPort(wLinkPort); + IArdCamerasService ardCamerasService = SpringTool.getApplicationContext().getBean(IArdCamerasService.class); + ArdCameras ardcamere = ardCamerasService.selectArdCamerasList(ardCameras).get(0); + HCNetSDK.NET_VCA_RULE_ALARM strVcaAlarm = new HCNetSDK.NET_VCA_RULE_ALARM(); strVcaAlarm.write(); Pointer pVCAInfo = strVcaAlarm.getPointer(); pVCAInfo.write(0, pAlarmInfo.getByteArray(0, strVcaAlarm.size()), 0, strVcaAlarm.size()); strVcaAlarm.read(); - Integer ruleID = Integer.valueOf(strVcaAlarm.struRuleInfo.byRuleID); + Integer ruleID = Integer.valueOf(strVcaAlarm.struRuleInfo.byRuleID); sTime = DateUtils.parseTime(strVcaAlarm.dwAbsTime);//浜嬩欢鏃堕棿 String ipaddr = new String(strVcaAlarm.struDevInfo.struDevIP.sIpV4).trim();//璁惧ip Integer channel = Integer.valueOf(strVcaAlarm.struDevInfo.byChannel);//閫氶亾 - ArdCameras ardCameras = new ArdCameras(); - ardCameras.setIp(ipaddr); - ArdCameras ardcamere = ardCamerasService.selectArdCamerasList(ardCameras).get(0); - info = new alarmEventInfo(); + info = new CameraEventInfo(); info.setAlarmName("浜哄憳琛屼负鍒嗘瀽"); info.setAlarmTime(sTime); info.setCameraName(ardcamere.getName()); @@ -122,24 +134,230 @@ //endregion break; default: - log.info("鏈煡琛屼负浜嬩欢绫诲瀷:" + strVcaAlarm.struRuleInfo.wEventTypeEx); - printLog(info); + // log.debug("鏈煡琛屼负浜嬩欢绫诲瀷:" + strVcaAlarm.struRuleInfo.wEventTypeEx); + isSnapPic=false; break; } //endregion //鍥剧墖瀛樺叆minio - url = savePicture(info); - info.setPicUrl(url); - publishMqtt(info); + if(isSnapPic) { + url = savePicture(info); + info.setPicUrl(url); + publishMqtt(info); + } + break; case HCNetSDK.COMM_UPLOAD_FACESNAP_RESULT: - log.info("浜鸿劯妫�娴嬩簨浠朵笂鎶�"); + log.debug("浜鸿劯妫�娴嬩簨浠朵笂鎶�(鏆備笉瑙f瀽)"); break; case HCNetSDK.COMM_GISINFO_UPLOAD: - log.info("GPS鎶ヨ淇℃伅涓婃姤"); + log.debug("GPS鎶ヨ淇℃伅涓婃姤(鏆備笉瑙f瀽)"); + break; + case HCNetSDK.COMM_ALARMHOST_CID_ALARM: + log.debug("鎶ヨ涓绘満CID鎶ュ憡鎶ヨ涓婃姤"); + //region 鎶ヨ涓绘満鎶ヨ澶勭悊 + ArdEquipExternal ardEquipExternal = new ArdEquipExternal(); + ardEquipExternal.setIp(sDeviceIP); + ardEquipExternal.setPort(wLinkPort); + IArdEquipExternalService ardEquipExternalService = SpringTool.getApplicationContext().getBean(IArdEquipExternalService.class); + ardEquipExternal = ardEquipExternalService.selectArdEquipExternal(ardEquipExternal); + + + HCNetSDK.NET_DVR_CID_ALARM netDvrCidAlarm = new HCNetSDK.NET_DVR_CID_ALARM(); + netDvrCidAlarm.write(); + Pointer pCIDInfo = netDvrCidAlarm.getPointer(); + pCIDInfo.write(0, pAlarmInfo.getByteArray(0, netDvrCidAlarm.size()), 0, netDvrCidAlarm.size()); + netDvrCidAlarm.read(); + //CID浜嬩欢鍚� + String sCIDCode = ByteUtils.bytesToStringZh(netDvrCidAlarm.sCIDCode);//CID浜嬩欢鍚� + + //CID浜嬩欢鍚� + //String sCIDDescribe = ByteUtils.bytesToStringZh(netDvrCidAlarm.sCIDDescribe);//CID浜嬩欢鍚� + int position = ByteUtils.findIndexOfDoubleZero(netDvrCidAlarm.sCIDDescribe); + String sCIDDescribe; + if (position != -1) { + byte[] result = new byte[position]; + System.arraycopy(netDvrCidAlarm.sCIDDescribe, 0, result, 0, position); + sCIDDescribe = ByteUtils.bytesToStringZh(result); + } else { + sCIDDescribe = ByteUtils.bytesToStringZh(netDvrCidAlarm.sCIDDescribe); + } + //瑙﹀彂鎶ヨ鐨勬椂闂寸偣 + String struTriggerTime = DateUtils.convertDate(parseAlarmTime(netDvrCidAlarm.struTriggerTime), "yyyy-M-d H:m:s"); + //涓婁紶鎶ヨ鐨勬椂闂寸偣 + String struUploadTime = DateUtils.convertDate(parseAlarmTime(netDvrCidAlarm.struUploadTime), "yyyy-M-d H:m:s"); + //鎶ュ憡绫诲瀷 + String byReportType = ""; + switch (netDvrCidAlarm.byReportType) { + case 1: + byReportType = "闃插尯鎶ヨ"; + break; + case 2: + byReportType = "瑙嗛鎶ヨ"; + break; + case 3: + byReportType = "杞槻鍖烘姤璀�"; + break; + case 4: + byReportType = "鎸熸寔鎶ヨ"; + break; + case 5: + byReportType = "闃叉媶鎶ヨ "; + break; + case 6: + byReportType = "鎿嶄綔鎶ュ憡 "; + break; + case 7: + byReportType = "寮傚父鎶ュ憡 "; + break; + } + //瀛愮郴缁熷彿 + Integer bySubSysNo = Integer.valueOf(netDvrCidAlarm.bySubSysNo); + //闃插尯鍙� 璧峰0 + Integer wDefenceNo = Integer.valueOf(netDvrCidAlarm.wDefenceNo); + //闃插尯鍚嶇О + String wDefenceName = ""; + if (!bySubSysNo.equals(-1)) { + CameraCmd cmd = new CameraCmd(); + cmd.setCameraId(ardEquipExternal.getId()); + cmd.setWZoneIndex(wDefenceNo); + wDefenceName = HikClientUtil.getDefenseZoneName(cmd); + } + if (sCIDDescribe.contains("鎭㈠")) { + return true; + } + + ExternalAlarmEventInfo externalAlarmEventInfo = new ExternalAlarmEventInfo(); + externalAlarmEventInfo.setAlarmId(sCIDCode); + externalAlarmEventInfo.setAlarmName(sCIDDescribe); + externalAlarmEventInfo.setDefenseId((wDefenceNo + 1)); + externalAlarmEventInfo.setDefenseName(wDefenceName); + externalAlarmEventInfo.setSubSysNo(bySubSysNo); + externalAlarmEventInfo.setAlarmType(byReportType); + externalAlarmEventInfo.setAlarmTime(struTriggerTime); + externalAlarmEventInfo.setAlarmHostId(ardEquipExternal.getId()); + publishMqtt(externalAlarmEventInfo); + //endregion + break; + case HCNetSDK.COMM_ALARM_ACS: + //region 闂ㄧ涓绘満鎶ヨ澶勭悊 + ArdEquipExternal accessControlHost = new ArdEquipExternal(); + accessControlHost.setIp(sDeviceIP); + accessControlHost.setPort(wLinkPort); + ardEquipExternalService = SpringTool.getApplicationContext().getBean(IArdEquipExternalService.class); + accessControlHost = ardEquipExternalService.selectArdEquipExternal(accessControlHost); + + HCNetSDK.NET_DVR_ACS_ALARM_INFO strACSInfo = new HCNetSDK.NET_DVR_ACS_ALARM_INFO(); + strACSInfo.write(); + Pointer acsInfo = strACSInfo.getPointer(); + acsInfo.write(0, pAlarmInfo.getByteArray(0, strACSInfo.size()), 0, strACSInfo.size()); + strACSInfo.read(); + int dwMajor = strACSInfo.dwMajor; + + if (dwMajor != 5) { + //鍙幏鍙栦簨浠� + log.debug("闈炰簨浠舵姤璀︽暟鎹笂鎶�(鏆備笉瑙f瀽)"); + break; + } + int dwMinor = strACSInfo.dwMinor; + if (dwMinor != 80 && dwMinor != 104) { + //鍙В鏋愮湡浜烘娴嬪け璐ュ拰浜鸿劯鎶撴媿澶辫触鐨勬绫诲瀷浜嬩欢 + break; + } +// log.info("闂ㄧ涓绘満鎶ヨ涓婁紶"); +// log.info("銆愪富绫诲瀷銆戜簨浠�"); + String alarmType = ""; + switch (dwMinor) { + case 104: + alarmType = "鐪熶汉妫�娴嬪け璐�"; + break; + case 80: + alarmType = "浜鸿劯鎶撴媿澶辫触"; + break; + } + String alarmTime = DateUtils.convertDate(parseAlarmTime(strACSInfo.struTime), "yyyy-M-d H:m:s"); + + //浜嬩欢鍥剧墖澶勭悊 + int dwPicDataLen = strACSInfo.dwPicDataLen; + if (dwPicDataLen > 0) { + SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + String newName = sf.format(new Date()); + try { + //灏嗗瓧鑺傚啓鍏ユ枃浠� + long offset = 0; + ByteBuffer buffers = strACSInfo.pPicData.getByteBuffer(offset, strACSInfo.dwPicDataLen); + byte[] bytes = new byte[strACSInfo.dwPicDataLen]; + buffers.rewind(); + buffers.get(bytes); + InputStream input = new ByteArrayInputStream(bytes); + String bucketName = "pic"; + String objectName = "alarm_" + newName + ".jpeg"; + boolean uploadObject = MinioUtils.uploadObject(bucketName, objectName, input, "image/JPEG"); + if (uploadObject) { + url = MinioClientSingleton.domainUrl + "/" + bucketName + "/" + objectName; + //log.debug("涓婁紶鏂囦欢鎴愬姛!" + url); + } + } catch (Exception e) { + log.error("鍥剧墖淇濆瓨澶辫触"); + } + } + HCNetSDK.NET_DVR_ACS_EVENT_INFO struAcsEventInfo = strACSInfo.struAcsEventInfo; + int byType = struAcsEventInfo.byType; + String defenseType = ""; + switch (byType) { + case 0: + defenseType = "鍗虫椂闃插尯"; + break; + case 1: + defenseType = "24灏忔椂闃插尯"; + break; + case 2: + defenseType = "寤舵椂闃插尯"; + break; + case 3: + defenseType = "鍐呴儴闃插尯"; + break; + case 4: + defenseType = "閽ュ寵闃插尯"; + break; + case 5: + defenseType = "鐏闃插尯"; + break; + case 6: + defenseType = "鍛ㄧ晫闃插尯"; + break; + case 7: + defenseType = "24灏忔椂鏃犲0闃插尯"; + break; + case 8: + defenseType = "24灏忔椂杈呭姪闃插尯"; + break; + case 9: + defenseType = "24灏忔椂闇囧姩闃插尯"; + break; + case 10: + defenseType = "闂ㄧ绱ф�ュ紑闂ㄩ槻鍖�"; + break; + case 11: + defenseType = "闂ㄧ绱ф�ュ叧闂ㄩ槻鍖�"; + break; + default: + defenseType = "鏃�"; + break; + } + AccessControlHostEventInfo accessControlHostEventInfo = new AccessControlHostEventInfo(); + accessControlHostEventInfo.setSerialNo(struAcsEventInfo.dwSerialNo); + accessControlHostEventInfo.setAlarmType(alarmType); + accessControlHostEventInfo.setDoorNo(struAcsEventInfo.dwDoorNo); + accessControlHostEventInfo.setDefenseType(defenseType); + accessControlHostEventInfo.setAlarmTime(alarmTime); + accessControlHostEventInfo.setPicUrl(url); + accessControlHostEventInfo.setAcsId(accessControlHost.getId()); + publishMqtt(accessControlHostEventInfo); + //endregion break; default: - log.info("鏈煡鎶ヨ浜嬩欢绫诲瀷:lCommand:" + Integer.toHexString(lCommand)); + log.debug("鏈煡鎶ヨ浜嬩欢绫诲瀷:lCommand:" + Integer.toHexString(lCommand)); break; } @@ -169,7 +387,7 @@ String ipaddr = new String(strVcaAlarm.struDevInfo.struDevIP.sIpV4).trim();//璁惧ip String UUID = java.util.UUID.randomUUID().toString().replace("-", ""); String filename = ipaddr + "/" + currentTime + "/" + eventNameEng + "/" + UUID + ".jpg"; - boolean uploadRes = MinioUtils.uploadObject("pic", filename, inputStream, inputStream.available(), "image/jpeg"); + boolean uploadRes = MinioUtils.uploadObject("pic", filename, inputStream, "image/jpeg"); if (uploadRes) { url = MinioClientSingleton.domainUrl + filename; log.info("鍐欏叆minio鍥剧墖鍦板潃锛�" + url); @@ -182,11 +400,15 @@ } /** - * 鎵撲繚瀛樺浘鐗� + * 鐩告満鎴浘 */ - private String savePicture(alarmEventInfo info) { + private String savePicture(CameraEventInfo info) { CameraCmd cmd = new CameraCmd(); ArdCameras Cameras = GlobalVariable.cameraMap.get(info.getCameraIp()); + if(Cameras==null) + { + return ""; + } cmd.setCameraId(Cameras.getId()); cmd.setChannelNum(info.getCameraChannel()); cmd.setBucketName("pic"); @@ -198,19 +420,81 @@ } /** - * 鎵撳嵃鏃ュ織 + * 鎵撳嵃閫氱敤鍏夌數鏃ュ織 */ - private void printLog(alarmEventInfo info) { - log.info("銆愯鍒欍��" + info.getAlarmName() +"銆愯鍒檌d銆�" + info.getRuleId() + "銆愮被鍨嬨��" + info.getAlarmType() + + private void printLog(CameraEventInfo info) { + log.debug("銆愯鍒欍��" + info.getAlarmName() + "銆愯鍒檌d銆�" + info.getRuleId() + "銆愮被鍨嬨��" + info.getAlarmType() + "銆愭椂闂淬��" + info.getAlarmTime() + "銆愮浉鏈篿d銆�" + info.getCameraId() + "銆愮浉鏈恒��" + info.getCameraName() + - "銆怚P銆�" + info.getCameraIp() + "銆愰�氶亾銆�" + info.getCameraChannel() +"銆愬瀷鍙枫��" + info.getCameraType() + + "銆怚P銆�" + info.getCameraIp() + "銆愰�氶亾銆�" + info.getCameraChannel() + "銆愬瀷鍙枫��" + info.getCameraType() + "銆愬浘鐗囥��" + info.getPicUrl() + "銆愬潗鏍囥��" + info.getLongitude() + "," + info.getLatitude()); } + /** - * 鎺ㄩ�乵qtt + * 鎵撳嵃鎶ヨ涓绘満浜嬩欢鏃ュ織 */ - private void publishMqtt(alarmEventInfo info) { - // printLog(info); + private void printLog(ExternalAlarmEventInfo info) { + log.debug("銆愭姤璀D銆�" + info.getAlarmId() + "銆愭姤璀﹀悕绉般��" + info.getAlarmName() + + "銆愰槻鍖篒D銆�" + info.getDefenseId() + "銆愰槻鍖哄悕绉般��" + info.getDefenseName() + "銆愮被鍨嬨��" + info.getAlarmType() + + "銆愭椂闂淬��" + info.getAlarmTime() + "銆愭姤璀︿富鏈篒D銆�" + info.getAlarmHostId()); + } + + /** + * 鎵撳嵃闂ㄧ浜嬩欢鏃ュ織 + */ + private void printLog(AccessControlHostEventInfo info) { + log.debug("銆愭姤璀D銆�" + info.getSerialNo() + "銆愯澶囩紪鍙枫��"+ + "銆愰棬缂栧彿銆�" + info.getDoorNo() + "銆愪簨浠剁被鍨嬨��" + info.getAlarmType() + + "銆愰槻鍖虹被鍨嬨��" + info.getDefenseType()+"銆愭椂闂淬��" + info.getAlarmTime() + + "銆愰棬绂佷富鏈篒D銆�" + info.getAcsId()); + } + + /** + * 閫氱敤鍏夌數鎶ヨ鎺ㄩ�乵qtt + */ + private void publishMqtt(CameraEventInfo info) { + // printLog(info); MqttConsumer.publish(2, false, "camera", JSON.toJSONString(info)); } + + /** + * 鎶ヨ涓绘満浜嬩欢鎺ㄩ�乵qtt + */ + private void publishMqtt(ExternalAlarmEventInfo info) { + printLog(info); + MqttConsumer.publish(2, false, "external", JSON.toJSONString(info)); + } + + /** + * 闂ㄧ浜嬩欢鎺ㄩ�乵qtt + */ + private void publishMqtt(AccessControlHostEventInfo info) { + printLog(info); + MqttConsumer.publish(2, false, "accessControl", JSON.toJSONString(info)); + } + + /** + * 鏃堕棿鏍煎紡鍖� + */ + private String parseAlarmTime(HCNetSDK.NET_DVR_TIME_EX netDvrTimeEx) { + short wYear = netDvrTimeEx.wYear; + byte byMonth = netDvrTimeEx.byMonth; + byte byDay = netDvrTimeEx.byDay; + byte byHour = netDvrTimeEx.byHour; + byte byMinute = netDvrTimeEx.byMinute; + byte bySecond = netDvrTimeEx.bySecond; + return wYear + "-" + byMonth + "-" + byDay + " " + byHour + ":" + byMinute + ":" + bySecond; + } + + /** + * 鏃堕棿鏍煎紡鍖� + */ + private String parseAlarmTime(HCNetSDK.NET_DVR_TIME netDvrTimeEx) { + int wYear = netDvrTimeEx.dwYear; + int byMonth = netDvrTimeEx.dwMonth; + int byDay = netDvrTimeEx.dwDay; + int byHour = netDvrTimeEx.dwHour; + int byMinute = netDvrTimeEx.dwMinute; + int bySecond = netDvrTimeEx.dwSecond; + return wYear + "-" + byMonth + "-" + byDay + " " + byHour + ":" + byMinute + ":" + bySecond; + } } -- Gitblit v1.9.3