From 7265b3d4b666f3a59f69c6dbc556098475041a27 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 星期一, 16 十月 2023 17:25:18 +0800
Subject: [PATCH] 1. 增加获取和设置PTZ接口 2. 增加相机抓图和录像接口 3. 增加设置零方位角接口 4. 增加在线状态检测接口 5. 增加云台控制接口

---
 ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java |  239 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 228 insertions(+), 11 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java b/ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java
index b984262..5e66b18 100644
--- a/ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java
@@ -1,6 +1,9 @@
 package com.ruoyi.device.dhsdk.service.impl;
 
 import com.ruoyi.common.annotation.SdkOperate;
+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.domain.ArdCameras;
 import com.ruoyi.device.camera.domain.CameraCmd;
@@ -10,27 +13,35 @@
 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.ToolKits;
-import com.ruoyi.device.dhsdk.lib.enumeration.EM_NEW_QUERY_SYSTEM_INFO;
+import com.ruoyi.device.dhsdk.module.CapturePictureModule;
 import com.ruoyi.device.dhsdk.module.ConfigModule;
 import com.ruoyi.device.dhsdk.module.LoginModule;
-import com.ruoyi.device.dhsdk.module.PtzControlModule;
+import com.ruoyi.device.dhsdk.module.RealPlayModule;
 import com.ruoyi.device.dhsdk.service.IDhClientService;
 import com.ruoyi.device.hiksdk.common.GlobalVariable;
 import com.ruoyi.device.hiksdk.sdk.HCNetSDK;
+import com.ruoyi.utils.gis.GisUtil;
+import com.ruoyi.utils.minio.MinioUtil;
 import com.sun.jna.Pointer;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.text.DecimalFormat;
 import java.util.*;
 
 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.ToolKits.getErrorCodePrint;
-import static com.ruoyi.device.hiksdk.sdk.HCNetSDK.*;
+import static com.ruoyi.device.dhsdk.module.LoginModule.netsdk;
+import static com.ruoyi.device.hiksdk.sdk.HCNetSDK.NET_DVR_SET_PTZPOS;
+
 
 /**
  * @ClassName DhSdkServiceImpl
@@ -46,6 +57,8 @@
     private IArdCamerasService ardCamerasService;
     @Resource
     private IArdChannelService ardChannelService;
+    @Value("${minio.endpoint}")
+    private String minioEndPoint;
 
     private Vector<String> chnlist = new Vector<String>();
     // 璁惧鏂嚎閫氱煡鍥炶皟
@@ -212,7 +225,7 @@
                 dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL;
                 break;
         }
-        boolean bool = LoginModule.netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, dwPTZCommand, speed, speed, 0, dwStop);
+        boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, dwPTZCommand, speed, speed, 0, dwStop);
         if (!bool) {
             log.error("鎺у埗澶辫触,璇风◢鍚庨噸璇�" + getErrorCodePrint());
         }
@@ -240,6 +253,7 @@
         }
         return ptzMap;
     }
+
     /**
      * @鎻忚堪 璁剧疆ptz淇℃伅
      * @鍙傛暟 [userId, channelNum]
@@ -257,12 +271,12 @@
         if (!GlobalVariable.loginMap.containsKey(cameraId)) {
             return false;
         }
-        LLong loginId = (LLong)GlobalVariable.loginMap.get(cameraId);
+        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
         try {
-            int p = (int)(ptz.get("p") * 10);
-            int t = (int)(ptz.get("t") * 10);
+            int p = (int) (ptz.get("p") * 10);
+            int t = (int) (ptz.get("t") * 10);
             int z = ptz.get("z").intValue();
-            boolean bool = LoginModule.netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_EXACTGOTO, p, t, z, 0 );
+            boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_EXACTGOTO, p, t, z, 0);
             if (!bool) {
                 log.error("鎺у埗澶辫触,璇风◢鍚庨噸璇�" + getErrorCodePrint());
             }
@@ -289,15 +303,188 @@
         if (!GlobalVariable.loginMap.containsKey(cameraId)) {
             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, 0, 0);
+        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);
         if (!bool) {
             log.error("鎺у埗澶辫触,璇风◢鍚庨噸璇�" + getErrorCodePrint());
         }
         return bool;
     }
 
+    /**
+     * @鎻忚堪 鎴浘 瀛樻湇鍔″櫒
+     * @鍙傛暟 [cameraId, channelNum]
+     * @杩斿洖鍊� java.lang.String
+     * @鍒涘缓浜� 鍒樿嫃涔�
+     * @鍒涘缓鏃堕棿 2023/2/2 14:59
+     * @淇敼浜哄拰鍏跺畠淇℃伅
+     */
+    @Override
+    @SdkOperate
+    public String picCutCate(CameraCmd cmd) {
+        String cameraId = cmd.getCameraId();
+        Integer chanNo = cmd.getChanNo();
+        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
+            return "";
+        }
+        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
+        String bucketName = "pic";
+        String picUrl = "";
+        String bucketObject = "/capture/" + IdUtils.simpleUUID() + ".jpeg";
+        fCaptureReceiveCB m_CaptureReceiveCB = new fCaptureReceiveCB(minioEndPoint, bucketName, bucketObject);
+        CapturePictureModule.setSnapRevCallBack(m_CaptureReceiveCB);
+        boolean b = CapturePictureModule.remoteCapturePicture(loginId, chanNo - 1);
+        if (b) {
+            picUrl = minioEndPoint + "/" + bucketName + bucketObject;
+        }
+        return picUrl;
 
+    }
+
+    /**
+     * @鎻忚堪 鐭椂褰曞儚
+     * @鍙傛暟 [userId, channelNum, enable]
+     * @杩斿洖鍊� void
+     * @鍒涘缓浜� 鍒樿嫃涔�
+     * @鍒涘缓鏃堕棿 2023/1/20 11:18
+     * @淇敼浜哄拰鍏跺畠淇℃伅
+     */
+    @Override
+    public String record(CameraCmd cmd) {
+        try {
+            String url="";
+            String cameraId = cmd.getCameraId();
+            Integer chanNo = cmd.getChanNo();
+            String path = FileUtils.createFile("D:/recordTemp/" + cameraId + ".mp4");
+            boolean enable = cmd.isEnable();
+            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
+                return "";
+            }
+            LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
+
+            if (enable) {
+                LLong lRealHandle = new LLong(0);
+                if (!GlobalVariable.previewMap.containsKey(cameraId)) {
+                    lRealHandle = RealPlayModule.startRealPlay(loginId, chanNo, 0);
+                    if (lRealHandle.longValue() <= 0) {
+                        log.error("鍙栨祦澶辫触" + getErrorCodePrint());
+                        return "";
+                    }
+                    log.debug("鍙栨祦鎴愬姛");
+                    GlobalVariable.previewMap.put(cameraId, lRealHandle.intValue());
+                }
+                if (!netsdk.CLIENT_SaveRealData(lRealHandle, path)) {
+                    log.error("淇濆瓨瑙嗛鏂囦欢鍒颁复鏃舵枃浠跺す澶辫触 閿欒鐮佷负:  " + getErrorCodePrint());
+                    return "";
+                }
+                log.debug("褰曞儚寮�濮�");
+            } else {
+                if (GlobalVariable.previewMap.containsKey(cameraId)) {
+                    LLong lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId));
+                    boolean b = netsdk.CLIENT_StopSaveRealData(lRealHandle);
+                    GlobalVariable.previewMap.remove(cameraId);
+                }
+                log.debug("褰曞儚鍋滄");
+            }
+            return url;
+        } catch (Exception ex) {
+            log.error("褰曞儚寮傚父" + ex.getMessage());
+            return "";
+        }
+    }
+    @Override
+    public boolean recordStart(CameraCmd cmd) {
+        try {
+            String cameraId = cmd.getCameraId();
+            Integer chanNo = cmd.getChanNo();
+            String path = FileUtils.createFile("D:/recordTemp/" + cameraId + ".mp4");
+            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
+                return false;
+            }
+            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);
+                GlobalVariable.previewMap.remove(cameraId);
+                log.debug("鍋滄褰撳墠褰曞儚");
+            }
+            lRealHandle = RealPlayModule.startRealPlay(loginId, chanNo-1, 0);
+            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;
+            }
+            log.debug("褰曞儚寮�濮�");
+            return true;
+        } catch (Exception ex) {
+            log.error("寮�濮嬪綍鍍忓紓甯�" + ex.getMessage());
+            return false;
+        }
+    }
+    @Override
+    public String recordStopToMinio(CameraCmd cmd) {
+        String url = "";
+        try {
+            String cameraId = cmd.getCameraId();
+            String path = FileUtils.createFile("D:/recordTemp/" + cameraId + ".mp4");
+            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
+                return "";
+            }
+            LLong lRealHandle;
+            if (GlobalVariable.previewMap.containsKey(cameraId)) {
+                lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId));
+                netsdk.CLIENT_StopSaveRealData(lRealHandle);
+                GlobalVariable.previewMap.remove(cameraId);
+                log.debug("鍋滄褰撳墠褰曞儚");
+            }
+            //瀛樺叆minio
+            String BucketName = cmd.getRecordBucketName();
+            String ObjectName = cmd.getRecordObjectName() + ".mp4";
+            FileInputStream stream = new FileInputStream(path);
+            boolean b = MinioUtil.uploadObject(BucketName, ObjectName, stream, stream.available(), "video/MP4");
+            if (b) {
+                url = MinioUtil.getBucketObjectUrl(BucketName, ObjectName);
+                log.debug("涓婁紶鏂囦欢鎴愬姛!" + url);
+            }
+            return url;
+        } catch (Exception ex) {
+            log.error("褰曞儚寮傚父" + ex.getMessage());
+            return "";
+        }
+    }
+
+    @Override
+    public boolean guideTargetPosition(CameraCmd cmd) {
+        String cameraId = cmd.getCameraId();
+        Integer chanNo = cmd.getChanNo();
+        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
+            return false;
+        }
+        LLong loginId = (LLong)GlobalVariable.loginMap.get(cameraId);
+        try {
+            ArdCameras cameras = ardCamerasService.selectArdCamerasById(cameraId);
+            double[] cameraPositon = new double[]{cameras.getLongitude(), cameras.getLatitude(), cameras.getAltitude()};
+            double[] targetPositions = cmd.getTargetPosition();
+            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]);
+            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 bool;
+        } catch (Exception ex) {
+            log.error("寮曞寮傚父:" + ex.getMessage());
+            return false;
+        }
+    }
 
     // 璁惧鏂嚎鍥炶皟: 閫氳繃 CLIENT_Init 璁剧疆璇ュ洖璋冨嚱鏁帮紝褰撹澶囧嚭鐜版柇绾挎椂锛孲DK浼氳皟鐢ㄨ鍑芥暟
     private static class DisConnect implements NetSDKLib.fDisConnect {
@@ -314,4 +501,34 @@
             System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
         }
     }
+    // 鎶撳浘鎺ユ敹鍥炶皟
+    public static class fCaptureReceiveCB implements NetSDKLib.fSnapRev {
+        private String minioEndPoint;
+        private String ObjectName;
+        private String bucketName;
+
+        public fCaptureReceiveCB(String minioEndPoint, String bucketName, String ObjectName) {
+            this.minioEndPoint = minioEndPoint;
+            this.bucketName = bucketName;
+            this.ObjectName = ObjectName;
+        }
+
+        public void invoke(LLong lLoginID, Pointer pBuf, int RevLen, int EncodeType, int CmdSerial, Pointer dwUser) {
+            if (pBuf != null && RevLen > 0) {
+                byte[] buf = pBuf.getByteArray(0, RevLen);
+                //瀛樺偍鍒癿inio
+                InputStream input = new ByteArrayInputStream(buf);
+
+                try {
+                    boolean b = MinioUtil.uploadObject(bucketName, ObjectName, input, input.available(), MimeTypeUtils.IMAGE_JPEG);
+                    if (b) {
+                        String url = minioEndPoint + "/" + bucketName + ObjectName;
+                        log.debug("涓婁紶鏂囦欢鎴愬姛!" + url);
+                    }
+                } catch (IOException ex) {
+                    log.error("涓婁紶鏂囦欢寮傚父锛�" + ex.getMessage());
+                }
+            }
+        }
+    }
 }
\ No newline at end of file

--
Gitblit v1.9.3