From 483f72f5540bdefb3ddd4726113b3c171eb7107d Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 星期四, 06 七月 2023 17:20:41 +0800
Subject: [PATCH] 增加外联设备报警解析并上传mqtt

---
 src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java |  134 +++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 124 insertions(+), 10 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..a8a32c0 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
@@ -5,7 +5,9 @@
 import com.ard.alarm.camera.domain.CameraCmd;
 import com.ard.alarm.camera.service.impl.ArdCamerasServiceImpl;
 import com.ard.config.MinioClientSingleton;
+import com.ard.utils.ByteUtils;
 import com.ard.utils.hiksdk.common.GlobalVariable;
+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;
@@ -15,6 +17,7 @@
 import com.sun.jna.Pointer;
 import lombok.extern.slf4j.Slf4j;
 
+import javax.xml.bind.DatatypeConverter;
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
@@ -43,10 +46,16 @@
     @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);
+        ArdCameras ardCameras = new ArdCameras();
+        ardCameras.setIp(sDeviceIP);
+        ardCameras.setPort(wLinkPort);
+        ArdCameras ardcamere = ardCamerasService.selectArdCamerasList(ardCameras).get(0);
         String sTime;//浜嬩欢鏃堕棿
         String url;//浜嬩欢鍥剧墖
         alarmEventInfo info;//浜嬩欢淇℃伅
+
         //lCommand鏄紶鐨勬姤璀︾被鍨�
         switch (lCommand) {
             case HCNetSDK.COMM_ALARM_RULE:
@@ -57,13 +66,10 @@
                 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.setAlarmName("浜哄憳琛屼负鍒嗘瀽");
                 info.setAlarmTime(sTime);
@@ -138,6 +144,85 @@
             case HCNetSDK.COMM_GISINFO_UPLOAD:
                 log.info("GPS鎶ヨ淇℃伅涓婃姤");
                 break;
+            case HCNetSDK.COMM_ALARMHOST_CID_ALARM:
+                log.info("鎶ヨ涓绘満 CID 鎶ュ憡鎶ヨ涓婁紶");
+                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(ardcamere.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.setCameraId(ardcamere.getId());
+                externalAlarmEventInfo.setCameraName(ardcamere.getName());
+                externalAlarmEventInfo.setCameraIp(ardcamere.getIp());
+                externalAlarmEventInfo.setCameraType(ardcamere.getGdtype());
+                publishMqtt(externalAlarmEventInfo);
+                break;
             default:
                 log.info("鏈煡鎶ヨ浜嬩欢绫诲瀷:lCommand:" + Integer.toHexString(lCommand));
                 break;
@@ -198,19 +283,48 @@
     }
 
     /**
-     * 鎵撳嵃鏃ュ織
+     * 鎵撳嵃閫氱敤鍏夌數鏃ュ織
      */
     private void printLog(alarmEventInfo info) {
-        log.info("銆愯鍒欍��" + info.getAlarmName() +"銆愯鍒檌d銆�" + info.getRuleId() + "銆愮被鍨嬨��" + info.getAlarmType() +
+        log.info("銆愯鍒欍��" + 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 printLog(ExternalAlarmEventInfo info) {
+        log.info("銆愭姤璀D銆�" + info.getAlarmId() + "銆愭姤璀﹀悕绉般��" + info.getAlarmName() +
+                "銆愰槻鍖篒D銆�" + info.getDefenseId() + "銆愰槻鍖哄悕绉般��" + info.getDefenseName() + "銆愮被鍨嬨��" + info.getAlarmType() +
+                "銆愭椂闂淬��" + info.getAlarmTime() + "銆愮浉鏈篒D銆�" + info.getCameraId() + "銆愮浉鏈恒��" + info.getCameraName() +
+                "銆怚P銆�" + info.getCameraIp() + "銆愬瀷鍙枫��" + info.getCameraType());
+    }
+
+    /**
+     * 閫氱敤鍏夌數鎶ヨ鎺ㄩ�乵qtt
      */
     private void publishMqtt(alarmEventInfo info) {
-       // printLog(info);
+        // printLog(info);
         MqttConsumer.publish(2, false, "camera", JSON.toJSONString(info));
     }
+    /**
+     * 澶栬仈鎶ヨ鎺ㄩ�乵qtt
+     */
+    private void publishMqtt(ExternalAlarmEventInfo info) {
+        printLog(info);
+        MqttConsumer.publish(2, false, "camera", 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;
+    }
 }

--
Gitblit v1.9.3