ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java
@@ -13,6 +13,8 @@
import com.ruoyi.device.dhsdk.common.Res;
import com.ruoyi.device.dhsdk.lib.NetSDKLib;
import com.ruoyi.device.dhsdk.lib.NetSDKLib.LLong;
import com.ruoyi.device.dhsdk.lib.structure.CFG_VIDEO_IN_FOCUS;
import com.ruoyi.device.dhsdk.lib.structure.CFG_VIDEO_IN_FOCUS_UNIT;
import com.ruoyi.device.dhsdk.module.CapturePictureModule;
import com.ruoyi.device.dhsdk.module.ConfigModule;
import com.ruoyi.device.dhsdk.module.LoginModule;
@@ -38,6 +40,8 @@
import static com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_DEVSTATE_ONLINE;
import static com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_DEVSTATE_PTZ_LOCATION;
import static com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_MOVE_CONTROL;
import static com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_SET_CONTROL;
import static com.ruoyi.device.dhsdk.lib.ToolKits.getErrorCodePrint;
import static com.ruoyi.device.dhsdk.module.LoginModule.netsdk;
import static com.ruoyi.device.hiksdk.sdk.HCNetSDK.NET_DVR_SET_PTZPOS;
@@ -66,7 +70,11 @@
    // 网络连接恢复
    private static HaveReConnect haveReConnect = new HaveReConnect();
    /**
     * 登录所有相机
     * 刘苏义
     * 2023/10/17 8:28:13
     */
    @Override
    public void loginAll() {
        try {
@@ -83,11 +91,21 @@
        }
    }
    /**
     * sdk初始化
     * 刘苏义
     * 2023/10/17 8:28:13
     */
    @Override
    public Boolean init() {
        return LoginModule.init(disConnect, haveReConnect);   // 打开工程,初始化
    }
    /**
     * 登录
     * 刘苏义
     * 2023/10/17 8:28:13
     */
    @Override
    @Async
    public Boolean login(ArdCameras camera) {
@@ -127,6 +145,11 @@
        return true;
    }
    /**
     * 注销
     * 刘苏义
     * 2023/10/17 8:28:13
     */
    @Override
    public Boolean logout(String cameraId) {
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
@@ -136,6 +159,11 @@
        return LoginModule.logout(loginId);
    }
    /**
     * 是否在线检测
     * 刘苏义
     * 2023/10/17 8:28:13
     */
    @Override
    public boolean isOnLine(CameraCmd cmd) {
        try {
@@ -156,6 +184,11 @@
        return true;
    }
    /**
     * 云台控制
     * 刘苏义
     * 2023/10/17 8:28:13
     */
    @Override
    public boolean pTZControl(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
@@ -189,7 +222,7 @@
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL;
                break;
            case 5:
                dwPTZCommand = HCNetSDK.RUN_SEQ;
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_LOOP_CONTROL;
                break;
            case 6:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL;
@@ -224,6 +257,9 @@
            case 15:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL;
                break;
            case 16:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LAMP_CONTROL;
                break;
        }
        boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, dwPTZCommand, speed, speed, 0, dwStop);
        if (!bool) {
@@ -232,6 +268,11 @@
        return bool;
    }
    /**
     * 获取PTZ值
     * 刘苏义
     * 2023/10/17 8:28:13
     */
    @Override
    public Map<String, Object> getPtz(CameraCmd cmd) {
        Map<String, Object> ptzMap = new HashMap<>();
@@ -276,6 +317,9 @@
            int p = (int) (ptz.get("p") * 10);
            int t = (int) (ptz.get("t") * 10);
            int z = ptz.get("z").intValue();
            if (z == 0) {
                z = 1;
            }
            boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_EXACTGOTO, p, t, z, 0);
            if (!bool) {
                log.error("控制失败,请稍后重试" + getErrorCodePrint());
@@ -304,7 +348,7 @@
            return false;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        boolean bool = NetSDKLib.NETSDK_INSTANCE.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RESETZERO, 0, 0, 1, 0);
        boolean bool = NetSDKLib.NETSDK_INSTANCE.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RESETZERO, 0, 0, 0, 0);
        if (!bool) {
            log.error("控制失败,请稍后重试" + getErrorCodePrint());
        }
@@ -352,7 +396,7 @@
    @Override
    public String record(CameraCmd cmd) {
        try {
            String url="";
            String url = "";
            String cameraId = cmd.getCameraId();
            Integer chanNo = cmd.getChanNo();
            String path = FileUtils.createFile("D:/recordTemp/" + cameraId + ".mp4");
@@ -392,6 +436,7 @@
            return "";
        }
    }
    @Override
    public boolean recordStart(CameraCmd cmd) {
        try {
@@ -401,25 +446,25 @@
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return false;
            }
            LLong loginId = (LLong)GlobalVariable.loginMap.get(cameraId);
            LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
            LLong lRealHandle;
            if (GlobalVariable.previewMap.containsKey(cameraId)) {
                lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId));
                netsdk.CLIENT_StopSaveRealData(lRealHandle);
                netsdk.CLIENT_StopRealPlayEx(lRealHandle);
                GlobalVariable.previewMap.remove(cameraId);
                log.debug("停止当前录像");
            }
            lRealHandle = RealPlayModule.startRealPlay(loginId, chanNo-1, 0);
            lRealHandle = RealPlayModule.startRealPlay1(loginId, chanNo - 1, path);
            if (lRealHandle.longValue() <= 0) {
                log.error("取流失败" + getErrorCodePrint());
            }
            log.debug("取流成功");
            GlobalVariable.previewMap.put(cameraId, lRealHandle.intValue());
            GlobalVariable.threadMap.put(cameraId, Thread.currentThread().getName());
            if (!netsdk.CLIENT_SaveRealData(lRealHandle, path)) {
                log.error("保存视频文件到临时文件夹失败 错误码为:  " +getErrorCodePrint());
                return false;
            }
            //if (!netsdk.CLIENT_SaveRealData(lRealHandle, path)) {
            //    log.error("保存视频文件到临时文件夹失败 错误码为:  " +getErrorCodePrint());
            //    return false;
            //}
            log.debug("录像开始");
            return true;
        } catch (Exception ex) {
@@ -427,6 +472,7 @@
            return false;
        }
    }
    @Override
    public String recordStopToMinio(CameraCmd cmd) {
        String url = "";
@@ -439,7 +485,7 @@
            LLong lRealHandle;
            if (GlobalVariable.previewMap.containsKey(cameraId)) {
                lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId));
                netsdk.CLIENT_StopSaveRealData(lRealHandle);
                netsdk.CLIENT_StopRealPlayEx(lRealHandle);
                GlobalVariable.previewMap.remove(cameraId);
                log.debug("停止当前录像");
            }
@@ -459,6 +505,11 @@
        }
    }
    /**
     * 引导目标位置
     * 刘苏义
     * 2023/10/17 8:27:48
     */
    @Override
    public boolean guideTargetPosition(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
@@ -466,7 +517,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        LLong loginId = (LLong)GlobalVariable.loginMap.get(cameraId);
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        try {
            ArdCameras cameras = ardCamerasService.selectArdCamerasById(cameraId);
            double[] cameraPositon = new double[]{cameras.getLongitude(), cameras.getLatitude(), cameras.getAltitude()};
@@ -474,7 +525,7 @@
            double[] cameraPTZ = GisUtil.getCameraPTZ(cameraPositon, targetPositions, 20, 150);
            int p = (int) (cameraPTZ[0] * 10);
            int t = (int) (cameraPTZ[1] * 10);
            int z = (int)(cameraPTZ[2]);
            int z = (int) (cameraPTZ[2]);
            boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_EXACTGOTO, p, t, z, 0);
            if (!bool) {
                log.error("控制失败,请稍后重试" + getErrorCodePrint());
@@ -486,22 +537,99 @@
        }
    }
    // 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数
    //转至预置点
    @Override
    public boolean gotoPreset(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer chanNo = cmd.getChanNo();
        Integer PresetIndex = cmd.getPresetIndex();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        try {
            boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NET_PTZ_POINT_MOVE_CONTROL, 0, PresetIndex, 0, 0);
            if (!bool) {
                log.error("控制失败,请稍后重试" + getErrorCodePrint());
            }
            return bool;
        } catch (Exception ex) {
            log.error("转至预置点异常:" + ex.getMessage());
            return false;
        }
    }
    @Override
    //设置预置位
    public boolean setPreset(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer chanNo = cmd.getChanNo();
        Integer PresetIndex = cmd.getPresetIndex();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        try {
            boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NET_PTZ_POINT_SET_CONTROL, 0, PresetIndex, 0, 0);
            if (!bool) {
                log.error("控制失败,请稍后重试" + getErrorCodePrint());
            }
            return bool;
        } catch (Exception ex) {
            log.error("设置预置点异常:" + ex.getMessage());
            return false;
        }
    }
    //切换聚焦模式
    @Override
    public boolean controlFocusMode(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer chanNo = cmd.getChanNo();
        boolean enable = cmd.isEnable();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        try {
            CFG_VIDEO_IN_FOCUS cfg_video_in_focus = new CFG_VIDEO_IN_FOCUS();
            CFG_VIDEO_IN_FOCUS_UNIT[] stVideoInFocusUnit = new CFG_VIDEO_IN_FOCUS_UNIT[32];
            if (enable) {
                stVideoInFocusUnit[0].nMode = 4;//手动聚焦
            } else {
                stVideoInFocusUnit[0].nMode = 2;//手动聚焦
            }
            cfg_video_in_focus.nChannelIndex = chanNo - 1;
            cfg_video_in_focus.stVideoInFocusUnit = stVideoInFocusUnit;
            boolean bool = ConfigModule.SetDevConfig(loginId, chanNo - 1, NetSDKLib.CFG_CMD_VIDEOIN_FOCUS, cfg_video_in_focus);
            if (!bool) {
                log.error("控制失败,请稍后重试" + getErrorCodePrint());
            }
            return bool;
        } catch (Exception ex) {
            log.error("切换聚焦模式异常:" + ex.getMessage());
            return false;
        }
    }
    // 设备断线回调: 当设备出现断线时,SDK会调用该函数
    private static class DisConnect implements NetSDKLib.fDisConnect {
        public void invoke(LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
            System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort);
        }
    }
    // 网络连接恢复,设备重连成功回调
    // 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数
    // 网络连接恢复回调:设备重连成功回调,当已断线的设备重连成功时,SDK会调用该函数
    private static class HaveReConnect implements NetSDKLib.fHaveReConnect {
        @Override
        public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
            System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
        }
    }
    // 抓图接收回调
    // 抓图接收回调:当抓图成功,sdk会调用该函数
    public static class fCaptureReceiveCB implements NetSDKLib.fSnapRev {
        private String minioEndPoint;
        private String ObjectName;