‘liusuyi’
2023-05-31 6a582d3819e27e9b0866489196046499c8a51ea8
提交
已修改6个文件
195 ■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/config/MinioClientSingleton.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java 164 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/util/minio/MinioUtils.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/PatrolInspectionTask.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java
@@ -35,4 +35,9 @@
    String operator;
    /*过期间隔(分钟)*/
    Integer expired;
    /*录像存储池名称*/
    String recordBucketName;
    /*录像文件名称*/
    String recordObjectName;
}
ard-work/src/main/java/com/ruoyi/device/hiksdk/config/MinioClientSingleton.java
@@ -21,11 +21,10 @@
 **/
@Slf4j(topic = "minio")
@Data
@Component
public class MinioClientSingleton {
    private static String domainUrl;
    public static String domainUrl;
    private static String accessKey;
    private static String secretKey;
@@ -59,7 +58,7 @@
    /*yml配置信息获取*/
    public static String getYmlNew(String key) {
        Resource resource = new ClassPathResource("application.yml");
        Resource resource = new ClassPathResource("application-ard.yml");
        Properties properties = null;
        try {
            YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java
@@ -3,6 +3,7 @@
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import java.io.IOException;
import java.util.Map;
/**
@@ -14,7 +15,7 @@
 **/
public interface IHikClientService {
    void loadHCNetSDKLib();
    boolean setTargetPosition(CameraCmd cmd);
    //登录
    ArdCameras login(ArdCameras cameras);
@@ -85,4 +86,8 @@
    //手动录像
    String record(CameraCmd cmd);
    //手动录像
    void recordToMinio(CameraCmd cmd) throws IOException;
    //引导目标位置
    boolean setTargetPosition(CameraCmd cmd);
}
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -135,8 +135,7 @@
            hCNetSDK.NET_DVR_Cleanup();
            camera.setLoginId(-1);
        }
        if(globalVariable.loginMap.containsKey(camera.getId()))
        {
        if (globalVariable.loginMap.containsKey(camera.getId())) {
            globalVariable.loginMap.remove(camera.getId());
        }
        globalVariable.loginMap.put(camera.getId(), lUserID);
@@ -223,6 +222,7 @@
        boolean isOnLine = hCNetSDK.NET_DVR_RemoteControl(userId, HCNetSDK.NET_DVR_CHECK_USER_STATUS, null, 0);
        return isOnLine;
    }
    /**
     * @描述 带速度的云台控制操作
     * Code:1-左上 2-上 3-右上 4-左 5-巡航 6-右 7-左下 8-下 9-右下 10-焦距变大 11-焦距变小
@@ -252,29 +252,60 @@
            dwStop = 1;//关闭
        }
        Integer dwPTZCommand=-1;
        switch (code)
        {
        switch (code) {
            /*方向*/
            case 1:dwPTZCommand=HCNetSDK.UP_LEFT;break;
            case 2:dwPTZCommand=HCNetSDK.TILT_UP;break;
            case 3:dwPTZCommand=HCNetSDK.UP_RIGHT;break;
            case 4:dwPTZCommand=HCNetSDK.PAN_LEFT;break;
            case 5:dwPTZCommand=HCNetSDK.RUN_SEQ;break;
            case 6:dwPTZCommand=HCNetSDK.PAN_RIGHT;break;
            case 7:dwPTZCommand=HCNetSDK.DOWN_LEFT;break;
            case 8:dwPTZCommand=HCNetSDK.TILT_DOWN;break;
            case 9:dwPTZCommand=HCNetSDK.DOWN_RIGHT;break;
            case 1:
                dwPTZCommand = HCNetSDK.UP_LEFT;
                break;
            case 2:
                dwPTZCommand = HCNetSDK.TILT_UP;
                break;
            case 3:
                dwPTZCommand = HCNetSDK.UP_RIGHT;
                break;
            case 4:
                dwPTZCommand = HCNetSDK.PAN_LEFT;
                break;
            case 5:
                dwPTZCommand = HCNetSDK.RUN_SEQ;
                break;
            case 6:
                dwPTZCommand = HCNetSDK.PAN_RIGHT;
                break;
            case 7:
                dwPTZCommand = HCNetSDK.DOWN_LEFT;
                break;
            case 8:
                dwPTZCommand = HCNetSDK.TILT_DOWN;
                break;
            case 9:
                dwPTZCommand = HCNetSDK.DOWN_RIGHT;
                break;
            /*焦距*/
            case 10:dwPTZCommand=HCNetSDK.ZOOM_IN;break;
            case 11:dwPTZCommand=HCNetSDK.ZOOM_OUT;break;
            case 10:
                dwPTZCommand = HCNetSDK.ZOOM_IN;
                break;
            case 11:
                dwPTZCommand = HCNetSDK.ZOOM_OUT;
                break;
            /*焦点*/
            case 12:dwPTZCommand=HCNetSDK.FOCUS_NEAR;break;
            case 13:dwPTZCommand=HCNetSDK.FOCUS_FAR;break;
            case 12:
                dwPTZCommand = HCNetSDK.FOCUS_NEAR;
                break;
            case 13:
                dwPTZCommand = HCNetSDK.FOCUS_FAR;
                break;
            /*光圈*/
            case 14:dwPTZCommand=HCNetSDK.IRIS_OPEN;break;
            case 15:dwPTZCommand=HCNetSDK.IRIS_CLOSE;break;
            case 14:
                dwPTZCommand = HCNetSDK.IRIS_OPEN;
                break;
            case 15:
                dwPTZCommand = HCNetSDK.IRIS_CLOSE;
                break;
            /*雨刷*/
            case 16:dwPTZCommand=HCNetSDK.WIPER_PWRON;break;
            case 16:
                dwPTZCommand = HCNetSDK.WIPER_PWRON;
                break;
        }
        boolean bool = hCNetSDK.NET_DVR_PTZControlWithSpeed_Other(userId, channelNum, dwPTZCommand, dwStop, speed);
        if (!bool) {
@@ -622,6 +653,7 @@
            return false;
        }
    }
    /**
     * @描述 操控锁定
     * @参数 [userId, channelNum]
@@ -641,8 +673,7 @@
        String operator=cmd.getOperator();//申请者
        String currentOperator = ardCameras.getOperatorId();//相机当前控制者
        Date currentExpired = ardCameras.getOperatorExpired();//相机当前过期时间
        if(currentExpired==null)
        {
        if (currentExpired == null) {
            //设置当前操作用户ID
            ardCameras.setOperatorId(operator);
            //设置当前过期时间
@@ -650,19 +681,16 @@
            now.setTime(now.getTime() + expired * 1000*60);
            ardCameras.setOperatorExpired(now);
            ardCamerasMapper.updateArdCameras(ardCameras);
        }
         else {
        } else {
            //如果过期时间有值
            //如果是本人直接修改
            if(currentOperator.equals(operator))
            {
            if (currentOperator.equals(operator)) {
                //设置当前过期时间
                Date now = new Date();
                now.setTime(now.getTime() + expired * 1000*60);
                ardCameras.setOperatorExpired(now);
                ardCamerasMapper.updateArdCameras(ardCameras);
            }
            else {
            } else {
                //如果非本人比较优先级
                Integer currentLevel = 0;//当前操作者的优先级
                if (sdkPriority.priorityMap.containsKey(currentOperator)) {
@@ -1235,8 +1263,7 @@
            return "";
        } else {
            recordInfo info = user_real_Map.get(userId);
            if(StringUtils.isNull(info))
            {
            if (StringUtils.isNull(info)) {
                return "";
            }
            hCNetSDK.NET_DVR_StopRealPlay(info.getLRealHandle());
@@ -1267,4 +1294,81 @@
            return url;
        }
    }
    @Override
    @SdkOperate
    public void recordToMinio(CameraCmd cmd) throws IOException {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChannelNum();
        boolean enable = cmd.isEnable();
        if (!globalVariable.loginMap.containsKey(cameraId)) {
            return;
        }
        Integer userId = globalVariable.loginMap.get(cameraId);
        String path = "";
        //预览参数
        NET_DVR_PREVIEWINFO previewinfo = new NET_DVR_PREVIEWINFO();
        previewinfo.read();
        previewinfo.lChannel = channelNum;
        previewinfo.dwStreamType = 0;//码流类型:0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推
        previewinfo.dwLinkMode = 0;//连接方式:0-TCP方式,1-UDP方式,2-多播方式,3-RTP方式,4-RTP/RTSP,5-RTP/HTTP,6-HRUDP(可靠传输),7-RTSP/HTTPS,8-NPQ
        previewinfo.hPlayWnd = null;//播放窗口的句柄,为NULL表示不解码显示。
        previewinfo.bBlocked = 0;//0- 非阻塞取流,1-阻塞取流
        previewinfo.byNPQMode = 0;//NPQ模式:0-直连模式,1-过流媒体模式
        previewinfo.write();
        int lRealHandle;
        if (enable) {
            if (!user_real_Map.containsKey(userId)) {
                lRealHandle = hCNetSDK.NET_DVR_RealPlay_V40(userId, previewinfo, null, null);
                if (lRealHandle == -1) {
                    int iErr = hCNetSDK.NET_DVR_GetLastError();
                    log.error("取流失败" + iErr);
                    return;
                }
                log.info("取流成功");
                File file = new File("D:/recordTemp/" + cameraId + ".mp4");
                if (!file.exists()) {
                    File fileParent = file.getParentFile();
                    if (!fileParent.exists()) {
                        fileParent.mkdirs();
                    }
                    file.createNewFile();
                }
                path = file.getCanonicalPath();
                recordInfo info = new recordInfo();
                info.setLRealHandle(lRealHandle);
                info.setRecordPath(path);
                user_real_Map.put(userId, info);
            }
            recordInfo info = user_real_Map.get(userId);
            if (!hCNetSDK.NET_DVR_SaveRealData_V30(info.getLRealHandle(), 1, info.getRecordPath())) {
                log.error("保存视频文件到临时文件夹失败 错误码为:  " + hCNetSDK.NET_DVR_GetLastError());
                return;
            }
            log.info("录像开始");
        } else {
            recordInfo info = user_real_Map.get(userId);
            if (StringUtils.isNull(info)) {
                return;
            }
            hCNetSDK.NET_DVR_StopRealPlay(info.getLRealHandle());
            log.info("录像停止");
            //存入minio
            String BucketName = cmd.getRecordBucketName();
            String ObjectName = cmd.getRecordObjectName();
            String ContentType = "video/MP4";
            FileInputStream stream = new FileInputStream(info.getRecordPath());
            String url = "";
            try {
                boolean b = MinioUtils.uploadObject(BucketName, ObjectName, stream, stream.available(), ContentType);
                if (b) {
                    url = BucketName + ObjectName;
                    log.info("上传文件成功!" + url);
                }
            } catch (IOException ex) {
                log.error("上传文件异常:" + ex.getMessage());
            }
            user_real_Map.remove(userId);
        }
    }
}
ard-work/src/main/java/com/ruoyi/device/hiksdk/util/minio/MinioUtils.java
@@ -271,6 +271,7 @@
                    .builder()
                    .bucket(bucketName)
                    .object(objectName)
                    .method(Method.GET)
                    .build();
            return MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs);
        } catch (Exception ex) {
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/PatrolInspectionTask.java
@@ -7,6 +7,7 @@
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.hiksdk.config.MinioClientSingleton;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import com.ruoyi.inspect.domain.ArdVideoInspectRecord;
import com.ruoyi.inspect.domain.ArdVideoInspectTask;
@@ -42,7 +43,7 @@
    @Resource
    IHikClientService hikClientService;
    public void scanRun() {
    public void scanRun() throws IOException {
        /*扫描所有可执行任务1-时间满足2-自动*/
        log.info("开始扫描所有可执行任务");
        ArdVideoInspectTask ardVideoInspectTask = new ArdVideoInspectTask();
@@ -90,7 +91,7 @@
                        {
                            /*控制相机巡检成功,开始录像*/
                            cmd.setEnable(true);//启动录像
                            hikClientService.record(cmd);
                            hikClientService.recordToMinio(cmd);
                            /*更新任务当前步骤id和步骤启动时间*/
                            ArdVideoInspectTask avit=new ArdVideoInspectTask();
                            avit.setId(videoInspectTask.getId());
@@ -121,7 +122,13 @@
                            cmd.setChannelNum(channel);
                            cmd.setOperator("sys_patrol_inspect");
                            cmd.setEnable(false);//停止录像
                            String record = hikClientService.record(cmd);
                            String uuid = UUID.randomUUID().toString().replace("-", "");
                            String time = new SimpleDateFormat("yyyyMMdd").format(new Date());
                            String recordName = cameraId + "/" + time + "/" + uuid + ".mp4";
                            cmd.setRecordBucketName("record");
                            cmd.setRecordObjectName(recordName);
                            String url= MinioClientSingleton.domainUrl+ "/" +cmd.getRecordBucketName()+ "/"+recordName;
                            hikClientService.recordToMinio(cmd);
                            /*更新巡检记录*/
                            ArdVideoInspectRecord ardVideoInspectRecord=new ArdVideoInspectRecord();
                            ardVideoInspectRecord.setStepId(currentStepId);