Jelajahi Sumber

添加deviceSn字段、添加根据deviceSn和alarmTime获取告警视频retp回放接口

bihs 2 minggu lalu
induk
melakukan
8d08f2b767

+ 14 - 1
src/main/java/com/sooka/sponest/monitor/camera/domain/CentermonitorTRecorderAlarm.java

@@ -22,7 +22,6 @@ public class CentermonitorTRecorderAlarm extends BaseEntity {
      */
     private String cameraCode;
 
-
     /**
      * 摄像头名称
      */
@@ -62,6 +61,11 @@ public class CentermonitorTRecorderAlarm extends BaseEntity {
      */
     private String deptNames;
 
+    /**
+     * 唯一编码,默认为国标编码
+     */
+    private String deviceSn;
+
 
 
     public void setCameraCode(String cameraCode) {
@@ -129,6 +133,14 @@ public class CentermonitorTRecorderAlarm extends BaseEntity {
         this.deptNames = deptNames;
     }
 
+    public String getDeviceSn() {
+        return deviceSn;
+    }
+
+    public void setDeviceSn(String deviceSn) {
+        this.deviceSn = deviceSn;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
@@ -140,6 +152,7 @@ public class CentermonitorTRecorderAlarm extends BaseEntity {
                 .append("status", getStatus())
                 .append("deptIds", getDeptIds())
                 .append("deptNames", getDeptNames())
+                .append("deviceSn", getDeviceSn())
                 .toString();
     }
 }

+ 81 - 1
src/main/java/com/sooka/sponest/monitor/dahua/controller/EquipmentStatusTaskController.java

@@ -23,14 +23,24 @@ import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.io.IOException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -69,10 +79,15 @@ public class EquipmentStatusTaskController {
     private String userName;
     @Value("${sooka.dahua_interface_server.userPwd}")
     private String userPwd;
+    //获取回放URI接口ip、port、url
+    @Value("${sooka.dahua_interface_server.baseUrl}")
+    private String baseUrl;
 //    private String loginIp = "10.53.0.35";
 //    private String loginPort = "7901";
 //    private String userName = "system";
 //    private String userPwd = "Admin123";
+//    //获取回放URI接口ip、port、url
+//    private String baseUrl = "http://10.53.0.35:7901/videoService/playback/uri";
     //按组织获取设备详细信息
     public static final String ACTION = "/videoService/devicesManager/devicesInfo";
     private List<String> orgCodes = Arrays.asList("11033445593778368", "11248668755298496");
@@ -229,7 +244,7 @@ public class EquipmentStatusTaskController {
             log.info("获取设备信息失败,请检查设备编码:{}", cameraCode);
             return;
         }
-        String deviceCode =json.get("code").toString();
+        String deviceCode = json.get("code").toString();
         deviceMonitorManager.stopDeviceMonitoring(deviceCode);
         redisService.setCacheObject("deviceCode_" + deviceCode, deviceCode);
     }
@@ -276,4 +291,69 @@ public class EquipmentStatusTaskController {
         }
     }
 
+
+    @RequestMapping(value = "/getAlarmVideoByChannelCodeAndAlarmTime/{deviceSn}/{alarmTime}", method = GET)
+    public void test(@PathVariable("deviceSn") String deviceSn, @PathVariable("alarmTime") String alarmTime) {
+        R<?> result = null;
+        try {
+            result = HttpTestUtils.getToken(loginIp, Integer.parseInt(loginPort), userName, userPwd);
+        } catch (Exception e) {
+            log.info("获取token失败,请检查配置信息:{}", JSONObject.parseObject(result.getMsg()));
+        }
+        String token = result.getData().toString();
+        // 定义输入格式
+        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        // 解析为 LocalDateTime(无时区信息)
+        LocalDateTime localDateTime = LocalDateTime.parse(alarmTime, inputFormatter);
+//        String deviceSn = "34020000001329000701";
+        String beginTime = DateTimeConversion(localDateTime);
+        // 加 10 分钟
+        LocalDateTime plus10Minutes = localDateTime.plusMinutes(10);
+//        String beginTime = "20250626T015000Z";
+//        String endTime = "20250626T015500Z";
+        String endTime = DateTimeConversion(plus10Minutes);
+        String location = "cloud";
+        String scheme = "RTSP";
+        String response = getVideoRecords(deviceSn, beginTime, endTime, location, scheme, token);
+        System.out.println(response);
+    }
+
+    public String getVideoRecords(String deviceSn, String beginTime,
+                                  String endTime, String location, String scheme,
+                                  String token) {
+        // 构建请求URL
+        String url = String.format("%s?channelCode=%s&scheme=%s&beginTime=%s&endTime=%s&location=%s",
+                baseUrl, deviceSn, scheme, beginTime, endTime, location);
+        // 创建HTTP客户端
+        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
+            // 创建GET请求
+            HttpGet httpGet = new HttpGet(url);
+            // 添加请求头
+            httpGet.addHeader("X-Subject-Token", token);
+            httpGet.addHeader("Accept", "application/json"); // 根据实际情况设置
+            // 执行请求
+            HttpResponse response = httpClient.execute(httpGet);
+            // 检查响应状态
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode != 200) {
+                log.error("HTTP request failed with code: " + statusCode);
+            }
+            // 获取响应内容
+            return EntityUtils.toString(response.getEntity());
+        } catch (IOException e) {
+            log.error("HTTP request failed with exception: " + e.getMessage());
+            return null;
+        }
+    }
+
+    private String DateTimeConversion(LocalDateTime dateTime) {
+        // 转换为东八区时间(假设原始时间是东八区)
+        ZonedDateTime beijingTime = dateTime.atZone(ZoneId.of("Asia/Shanghai"));
+        // 转换为 UTC 时间(减 8 小时)
+        ZonedDateTime utcTime = beijingTime.withZoneSameInstant(ZoneId.of("UTC"));
+        // 定义输出格式(ISO 8601 格式)
+        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'");
+        return utcTime.format(outputFormatter);
+    }
+
 }

+ 2 - 1
src/main/java/com/sooka/sponest/monitor/dahua/utils/DeviceMonitorManager.java

@@ -47,7 +47,7 @@ public class DeviceMonitorManager {
     private String userName;
     @Value("${sooka.dahua_interface_server.userPwd}")
     private String userPwd;
-//    private String loginIp = "10.53.0.35";
+    //    private String loginIp = "10.53.0.35";
 //    private String loginPort = "7901";
 //    private String userName = "system";
 //    private String userPwd = "Admin123";
@@ -145,6 +145,7 @@ public class DeviceMonitorManager {
             saveVo.setStatus(status);
             saveVo.setDeptIds(ObjectUtils.isEmpty(map.get("deptIds")) ? null : map.get("deptIds").toString());
             saveVo.setDeptNames(ObjectUtils.isEmpty(map.get("deptNames")) ? null : map.get("deptNames").toString());
+            saveVo.setDeviceSn(ObjectUtils.isEmpty(map.get("deviceSn")) ? null : map.get("deviceSn").toString());
 //            log.info("设备编码:{}摄像头编码:{}时间:{}执行报警操作.", deviceCode, map.get("channelCode").toString(), onlineTime);
             centermonitorTRecorderAlarmMapper.insertCentermonitorTRecorderAlarm(saveVo);
 //        System.out.println("设备编码:" + deviceCode + "摄像头编码:" + map.get("channelCode").toString() + "执行报警操作.");

+ 3 - 2
src/main/resources/mapper/monitor/camera/CentermonitorTCamerachannelMapper.xml

@@ -1,13 +1,14 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.sooka.sponest.monitor.camera.mapper.CentermonitorTCamerachannelMapper">
 
     <select id="selectChannelCodeByDeviceCode" resultType="java.util.Map">
         SELECT
             channel_name channelName,
             channel_code channelCode,
+            device_sn deviceSn,
             GROUP_CONCAT(ta.map_dept_id) deptIds,
             GROUP_CONCAT(ta.map_dept_name) deptNames
         FROM

+ 5 - 3
src/main/resources/mapper/monitor/camera/CentermonitorTRecorderAlarmMapper.xml

@@ -11,9 +11,11 @@
     </resultMap>
 
     <insert id="insertCentermonitorTRecorderAlarm" parameterType="CentermonitorTRecorderAlarm">
-        INSERT INTO centermonitor_t_recorder_alarm (camera_code, camera_name, alarm_name, alarm_time, record_id, status,
-                                                    dept_ids, dept_names)
-        VALUES (#{cameraCode}, #{cameraName}, #{alarmName}, #{alarmTime}, #{recordId}, #{status}, #{deptIds}, #{deptNames})
+        INSERT INTO centermonitor_t_recorder_alarm (camera_code, camera_name, alarm_name, alarm_time,
+                                                    record_id, status,
+                                                    dept_ids, dept_names, device_sn)
+        VALUES (#{cameraCode}, #{cameraName}, #{alarmName}, #{alarmTime}, #{recordId}, #{status},
+                #{deptIds}, #{deptNames}, #{deviceSn})
     </insert>
 
     <select id="selectRecorderAlarm" resultType="java.lang.Integer">