‘liusuyi’
2023-07-07 85446b5b526ac53af9add7c83cfd72f39ec39611
src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java
@@ -3,9 +3,15 @@
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.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.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 +21,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;
@@ -42,28 +49,33 @@
     */
    @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);
        String sTime;//事件时间
        String url;//事件图片
        alarmEventInfo info;//事件信息
        //lCommand是传的报警类型
        switch (lCommand) {
            case HCNetSDK.COMM_ALARM_RULE:
                //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();
                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 +150,89 @@
            case HCNetSDK.COMM_GISINFO_UPLOAD:
                log.info("GPS报警信息上报");
                break;
            case HCNetSDK.COMM_ALARMHOST_CID_ALARM:
                log.info("报警主机 CID 报告报警上传");
                ArdEquipExternal ardEquipExternal = new ArdEquipExternal();
                ardEquipExternal.setIp(sDeviceIP);
                ardEquipExternal.setPort(wLinkPort);
                IArdEquipExternalService ardEquipExternalService = SpringTool.getApplicationContext().getBean(IArdEquipExternalService.class);
                ardEquipExternal = ardEquipExternalService.selectArdEquipExternalList(ardEquipExternal).get(0);
                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);
                break;
            default:
                log.info("未知报警事件类型:lCommand:" + Integer.toHexString(lCommand));
                break;
@@ -198,19 +293,50 @@
    }
    /**
     * 打印日志
     * 打印通用光电日志
     */
    private void printLog(alarmEventInfo info) {
        log.info("【规则】" + info.getAlarmName() +"【规则id】" + info.getRuleId() + "【类型】" + info.getAlarmType() +
        log.info("【规则】" + info.getAlarmName() + "【规则id】" + info.getRuleId() + "【类型】" + info.getAlarmType() +
                "【时间】" + info.getAlarmTime() + "【相机id】" + info.getCameraId() + "【相机】" + info.getCameraName() +
                "【IP】" + info.getCameraIp() + "【通道】" + info.getCameraChannel() +"【型号】" + info.getCameraType() +
                "【IP】" + info.getCameraIp() + "【通道】" + info.getCameraChannel() + "【型号】" + info.getCameraType() +
                "【图片】" + info.getPicUrl() + "【坐标】" + info.getLongitude() + "," + info.getLatitude());
    }
    /**
     * 推送mqtt
     * 打印外联报警日志
     */
    private void printLog(ExternalAlarmEventInfo info) {
        log.info("【报警ID】" + info.getAlarmId() + "【报警名称】" + info.getAlarmName() +
                "【防区ID】" + info.getDefenseId() + "【防区名称】" + info.getDefenseName() + "【类型】" + info.getAlarmType() +
                "【时间】" + info.getAlarmTime() + "【报警主机ID】" + info.getAlarmHostId());
    }
    /**
     * 通用光电报警推送mqtt
     */
    private void publishMqtt(alarmEventInfo info) {
       // printLog(info);
        // printLog(info);
        MqttConsumer.publish(2, false, "camera", JSON.toJSONString(info));
    }
    /**
     * 外联报警推送mqtt
     */
    private void publishMqtt(ExternalAlarmEventInfo info) {
        printLog(info);
        MqttConsumer.publish(2, false, "external", 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;
    }
}