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 | 228 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 192 insertions(+), 36 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 f01a88e..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 @@ -4,27 +4,23 @@ import com.ard.alarm.camera.domain.ArdCameras; import com.ard.alarm.camera.domain.CameraCmd; import com.ard.alarm.camera.service.IArdCamerasService; -import com.ard.alarm.camera.service.impl.ArdCamerasServiceImpl; import com.ard.alarm.external.domain.ArdEquipExternal; import com.ard.alarm.external.service.IArdEquipExternalService; -import com.ard.alarm.external.service.impl.ArdEquipExternalServiceImpl; import com.ard.config.MinioClientSingleton; -import com.ard.utils.ByteUtils; +import com.ard.utils.other.ByteUtils; import com.ard.utils.hiksdk.common.GlobalVariable; +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.domain.alarmEventInfo; 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 org.apache.commons.lang3.StringUtils; -import javax.xml.bind.DatatypeConverter; -import java.io.ByteArrayInputStream; -import java.io.InputStream; +import java.io.*; import java.nio.ByteBuffer; import java.text.SimpleDateFormat; import java.util.Date; @@ -36,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 { /** @@ -53,21 +49,24 @@ 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 琛屼负鍒嗘瀽淇℃伅 ArdCameras ardCameras = new ArdCameras(); ardCameras.setIp(sDeviceIP); ardCameras.setPort(wLinkPort); IArdCamerasService ardCamerasService = SpringTool.getApplicationContext().getBean(IArdCamerasService.class); ArdCameras ardcamere = ardCamerasService.selectArdCamerasList(ardCameras).get(0); - log.info("鎶ヨ浜嬩欢绫诲瀷:lCommand:" + Integer.toHexString(lCommand)); + HCNetSDK.NET_VCA_RULE_ALARM strVcaAlarm = new HCNetSDK.NET_VCA_RULE_ALARM(); strVcaAlarm.write(); Pointer pVCAInfo = strVcaAlarm.getPointer(); @@ -77,7 +76,7 @@ sTime = DateUtils.parseTime(strVcaAlarm.dwAbsTime);//浜嬩欢鏃堕棿 String ipaddr = new String(strVcaAlarm.struDevInfo.struDevIP.sIpV4).trim();//璁惧ip Integer channel = Integer.valueOf(strVcaAlarm.struDevInfo.byChannel);//閫氶亾 - info = new alarmEventInfo(); + info = new CameraEventInfo(); info.setAlarmName("浜哄憳琛屼负鍒嗘瀽"); info.setAlarmTime(sTime); info.setCameraName(ardcamere.getName()); @@ -135,29 +134,33 @@ //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.info("鎶ヨ涓绘満 CID 鎶ュ憡鎶ヨ涓婁紶"); + log.debug("鎶ヨ涓绘満CID鎶ュ憡鎶ヨ涓婃姤"); + //region 鎶ヨ涓绘満鎶ヨ澶勭悊 ArdEquipExternal ardEquipExternal = new ArdEquipExternal(); ardEquipExternal.setIp(sDeviceIP); ardEquipExternal.setPort(wLinkPort); IArdEquipExternalService ardEquipExternalService = SpringTool.getApplicationContext().getBean(IArdEquipExternalService.class); - ardEquipExternal = ardEquipExternalService.selectArdEquipExternalList(ardEquipExternal).get(0); + ardEquipExternal = ardEquipExternalService.selectArdEquipExternal(ardEquipExternal); HCNetSDK.NET_DVR_CID_ALARM netDvrCidAlarm = new HCNetSDK.NET_DVR_CID_ALARM(); @@ -234,9 +237,127 @@ 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; } @@ -266,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); @@ -279,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"); @@ -297,36 +422,54 @@ /** * 鎵撳嵃閫氱敤鍏夌數鏃ュ織 */ - 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() + "銆愬浘鐗囥��" + info.getPicUrl() + "銆愬潗鏍囥��" + info.getLongitude() + "," + info.getLatitude()); } /** - * 鎵撳嵃澶栬仈鎶ヨ鏃ュ織 + * 鎵撳嵃鎶ヨ涓绘満浜嬩欢鏃ュ織 */ private void printLog(ExternalAlarmEventInfo info) { - log.info("銆愭姤璀D銆�" + info.getAlarmId() + "銆愭姤璀﹀悕绉般��" + info.getAlarmName() + + 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(alarmEventInfo info) { + private void publishMqtt(CameraEventInfo info) { // printLog(info); MqttConsumer.publish(2, false, "camera", JSON.toJSONString(info)); } /** - * 澶栬仈鎶ヨ鎺ㄩ�乵qtt + * 鎶ヨ涓绘満浜嬩欢鎺ㄩ�乵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)); } /** @@ -341,4 +484,17 @@ 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