‘liusuyi’
2024-03-14 4b085b357d5e3137a79b4618a15dcba1fc5adf7b
ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
@@ -2,8 +2,12 @@
import com.ruoyi.alarm.global.domain.GuidePriorityQueue;
import com.ruoyi.alarm.global.domain.GuideTask;
import com.ruoyi.alarm.global.service.impl.QueueHandler;
import com.ruoyi.common.annotation.SdkOperate;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.device.camera.factory.CameraSDK;
import com.ruoyi.device.camera.domain.ArdCameras;
@@ -16,6 +20,7 @@
import com.ruoyi.utils.gis.GisUtil;
import com.ruoyi.utils.minio.MinioUtil;
import com.ruoyi.utils.sdk.common.GlobalVariable;
import com.ruoyi.utils.sdk.dhsdk.common.ErrorCode;
import com.ruoyi.utils.sdk.dhsdk.lib.NetSDKLib;
import com.ruoyi.utils.sdk.dhsdk.lib.enumeration.EM_NEW_CONFIG;
import com.ruoyi.utils.sdk.dhsdk.lib.enumeration.NET_EM_CFG_OPERATE_TYPE;
@@ -62,7 +67,8 @@
    private IVtduService vtduService;
    @Value("${minio.endpoint}")
    private String minioEndPoint;
    @Resource
    private QueueHandler queueHandler;
    // 设备断线通知回调
    private static DisConnect disConnect = new DisConnect();
@@ -74,6 +80,7 @@
     * 登录
     * 刘苏义
     * 2023/10/17 8:28:13
     *
     * @return
     */
    @Override
@@ -152,17 +159,22 @@
        }
        //创建引导队列
        if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
            Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
            PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
            GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
        //创建引导队列
        if (camera.getCamAlarmGuideEnable() == 1) {
            if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
                Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
                PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
                GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
            }
            //启动队列处理器
            queueHandler.process(camera.getId());
        }
        return true;
    }
    @Override
    @Async("loginExecutor")
    public void asyncLogin(ArdCameras camera){
    public void asyncLogin(ArdCameras camera) {
        LoginModule.init(disConnect, haveReConnect);
        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);
@@ -208,7 +220,14 @@
            ardChannelService.insertArdChannel(channel);
        }
        //配置到流媒体
        for (int i = 1; i < m_stDeviceInfo.byChanNum + 1; i++) {
        addVtdu(camera);
        //创建引导队列
        createGuideQueue(camera);
    }
    //添加到流媒体
    private void addVtdu(ArdCameras camera) {
        for (int i = 1; i < camera.getChanNum() + 1; i++) {
            String name = camera.getId() + "_" + i;
            String rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/cam/realmonitor?channel=" + i + "&subtype=0";
            Vtdu vtdu = vtduService.selectVtduByName(name);
@@ -234,12 +253,20 @@
            vtdu.setCameraId(camera.getId());
            vtduService.insertVtdu(vtdu);
        }
    }
        //创建引导队列
        if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
            Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
            PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
            GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
    //创建引导队列
    private void createGuideQueue(ArdCameras camera) {
        if (camera.getCamAlarmGuideEnable() != null) {
            if (camera.getCamAlarmGuideEnable() == 1) {
                if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
                    Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
                    PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
                    GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
                    //启动队列处理器
                    queueHandler.process(camera.getId());
                }
            }
        }
    }
@@ -247,6 +274,7 @@
     * 注销
     * 刘苏义
     * 2023/10/17 8:28:13
     *
     * @return
     */
    @Override
@@ -290,14 +318,15 @@
     * 2023/10/17 8:28:13
     */
    @Override
    public boolean pTZControl(CameraCmd cmd) {
    @SdkOperate
    public AjaxResult pTZControl(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        boolean enable = cmd.isEnable();
        Integer chanNo = cmd.getChanNo();
        Integer speed = cmd.getSpeed();
        Integer code = cmd.getCode();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
            return AjaxResult.error("设备未登录");
        }
        NetSDKLib.LLong loginId = (NetSDKLib.LLong) GlobalVariable.loginMap.get(cameraId);
        int dwStop;
@@ -364,8 +393,9 @@
        boolean bool = PtzControlModule.ptzControl(loginId, chanNo - 1, dwPTZCommand, speed, speed, 0, dwStop);
        if (!bool) {
            log.error("控制失败,请稍后重试" + getErrorCodePrint());
            return AjaxResult.error(ErrorCode.getErrorCode(LoginModule.netsdk.CLIENT_GetLastError()));
        }
        return bool;
        return AjaxResult.success();
    }
    /**
@@ -401,6 +431,11 @@
        return null;
    }
    @Override
    public AjaxResult setPtz1(CameraCmd cmd) {
        return setPtz(cmd) ;
    }
    /**
     * @描述 设置ptz信息
     * @参数 [userId, channelNum]
@@ -410,15 +445,20 @@
     * @修改人和其它信息 注意俯仰角度负值需要加上360得到的正值进行设置
     */
    @Override
    public boolean setPtz(CameraCmd cmd) {
    @SdkOperate
    public AjaxResult setPtz(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer chanNo = cmd.getChanNo();
        Map<String, Double> ptz = cmd.getPtzMap();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
            return AjaxResult.error("设备未登录");
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        try {
            if(ptz.get("p")==null||ptz.get("t")==null||ptz.get("z")==null)
            {
                return AjaxResult.error("ptz参数不能为空");
            }
            int p = (int) (ptz.get("p") * 10);
            int t = (int) (ptz.get("t") * 10);
            t = t > 900 ? 3600 - t : t * -1;
@@ -427,11 +467,12 @@
            boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_EXACTGOTO, p, t, z, 0);
            if (!bool) {
                log.error("控制失败,请稍后重试" + getErrorCodePrint());
                return AjaxResult.error(ErrorCode.getErrorCode(LoginModule.netsdk.CLIENT_GetLastError()));
            }
            return bool;
            return AjaxResult.success();
        } catch (Exception ex) {
            log.error(ex.getMessage());
            return false;
            return AjaxResult.error(ex.getMessage());
        }
    }
@@ -444,6 +485,7 @@
     * @修改人和其它信息 注意俯仰角度负值需要加上360得到的正值进行设置
     */
    @Override
    @SdkOperate
    public boolean setZeroPtz(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer chanNo = cmd.getChanNo();
@@ -485,6 +527,11 @@
        }
        return picUrl;
    }
    @Override
    public Map<String, Object> getPtz1(CameraCmd cmd) {
        return getPtz(cmd);
    }
    /**
@@ -1058,4 +1105,4 @@
        }
    }
}
}