‘liusuyi’
2023-07-06 483f72f5540bdefb3ddd4726113b3c171eb7107d
增加外联设备报警解析并上传mqtt
已添加1个文件
已修改12个文件
411 ■■■■ 文件已修改
src/main/java/com/ard/alarm/camera/domain/CameraCmd.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/tube/service/TubeAlarmService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/ByteUtils.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/DateUtils.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/hiksdk/domain/ExternalAlarmEventInfo.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/hiksdk/domain/alarmEventInfo.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/hiksdk/util/hikSdkUtil/HCNetSDK.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/tcp/ClientHandler.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/tcp/NettyTcpClientHandler.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/camera/domain/CameraCmd.java
@@ -37,4 +37,7 @@
    String objectName;
    /*是否上传minio*/
    boolean isUploadMinio;
    /*防区号 ä»Ž0开始*/
    Integer wZoneIndex;
}
src/main/java/com/ard/alarm/tube/service/TubeAlarmService.java
@@ -50,7 +50,7 @@
                String start = messages[0];
                String host = messages[1];
                String tubeId = messages[2];
                String alarmTime = DateUtils.convertDate(messages[3]);
                String alarmTime = DateUtils.convertDate(messages[3],"yyyy/M/d H:m:s");
                String position = messages[4];
                String type = messages[5];
                String watcher = messages[6];
src/main/java/com/ard/utils/ByteUtils.java
@@ -2,6 +2,7 @@
import javax.xml.bind.DatatypeConverter;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.zip.CRC32;
@@ -14,6 +15,26 @@
 **/
public class ByteUtils {
    /**
     * byte数组转中文字符串
     */
    public static String bytesToStringZh(byte[] bytes) {
        String zhStr = "";
        try {
            int position = ByteUtils.findIndexOfDoubleZero(bytes);
            if (position != -1) {
                byte[] result = new byte[position];
                System.arraycopy(bytes, 0, result, 0, position);
                zhStr = new String(result, "GBK");
            } else {
                zhStr = new String(bytes, "GBK");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return zhStr;
    }
    /**
     * Byte字节转Hex
     *
     * @param b å­—节
src/main/java/com/ard/utils/DateUtils.java
@@ -199,10 +199,11 @@
    /**
     * æ—¥æœŸå­—符串的月日时分秒自动补零,并将/替换成-
     * "yyyy/M/d H:m:s" to "yyyy-MM-dd HH:mm:ss"
     * */
    public static String convertDate(String startDate) {
        DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy/M/d H:m:s");
        DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return LocalDateTime.parse(startDate, inputFormat).format(outputFormat);
    public static String convertDate(String startDate,String inputFormat) {
        DateTimeFormatter inputdtf = DateTimeFormatter.ofPattern(inputFormat);
        DateTimeFormatter outputdtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return LocalDateTime.parse(startDate, inputdtf).format(outputdtf);
    }
}
src/main/java/com/ard/utils/hiksdk/domain/ExternalAlarmEventInfo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.ard.utils.hiksdk.domain;
import lombok.Data;
/**
 * @Description: å¤–联报警事件信息
 * @ClassName: ExternalAlarmEventInfo
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´07月06日16:19
 * @Version: 1.0
 **/
@Data
public class ExternalAlarmEventInfo {
    /**
     * æŠ¥è­¦ID
     */
    String alarmId;
    /**
     * æŠ¥è­¦åç§°
     */
    String alarmName;
    /**
     * é˜²åŒºID
     */
    Integer defenseId;
    /**
     * é˜²åŒºåç§°
     */
    String defenseName;
    /**
     * æŠ¥è­¦ç±»åˆ«
     */
    String alarmType;
    /**
     * æŠ¥è­¦æ—¶é—´
     */
    String alarmTime;
    /**
     * å­ç³»ç»ŸID
     */
    Integer subSysNo;
    /**
     * å…³è”相机id
     */
    String cameraId;
    /**
     * å…³è”相机名称
     */
    String cameraName;
    /**
     * å…³è”相机ip
     */
    String cameraIp;
    /**
     * å…³è”相机经度
     */
    Double longitude;
    /**
     * å…³è”相机纬度
     */
    Double latitude;
    /**
     * å…³è”相机类型
     */
    String cameraType;
}
src/main/java/com/ard/utils/hiksdk/domain/alarmEventInfo.java
@@ -11,12 +11,13 @@
 */
@Data
public class alarmEventInfo {
    /**
     * æŠ¥è­¦åç§°
     */
    String alarmName;
    /**
     *  æŠ¥è­¦ç±»åˆ«
     * æŠ¥è­¦ç±»åˆ«
     */
    String alarmType;
    /**
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() +"【规则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.getCameraId() + "【相机】" + info.getCameraName() +
                "【IP】" + info.getCameraIp() + "【型号】" + info.getCameraType());
    }
    /**
     * é€šç”¨å…‰ç”µæŠ¥è­¦æŽ¨é€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, "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;
    }
}
src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java
@@ -2,11 +2,13 @@
import com.ard.alarm.camera.domain.ArdCameras;
import com.ard.alarm.camera.domain.CameraCmd;
import com.ard.utils.ByteUtils;
import com.ard.utils.hiksdk.common.GlobalVariable;
import com.ard.utils.hiksdk.util.hikSdkUtil.HCNetSDK;
import com.ard.utils.hiksdk.util.minio.MinioUtils;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
@@ -124,7 +126,6 @@
     * @创建时间 2023/1/17 16:12
     * @修改人和其它信息
     */
    public static void login(ArdCameras camera) {
        // åˆå§‹åŒ–
        if (!hCNetSDK.NET_DVR_Init()) {
@@ -186,7 +187,7 @@
                Thread.sleep(100);
                login(camera);
                String ip = camera.getIp();
                cameraMap.put(ip,camera);
                cameraMap.put(ip, camera);
            }
        } catch (Exception ex) {
            log.error("初始化登录相机异常:" + ex.getMessage());
@@ -254,7 +255,7 @@
            HCNetSDK.NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();
            m_strAlarmInfo.dwSize = m_strAlarmInfo.size();
            // æ™ºèƒ½äº¤é€šå¸ƒé˜²ä¼˜å…ˆçº§ï¼š0 - ä¸€ç­‰çº§ï¼ˆé«˜ï¼‰ï¼Œ1 - äºŒç­‰çº§ï¼ˆä¸­ï¼‰ï¼Œ2 - ä¸‰ç­‰çº§ï¼ˆä½Žï¼‰
            m_strAlarmInfo.byLevel = 1;
            m_strAlarmInfo.byLevel = 2;
            // æ™ºèƒ½äº¤é€šæŠ¥è­¦ä¿¡æ¯ä¸Šä¼ ç±»åž‹ï¼š0 - è€æŠ¥è­¦ä¿¡æ¯ï¼ˆNET_DVR_PLATE_RESULT), 1 - æ–°æŠ¥è­¦ä¿¡æ¯(NET_ITS_PLATE_RESULT)
            m_strAlarmInfo.byAlarmInfoType = 1;
            // å¸ƒé˜²ç±»åž‹(仅针对门禁主机、人证设备):0 - å®¢æˆ·ç«¯å¸ƒé˜²(会断网续传),1 - å®žæ—¶å¸ƒé˜²(只上传实时数据)
@@ -263,7 +264,6 @@
            // å¸ƒé˜²æˆåŠŸï¼Œè¿”å›žå¸ƒé˜²æˆåŠŸçš„æ•°æ®ä¼ è¾“é€šé“å·
            lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, m_strAlarmInfo);
            if (lAlarmHandle == -1) {
                log.error("设备布防失败,错误码==========》" + hCNetSDK.NET_DVR_GetLastError());
                log.error("设备布防失败,错误码==========》" + hCNetSDK.NET_DVR_GetLastError());
                // æ³¨é”€ é‡Šæ”¾sdk资源
                logout(lUserID);
@@ -287,6 +287,7 @@
        // é‡Šæ”¾sdk资源
        hCNetSDK.NET_DVR_Cleanup();
    }
    /**
     * æŠ“图
     *
@@ -344,4 +345,38 @@
            return "";
        }
    }
    /**
     * èŽ·å–é˜²åŒºåç§°
     * é€šé“号==防区号 ä»Ž0开始
     * åˆ˜è‹ä¹‰
     * 2023/7/6 10:48
     */
    public static String getDefenseZoneName(CameraCmd cmd) {
        String name="";
        try {
            String cameraId = cmd.getCameraId();
            Integer channelNum = cmd.getWZoneIndex();//通道号==防区号
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return name;
            }
            Integer userId = GlobalVariable.loginMap.get(cameraId);
            HCNetSDK.NET_DVR_ALARMIN_PARAM netDvrAlarminParam = new HCNetSDK.NET_DVR_ALARMIN_PARAM();
            Pointer point = netDvrAlarminParam.getPointer();
            IntByReference ibrBytesReturned = new IntByReference();
            netDvrAlarminParam.write();
            boolean b = hCNetSDK.NET_DVR_GetDVRConfig(userId, HCNetSDK.NET_DVR_GET_ALARMIN_PARAM, channelNum, point, netDvrAlarminParam.size(), ibrBytesReturned);
            if (b) {
                netDvrAlarminParam.read();
                name = ByteUtils.bytesToStringZh(netDvrAlarminParam.byName);
            } else {
                int error = hCNetSDK.NET_DVR_GetLastError();
                log.info("获取防区名称失败:" + error);
            }
        } catch (Exception ex) {
            log.error("获取防区名称异常:" + ex.getMessage());
        }
        return name;
    }
}
src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java
@@ -1,6 +1,7 @@
package com.ard.utils.hiksdk.service.impl;
import com.ard.alarm.camera.domain.ArdCameras;
import com.ard.alarm.camera.domain.CameraCmd;
import com.ard.utils.hiksdk.common.GlobalVariable;
import com.ard.utils.hiksdk.util.hikSdkUtil.HCNetSDK;
import com.sun.jna.Pointer;
src/main/java/com/ard/utils/hiksdk/util/hikSdkUtil/HCNetSDK.java
@@ -530,9 +530,9 @@
    public static final int NET_DVR_SET_DDNSCFG_EX = 275;//设置扩展DDNS参数
    public static final int NET_DVR_SET_PTZPOS = 292;    //云台设置PTZ位置
    public static final int NET_DVR_GET_PTZPOS = 293;    //云台获取PTZ位置
    public static final int NET_DVR_SET_PTZLOCKCFG=3288;//设置云台锁定信息
    public static final int NET_DVR_GET_PTZLOCKCFG=3287;//获取云台锁定信息
    public static final int NET_DVR_PTZ_INITIALPOSITIONCTRL=3283;//零方位角控制
    public static final int NET_DVR_SET_PTZLOCKCFG = 3288;//设置云台锁定信息
    public static final int NET_DVR_GET_PTZLOCKCFG = 3287;//获取云台锁定信息
    public static final int NET_DVR_PTZ_INITIALPOSITIONCTRL = 3283;//零方位角控制
    public static final int NET_DVR_GET_PTZSCOPE = 294;//云台获取PTZ范围
    public static final int NET_DVR_SET_BASICPARAMCFG = 3271;//设置PTZ基本参数信息
    public static final int NET_DVR_COMPLETE_RESTORE_CTRL = 3420;    //设置完全恢复出厂值
@@ -1162,7 +1162,7 @@
    public static class NET_DVR_SCHEDTIME extends HIKSDKStructure {
        public byte byStartHour;    //开始时间
        public byte byStartMin;
        public byte byStopHour;            //结束时间
        public byte byStopHour;     //结束时间
        public byte byStopMin;
@@ -3150,6 +3150,66 @@
        public NET_DVR_TIMEPOINT struEndPoint;    //夏时制停止时间
    }
    //防区参数
    public static class NET_DVR_ALARMIN_PARAM extends HIKSDKStructure {
        public int dwSize;
        public byte[] byName = new byte[NAME_LEN];
       // public DETECTOR_TYPE wDetectorType;
        public byte byType;
        public byte byUploadAlarmRecoveryReport;
        public int dwParam;
        //public byte[][] struAlarmTime = new byte[MAX_DAYS][MAX_TIMESEGMENT];
        public byte[] byAssociateAlarmOut = new byte[MAX_ALARMHOST_ALARMOUT_NUM];
        public byte[] byAssociateSirenOut = new byte[8];
        public byte bySensitivityParam;
        public byte byArrayBypass;
        public byte byJointSubSystem;
        public byte byModuleStatus;
        public short wModuleAddress;
        public byte byModuleChan;
        public byte byModuleType;
        public short wZoneIndex;
        public short wInDelay;
        public short wOutDelay;
        public byte byAlarmType;
        public byte byZoneResistor;
        public float fZoneResistorManual;
        public byte[] byDetectorSerialNo = new byte[128];
        public byte byZoneSignalType;
        public byte byDisableDetectorTypeCfg;
        public byte byTimeOutRange;
        public byte[] byAssociateLampOut = new byte[8];
        public short wTimeOut;
        public byte byDetectorSignalIntensity;
        public byte byTimeOutMethod;
        public byte[] byRes3 = new byte[8];
    }
    enum DETECTOR_TYPE {
        PANIC_BUTTON,
        MAGNETIC_CONTACT,
        SMOKE_DETECTOR,
        ACTIVE_INFRARED_DETECTOR,
        PASSIVE_INFRARED_DETECTOR,
        GLASS_BREAK_DETECTOR,
        VIBRATION_DETECTOR,
        DUAL_TECHNOLOGY_PIR_DETECTOR,
        TRIPLE_TECHNOLOGY_PIR_DETECTOR,
        HUMIDITY_DETECTOR,
        TEMPERATURE_DETECTOR,
        COMBUSTIBLE_GAS_DETECTOR,
        DYNAMIC_SWITCH,
        CONTROL_SWITCH,
        SMART_LOCK,
        WATER_DETECTOR,
        DISPLACEMENT_DETECTOR,
        SINGLE_INFRARED_DETECTOR,
        SINGLE_ZONE_MODULE,
        CURTAIN_INFRARED_DETECTOR,
        DOORBELL_SWITCH,
        OTHER_DETECTOR
    }
    //图片质量
    public static class NET_DVR_JPEGPARA extends HIKSDKStructure {
        /*注意:当图像压缩分辨率为VGA时,支持0=CIF, 1=QCIF, 2=D1抓图,
@@ -3781,19 +3841,22 @@
        public short wTiltPos;//垂直参数
        public short wZoomPos;//变倍参数
    }
    //PTZ锁定信息
    public static class NET_DVR_PTZ_LOCKCFG extends HIKSDKStructure {
        public int dwSize;//结构体大小
        public byte byWorkMode;//云台锁定控制:0- è§£é”ï¼Œ1- é”å®š
        public byte[] byRes = new byte[127];
    }
    //零方位角控制信息
    public static class NET_DVR_INITIALPOSITIONCTRL extends HIKSDKStructure {
        public int dwSize ;//结构体大小
        public int dwSize;//结构体大小
        public short dwChan;//设备通道号
        public byte byWorkMode;//工作模式:0- è®¾ç½®ï¼Œ1- è°ƒç”¨ï¼Œ2- æ¸…除
        public byte[] byRes = new byte[127];
    }
    //球机位置信息
    public static class NET_DVR_PTZ_BASICPARAMCFG extends HIKSDKStructure {
        public short dwSize;//结构体大小
@@ -10244,14 +10307,16 @@
    boolean NET_DVR_InquiryRecordTimeSpan(int lUserID, int dwChannel, NET_DVR_RECORD_TIME_SPAN_INQUIRY lpInquiry, NET_DVR_RECORD_TIME_SPAN lpResult);
    boolean NET_DVR_StartGetDevState(NET_DVR_CHECK_DEV_STATE pParams);
    //强制I帧参数结构体。
    public static class NET_DVR_I_FRAME extends HIKSDKStructure{
    public static class NET_DVR_I_FRAME extends HIKSDKStructure {
        public int dwSize;
        public byte[] sStreamID = new byte[32];  //流IDs    SDK ä¸­å¯¹  STREAM_ID_LEN进行了定义,赋值32
        public int dwChannel;//通道号
        public byte byStreamType; //码流类型:0-主码流,1-子码流,2-码流3,3-虚拟码流,以此类推
        public byte[] byRes = new byte[63];  //保留,置为0    æŒ‰ç…§SDK要求进行对应赋值
    }
    //gps相关结构定义
    public static class TimeSegParam extends HIKSDKStructure {
        //GPS数据查找起始时间
@@ -10585,6 +10650,7 @@
        public byte[] byRes = new byte[6];
    }
}
//播放库函数声明,PlayCtrl.dll
interface PlayCtrl extends Library {
    public static final int STREAME_REALTIME = 0;
src/main/java/com/ard/utils/tcp/ClientHandler.java
@@ -297,15 +297,7 @@
                    // log.info("报警类型:" + alarmType);
                    byte[] szName = Arrays.copyOfRange(data, index + 64, index + 96);
                    int position = ByteUtils.findIndexOfDoubleZero(szName);
                    String alarmPointName;
                    if (position != -1) {
                        byte[] result = new byte[position];
                        System.arraycopy(szName, 0, result, 0, position);
                        alarmPointName = new String(result, "GBK");
                    } else {
                        alarmPointName = new String(szName, "GBK");
                    }
                    String alarmPointName = ByteUtils.bytesToStringZh(szName);
                    // log.info("所属告警区域名称:" + alarmPointName);
                    byte[] afTx = Arrays.copyOfRange(data, index + 96, index + 100);
                    afTx = ByteUtils.toLittleEndian(afTx);
@@ -405,15 +397,7 @@
                    byte[] szName = Arrays.copyOfRange(data, index + 32, index + 64);
                    //log.info("所属告警区域名称:" + DatatypeConverter.printHexBinary(szName));
                    int position = ByteUtils.findIndexOfDoubleZero(szName);
                    String alarmPointName;
                    if (position != -1) {
                        byte[] result = new byte[position];
                        System.arraycopy(szName, 0, result, 0, position);
                        alarmPointName = new String(result, "GBK");
                    } else {
                        alarmPointName = new String(szName, "GBK");
                    }
                    String alarmPointName = ByteUtils.bytesToStringZh(szName);
                    // log.info("所属告警区域名称:" + alarmPointName);
                    //log.info("报警信息:" + "【id】" + id + "【name】" + alarmPointName + "【alarmType】" + alarmType + "【alarmTime】" + alarmTime);
                    ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar();
src/main/java/com/ard/utils/tcp/NettyTcpClientHandler.java
@@ -232,15 +232,7 @@
                    // log.info("报警类型:" + alarmType);
                    byte[] szName = Arrays.copyOfRange(data, index + 64, index + 96);
                    int position = ByteUtils.findIndexOfDoubleZero(szName);
                    String alarmPointName;
                    if (position != -1) {
                        byte[] result = new byte[position];
                        System.arraycopy(szName, 0, result, 0, position);
                        alarmPointName = new String(result, "GBK");
                    } else {
                        alarmPointName = new String(szName, "GBK");
                    }
                    String alarmPointName = ByteUtils.bytesToStringZh(szName);
                    // log.info("所属告警区域名称:" + alarmPointName);
                    byte[] afTx = Arrays.copyOfRange(data, index + 96, index + 100);
                    afTx = ByteUtils.toLittleEndian(afTx);
@@ -340,15 +332,7 @@
                    byte[] szName = Arrays.copyOfRange(data, index + 32, index + 64);
                    //log.info("所属告警区域名称:" + DatatypeConverter.printHexBinary(szName));
                    int position = ByteUtils.findIndexOfDoubleZero(szName);
                    String alarmPointName;
                    if (position != -1) {
                        byte[] result = new byte[position];
                        System.arraycopy(szName, 0, result, 0, position);
                        alarmPointName = new String(result, "GBK");
                    } else {
                        alarmPointName = new String(szName, "GBK");
                    }
                    String alarmPointName = ByteUtils.bytesToStringZh(szName);
                    // log.info("所属告警区域名称:" + alarmPointName);
                    //log.info("报警信息:" + "【id】" + id + "【name】" + alarmPointName + "【alarmType】" + alarmType + "【alarmTime】" + alarmTime);
                    ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar();
src/main/resources/application.yml
@@ -1,3 +1,4 @@
spring:
  datasource:
      #  ä½¿ç”¨druid数据库连接池
@@ -29,7 +30,7 @@
      port: 40000
      enabled: true
    tcp:
      enabled: true
      enabled: false
  mqtt:
    host: tcp://192.168.1.15:1883
    clientId: cc3
@@ -51,4 +52,6 @@
  secretKey: xzx12345
logging:
  level:
    com.ard: info
    com.ard: info
server:
  port: 8088