aijinhui
2023-10-24 8a87e4226aa802d6a0e3566c66824fedf68e77da
ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java
@@ -1,6 +1,7 @@
package com.ruoyi.device.dhsdk.service.impl;
import com.ruoyi.common.annotation.SdkOperate;
import com.ruoyi.common.utils.Threads;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
@@ -58,7 +59,7 @@
    private IVtduService vtduService;
    @Value("${minio.endpoint}")
    private String minioEndPoint;
    private final Object lock = new Object();
    // 设备断线通知回调
    private static DisConnect disConnect = new DisConnect();
@@ -74,22 +75,30 @@
    @Override
    public Boolean login(ArdCameras camera) {
        LoginModule.init(disConnect, haveReConnect);
        LLong loginId = LoginModule.login(camera.getIp(), camera.getPort(), camera.getUsername(), camera.getPassword());
        if (loginId.longValue() > 0) {
            //log.debug(camera.getIp() + ":" + camera.getPort() + "登录成功");
        NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
        LLong loginId = LoginModule.login(camera.getIp(), camera.getPort(), camera.getUsername(), camera.getPassword(), m_stDeviceInfo);
        if (loginId.longValue() <= 0) {
            camera.setChanNum(0);
            camera.setLoginId(-1);
            camera.setState("0");
            ardCamerasService.updateArdCameras(camera);
            return false;
        }
        synchronized (lock) {
            if (GlobalVariable.loginMap.containsKey(camera.getId())) {
                GlobalVariable.loginMap.remove(camera.getId());
            }
            //删除管理通道
            ardChannelService.deleteArdChannelByDeviceId(camera.getId());
            camera.setState("1");
            camera.setChanNum(LoginModule.m_stDeviceInfo.byChanNum);
            camera.setChanNum(m_stDeviceInfo.byChanNum);
            camera.setStartDChan(1);
            camera.setLoginId((int) loginId.longValue());
            ardCamerasService.updateArdCameras(camera);
            GlobalVariable.loginMap.put(camera.getId(), loginId);
            //获取最新通道
            for (int i = 1; i < LoginModule.m_stDeviceInfo.byChanNum + 1; i++) {
            for (int i = 1; i < m_stDeviceInfo.byChanNum + 1; i++) {
                ArdChannel channel = new ArdChannel();
                AV_CFG_ChannelName av_cfg_channelName = new AV_CFG_ChannelName();
                boolean b = ConfigModule.GetNewDevConfig(loginId, i - 1, CFG_CMD_CHANNELTITLE, av_cfg_channelName);
@@ -107,17 +116,17 @@
                channel.setDeviceId(camera.getId());
                channel.setChanNo(i);
                ardChannelService.insertArdChannel(channel);
                //配置到流媒体
                String name = camera.getId() + "_" + channel.getChanNo();
                String rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/cam/realmonitor?channel=" + channel.getChanNo() + "&subtype=0";
            }
            //配置到流媒体
            for (int i = 1; i < m_stDeviceInfo.byChanNum + 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);
                if (vtdu != null) {
                    vtduService.deleteVtduByName(name);
                }
                //添加到流媒体
                CameraCmd cmd = new CameraCmd(camera.getId(), channel.getChanNo());
                CameraCmd cmd = new CameraCmd(camera.getId(), i);
                Map<String, Object> videoCompressionCfg = getVideoCompressionCfg(cmd);
                vtdu = new Vtdu();
                if (videoCompressionCfg.get("videoEncType").equals("标准h264")) {
@@ -126,18 +135,11 @@
                    vtdu.setIsCode("1");//默认转码
                }
                vtdu.setRtspSource(rtspSource);
                vtdu.setName(camera.getId() + "_" + channel.getChanNo());
                vtdu.setName(camera.getId() + "_" + i);
                vtdu.setMode("1");//默认CPU软解码
                vtdu.setCameraId(camera.getId());
                vtduService.insertVtdu(vtdu);
            }
        } else {
            //log.debug(camera.getIp() + ":" + camera.getPort() + "登录失败");
            camera.setChanNum(0);
            camera.setLoginId(-1);
            camera.setState("0");
            ardCamerasService.updateArdCameras(camera);
            return false;
        }
        return true;
    }
@@ -792,62 +794,66 @@
    @Override
    public Map<String, Object> getVideoCompressionCfg(CameraCmd cmd) {
        Map<String, Object> map = new HashMap<>();
        String cameraId = cmd.getCameraId();
        Integer chanNo = cmd.getChanNo();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return null;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        CFG_ENCODE_INFO cfg_encode_info = new CFG_ENCODE_INFO();
        cfg_encode_info.nChannelID = chanNo - 1;
        boolean b = ConfigModule.GetNewDevConfig(loginId, chanNo - 1, CFG_CMD_ENCODE, cfg_encode_info);
        if (b) {
            int emCompression = cfg_encode_info.stuMainStream[0].stuVideoFormat.emCompression;//视频格式
            String videoEncType = "";
            switch (emCompression) {
                case 0:
                    videoEncType = "MPEG4";
                    break;
                case 1:
                    videoEncType = "MS-MPEG4";
                    break;
                case 2:
                    videoEncType = "MPEG2";
                    break;
                case 3:
                    videoEncType = "MPEG1";
                    break;
                case 4:
                    videoEncType = "H.263";
                    break;
                case 5:
                    videoEncType = "MJPG";
                    break;
                case 6:
                    videoEncType = "FCC-MPEG4";
                    break;
                case 7:
                    videoEncType = "标准h264";
                    break;
                case 8:
                    videoEncType = "标准h265";
                    break;
                case 9:
                    videoEncType = "SVAC";
                    break;
                default:
                    videoEncType = "未知";
                    break;
        try {
            String cameraId = cmd.getCameraId();
            Integer chanNo = cmd.getChanNo();
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return null;
            }
            int nBitRate = cfg_encode_info.stuMainStream[0].stuVideoFormat.nBitRate;
            int nWidth = cfg_encode_info.stuMainStream[0].stuVideoFormat.nWidth;
            int nHeight = cfg_encode_info.stuMainStream[0].stuVideoFormat.nHeight;
            String resolution = nWidth + "*" + nHeight;
            float nFrameRate = cfg_encode_info.stuMainStream[0].stuVideoFormat.nFrameRate;
            map.put("resolution", resolution);//分辨率
            map.put("videoBitrate", String.valueOf(nBitRate));//比特率
            map.put("videoEncType", videoEncType);//编码
            map.put("nFrameRate", String.valueOf(nFrameRate));//帧率
            LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
            CFG_ENCODE_INFO cfg_encode_info = new CFG_ENCODE_INFO();
            cfg_encode_info.nChannelID = chanNo - 1;
            boolean b = ConfigModule.GetNewDevConfig(loginId, chanNo - 1, CFG_CMD_ENCODE, cfg_encode_info);
            if (b) {
                int emCompression = cfg_encode_info.stuMainStream[0].stuVideoFormat.emCompression;//视频格式
                String videoEncType = "";
                switch (emCompression) {
                    case 0:
                        videoEncType = "MPEG4";
                        break;
                    case 1:
                        videoEncType = "MS-MPEG4";
                        break;
                    case 2:
                        videoEncType = "MPEG2";
                        break;
                    case 3:
                        videoEncType = "MPEG1";
                        break;
                    case 4:
                        videoEncType = "H.263";
                        break;
                    case 5:
                        videoEncType = "MJPG";
                        break;
                    case 6:
                        videoEncType = "FCC-MPEG4";
                        break;
                    case 7:
                        videoEncType = "标准h264";
                        break;
                    case 8:
                        videoEncType = "标准h265";
                        break;
                    case 9:
                        videoEncType = "SVAC";
                        break;
                    default:
                        videoEncType = "未知";
                        break;
                }
                int nBitRate = cfg_encode_info.stuMainStream[0].stuVideoFormat.nBitRate;
                int nWidth = cfg_encode_info.stuMainStream[0].stuVideoFormat.nWidth;
                int nHeight = cfg_encode_info.stuMainStream[0].stuVideoFormat.nHeight;
                String resolution = nWidth + "*" + nHeight;
                float nFrameRate = cfg_encode_info.stuMainStream[0].stuVideoFormat.nFrameRate;
                map.put("resolution", resolution);//分辨率
                map.put("videoBitrate", String.valueOf(nBitRate));//比特率
                map.put("videoEncType", videoEncType);//编码
                map.put("nFrameRate", String.valueOf(nFrameRate));//帧率
            }
        } catch (Exception ex) {
            log.error("取码流压缩参数异常:" + ex.getMessage());
        }
        return map;
    }
@@ -881,7 +887,7 @@
    // 设备断线回调: 当设备出现断线时,SDK会调用该函数
    private static class DisConnect implements NetSDKLib.fDisConnect {
        public void invoke(LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
            log.warn("Device["+pchDVRIP+"] Port["+nDVRPort+"] DisConnect!");
            log.warn("Device[" + pchDVRIP + "] Port[" + nDVRPort + "] DisConnect!");
        }
    }
@@ -889,7 +895,7 @@
    private static class HaveReConnect implements NetSDKLib.fHaveReConnect {
        @Override
        public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
            log.warn("ReConnect Device["+pchDVRIP+"] Port["+nDVRPort+"]");
            log.warn("ReConnect Device[" + pchDVRIP + "] Port[" + nDVRPort + "]");
        }
    }