liusuyi
2025-12-30 d873828ae4b9d4fc6ad510513c6c3f0c33118fd8
优化
7 files modified
153 ■■■■■ changed files
ard-device/src/main/java/com/ard/device/camera/domain/ArdCamera.java 2 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java 27 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/component/sdk/common/GlobalVariable.java 3 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/component/sdk/dh/service/impl/DaHuaSDK.java 39 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java 40 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java 6 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java 36 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/camera/domain/ArdCamera.java
@@ -4,6 +4,7 @@
import com.ard.common.core.domain.BaseEntity;
import com.ard.device.channel.domain.ArdChannel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@@ -17,6 +18,7 @@
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ArdCamera extends BaseEntity {
    private static final long serialVersionUID = 1L;
ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java
@@ -163,7 +163,7 @@
        ardCamera.setUpdateBy(SecurityUtils.getUsername());
        int res = ardCameraMapper.updateArdCamera(ardCamera);
        if (res > 0) {
            cameraSDKService.logout(ardCamera.getId());//sdk注销
            cameraSDKService.logout(ardCamera);//sdk注销
            cameraSDKService.login(ardCamera);//sdk登录获取通道信息
        }
        return res;
@@ -186,7 +186,7 @@
                //删除当前相机的所有通道
                ardChannelService.deleteArdChannelByDeviceId(id);
                //sdk注销
                cameraSDKService.logout(id);
                cameraSDKService.logout(camera);
            }
        }
        return ardCameraMapper.deleteArdCameraByIds(ids);
@@ -207,7 +207,7 @@
            //删除当前相机的所有通道
            ardChannelService.deleteArdChannelByDeviceId(id);
            //sdk注销
            cameraSDKService.logout(id);
            cameraSDKService.logout(ArdCamera.builder().id(id).build());
        }
        return i;
    }
@@ -408,15 +408,20 @@
     * @author 刘苏义
     * @date 2024/8/22 14:37
     */
    @Scheduled(fixedDelay = 30000)
    @Scheduled(fixedDelay = 10000)
    public void failedReconnect() {
        try {
            log.debug("定时执行失败相机重连任务");
            List<Object> ardCameras = redisService.getListKey(CacheConstants.CAMERA_LIST_KEY);
            ardCameras.stream()
                    .map(object -> (ArdCamera) object) // 将Object转换为ArdCameras
                    .filter(camera -> !GlobalVariable.loginMap.containsKey(camera.getId()))
                    .forEach(camera -> cameraSDKService.login(camera));
            // 从数据库取全部设备
            List<ArdCamera> cameraList = selectArdCameraList(new ArdCamera());
            cameraList.stream()
                    // 只处理登录失败或离线的设备
                    .filter(camera -> camera.getLoginId() == null || camera.getLoginId() < 0 || "0".equals(camera.getState()))
                    .forEach(camera -> {
                        log.info("尝试重新登录设备 {}:{}", camera.getIp(), camera.getPort());
                        cameraSDKService.login(camera);
                    });
        } catch (Exception ex) {
            log.error("定时执行失败相机重连任务异常:{}", ex.getMessage());
        }
@@ -435,9 +440,7 @@
            List<ArdCamera> ardCameraList = selectArdCameraList(new ArdCamera());
            ardCameraList
                    .forEach(camera -> {
                        CameraCmd cmd = new CameraCmd();
                        cmd.setCameraId(camera.getId());
                        boolean onLineNew = cameraSDKService.isOnLine(cmd);
                        boolean onLineNew = cameraSDKService.isOnLine(camera);
                        boolean onLineOld = "1".equals(camera.getState());
                        if (onLineNew != onLineOld) {
                            if (onLineNew) {
ard-device/src/main/java/com/ard/device/component/sdk/common/GlobalVariable.java
@@ -16,8 +16,7 @@
 **/
@Data
public class GlobalVariable {
    //保存相机登录信息(cameraId:loginId)
    public static Map<String, Object> loginMap = new ConcurrentHashMap<>();
    //保存相机登录信息(loginId:Camera)
    public static Map<Integer, ArdCamera> hikLoginMap = new ConcurrentHashMap<>();
}
ard-device/src/main/java/com/ard/device/component/sdk/dh/service/impl/DaHuaSDK.java
@@ -17,6 +17,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.*;
@@ -102,7 +103,8 @@
    public void login(ArdCamera camera) {
        try {
            NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
            NetSDKLib.LLong loginId = LoginModule.login(camera.getIp(), camera.getPort(), camera.getUsername(), camera.getPassword(), m_stDeviceInfo);
            NetSDKLib.LLong loginId = LoginModule.login(camera.getIp(), camera.getPort(), camera.getUsername(),
                    camera.getPassword(), m_stDeviceInfo);
            if (loginId.longValue() <= 0) {
                camera.setChanNum(0);
                camera.setLoginId(-1L);
@@ -116,7 +118,7 @@
            camera.setChanNum(m_stDeviceInfo.byChanNum);
            camera.setStartChan(1);
            camera.setLoginId(loginId.longValue());
            GlobalVariable.loginMap.put(camera.getId(), loginId);
            //获取最新通道
            List<ArdChannel> ardChannelList = getChannels(camera);
            if (!ardChannelList.isEmpty()) {
@@ -135,11 +137,8 @@
     * 2023/10/17 8:28:13
     */
    @Override
    public void logout(String cameraId) {
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return;
        }
        NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId);
    public void logout(ArdCamera ardCamera) {
        NetSDKLib.LLong loginId = new NetSDKLib.LLong(ardCamera.getLoginId());
        LoginModule.logout(loginId);
    }
@@ -149,13 +148,9 @@
     * 2023/10/17 8:28:13
     */
    @Override
    public boolean isOnLine(CameraCmd cmd) {
    public boolean isOnLine(ArdCamera ardCamera) {
        try {
            String cameraId = cmd.getCameraId();
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return false;
            }
            NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId);
            NetSDKLib.LLong loginId = new NetSDKLib.LLong(ardCamera.getLoginId());
            NetSDKLib.NET_WORKSTATE dh_ptz_location_info = new NetSDKLib.NET_WORKSTATE();
            boolean b = ConfigModule.queryDevState(loginId, NET_DEVSTATE_ONLINE, dh_ptz_location_info);
            if (!b) {
@@ -185,8 +180,8 @@
            channel.setDeviceId(camera.getId());
            channel.setChanNo(i);
            //获取视频编码
            CameraCmd cameraCmd = new CameraCmd(camera.getId(), channel.getChanNo());
            VideoCompressionCfg videoCompressionCfg = getVideoCompressionCfg(cameraCmd);
            camera.setChanNo(i);
            VideoCompressionCfg videoCompressionCfg = getVideoCompressionCfg(camera);
            if (StringUtils.isNotNull(videoCompressionCfg)) {
                channel.setVideoCode(videoCompressionCfg.getVideoEncType());
            }
@@ -202,16 +197,12 @@
    }
    @Override
    public VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer chanNo = cmd.getChanNo();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return null;
        }
        NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId);
    public VideoCompressionCfg getVideoCompressionCfg(ArdCamera ardCamera) {
        NetSDKLib.LLong loginId = new NetSDKLib.LLong(ardCamera.getLoginId());
        NetSDKLib.CFG_ENCODE_INFO cfg_encode_info = new NetSDKLib.CFG_ENCODE_INFO();
        cfg_encode_info.nChannelID = chanNo - 1;
        boolean b = ConfigModule.GetNewDevConfig(loginId, chanNo - 1, CFG_CMD_ENCODE, cfg_encode_info);
        cfg_encode_info.nChannelID = ardCamera.getChanNo() - 1;
        boolean b = ConfigModule.GetNewDevConfig(loginId, ardCamera.getChanNo() - 1, CFG_CMD_ENCODE, cfg_encode_info);
        if (b) {
            int emCompression = cfg_encode_info.stuMainStream[0].stuVideoFormat.emCompression;//视频格式
            String videoEncType;
ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java
@@ -9,6 +9,7 @@
import com.ard.device.component.sdk.common.ResolutionEnum;
import com.ard.device.component.sdk.common.SdkErrorCodeEnum;
import com.ard.device.component.sdk.common.osSelect;
import com.ard.device.component.sdk.dh.lib.NetSDKLib;
import com.ard.device.component.sdk.event.LoginEvent;
import com.ard.device.component.sdk.hik.lib.ExceptionCallBack;
import com.ard.device.component.sdk.hik.lib.HCNetSDK;
@@ -109,8 +110,6 @@
                return;
            }
            log.info("Login Success 【 {}:{} 】", camera.getIp(), camera.getPort());
            GlobalVariable.loginMap.put(camera.getId(), loginId);
            GlobalVariable.hikLoginMap.put(loginId, camera);
            camera.setLoginId((long) loginId);
            camera.setState("1");
@@ -138,26 +137,15 @@
     * 注销
     */
    @Override
    public void logout(String cameraId) {
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return;
        }
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        boolean b = hCNetSDK.NET_DVR_Logout(userId);
        if (b) {
            GlobalVariable.loginMap.remove(cameraId);
        }
    public void logout(ArdCamera ardCamera) {
        hCNetSDK.NET_DVR_Logout(ardCamera.getLoginId().intValue());
    }
    @Override
    public boolean isOnLine(CameraCmd cmd) {
    public boolean isOnLine(ArdCamera ardCamera) {
        try {
            String cameraId = cmd.getCameraId();
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return false;
            }
            Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
            return hCNetSDK.NET_DVR_RemoteControl(userId, NET_DVR_CHECK_USER_STATUS, null, 0);
            return hCNetSDK.NET_DVR_RemoteControl(ardCamera.getLoginId().intValue(), NET_DVR_CHECK_USER_STATUS, null, 0);
        } catch (Exception ex) {
            log.error("检测在线异常:{}", ex.getMessage());
            return false;
@@ -169,19 +157,13 @@
     *
     */
    @Override
    public VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer chanNo = cmd.getChanNo();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return null;
        }
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
    public VideoCompressionCfg getVideoCompressionCfg(ArdCamera ardCamera) {
        Integer chanNo = ardCamera.getChanNo();
        int userId = ardCamera.getLoginId().intValue();
        HCNetSDK.NET_DVR_COMPRESSIONCFG_V30 compressionCfg = new HCNetSDK.NET_DVR_COMPRESSIONCFG_V30();
        compressionCfg.write();
        Pointer point = compressionCfg.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
        boolean bool = hCNetSDK.NET_DVR_GetDVRConfig(userId, HCNetSDK.NET_DVR_GET_COMPRESSCFG_V30, chanNo, point,
                compressionCfg.size(), ibrBytesReturned);
        if (bool) {
@@ -432,8 +414,8 @@
                    channel.setName(channelName);
                    channel.setChanNo(chanNo);
                    //获取视频编码
                    CameraCmd cameraCmd = new CameraCmd(camera.getId(), chanNo);
                    VideoCompressionCfg videoCompressionCfg = getVideoCompressionCfg(cameraCmd);
                    camera.setChanNo(chanNo);
                    VideoCompressionCfg videoCompressionCfg = getVideoCompressionCfg(camera);
                    if (StringUtils.isNotNull(videoCompressionCfg)) {
                        channel.setVideoCode(videoCompressionCfg.getVideoEncType());
                    }
ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java
@@ -20,13 +20,13 @@
    void login(ArdCamera cameras);
    //注销
    void logout(String cameraId);
    void logout(ArdCamera ardCamera);
    //在线状态
    boolean isOnLine(CameraCmd cmd);
    boolean isOnLine(ArdCamera ardCamera);
    //获取码流压缩参数
    VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd);
    VideoCompressionCfg getVideoCompressionCfg(ArdCamera ardCamera);
    //获取相机通道信息
    List<ArdChannel> getChannels(ArdCamera camera);
ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java
@@ -55,15 +55,12 @@
    //注销
    @Override
    public void logout(String cameraId) {
    public void logout(ArdCamera ardCamera) {
        try {
            ArdCamera ardCamera = redisService.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                cameraSDK.logout(cameraId);
                GlobalVariable.loginMap.remove(cameraId);//移除相机登录id缓存
            }
            String factory = ardCamera.getFactory();
            CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
            cameraSDK.logout(ardCamera);
        } catch (Exception ex) {
            log.error("注销异常:{}", ex.getMessage());
        }
@@ -71,17 +68,11 @@
    //在线检测
    @Override
    public boolean isOnLine(CameraCmd cmd) {
    public boolean isOnLine(ArdCamera ardCamera) {
        try {
            boolean onLine = false;
            String cameraId = cmd.getCameraId();
            ArdCamera ardCamera = redisService.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                onLine = cameraSDK.isOnLine(cmd);
            }
            return onLine;
            String factory = ardCamera.getFactory();
            CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
            return cameraSDK.isOnLine(ardCamera);
        } catch (Exception ex) {
            log.error("检测在线异常:{}", ex.getMessage());
            return false;
@@ -90,16 +81,11 @@
    @Override
    //获取码流压缩参数
    public VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd) {
    public VideoCompressionCfg getVideoCompressionCfg(ArdCamera ardCamera) {
        try {
            String cameraId = cmd.getCameraId();
            ArdCamera ardCamera = redisService.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera == null) {
                return null;
            }
            String factory = ardCamera.getFactory();
            CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
            return cameraSDK.getVideoCompressionCfg(cmd);
            return cameraSDK.getVideoCompressionCfg(ardCamera);
        } catch (Exception ex) {
            log.error("获取码流压缩参数异常:{}", ex.getMessage());
            return null;