‘liusuyi’
2023-07-07 85446b5b526ac53af9add7c83cfd72f39ec39611
优化外联设备报警解析并上传mqtt
已添加6个文件
已修改9个文件
536 ■■■■ 文件已修改
src/main/java/com/ard/alarm/camera/service/impl/ArdCamerasServiceImpl.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/external/domain/ArdEquipExternal.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/external/mapper/ArdEquipExternalMapper.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/external/service/IArdEquipExternalService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/external/service/impl/ArdEquipExternalServiceImpl.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/tube/service/TubeAlarmService.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/hiksdk/common/GlobalVariable.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/hiksdk/domain/DeviceInfo.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/hiksdk/domain/ExternalAlarmEventInfo.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/mqtt/MqttConsumer.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/tcp/ClientInitialize.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ArdEquipExternalMapper.xml 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/camera/service/impl/ArdCamerasServiceImpl.java
@@ -4,8 +4,13 @@
import com.ard.alarm.camera.domain.ArdCameras;
import com.ard.alarm.camera.mapper.ArdCamerasMapper;
import com.ard.alarm.camera.service.IArdCamerasService;
import com.ard.alarm.external.domain.ArdEquipExternal;
import com.ard.alarm.external.mapper.ArdEquipExternalMapper;
import com.ard.utils.hiksdk.service.impl.HikClientUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
@@ -19,17 +24,25 @@
 */
@Service
@Slf4j(topic = "camera")
public class ArdCamerasServiceImpl implements IArdCamerasService {
@Order(4)
public class ArdCamerasServiceImpl implements IArdCamerasService, ApplicationRunner {
    @Resource
    private ArdCamerasMapper ardCamerasMapper;
    @Resource
    private ArdEquipExternalMapper ardEquipExternalMapper;
    @Override
    public void run(ApplicationArguments args) throws Exception {
    @PostConstruct
    public void init()
    {
        List<ArdCameras> ardCameras = ardCamerasMapper.selectArdCamerasList(new ArdCameras());
        HikClientUtil.loadHCNetSDKLib();
        HikClientUtil.loginAll(ardCameras);
        //获取全部海康光电
        List<ArdCameras> ardCameras = ardCamerasMapper.selectArdCamerasList(new ArdCameras());
        HikClientUtil.loginAllCamera(ardCameras);
        //获取全部海康报警主机
        ArdEquipExternal ardEquipExternal= new ArdEquipExternal();
        ardEquipExternal.setFactory("1");
        ardEquipExternal.setType("1");
        List<ArdEquipExternal> ardEquipExternals = ardEquipExternalMapper.selectArdEquipExternalList(ardEquipExternal);
        HikClientUtil.loginAllAlarmHost(ardEquipExternals);
    }
    /**
     * æŸ¥è¯¢ç›¸æœºè®¾å¤‡
@@ -53,4 +66,5 @@
        return ardCamerasMapper.selectArdCamerasList(ardCameras);
    }
}
src/main/java/com/ard/alarm/external/domain/ArdEquipExternal.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ard.alarm.external.domain;
import lombok.Data;
/**
 * å¤–联设备管理对象 ard_equip_external
 *
 * @author ard
 * @date 2023-07-07
 */
@Data
public class ArdEquipExternal
{
    private static final long serialVersionUID = 1L;
    /** id */
    private String id;
    /** åç§° */
    private String name;
    /** è®¾å¤‡ç±»åž‹ */
    private String type;
    /** åނ商 */
    private String factory;
    /** ip */
    private String ip;
    /** ç«¯å£ */
    private Integer port;
    /** ç”¨æˆ·å */
    private String username;
    /** å¯†ç  */
    private String password;
    /** ç»åº¦ */
    private Double longitude;
    /** çº¬åº¦ */
    private Double latitude;
    /** å®‰è£…高度 */
    private Double altitude;
    /** éƒ¨é—¨id */
    private Integer deptId;
    /** ç”¨æˆ·id */
    private String userId;
}
src/main/java/com/ard/alarm/external/mapper/ArdEquipExternalMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ard.alarm.external.mapper;
import java.util.List;
import com.ard.alarm.external.domain.ArdEquipExternal;
import org.apache.ibatis.annotations.Mapper;
/**
 * externalMapper接口
 *
 * @author zj
 * @date 2023-03-13
 */
@Mapper
public interface ArdEquipExternalMapper
{
    /**
     * æŸ¥è¯¢external
     *
     * @param id external主键
     * @return external
     */
    public ArdEquipExternal selectArdEquipExternalById(String id);
    /**
     * æŸ¥è¯¢external列表
     *
     * @param ardEquipExternal external
     * @return external集合
     */
    public List<ArdEquipExternal> selectArdEquipExternalList(ArdEquipExternal ardEquipExternal);
}
src/main/java/com/ard/alarm/external/service/IArdEquipExternalService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ard.alarm.external.service;
import java.util.List;
import com.ard.alarm.external.domain.ArdEquipExternal;
/**
 * externalService接口
 *
 * @author zj
 * @date 2023-03-13
 */
public interface IArdEquipExternalService
{
    /**
     * æŸ¥è¯¢external
     *
     * @param id external主键
     * @return external
     */
    public ArdEquipExternal selectArdEquipExternalById(String id);
    /**
     * æŸ¥è¯¢external列表
     *
     * @param ardEquipExternal external
     * @return external集合
     */
    public List<ArdEquipExternal> selectArdEquipExternalList(ArdEquipExternal ardEquipExternal);
}
src/main/java/com/ard/alarm/external/service/impl/ArdEquipExternalServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.ard.alarm.external.service.impl;
import java.util.List;
import com.ard.alarm.external.domain.ArdEquipExternal;
import com.ard.alarm.external.mapper.ArdEquipExternalMapper;
import com.ard.alarm.external.service.IArdEquipExternalService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * externalService业务层处理
 *
 * @author zj
 * @date 2023-03-13
 */
@Service
public class ArdEquipExternalServiceImpl implements IArdEquipExternalService
{
    @Autowired
    private ArdEquipExternalMapper ardEquipExternalMapper;
    /**
     * æŸ¥è¯¢external
     *
     * @param id external主键
     * @return external
     */
    @Override
    public ArdEquipExternal selectArdEquipExternalById(String id)
    {
        return ardEquipExternalMapper.selectArdEquipExternalById(id);
    }
    /**
     * æŸ¥è¯¢external列表
     *
     * @param ardEquipExternal external
     * @return external
     */
    @Override
    public List<ArdEquipExternal> selectArdEquipExternalList(ArdEquipExternal ardEquipExternal)
    {
        return ardEquipExternalMapper.selectArdEquipExternalList(ardEquipExternal);
    }
}
src/main/java/com/ard/alarm/tube/service/TubeAlarmService.java
@@ -7,6 +7,9 @@
import com.ard.utils.udp.NettyUdpServer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@@ -24,7 +27,8 @@
 **/
@Service
@Slf4j(topic = "tube")
public class TubeAlarmService {
@Order(3)
public class TubeAlarmService implements ApplicationRunner {
    @Resource
    NettyUdpServer nettyUdpServer;
@@ -32,15 +36,15 @@
    private Integer udpPort;
    @Value("${spring.netty.udp.enabled}")
    private String UdpServerEnable;
    @PostConstruct
    public void init() {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        if (UdpServerEnable.equals("false")) {
            return;
        }
        nettyUdpServer.init(udpPort);
        log.info("管线泄露UDP服务已启动");
    }
    @Async("alarm")
    public void alarmHandler(String message) {
@@ -79,4 +83,6 @@
            log.error("tube报警数据推送异常:" + ex.getMessage());
        }
    }
}
src/main/java/com/ard/utils/hiksdk/common/GlobalVariable.java
@@ -1,6 +1,7 @@
package com.ard.utils.hiksdk.common;
import com.ard.alarm.camera.domain.ArdCameras;
import com.ard.alarm.external.domain.ArdEquipExternal;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@@ -16,6 +17,8 @@
public class GlobalVariable {
    //保存相机信息key:ip value:camera对象
    public static Map<String, ArdCameras> cameraMap = new HashMap<>();
    //保存相机信息key:ip value:报警主机对象
    public static Map<String, ArdEquipExternal> alarmHostMap = new HashMap<>();
    //保存相机登录信息key:cameraId value:loginId
    public static Map<String, Integer> loginMap = new HashMap<>();
}
src/main/java/com/ard/utils/hiksdk/domain/DeviceInfo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ard.utils.hiksdk.domain;
import lombok.Data;
/**
 * @Description:
 * @ClassName: DeviceInfo
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´07月07日9:45
 * @Version: 1.0
 **/
@Data
public class DeviceInfo {
    /**
     * è®¾å¤‡ID
     */
    private String deviceId;
    /**
     * è®¾å¤‡ç±»åž‹
     */
    private String deviceType;
    /**
     * ip
     */
    private String ip;
    /**
     * ç«¯å£
     */
    private Integer port;
    /**
     * ç”¨æˆ·å
     */
    private String username;
    /**
     * å¯†ç 
     */
    private String password;
}
src/main/java/com/ard/utils/hiksdk/domain/ExternalAlarmEventInfo.java
@@ -42,29 +42,8 @@
     */
    Integer subSysNo;
    /**
     * å…³è”相机id
     * å…³è”报警主机id
     */
    String cameraId;
    /**
     * å…³è”相机名称
     */
    String cameraName;
    /**
     * å…³è”相机ip
     */
    String cameraIp;
    /**
     * å…³è”相机经度
     */
    Double longitude;
    /**
     * å…³è”相机纬度
     */
    Double latitude;
    /**
     * å…³è”相机类型
     */
    String cameraType;
    String alarmHostId;
}
src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java
@@ -3,7 +3,11 @@
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;
@@ -45,13 +49,10 @@
     */
    @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;//事件信息
@@ -60,6 +61,11 @@
        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();
@@ -146,6 +152,13 @@
                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();
@@ -202,7 +215,7 @@
                String wDefenceName = "";
                if (!bySubSysNo.equals(-1)) {
                    CameraCmd cmd = new CameraCmd();
                    cmd.setCameraId(ardcamere.getId());
                    cmd.setCameraId(ardEquipExternal.getId());
                    cmd.setWZoneIndex(wDefenceNo);
                    wDefenceName = HikClientUtil.getDefenseZoneName(cmd);
                }
@@ -212,15 +225,12 @@
                ExternalAlarmEventInfo externalAlarmEventInfo = new ExternalAlarmEventInfo();
                externalAlarmEventInfo.setAlarmId(sCIDCode);
                externalAlarmEventInfo.setAlarmName(sCIDDescribe);
                externalAlarmEventInfo.setDefenseId((wDefenceNo + 1) );
                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());
                externalAlarmEventInfo.setAlarmHostId(ardEquipExternal.getId());
                publishMqtt(externalAlarmEventInfo);
                break;
            default:
@@ -291,14 +301,14 @@
                "【IP】" + info.getCameraIp() + "【通道】" + info.getCameraChannel() + "【型号】" + info.getCameraType() +
                "【图片】" + info.getPicUrl() + "【坐标】" + info.getLongitude() + "," + info.getLatitude());
    }
    /**
     * æ‰“印外联报警日志
     */
    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());
                "【时间】" + info.getAlarmTime() + "【报警主机ID】" + info.getAlarmHostId());
    }
    /**
@@ -308,13 +318,15 @@
        // 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));
        MqttConsumer.publish(2, false, "external", JSON.toJSONString(info));
    }
    /**
     * æ—¶é—´æ ¼å¼åŒ–
     */
src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java
@@ -2,8 +2,10 @@
import com.ard.alarm.camera.domain.ArdCameras;
import com.ard.alarm.camera.domain.CameraCmd;
import com.ard.alarm.external.domain.ArdEquipExternal;
import com.ard.utils.ByteUtils;
import com.ard.utils.hiksdk.common.GlobalVariable;
import com.ard.utils.hiksdk.domain.DeviceInfo;
import com.ard.utils.hiksdk.util.hikSdkUtil.HCNetSDK;
import com.ard.utils.hiksdk.util.minio.MinioUtils;
import com.sun.jna.Native;
@@ -11,12 +13,13 @@
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import java.io.*;
import java.nio.ByteBuffer;
import java.util.*;
import static com.ard.utils.hiksdk.common.GlobalVariable.cameraMap;
/**
@@ -126,7 +129,7 @@
     * @创建时间 2023/1/17 16:12
     * @修改人和其它信息
     */
    public static void login(ArdCameras camera) {
    public static void login(DeviceInfo deviceInfo) {
        // åˆå§‹åŒ–
        if (!hCNetSDK.NET_DVR_Init()) {
            log.error("SDK初始化失败");
@@ -138,10 +141,10 @@
        } else {
            hCNetSDK.NET_DVR_SetLogToFile(3, "/home/ardLog/hiklog", true);
        }
        String m_sDeviceIP = camera.getIp();
        String m_sUsername = camera.getUsername();
        String m_sPassword = camera.getPassword();
        short m_sPort = camera.getPort().shortValue();
        String m_sDeviceIP = deviceInfo.getIp();
        String m_sUsername = deviceInfo.getUsername();
        String m_sPassword = deviceInfo.getPassword();
        short m_sPort = deviceInfo.getPort().shortValue();
        //设置连接时间与重连时间
        hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
        hCNetSDK.NET_DVR_SetReconnect(100000, true);
@@ -162,7 +165,7 @@
        //是否异步登录:0- å¦ï¼Œ1- æ˜¯  windowsSDK里是true和false
        m_strLoginInfo.bUseAsynLogin = true;
        //异步登录回调
        m_strLoginInfo.cbLoginResult = new LoginResultCallBack(camera);
        m_strLoginInfo.cbLoginResult = new LoginResultCallBack(deviceInfo);
        m_strLoginInfo.write();
        int i = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
        if (i < 0) {
@@ -170,7 +173,6 @@
            log.info("登录异常:" + errorCode);
        }
    }
    /**
     * @描述 ç™»å½•所有相机
     * @参数 []
@@ -179,18 +181,48 @@
     * @创建时间 2023/2/3 10:10
     * @修改人和其它信息
     */
    public static void loginAll(List<ArdCameras> ardCameras) {
    public static void loginAllCamera(List<ArdCameras> ardCameras) {
        try {
            log.debug("加载lib完成!");
            for (ArdCameras camera : ardCameras) {
                Thread.sleep(100);
                login(camera);
                DeviceInfo info=new DeviceInfo();
                info.setDeviceId(camera.getId());
                info.setIp(camera.getIp());
                info.setPort(camera.getPort());
                info.setUsername(camera.getUsername());
                info.setPassword(camera.getPassword());
                login(info);
                String ip = camera.getIp();
                cameraMap.put(ip, camera);
                GlobalVariable.cameraMap.put(ip, camera);
            }
        } catch (Exception ex) {
            log.error("初始化登录相机异常:" + ex.getMessage());
        }
    }
    /**
     * @描述 ç™»å½•所有报警主机
     * @参数 []
     * @返回值 void
     * @创建人 åˆ˜è‹ä¹‰
     * @创建时间 2023/2/3 10:10
     * @修改人和其它信息
     */
    public static void loginAllAlarmHost(List<ArdEquipExternal> ardEquipExternals) {
        try {
            for (ArdEquipExternal alarmHost : ardEquipExternals) {
                Thread.sleep(100);
                DeviceInfo info=new DeviceInfo();
                info.setDeviceId(alarmHost.getId());
                info.setIp(alarmHost.getIp());
                info.setPort(alarmHost.getPort());
                info.setUsername(alarmHost.getUsername());
                info.setPassword(alarmHost.getPassword());
                login(info);
                String ip = alarmHost.getIp();
                GlobalVariable.alarmHostMap.put(ip, alarmHost);
            }
        } catch (Exception ex) {
            log.error("初始化报警主机异常:" + ex.getMessage());
        }
    }
@@ -269,7 +301,7 @@
                logout(lUserID);
                return lAlarmHandle;
            } else {
                log.info("相机布防成功");
                log.info("设备布防成功");
                return lAlarmHandle;
            }
        }
@@ -379,4 +411,6 @@
        }
        return name;
    }
}
src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java
@@ -3,6 +3,7 @@
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.domain.DeviceInfo;
import com.ard.utils.hiksdk.util.hikSdkUtil.HCNetSDK;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
@@ -17,27 +18,20 @@
@Slf4j(topic = "hikSdk")
public class LoginResultCallBack implements HCNetSDK.FLoginResultCallBack {
    private ArdCameras camera;
    public LoginResultCallBack(ArdCameras camera) {
        this.camera = camera;
    private DeviceInfo deviceInfo;
    public LoginResultCallBack(DeviceInfo deviceInfo)
    {
        this.deviceInfo=deviceInfo;
    }
    @Override
    public int invoke(int lUserID, int dwResult, HCNetSDK.NET_DVR_DEVICEINFO_V30 lpDeviceinfo, Pointer pUser) {
        if (GlobalVariable.loginMap.containsKey(camera.getId())) {
            GlobalVariable.loginMap.remove(camera.getId());
        }
        if (dwResult == 1) {
            GlobalVariable.loginMap.put(camera.getId(), lUserID);
            log.info(camera.getIp() + ":" + camera.getPort() + "登录成功");
            camera.setLoginId(lUserID);
            camera.setChannel((int) lpDeviceinfo.byChanNum);
            GlobalVariable.loginMap.put(deviceInfo.getDeviceId(), lUserID);
            log.info(deviceInfo.getIp() + ":" + deviceInfo.getPort() + "登录成功");
            // è®¾ç½®æŠ¥è­¦å›žè°ƒå‡½æ•°ï¼Œå»ºç«‹æŠ¥è­¦ä¸Šä¼ é€šé“(启用布防)
            HikClientUtil.setupAlarmChan(lUserID, -1);
        } else {
            log.info(camera.getIp() + ":" + camera.getPort() + "登录失败");
            camera.setChannel(0);
            camera.setLoginId(-1);
            log.info(deviceInfo.getIp() + ":" + deviceInfo.getPort() + "登录失败");
        }
        return 1;
    }
src/main/java/com/ard/utils/mqtt/MqttConsumer.java
@@ -1,12 +1,17 @@
package com.ard.utils.mqtt;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.expression.spel.ast.NullLiteral;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
/**
 * @Description: mqtt消费客户端
 * @ClassName: MqttConsumer
@@ -16,6 +21,7 @@
 **/
@Component
@Slf4j(topic = "mqtt")
@Order(1)
public class MqttConsumer implements ApplicationRunner {
    private static MqttClient client;
@@ -23,8 +29,7 @@
    @Override
    public void run(ApplicationArguments args) {
        log.info("初始化并启动mqtt......");
        if(PropertiesUtil.MQTT_ENABLED)
        {
        if (PropertiesUtil.MQTT_ENABLED) {
            this.connect();
        }
    }
@@ -49,7 +54,7 @@
    }
    /**
     *  åˆ›å»ºå®¢æˆ·ç«¯  --- 1 ---
     * åˆ›å»ºå®¢æˆ·ç«¯  --- 1 ---
     */
    public void getClient() {
        try {
@@ -63,7 +68,7 @@
    }
    /**
     *  ç”Ÿæˆé…ç½®å¯¹è±¡ï¼Œç”¨æˆ·åï¼Œå¯†ç ç­‰  --- 2 ---
     * ç”Ÿæˆé…ç½®å¯¹è±¡ï¼Œç”¨æˆ·åï¼Œå¯†ç ç­‰  --- 2 ---
     */
    public MqttConnectOptions getOptions() {
        MqttConnectOptions options = new MqttConnectOptions();
@@ -81,7 +86,7 @@
    }
    /**
     *  qos   --- 3 ---
     * qos   --- 3 ---
     */
    public int[] getQos(int length) {
@@ -101,7 +106,7 @@
    }
    /**
     *  è£…载各种实例和订阅主题  --- 4 ---
     * è£…载各种实例和订阅主题  --- 4 ---
     */
    public void create(MqttConnectOptions options, String[] topic, int[] qos) {
        try {
@@ -130,8 +135,8 @@
    /**
     * å‘布,非持久化
     *
     *  qos根据文档设置为1
     * <p>
     * qos根据文档设置为1
     *
     * @param topic
     * @param msg
@@ -144,30 +149,32 @@
     * å‘布
     */
    public static void publish(int qos, boolean retained, String topic, String pushMessage) {
        log.info("【主题】:" + topic + "【qos】:" + qos + "【pushMessage】:" + pushMessage);
        MqttMessage message = new MqttMessage();
        message.setQos(qos);
        message.setRetained(retained);
        try {
            message.setPayload(pushMessage.getBytes("UTF-8"));
        } catch (UnsupportedEncodingException e) {
            log.error("mqtt编码异常:" + e.getMessage());
        }
        MqttTopic mTopic = client.getTopic(topic);
        if (null == mTopic) {
            log.error("topic:" + topic + " ä¸å­˜åœ¨");
        }
        MqttDeliveryToken token;
        try {
            token = mTopic.publish(message);
            token.waitForCompletion();
            if (token.isComplete()) {
                log.info("消息发送成功");
        if (client != null) {
            log.info("【主题】:" + topic + "【qos】:" + qos + "【pushMessage】:" + pushMessage);
            MqttMessage message = new MqttMessage();
            message.setQos(qos);
            message.setRetained(retained);
            try {
                message.setPayload(pushMessage.getBytes("UTF-8"));
            } catch (UnsupportedEncodingException e) {
                log.error("mqtt编码异常:" + e.getMessage());
            }
        } catch (MqttPersistenceException e) {
            log.error("mqtt持久异常:" + e.getMessage());
        } catch (MqttException e) {
            log.error("mqtt异常:" + e.getMessage());
            MqttTopic mTopic = client.getTopic(topic);
            if (null == mTopic) {
                log.error("topic:" + topic + " ä¸å­˜åœ¨");
            }
            MqttDeliveryToken token;
            try {
                token = mTopic.publish(message);
                token.waitForCompletion();
                if (token.isComplete()) {
                    log.info("消息发送成功");
                }
            } catch (MqttPersistenceException e) {
                log.error("mqtt持久异常:" + e.getMessage());
            } catch (MqttException e) {
                log.error("mqtt异常:" + e.getMessage());
            }
        }
    }
}
src/main/java/com/ard/utils/tcp/ClientInitialize.java
@@ -17,6 +17,9 @@
import io.netty.channel.socket.nio.NioSocketChannel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@@ -34,7 +37,8 @@
 */
@Component
@Slf4j(topic = "netty")
public class ClientInitialize {
@Order(2)
public class ClientInitialize implements ApplicationRunner {
    @Resource
    IArdEquipRadarService ardEquipRadarService;
@@ -119,8 +123,8 @@
    /**
     * åˆå§‹åŒ–方法
     */
    @PostConstruct
    public void initialize() {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        if (!tcpClientEnable) {
            return;
        }
src/main/resources/mapper/ArdEquipExternalMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ard.alarm.external.mapper.ArdEquipExternalMapper">
    <resultMap type="ArdEquipExternal" id="ArdEquipExternalResult">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="type" column="type"/>
        <result property="factory" column="factory"/>
        <result property="ip" column="ip"/>
        <result property="port" column="port"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="longitude" column="longitude"/>
        <result property="latitude" column="latitude"/>
        <result property="altitude" column="altitude"/>
        <result property="deptId" column="dept_id"/>
        <result property="userId" column="user_id"/>
    </resultMap>
    <sql id="selectArdEquipExternalVo">
        select c.id,
               c.name,
               c.type,
               c.factory,
               c.ip,
               c.port,
               c.username,
               c.password,
               c.longitude,
               c.latitude,
               c.altitude
        from ard_equip_external c
    </sql>
    <select id="selectArdEquipExternalList" parameterType="ArdEquipExternal" resultMap="ArdEquipExternalResult">
        <include refid="selectArdEquipExternalVo"/>
        <where>
            <if test="name != null  and name != ''">and c.name like '%'||#{name}||'%'</if>
            <if test="type != null  and type != ''">and c.type = #{type}</if>
            <if test="factory != null  and factory != ''">and c.factory = #{factory}</if>
            <if test="deptId != null ">and (c.dept_id = #{deptId} OR c.dept_id IN ( SELECT t.dept_id FROM sys_dept t
                WHERE cast(#{deptId} as varchar) = any(string_to_array(ancestors,',')) ))
            </if>
            <if test="userId != null  and userId != ''">and c.user_id = #{userId}</if>
        </where>
    </select>
    <select id="selectArdEquipExternalById" parameterType="String" resultMap="ArdEquipExternalResult">
        <include refid="selectArdEquipExternalVo"/>
        where id = #{id}
    </select>
</mapper>