From a17ac1c04c229294760d58825ac68dbe044e8278 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 星期六, 13 四月 2024 10:12:15 +0800
Subject: [PATCH] 增加本地抓图和录像 增加兴趣点引导上报

---
 ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/controller/HikSdkController.java        |    7 
 ard-work/src/main/java/com/ruoyi/utils/sdk/common/SdkErrorCodeEnum.java                   |    3 
 ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/RealPlayModule.java               |    4 
 ard-work/src/main/java/com/ruoyi/device/camera/factory/CameraSDK.java                     |   11 
 ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java        |   54 ++++
 ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java     |   60 +++++
 ard-work/src/main/java/com/ruoyi/utils/qymqtt/oldM/PushCallback.java                      |    2 
 ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java          |  180 +++++++++++++--
 ard-work/src/main/java/com/ruoyi/device/camera/service/ICameraSdkService.java             |   10 
 ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/LoginModule.java                  |    2 
 ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueHandler.java              |   25 +-
 ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java |    9 
 ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdSyCarServiceImpl.java                 |  110 +++++----
 ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java               |  139 +++++++++++
 14 files changed, 494 insertions(+), 122 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueHandler.java b/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueHandler.java
index 05ebddc..0c705c4 100644
--- a/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueHandler.java
+++ b/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueHandler.java
@@ -138,21 +138,11 @@
             }
             if (guideRes) {
                 log.debug("寮曞鎴愬姛");
-                //region 閫氱煡鍓嶇
-                Map<String, Object> message = new HashMap<>();
-                Map<String, String> data = new HashMap<>();
-                data.put("cameraId", cmd.getCameraId());
-                data.put("chanNo", cmd.getChanNo().toString());
-                data.put("alarmType", cmd.getOperator());
-                data.put("alarmId", guideTask.getAlarmId());
-                data.put("wellId", guideTask.getWellId());
-                message.put("70000", data);
-                WebSocketUtils.sendMessageAll(message);
-                //endregion
                 cameraSdkService.controlLock(cmd);//涓婇攣
                 cameraSdkService.recordStart(cmd);//寮�濮嬪綍鍍�
                 recordFlag = true;
                 Instant startTime = Instant.now();
+                Instant startTime1 = startTime;
                 while (recordFlag) {
                     //鍒ゆ柇鏃堕棿
                     Instant currentTime = Instant.now();
@@ -172,6 +162,19 @@
                             recordFlag = false;//褰曞儚鍋滄
                         }
                     }
+                    //region 閫氱煡鍓嶇
+                    long seconds = Duration.between(startTime1, currentTime).getSeconds();
+                    // 鍒ゆ柇褰撳墠鏃堕棿涓庝笂娆″彂閫佹暟鎹殑鏃堕棿闂撮殧鏄惁瓒呰繃2绉�
+                    if (seconds == 2) {
+                        Map<String, Object> message = new HashMap<>();
+                        Map<String, String> data = new HashMap<>();
+                        data.put("cameraId", cmd.getCameraId());
+                        data.put("wellId", guideTask.getWellId());
+                        message.put("70000", data);
+                        WebSocketUtils.sendMessageAll(message);
+                        startTime1 = currentTime; // 鏇存柊涓婃鍙戦�佹暟鎹殑鏃堕棿鎴�
+                    }
+                    //endregion
                 }
                 if (StringUtils.isNotEmpty(url)) {
                     switch (guideTask.getAlarmType()) {
diff --git a/ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java b/ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java
index a2cefc6..1568ce7 100644
--- a/ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java
+++ b/ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java
@@ -23,6 +23,10 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -333,6 +337,20 @@
         return toAjaxString(path, "鐩告満鎶撳浘");
     }
 
+    @ApiOperation("鏈湴鎶撳浘")
+    @PostMapping("/localCapture")
+    @Log(title = "鐩告満鎶撳浘", businessType = BusinessType.CONTROL)
+    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"})
+    public @ResponseBody
+    void localCapture(@RequestBody CameraCmd cmd, HttpServletResponse response) throws IOException {
+        cmd.setOperator(SecurityUtils.getUserId());
+        response.setContentType("image/jpeg");
+        AjaxResult result = cameraSdkService.localCapture(cmd);
+        OutputStream outputStream = response.getOutputStream();
+        byte[] data = (byte[]) result.get("data");
+        outputStream.write(data);
+    }
+
     @ApiOperation("鑾峰彇鐩告満鏋惰鍙傛暟")
     @PostMapping("/getGisInfo")
     @Log(title = "鑾峰彇鐩告満鏋惰鍙傛暟", businessType = BusinessType.CONTROL)
@@ -343,10 +361,10 @@
         return cameraSdkService.getGisInfo(cmd);
     }
 
-    @ApiOperation("褰曞儚")
+    //@ApiOperation("褰曞儚")
     @PostMapping("/record")
     @Log(title = "鎵嬪姩褰曞儚寮�濮�", businessType = BusinessType.CONTROL)
-    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"})
+    //@ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"})
     public @ResponseBody
     AjaxResult record(@RequestBody CameraCmd cmd) {
         cmd.setOperator(SecurityUtils.getUserId());
@@ -354,10 +372,10 @@
         return AjaxResult.success(url);
     }
 
-    @ApiOperation("鎵嬪姩褰曞儚寮�濮�")
+    //@ApiOperation("鎵嬪姩褰曞儚寮�濮�")
     @PostMapping("/recordStart")
     @Log(title = "鎵嬪姩褰曞儚寮�濮�", businessType = BusinessType.CONTROL)
-    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"})
+    //@ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"})
     public @ResponseBody
     AjaxResult recordStart(@RequestBody CameraCmd cmd) {
         cmd.setOperator(SecurityUtils.getUserId());
@@ -365,14 +383,38 @@
         return toAjax(b);
     }
 
-    @ApiOperation("鎵嬪姩褰曞儚鍋滄")
+    //@ApiOperation("鎵嬪姩褰曞儚鍋滄")
     @PostMapping("/recordStop")
     @Log(title = "鎵嬪姩褰曞儚鍋滄", businessType = BusinessType.CONTROL)
-    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.recordBucketName", "cmd.recordObjectName"})
+    //@ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.recordBucketName", "cmd.recordObjectName"})
     public @ResponseBody
     AjaxResult recordStop(@RequestBody CameraCmd cmd) {
         cmd.setOperator(SecurityUtils.getUserId());
         String url = cameraSdkService.recordStopToMinio(cmd);
         return AjaxResult.success(url);
     }
+
+    @ApiOperation("鏈湴褰曞儚寮�濮�")
+    @PostMapping("/localRecordStart")
+    @Log(title = "鏈湴褰曞儚寮�濮�", businessType = BusinessType.CONTROL)
+    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"})
+    public @ResponseBody
+    AjaxResult localRecordStart(@RequestBody CameraCmd cmd) {
+        cmd.setOperator(SecurityUtils.getUserId());
+        return cameraSdkService.localRecordStart(cmd);
+    }
+
+    @ApiOperation("鏈湴褰曞儚鍋滄")
+    @PostMapping("/localRecordStop")
+    @Log(title = "鏈湴褰曞儚鍋滄", businessType = BusinessType.CONTROL)
+    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"})
+    public @ResponseBody
+    void localRecordStop(@RequestBody CameraCmd cmd, HttpServletResponse response) throws IOException {
+        cmd.setOperator(SecurityUtils.getUserId());
+        response.setContentType("video/mp4");
+        AjaxResult result = cameraSdkService.localRecordStop(cmd);
+        byte[] recordBytes = (byte[]) result.get("data");
+        OutputStream outputStream = response.getOutputStream();
+        outputStream.write(recordBytes);
+    }
 }
diff --git a/ard-work/src/main/java/com/ruoyi/device/camera/factory/CameraSDK.java b/ard-work/src/main/java/com/ruoyi/device/camera/factory/CameraSDK.java
index a978e5a..c1d51b5 100644
--- a/ard-work/src/main/java/com/ruoyi/device/camera/factory/CameraSDK.java
+++ b/ard-work/src/main/java/com/ruoyi/device/camera/factory/CameraSDK.java
@@ -4,6 +4,8 @@
 import com.ruoyi.device.camera.domain.ArdCameras;
 import com.ruoyi.device.camera.domain.CameraCmd;
 import com.ruoyi.device.channel.domain.ArdChannel;
+
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
 
@@ -65,8 +67,8 @@
     //鑾峰彇浜戝彴閿佸畾淇℃伅
     AjaxResult getPTZLockInfo(CameraCmd cmd);
 
-    //鎶撳浘-杩旂粰鍓嶇浜岃繘鍒舵祦
-    AjaxResult captureJPEGPicture(CameraCmd cmd);
+    //鏈湴鎶撳浘
+    AjaxResult localCapture(CameraCmd cmd);
 
     //鎶撳浘
     String picCutCate(CameraCmd cmd);
@@ -108,4 +110,9 @@
 
     //鑾峰彇GIS淇℃伅鏁版嵁
     AjaxResult getGisInfo(CameraCmd cmd);
+
+    //鏈湴褰曞儚寮�濮�
+    AjaxResult localRecordStart(CameraCmd cmd);
+    //鏈湴褰曞儚鍋滄
+    AjaxResult localRecordStop(CameraCmd cmd);
 }
diff --git a/ard-work/src/main/java/com/ruoyi/device/camera/service/ICameraSdkService.java b/ard-work/src/main/java/com/ruoyi/device/camera/service/ICameraSdkService.java
index 8909eec..18f0cde 100644
--- a/ard-work/src/main/java/com/ruoyi/device/camera/service/ICameraSdkService.java
+++ b/ard-work/src/main/java/com/ruoyi/device/camera/service/ICameraSdkService.java
@@ -5,6 +5,7 @@
 import com.ruoyi.device.camera.domain.CameraCmd;
 import org.springframework.scheduling.annotation.Async;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.Map;
 
 public interface ICameraSdkService {
@@ -66,8 +67,8 @@
     //鑾峰彇浜戝彴閿佸畾淇℃伅
     AjaxResult getPTZLockInfo(CameraCmd cmd);
 
-    //鎶撳浘-杩旂粰鍓嶇浜岃繘鍒舵祦
-    String captureJPEGPicture(CameraCmd cmd);
+    //鏈湴鎶撳浘
+    AjaxResult localCapture(CameraCmd cmd);
 
     //鎶撳浘
     String picCutCate(CameraCmd cmd);
@@ -104,4 +105,9 @@
 
     //鑾峰彇GIS淇℃伅鏁版嵁
     AjaxResult getGisInfo(CameraCmd cmd);
+
+    //鏈湴褰曞儚寮�濮�
+    AjaxResult localRecordStart(CameraCmd cmd);
+    //鏈湴褰曞儚鍋滄
+    AjaxResult localRecordStop(CameraCmd cmd);
 }
diff --git a/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java b/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java
index de2805a..e3aac54 100644
--- a/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java
@@ -29,6 +29,7 @@
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 import java.util.*;
 
 
@@ -384,9 +385,25 @@
         }
     }
 
+    //鏈湴鎶撳浘
     @Override
-    public String captureJPEGPicture(CameraCmd cmd) {
-        return null;
+    public AjaxResult localCapture(CameraCmd cmd) {
+        try {
+            String cameraId = cmd.getCameraId();
+            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
+            if (ardCamera != null) {
+                String factory = ardCamera.getFactory();
+                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
+              return   cameraSDK.localCapture(cmd);
+            }
+            else
+            {
+                return AjaxResult.error("鎽勫儚澶翠笉瀛樺湪");
+            }
+        } catch (Exception ex) {
+            log.error("鎵嬪姩鎶撳浘寮傚父:" + ex.getMessage());
+            return AjaxResult.error("鎵嬪姩鎶撳浘寮傚父:" + ex.getMessage());
+        }
     }
 
     //鎶撳浘
@@ -829,4 +846,43 @@
             return AjaxResult.error("鑾峰彇鐩告満鏋惰鍙傛暟寮傚父锛�" + ex.getMessage());
         }
     }
+
+    //鏈湴褰曞儚寮�濮�
+    @Override
+    public AjaxResult localRecordStart(CameraCmd cmd) {
+        try {
+            String cameraId = cmd.getCameraId();
+            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
+            if (ardCamera != null) {
+                String factory = ardCamera.getFactory();
+                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
+                return cameraSDK.localRecordStart(cmd);
+            } else {
+                return AjaxResult.error("鐩告満涓嶅瓨鍦�");
+            }
+        } catch (Exception ex) {
+            log.error("鏈湴褰曞儚寮�濮嬪紓甯革細" + ex.getMessage());
+            return AjaxResult.error("鏈湴褰曞儚寮�濮嬪紓甯革細" + ex.getMessage());
+        }
+    }
+    //鏈湴褰曞儚鍋滄
+    @Override
+    public AjaxResult localRecordStop(CameraCmd cmd) {
+        try {
+            String cameraId = cmd.getCameraId();
+            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
+            if (ardCamera != null) {
+                String factory = ardCamera.getFactory();
+                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
+                return cameraSDK.localRecordStop(cmd);
+            }
+            else
+            {
+                return AjaxResult.error("鐩告満涓嶅瓨鍦�");
+            }
+        } catch (Exception ex) {
+            log.error("鏈湴褰曞儚鍋滄寮傚父锛�" + ex.getMessage());
+            return AjaxResult.error("鏈湴褰曞儚鍋滄寮傚父锛�" + ex.getMessage());
+        }
+    }
 }
diff --git a/ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java b/ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java
index 097c4fa..8a93ee5 100644
--- a/ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java
@@ -14,6 +14,7 @@
 import com.ruoyi.inspect.domain.ArdVideoInspectRecord;
 import com.ruoyi.inspect.mapper.ArdVideoInspectRecordMapper;
 import com.ruoyi.inspect.mapper.ArdVideoInspectTaskStepMapper;
+import com.ruoyi.utils.websocket.util.WebSocketUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import com.ruoyi.common.utils.StringUtils;
@@ -517,6 +518,14 @@
                         ardVideoInspectTaskMapper.updateArdVideoInspectTaskWithCurrentSetpInfo(ardVideoInspectTask);
                     } else {
                         log.debug("寮曞鎴愬姛!");
+                        //region 閫氱煡鍓嶇
+                        Map<String, Object> message = new HashMap<>();
+                        Map<String, String> data = new HashMap<>();
+                        data.put("cameraId", cmd.getCameraId());
+                        data.put("wellId", well.getWellId());
+                        message.put("70000", data);
+                        WebSocketUtils.sendMessageAll(message);
+                        //endregion
                     }
                 }
             }
diff --git a/ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdSyCarServiceImpl.java b/ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdSyCarServiceImpl.java
index baa6568..4797f54 100644
--- a/ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdSyCarServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdSyCarServiceImpl.java
@@ -1317,62 +1317,68 @@
      */
     @Override
     public List<Map<String, Object>> getNearCar(SchedulingParam param) {
-        Double longitude = param.getLongitude();
-        Double latitude = param.getLatitude();
-        Integer radius = param.getSealingRadius();
-        if (longitude == null && latitude == null) {
-            log.debug("鍘熺偣鍧愭爣涓虹┖");
-            return null;
-        }
-        if (radius == null) {
-            log.debug("鍗婂緞璺濈涓虹┖");
-            return null;
-        }
-        String userId = SecurityUtils.getUserId();
-        ArdSyUser syUser = new ArdSyUser();
-        syUser.setSysUserId(userId);
-        List<ArdSyUser> ardSyUserList = ardSyUserMapper.selectArdSyUserList(syUser);
-        if (ardSyUserList.size() == 0) {
-            log.debug("鐢ㄦ埛鏈寕鎺ヤ笁涓�杞﹁締");
-            return null;
-        }
-        ArdSyUser ardSyUser = ardSyUserList.get(0);
-        String syUrl = redisCache.getCacheObject("sys_config:syCarPT");
-        String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword());
-        Map<String, Object> LogInResult = sYClient.logIn(syUrl, passwordMd5, ardSyUser.getUserId());
-        String sessionId = (String) LogInResult.get("sessionId");
+        try {
+            Double longitude = param.getLongitude();
+            Double latitude = param.getLatitude();
+            Integer radius = param.getSealingRadius();
+            if (longitude == null && latitude == null) {
+                log.debug("鍘熺偣鍧愭爣涓虹┖");
+                return null;
+            }
+            if (radius == null) {
+                log.debug("鍗婂緞璺濈涓虹┖");
+                return null;
+            }
+            String userId = SecurityUtils.getUserId();
+            ArdSyUser syUser = new ArdSyUser();
+            syUser.setSysUserId(userId);
+            List<ArdSyUser> ardSyUserList = ardSyUserMapper.selectArdSyUserList(syUser);
+            if (ardSyUserList.size() == 0) {
+                log.debug("鐢ㄦ埛鏈寕鎺ヤ笁涓�杞﹁締");
+                return null;
+            }
+            ArdSyUser ardSyUser = ardSyUserList.get(0);
+            String syUrl = redisCache.getCacheObject("sys_config:syCarPT");
+            String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword());
+            Map<String, Object> LogInResult = sYClient.logIn(syUrl, passwordMd5, ardSyUser.getUserId());
+            String sessionId = (String) LogInResult.get("sessionId");
 
-        Map<String, Object> teamList = sYClient.getTeamList(syUrl, ardSyUser.getUserId(), sessionId);
-        List<Map<String, Object>> listMap = (List<Map<String, Object>>) teamList.get("list");
-        List<Map<String, Object>> allList = new ArrayList<>();
-        for (Map<String, Object> team : listMap) {
-            String teamId = (String) team.get("teamId");
-            Map<String, Object> carListMap = sYClient.getCarList1(syUrl, teamId, ardSyUser.getUserId(), sessionId);
-            if (((String) carListMap.get("rspCode")).equals("1")) {
-                List<Map<String, Object>> list = (List<Map<String, Object>>) carListMap.get("list");
-                allList.addAll(list);
+            Map<String, Object> teamList = sYClient.getTeamList(syUrl, ardSyUser.getUserId(), sessionId);
+            List<Map<String, Object>> listMap = (List<Map<String, Object>>) teamList.get("list");
+            List<Map<String, Object>> allList = new ArrayList<>();
+            for (Map<String, Object> team : listMap) {
+                String teamId = (String) team.get("teamId");
+                Map<String, Object> carListMap = sYClient.getCarList1(syUrl, teamId, ardSyUser.getUserId(), sessionId);
+                if (((String) carListMap.get("rspCode")).equals("1")) {
+                    List<Map<String, Object>> list = (List<Map<String, Object>>) carListMap.get("list");
+                    allList.addAll(list);
+                }
             }
-        }
-        //杩囨护鍦ㄧ嚎杞﹁締
-        List<Map<String, Object>> onlineList = allList.stream()
-                .filter(map -> !"绂荤嚎".equals(map.get("stateCn")))
-                .collect(Collectors.toList());
-        List<Map<String, Object>> filteredList = new ArrayList<>();
-        //杩囨护鍗婂緞
-        for (Map<String, Object> carMap : onlineList) {
-            String carId = (String) carMap.get("carId");
-            Map<String, Object> carGPSTrack = sYClient.getCarNearPositionByCarId(syUrl, carId, ardSyUser.getUserId(), sessionId);
-            List<Map<String, Object>> carGPSMap = (List<Map<String, Object>>) carGPSTrack.get("list");
-            Double lng = Double.valueOf((String) carGPSMap.get(0).get("lng"));
-            Double lat = Double.valueOf((String) carGPSMap.get(0).get("lat"));
-            double distance = GisUtil.getDistance( new double[]{longitude,latitude}, new double[]{lng, lat});
-            if (distance <= radius) {
-                carMap.put("longitude",lng);
-                carMap.put("latitude",lat);
-                filteredList.add(carMap); // 灏嗘弧瓒虫潯浠剁殑杞﹁締娣诲姞鍒扮瓫閫夊垪琛ㄤ腑
+            //杩囨护鍦ㄧ嚎杞﹁締
+            List<Map<String, Object>> onlineList = allList.stream()
+                    .filter(map -> !"绂荤嚎".equals(map.get("stateCn")))
+                    .collect(Collectors.toList());
+            List<Map<String, Object>> filteredList = new ArrayList<>();
+            //杩囨护鍗婂緞
+            for (Map<String, Object> carMap : onlineList) {
+                String carId = (String) carMap.get("carId");
+                Map<String, Object> carGPSTrack = sYClient.getCarNearPositionByCarId(syUrl, carId, ardSyUser.getUserId(), sessionId);
+                List<Map<String, Object>> carGPSMap = (List<Map<String, Object>>) carGPSTrack.get("list");
+                Double lng = Double.valueOf((String) carGPSMap.get(0).get("lng"));
+                Double lat = Double.valueOf((String) carGPSMap.get(0).get("lat"));
+                double distance = GisUtil.getDistance(new double[]{longitude, latitude}, new double[]{lng, lat});
+                if (distance <= radius) {
+                    carMap.put("longitude", lng);
+                    carMap.put("latitude", lat);
+                    filteredList.add(carMap); // 灏嗘弧瓒虫潯浠剁殑杞﹁締娣诲姞鍒扮瓫閫夊垪琛ㄤ腑
+                }
             }
+            return filteredList;
+        }catch (Exception e)
+        {
+           log.error("鑾峰彇闄勮繎鑼冨洿鍐呯殑杞﹁締淇℃伅寮傚父:"+e.getMessage());
+            return null;
         }
-        return filteredList;
     }
     /**
      * 鑾峰彇鑼冨洿鍐呯殑杞﹁締淇℃伅(澶氳竟褰�)
diff --git a/ard-work/src/main/java/com/ruoyi/utils/qymqtt/oldM/PushCallback.java b/ard-work/src/main/java/com/ruoyi/utils/qymqtt/oldM/PushCallback.java
index a955c6a..37841aa 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/qymqtt/oldM/PushCallback.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/qymqtt/oldM/PushCallback.java
@@ -39,7 +39,7 @@
     @Override
     public void connectionLost(Throwable throwable) {
         if (client == null || !client.isConnected()) {
-            System.out.println("杩炴帴鏂紑锛屾鍦ㄩ噸杩�....");
+            //log.error("杩炴帴鏂紑锛屾鍦ㄩ噸杩�....");
         }
     }
 
diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/common/SdkErrorCodeEnum.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/common/SdkErrorCodeEnum.java
index 7cad149..64832aa 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/sdk/common/SdkErrorCodeEnum.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/common/SdkErrorCodeEnum.java
@@ -15,7 +15,8 @@
     NET_DVR_NETWORK_FAIL_CONNECT(7, "杩炴帴璁惧澶辫触銆傝澶囦笉鍦ㄧ嚎鎴栫綉缁滃師鍥犲紩璧风殑杩炴帴瓒呮椂绛�"),
     NET_DVR_NETWORK_RECV_TIMEOUT(10, "浠庤澶囨帴鏀舵暟鎹秴鏃�"),
     NET_DVR_NETWORK_ERRORDATA(11, "浼犻�佺殑鏁版嵁鏈夎銆傚彂閫佺粰璁惧鎴栬�呬粠璁惧鎺ユ敹鍒扮殑鏁版嵁閿欒锛屽杩滅▼鍙傛暟閰嶇疆鏃惰緭鍏ヨ澶囦笉鏀寔鐨勫��"),
-    NET_DVR_DVROPRATEFAILED(29, "璁惧鎿嶄綔澶辫触");
+    NET_DVR_DVROPRATEFAILED(29, "璁惧鎿嶄綔澶辫触"),
+    NET_DVR_USERNOTEXIST(47, "鐢ㄦ埛涓嶅瓨鍦ㄣ�傛敞鍐岀殑鐢ㄦ埛ID宸叉敞閿�鎴栦笉鍙敤");
     /**
      * 鏋氫妇鐮�
      */
diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/LoginModule.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/LoginModule.java
index ff36514..ee3b54a 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/LoginModule.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/LoginModule.java
@@ -19,7 +19,7 @@
     public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
 
     // 璁惧淇℃伅
-    //  public static NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
+    // public static NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
 
     // 鐧婚檰鍙ユ焺
     public static LLong m_hLoginHandle = new LLong(0);//
diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/RealPlayModule.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/RealPlayModule.java
index a1afd9f..76fb17b 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/RealPlayModule.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/RealPlayModule.java
@@ -13,6 +13,8 @@
  */
 @Slf4j(topic = "dhSdk")
 public class RealPlayModule {
+    public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
+    public static NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE;
     /**
      * \if ENGLISH_LANG
      * Start RealPlay
@@ -101,4 +103,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
index e7ce57e..74f78c8 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
@@ -23,12 +23,14 @@
 import com.ruoyi.utils.sdk.common.SdkErrorCodeEnum;
 import com.ruoyi.utils.sdk.dhsdk.common.ErrorCode;
 import com.ruoyi.utils.sdk.dhsdk.lib.NetSDKLib;
+import com.ruoyi.utils.sdk.dhsdk.lib.ToolKits;
 import com.ruoyi.utils.sdk.dhsdk.lib.enumeration.EM_NEW_CONFIG;
 import com.ruoyi.utils.sdk.dhsdk.lib.enumeration.NET_EM_CFG_OPERATE_TYPE;
 import com.ruoyi.utils.sdk.dhsdk.lib.structure.CFG_INFRARED_INFO;
 import com.ruoyi.utils.sdk.dhsdk.lib.structure.CFG_VIDEO_IN_FOCUS;
 import com.ruoyi.utils.sdk.dhsdk.lib.structure.DH_OUT_PTZ_VIEW_RANGE_STATUS;
 import com.ruoyi.utils.sdk.dhsdk.module.*;
+import com.sun.jna.Native;
 import com.sun.jna.Pointer;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
@@ -36,12 +38,14 @@
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
 import java.io.*;
+import java.nio.ByteBuffer;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.text.DecimalFormat;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.PriorityBlockingQueue;
 
 import static com.ruoyi.utils.sdk.dhsdk.lib.NetSDKLib.*;
@@ -550,6 +554,101 @@
 
     }
 
+    @Override
+    public AjaxResult localCapture(CameraCmd cmd) {
+        try {
+            String cameraId = cmd.getCameraId();
+            Integer chanNo = cmd.getChanNo();
+            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
+                return AjaxResult.error("璁惧鏈櫥褰�");
+            }
+            LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
+            String imagePath = FileUtils.createFile("D:/LocalCaptureTemp/" + cameraId + ".jpeg");
+            fCaptureReceiveCB1 m_CaptureReceiveCB = new fCaptureReceiveCB1(imagePath);
+            CapturePictureModule.setSnapRevCallBack(m_CaptureReceiveCB);
+            boolean b = CapturePictureModule.remoteCapturePicture(loginId, chanNo - 1);
+            if (b) {
+                Thread.sleep(200);
+                byte[] imageBytes = Files.readAllBytes(Paths.get(imagePath));
+                //OutputStream outputStream = response.getOutputStream();
+                //outputStream.write(imageBytes);
+                // 鍒涘缓ByteBuffer骞跺皢瀛楄妭鏁扮粍鍐欏叆鍏朵腑
+                //ByteBuffer jpegBuffer = ByteBuffer.wrap(imageBytes);
+                //Base64.Encoder decoder = Base64.getEncoder();
+                //String png_base64 = decoder.encodeToString(jpegBuffer.array());//杞崲鎴恇ase64涓�
+                return AjaxResult.success(imageBytes);
+            } else {
+                return AjaxResult.error("鏈湴鎶撳浘澶辫触");
+            }
+        } catch (Exception ex) {
+            return AjaxResult.error("鏈湴鎶撳浘寮傚父:" + ex);
+        }
+    }
+
+    //鏈湴褰曞儚寮�濮�
+    @Override
+    public AjaxResult localRecordStart(CameraCmd cmd) {
+        try {
+            String cameraId = cmd.getCameraId();
+            Integer chanNo = cmd.getChanNo();
+            String path = FileUtils.createFile("D:/LocalRecordTemp/" + cameraId + ".mp4");
+            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
+                return AjaxResult.error("璁惧鏈櫥褰�");
+            }
+            LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
+            LLong lRealHandle;
+            if (GlobalVariable.previewMap.containsKey(cameraId)) {
+                lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId));
+                RealPlayModule.stopRealPlay(lRealHandle);
+                GlobalVariable.previewMap.remove(cameraId);
+                log.debug("鍋滄褰撳墠褰曞儚");
+            }
+            lRealHandle = RealPlayModule.startRealPlay(loginId, chanNo - 1, path);
+            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 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();
+            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
+                return AjaxResult.error("璁惧鏈櫥褰�");
+            }
+            LLong lRealHandle;
+            if (GlobalVariable.previewMap.containsKey(cameraId)) {
+                lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId));
+                RealPlayModule.stopRealPlay(lRealHandle);
+                GlobalVariable.previewMap.remove(cameraId);
+                log.debug("鏈湴褰曞儚鍋滄");
+                String recordPath = FileUtils.createFile("D:/LocalRecordTemp/" + cameraId + ".mp4");
+                byte[] imageBytes = Files.readAllBytes(Paths.get(recordPath));
+               // OutputStream outputStream = response.getOutputStream();
+               // outputStream.write(imageBytes);
+                return AjaxResult.success(imageBytes);
+            }
+            else {
+                return AjaxResult.error("璁惧鏈紑濮嬪綍鍍�");
+            }
+        } catch (Exception ex) {
+            log.error("鏈湴褰曞儚鍋滄寮傚父" + ex.getMessage());
+            return AjaxResult.error("鏈湴褰曞儚鍋滄寮傚父" + ex.getMessage());
+        }
+    }
 
     /**
      * @鎻忚堪 鐭椂褰曞儚
@@ -739,7 +838,6 @@
         }
         LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
         try {
-
             boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NET_PTZ_POINT_MOVE_CONTROL, 0, PresetIndex, 0, 0);
             if (!bool) {
                 log.error("杞嚦棰勭疆鐐瑰け璐�:" + getErrorCodePrint());
@@ -875,10 +973,6 @@
         return AjaxResult.success("璇ュ姛鑳芥湭瀹炵幇");
     }
 
-    @Override
-    public AjaxResult captureJPEGPicture(CameraCmd cmd) {
-        return AjaxResult.success("璇ュ姛鑳芥湭瀹炵幇");
-    }
 
     //鍒囨崲閫忛浘
     @Override
@@ -1125,4 +1219,31 @@
         }
     }
 
+    // 鎶撳浘鎺ユ敹鍥炶皟:褰撴姄鍥炬垚鍔燂紝sdk浼氳皟鐢ㄨ鍑芥暟
+    public static class fCaptureReceiveCB1 implements NetSDKLib.fSnapRev {
+        private String picPath;
+        public fCaptureReceiveCB1(String picPath) {
+            this.picPath = picPath;
+        }
+        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);
+                //瀛樺偍鍒版湰鍦�
+                InputStream input = new ByteArrayInputStream(buf);
+                OutputStream output = null;
+                try {
+                    output = new FileOutputStream(picPath);
+                    byte[] buffer = new byte[1024];
+                    int bytesRead;
+                    while ((bytesRead = input.read(buffer)) != -1) {
+                        output.write(buffer, 0, bytesRead);
+                    }
+                    input.close();
+                    output.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 }
diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/controller/HikSdkController.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/controller/HikSdkController.java
index e92f0a2..0c3a555 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/controller/HikSdkController.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/controller/HikSdkController.java
@@ -17,6 +17,7 @@
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
 
@@ -259,11 +260,11 @@
         return sdk.controlCameraDeicing(cmd);
     }
 
-    @PostMapping("/captureJPEGPicture")
+    @PostMapping("/localCapture")
     public @ResponseBody
-    AjaxResult captureJPEGPicture(@RequestBody CameraCmd cmd) {
+    void localCapture(@RequestBody CameraCmd cmd) {
         cmd.setOperator(SecurityUtils.getUserId());
-        return sdk.captureJPEGPicture(cmd);
+        sdk.localCapture(cmd);
     }
 
     @ApiOperation("鐩告満鎶撳浘")
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 3f8969b..2d56529 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;
@@ -1497,38 +1500,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 +1937,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