From d8c58a271f0d7a9dce864c028f243da6cf35df81 Mon Sep 17 00:00:00 2001
From: wl <173@qq.com>
Date: 星期三, 07 十二月 2022 12:42:35 +0800
Subject: [PATCH] feat: 添加视频地址获取APi

---
 ycl-platform/src/main/java/com/ycl/dto/v1/Res/FirstRes.java                       |   13 ++++
 ycl-platform/src/main/java/com/ycl/dto/v1/Req/FirstReq.java                       |   13 ++++
 ycl-platform/src/main/resources/application-dev.yml                               |    7 ++
 ycl-platform/src/main/java/com/ycl/dto/v1/Req/SecondReq.java                      |   13 ++++
 ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java    |  108 ++++++++++++++++++++++++++++++++++-
 ycl-common/src/main/java/com/ycl/api/CommonResult.java                            |    9 +++
 ycl-platform/src/test/java/com/ycl/sccgplatform/SccgPlatformApplicationTests.java |    2 
 7 files changed, 159 insertions(+), 6 deletions(-)

diff --git a/ycl-common/src/main/java/com/ycl/api/CommonResult.java b/ycl-common/src/main/java/com/ycl/api/CommonResult.java
index 9cc5b46..6e210ec 100644
--- a/ycl-common/src/main/java/com/ycl/api/CommonResult.java
+++ b/ycl-common/src/main/java/com/ycl/api/CommonResult.java
@@ -35,6 +35,15 @@
     }
 
     /**
+     * @Description  api鑾峰彇鎴愬姛
+     * @Param [data]
+     * @return com.ycl.api.CommonResult<T>
+     **/
+    public static <T> CommonResult<T> successApi(T data) {
+        return new CommonResult<T>(ResultCode.API_SUCCESS.getCode(), ResultCode.API_SUCCESS.getMessage(), data);
+    }
+
+    /**
      * 鎴愬姛杩斿洖缁撴灉
      *
      * @param data 鑾峰彇鐨勬暟鎹�
diff --git a/ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java b/ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java
index 00f1924..6730d52 100644
--- a/ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java
+++ b/ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java
@@ -1,17 +1,29 @@
 package com.ycl.controller.platformApi;
 
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ycl.api.CommonResult;
+import com.ycl.dto.v1.Req.FirstReq;
+import com.ycl.dto.v1.Req.SecondReq;
+import com.ycl.dto.v1.Res.FirstRes;
 import com.ycl.dto.video.AlarmParam;
 import com.ycl.enums.common.ResultCode;
 import com.ycl.service.video.IVideoAlarmReportService;
+import com.ycl.utils.MD5Util;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.SneakyThrows;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.*;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.DefaultResponseErrorHandler;
+import org.springframework.web.client.RestTemplate;
+
+import java.net.URI;
 
 /**
  * @author admin
@@ -20,6 +32,18 @@
 @RestController
 @RequestMapping("/API")
 public class AlarmController {
+
+    @Value("${videoPoint.url}")
+    private String url;
+
+    @Value("${videoPoint.userName}")
+    private String userName;
+
+    @Value("${videoPoint.passWord}")
+    private String passWord;
+
+    @Value("${videoPoint.ip}")
+    private String ip;
 
     private IVideoAlarmReportService videoAlarmReportService;
 
@@ -35,4 +59,78 @@
         return new CommonResult(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage());
     }
 
-}
+    @GetMapping("/video")
+    @ApiOperation(value = "璁惧鑾峰彇鐩戞帶鍦板潃")
+    @SneakyThrows
+    public CommonResult getMonitorAddress(@RequestParam String code,
+                                          @RequestParam(required = false) Integer subType,
+                                          @RequestParam(required = false) String scheme) {
+
+        String clientType = "winpc";
+        String reqUrl = "/videoService/accounts/authorize";
+        String deviceUrl = "/videoService/devicesManager/devices";
+        if (subType == null) {
+            subType = 1;
+        }
+        if (StringUtils.isNotBlank(scheme)) {
+            scheme = "RTSP";
+        }
+        String monitorUrl = "/videoService/realmonitor/uri?subType=" + subType + "&scheme" + scheme + "&channelId=";
+
+        RestTemplate restTemplate = new RestTemplate();
+        restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
+            @Override
+            public boolean hasError(HttpStatus status) {
+                return super.hasError(status);
+            }
+
+            @Override
+            public void handleError(URI url, HttpMethod method, ClientHttpResponse response) {
+
+            }
+        });
+        SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
+        simpleClientHttpRequestFactory.setOutputStreaming(false);
+        restTemplate.setRequestFactory(simpleClientHttpRequestFactory);
+
+        //璇锋眰澶�
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
+
+        //绗竴娆℃潈闄愯姹備綋
+        FirstReq firstReq = new FirstReq();
+        firstReq.setIpAddress(ip);
+        firstReq.setUserName(userName);
+        firstReq.setClientType(clientType);
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        HttpEntity<String> firstEntity = new HttpEntity<>(objectMapper.writeValueAsString(firstReq), httpHeaders);
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url + reqUrl, firstEntity, String.class);
+
+        FirstRes firstRes = objectMapper.readValue(responseEntity.getBody(), FirstRes.class);
+
+        String signature = MD5Util.md5Encrypt(passWord);
+        signature = MD5Util.md5Encrypt(userName + signature);
+        signature = MD5Util.md5Encrypt(signature);
+        signature = MD5Util.md5Encrypt(userName + ":" + firstRes.getRealm() + ":" + signature);
+        signature = MD5Util.md5Encrypt(signature + ":" + firstRes.getRandomKey());
+
+        SecondReq secondReq = new SecondReq();
+        secondReq.setIpAddress(ip);
+        secondReq.setEncryptType(firstRes.getEncryptType());
+        secondReq.setSignature(signature);
+        secondReq.setRandomKey(firstRes.getRandomKey());
+        secondReq.setClientType(clientType);
+        secondReq.setUserName(userName);
+
+        HttpEntity<String> secondEntity = new HttpEntity<>(objectMapper.writeValueAsString(secondReq), httpHeaders);
+        ResponseEntity<String> secondResEntity = restTemplate.postForEntity(url + reqUrl, secondEntity, String.class);
+        HttpHeaders deviceHeaders = new HttpHeaders();
+        deviceHeaders.add("X-Subject-Token", objectMapper.readTree(secondResEntity.getBody()).get("token").textValue());
+        HttpEntity<Object> deviceEntity = new HttpEntity<>(deviceHeaders);
+        ResponseEntity<String> exchange = restTemplate.exchange(url + deviceUrl + "/" + code, HttpMethod.GET, deviceEntity, String.class);
+        String channelId = objectMapper.readTree(objectMapper.readTree(objectMapper.readTree(exchange.getBody()).get("encoderUnit").toString()).get("channels").get(0).toString()).get("channelId").textValue();
+        ResponseEntity<String> monitorReq = restTemplate.exchange(url + monitorUrl + channelId, HttpMethod.GET, deviceEntity, String.class);
+        return CommonResult.successApi(objectMapper.readTree(monitorReq.getBody()).get("url"));
+    }
+}
\ No newline at end of file
diff --git a/ycl-platform/src/main/java/com/ycl/dto/v1/Req/FirstReq.java b/ycl-platform/src/main/java/com/ycl/dto/v1/Req/FirstReq.java
new file mode 100644
index 0000000..dad9ca6
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/dto/v1/Req/FirstReq.java
@@ -0,0 +1,13 @@
+package com.ycl.dto.v1.Req;
+
+import lombok.Data;
+
+@Data
+public class FirstReq {
+
+    private String userName;
+
+    private String clientType;
+
+    private String ipAddress;
+}
diff --git a/ycl-platform/src/main/java/com/ycl/dto/v1/Req/SecondReq.java b/ycl-platform/src/main/java/com/ycl/dto/v1/Req/SecondReq.java
new file mode 100644
index 0000000..5c4289f
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/dto/v1/Req/SecondReq.java
@@ -0,0 +1,13 @@
+package com.ycl.dto.v1.Req;
+
+import lombok.Data;
+
+@Data
+public class SecondReq {
+    private  String userName;
+    private  String signature;
+    private  String randomKey;
+    private  String encryptType;
+    private  String clientType;
+    private  String ipAddress;
+}
diff --git a/ycl-platform/src/main/java/com/ycl/dto/v1/Res/FirstRes.java b/ycl-platform/src/main/java/com/ycl/dto/v1/Res/FirstRes.java
new file mode 100644
index 0000000..d365380
--- /dev/null
+++ b/ycl-platform/src/main/java/com/ycl/dto/v1/Res/FirstRes.java
@@ -0,0 +1,13 @@
+package com.ycl.dto.v1.Res;
+
+import lombok.Data;
+
+@Data
+public class FirstRes {
+
+   private String randomKey;
+
+   private String realm;
+
+   private String encryptType;
+}
diff --git a/ycl-platform/src/main/resources/application-dev.yml b/ycl-platform/src/main/resources/application-dev.yml
index d0b7834..f3b4bcb 100644
--- a/ycl-platform/src/main/resources/application-dev.yml
+++ b/ycl-platform/src/main/resources/application-dev.yml
@@ -64,3 +64,10 @@
   apId: 1
   sign: sign
   url: http://localhost:8082/sccg/text/sms_res
+
+videoPoint:
+  url: http://183.245.159.161:8281
+  port: 8281
+  userName: suichang
+  passWord: a12345677
+  ip: 10.10.10.10
\ No newline at end of file
diff --git a/ycl-platform/src/test/java/com/ycl/sccgplatform/SccgPlatformApplicationTests.java b/ycl-platform/src/test/java/com/ycl/sccgplatform/SccgPlatformApplicationTests.java
index 28fcfd1..b138596 100644
--- a/ycl-platform/src/test/java/com/ycl/sccgplatform/SccgPlatformApplicationTests.java
+++ b/ycl-platform/src/test/java/com/ycl/sccgplatform/SccgPlatformApplicationTests.java
@@ -35,7 +35,7 @@
 
     @Test
     void createCode() {
-        String randomKey ="f83bf56491350983146a1e463f46e59d_7312712453128192";
+        String randomKey ="f83bf56491350983146a1e463f46e59d_7318061173768192";
         String realm = "D62D265605378973";
         String userName = "suichang"; /// 鐢ㄦ埛鍚�
         String password = "a12345677"; /// 璇ョ敤鎴风殑鏄庢枃瀵嗙爜

--
Gitblit v1.8.0