From b81192f7fc3c8050b17e68689062654c15a73ef9 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 星期四, 18 四月 2024 15:54:22 +0800
Subject: [PATCH] 维护海康sdk错误码

---
 ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java |  202 +++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 158 insertions(+), 44 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
index 1193b37..b8dcd9c 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
@@ -32,9 +32,12 @@
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.math.BigDecimal;
 import java.nio.ByteBuffer;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.text.DecimalFormat;
 import java.util.*;
 import java.util.concurrent.PriorityBlockingQueue;
@@ -121,7 +124,7 @@
                 ardChannelService.deleteArdChannelByDeviceId(camera.getId());
                 ardCamerasService.updateArdCameras(camera);
                 log.error("璁惧[" + camera.getIp() + ":" + camera.getPort() + "]鐧诲綍澶辫触: errorCode:" + errorCode + " errorInfo:" + SdkErrorCodeEnum.getDescByCode(errorCode));
-                return AjaxResult.error("鐧诲綍澶辫触: errorCode:" + errorCode + " errorInfo:" + SdkErrorCodeEnum.getDescByCode(errorCode));
+                return AjaxResult.error("璁惧鐧诲綍澶辫触: errorCode:" + errorCode + " errorInfo:" + SdkErrorCodeEnum.getDescByCode(errorCode));
             }
 
             log.debug("Login Success [ " + camera.getIp() + ":" + camera.getPort() + " ]");
@@ -168,8 +171,8 @@
             ardCamerasService.updateArdCameras(camera);
             return AjaxResult.success("璁惧鐧诲綍鎴愬姛");
         } catch (Exception ex) {
-            log.error("娉ㄥ唽璁惧寮傚父", ex);
-            return AjaxResult.error("娉ㄥ唽璁惧寮傚父" + ex.getMessage());
+            log.error("璁惧鐧诲綍寮傚父", ex);
+            return AjaxResult.error("璁惧鐧诲綍寮傚父" + ex.getMessage());
         }
     }
 
@@ -284,16 +287,12 @@
 
     //鍒涘缓寮曞闃熷垪
     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());
-                }
-            }
+        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());
         }
     }
 
@@ -1497,38 +1496,45 @@
      *
      * @param cmd 鐩告満鍛戒护
      */
-    public AjaxResult captureJPEGPicture(CameraCmd cmd) {
-        String cameraId = cmd.getCameraId();
-        Integer channelNum = cmd.getChanNo();
-        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
-            return AjaxResult.error("璁惧鏈櫥褰�");
+    @Override
+    public AjaxResult localCapture(CameraCmd cmd) {
+        try {
+            String cameraId = cmd.getCameraId();
+            Integer channelNum = cmd.getChanNo();
+            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
+                return AjaxResult.error("璁惧鏈櫥褰�");
+            }
+            Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
+            NET_DVR_WORKSTATE_V30 devwork = new NET_DVR_WORKSTATE_V30();
+            if (!hCNetSDK.NET_DVR_GetDVRWorkState_V30(userId, devwork)) {
+                int code = hCNetSDK.NET_DVR_GetLastError();
+                log.error("鑾峰彇璁惧宸ヤ綔鐘舵�佸け璐�: errorCode" + code + " errorInfo" + SdkErrorCodeEnum.getDescByCode(code));
+                return AjaxResult.error("鑾峰彇璁惧宸ヤ綔鐘舵�佸け璐�: errorCode" + code + " errorInfo" + SdkErrorCodeEnum.getDescByCode(code));
+            }
+            //鍥剧墖璐ㄩ噺
+            NET_DVR_JPEGPARA jpeg = new NET_DVR_JPEGPARA();
+            //璁剧疆鍥剧墖鍒嗚鲸鐜�
+            jpeg.wPicSize = 0;
+            //璁剧疆鍥剧墖璐ㄩ噺
+            jpeg.wPicQuality = 0;
+            IntByReference a = new IntByReference();
+            //璁剧疆鍥剧墖澶у皬
+            ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024);
+            // 鎶撳浘鍒板唴瀛橈紝鍗曞抚鏁版嵁鎹曡幏骞朵繚瀛樻垚JPEG瀛樻斁鍦ㄦ寚瀹氱殑鍐呭瓨绌洪棿涓�
+            boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(userId, channelNum, jpeg, jpegBuffer, 1024 * 1024, a);
+            //log.debug("-----------杩欓噷寮�濮嬪浘鐗囧瓨鍏ュ唴瀛�----------" + is);
+           // OutputStream outputStream = response.getOutputStream();
+            //outputStream.write(jpegBuffer.array());
+            //Base64.Encoder decoder = Base64.getEncoder();
+            //  BASE64Encoder encoder = new BASE64Encoder();
+            //String png_base64 = decoder.encodeToString(jpegBuffer.array());//杞崲鎴恇ase64涓�
+            // png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//鍒犻櫎 \r\n
+            //log.debug("-----------澶勭悊瀹屾垚鎴浘鏁版嵁----------");
+            return AjaxResult.success(jpegBuffer.array());
+        } catch (Exception ex) {
+            log.error("-----------鎴浘澶辫触----------");
+            return AjaxResult.error(ex.getMessage());
         }
-        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
-        NET_DVR_WORKSTATE_V30 devwork = new NET_DVR_WORKSTATE_V30();
-        if (!hCNetSDK.NET_DVR_GetDVRWorkState_V30(userId, devwork)) {
-            int code = hCNetSDK.NET_DVR_GetLastError();
-            log.error("鑾峰彇璁惧宸ヤ綔鐘舵�佸け璐�: errorCode" + code + " errorInfo" + SdkErrorCodeEnum.getDescByCode(code));
-            return AjaxResult.error("鑾峰彇璁惧宸ヤ綔鐘舵�佸け璐�: errorCode" + code + " errorInfo" + SdkErrorCodeEnum.getDescByCode(code));
-        }
-        //鍥剧墖璐ㄩ噺
-        NET_DVR_JPEGPARA jpeg = new NET_DVR_JPEGPARA();
-        //璁剧疆鍥剧墖鍒嗚鲸鐜�
-        jpeg.wPicSize = 0;
-        //璁剧疆鍥剧墖璐ㄩ噺
-        jpeg.wPicQuality = 0;
-        IntByReference a = new IntByReference();
-        //璁剧疆鍥剧墖澶у皬
-        ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024);
-        // 鎶撳浘鍒板唴瀛橈紝鍗曞抚鏁版嵁鎹曡幏骞朵繚瀛樻垚JPEG瀛樻斁鍦ㄦ寚瀹氱殑鍐呭瓨绌洪棿涓�
-        boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(userId, channelNum, jpeg, jpegBuffer, 1024 * 1024, a);
-        log.debug("-----------杩欓噷寮�濮嬪浘鐗囧瓨鍏ュ唴瀛�----------" + is);
-
-        Base64.Encoder decoder = Base64.getEncoder();
-        //  BASE64Encoder encoder = new BASE64Encoder();
-        String png_base64 = decoder.encodeToString(jpegBuffer.array());//杞崲鎴恇ase64涓�
-        png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//鍒犻櫎 \r\n
-        log.debug("-----------澶勭悊瀹屾垚鎴浘鏁版嵁----------");
-        return AjaxResult.success(png_base64);
     }
 
     /**
@@ -1927,4 +1933,112 @@
         return AjaxResult.success(map);
 
     }
+
+    //鏈湴褰曞儚寮�濮�
+    @Override
+    public AjaxResult localRecordStart(CameraCmd cmd) {
+        try {
+            String cameraId = cmd.getCameraId();
+            Integer channelNum = cmd.getChanNo();
+            String path = FileUtils.createFile("D:/LocalRecordTemp/" + cameraId + ".mp4");
+            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
+                return AjaxResult.error("璁惧鏈櫥褰�");
+            }
+            Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
+            //寮哄埗I甯х粨鏋勪綋瀵硅薄
+            HCNetSDK.NET_DVR_I_FRAME netDvrIFrame = new HCNetSDK.NET_DVR_I_FRAME();   //鏂板缓缁撴瀯浣撳璞�
+            netDvrIFrame.read();
+            netDvrIFrame.dwChannel = channelNum;//鍥犱负涓婃枃浠g爜涓缃簡閫氶亾鍙凤紝鎸夌収涓婃枃涓殑璁剧疆
+            netDvrIFrame.byStreamType = 0;
+            netDvrIFrame.dwSize = netDvrIFrame.size();
+            netDvrIFrame.write();
+            if (!hCNetSDK.NET_DVR_RemoteControl(userId, 3402, netDvrIFrame.getPointer(), netDvrIFrame.dwSize)) {
+                log.error("寮哄埗I甯� 閿欒鐮佷负:  " + hCNetSDK.NET_DVR_GetLastError());
+            }
+            //棰勮鍙傛暟
+            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;//鎾斁绐楀彛鐨勫彞鏌勶紝涓篘ULL琛ㄧず涓嶈В鐮佹樉绀恒��
+            previewinfo.bBlocked = 0;//0- 闈為樆濉炲彇娴侊紝1-闃诲鍙栨祦
+            previewinfo.byNPQMode = 0;//NPQ妯″紡锛�0-鐩磋繛妯″紡锛�1-杩囨祦濯掍綋妯″紡
+            previewinfo.write();
+            if (GlobalVariable.previewMap.containsKey(cameraId)) {
+                Integer lRealHandle = GlobalVariable.previewMap.get(cameraId);
+                hCNetSDK.NET_DVR_StopRealPlay(lRealHandle);
+                GlobalVariable.previewMap.remove(cameraId);
+                log.debug("鍋滄褰撳墠褰曞儚");
+            }
+            int lRealHandle = hCNetSDK.NET_DVR_RealPlay_V40(userId, previewinfo, null, null);
+            if (lRealHandle == -1) {
+                int code = hCNetSDK.NET_DVR_GetLastError();
+                log.error("鏈湴褰曞儚鍙栨祦澶辫触" + hCNetSDK.NET_DVR_GetLastError());
+                return AjaxResult.error("鏈湴褰曞儚鍙栨祦澶辫触: errorCode:" + code + " errorInfo:" + SdkErrorCodeEnum.getDescByCode(code));
+            }
+            log.debug("鏈湴褰曞儚鍙栨祦鎴愬姛");
+            GlobalVariable.threadMap.put(cameraId, Thread.currentThread().getName());
+            GlobalVariable.previewMap.put(cameraId, lRealHandle);
+            if (!hCNetSDK.NET_DVR_SaveRealData_V30(GlobalVariable.previewMap.get(cameraId), 2, path)) {
+                int code = hCNetSDK.NET_DVR_GetLastError();
+                log.error("淇濆瓨瑙嗛鏂囦欢鍒颁复鏃舵枃浠跺す澶辫触 閿欒鐮佷负:  " + hCNetSDK.NET_DVR_GetLastError());
+                return AjaxResult.error("鏈湴褰曞儚鍙栨祦澶辫触: errorCode:" + code + " errorInfo:" + SdkErrorCodeEnum.getDescByCode(code));
+            }
+            log.debug("鏈湴褰曞儚寮�濮�");
+            return AjaxResult.success("褰曞儚寮�濮�,褰曞儚ID:" + lRealHandle);
+        } catch (Exception ex) {
+            log.error("鏈湴褰曞儚寮�濮嬪紓甯�" + ex.getMessage());
+            return AjaxResult.error("鏈湴褰曞儚寮�濮嬪紓甯�" + ex.getMessage());
+        }
+    }
+
+    //鏈湴褰曞儚鍋滄
+    @Override
+    public AjaxResult localRecordStop(CameraCmd cmd) {
+        try {
+            String cameraId = cmd.getCameraId();
+            Integer channelNum = cmd.getChanNo();
+            String recordPath = FileUtils.createFile("D:/LocalRecordTemp/" + cameraId + ".mp4");
+            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
+                return AjaxResult.error("璁惧鏈櫥褰�");
+            }
+            Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
+            //region 寮哄埗I甯�
+            HCNetSDK.NET_DVR_I_FRAME netDvrIFrame = new HCNetSDK.NET_DVR_I_FRAME();   //鏂板缓缁撴瀯浣撳璞�
+            netDvrIFrame.read();
+            netDvrIFrame.dwChannel = channelNum;//鍥犱负涓婃枃浠g爜涓缃簡閫氶亾鍙凤紝鎸夌収涓婃枃涓殑璁剧疆
+            netDvrIFrame.byStreamType = 0;
+            netDvrIFrame.dwSize = netDvrIFrame.size();
+            netDvrIFrame.write();
+            if (!hCNetSDK.NET_DVR_RemoteControl(userId, 3402, netDvrIFrame.getPointer(), netDvrIFrame.dwSize)) {
+                log.error("寮哄埗I甯� 閿欒鐮佷负:  " + hCNetSDK.NET_DVR_GetLastError());
+            }
+            //endregion
+            //region 棰勮鍙傛暟
+            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;//鎾斁绐楀彛鐨勫彞鏌勶紝涓篘ULL琛ㄧず涓嶈В鐮佹樉绀恒��
+            previewinfo.bBlocked = 0;//0- 闈為樆濉炲彇娴侊紝1-闃诲鍙栨祦
+            previewinfo.byNPQMode = 0;//NPQ妯″紡锛�0-鐩磋繛妯″紡锛�1-杩囨祦濯掍綋妯″紡
+            previewinfo.write();
+            //endregion
+            if (GlobalVariable.previewMap.containsKey(cameraId)) {
+                Integer lRealHandle = GlobalVariable.previewMap.get(cameraId);
+                hCNetSDK.NET_DVR_StopRealPlay(lRealHandle);
+                GlobalVariable.previewMap.remove(cameraId);
+            }
+            log.debug("鏈湴褰曞儚鍋滄");
+            byte[] recordBytes = Files.readAllBytes(Paths.get(recordPath));
+            //OutputStream outputStream = response.getOutputStream();
+            //outputStream.write(imageBytes);
+            return AjaxResult.success(recordBytes);
+        } catch (Exception ex) {
+            log.error("鏈湴褰曞儚鍋滄寮傚父" + ex.getMessage());
+            return AjaxResult.error("鏈湴褰曞儚鍋滄寮傚父" +ex.getMessage());
+        }
+    }
 }

--
Gitblit v1.9.3