From a7c7965a518359a1c81bde0a8c451f2fc1cc25fe Mon Sep 17 00:00:00 2001
From: zhangjian <zhangjianrock@163.com>
Date: Fri, 07 Jul 2023 16:31:40 +0800
Subject: [PATCH] 无人机转发接口

---
 ard-work/pom.xml                                                             |   11 ++
 ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java                 |   26 ++++++
 ard-work/src/main/java/com/ruoyi/device/uav/controller/ArdUavController.java |  132 +++++++++++++++++++++++++++++++++
 ard-work/src/main/java/com/ruoyi/utils/forest/UavAuthLifeCircle.java         |   40 ++++++++++
 ard-work/src/main/java/com/ruoyi/utils/forest/UavAuth.java                   |   18 ++++
 5 files changed, 227 insertions(+), 0 deletions(-)

diff --git a/ard-work/pom.xml b/ard-work/pom.xml
index 0047bfb..2d02074 100644
--- a/ard-work/pom.xml
+++ b/ard-work/pom.xml
@@ -16,6 +16,17 @@
     <dependencies>
         <!-- 通用工具-->
         <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.10</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-common</artifactId>
+        </dependency>
+        <dependency>
             <groupId>com.ruoyi</groupId>
             <artifactId>ruoyi-common</artifactId>
         </dependency>
diff --git a/ard-work/src/main/java/com/ruoyi/device/uav/controller/ArdUavController.java b/ard-work/src/main/java/com/ruoyi/device/uav/controller/ArdUavController.java
new file mode 100644
index 0000000..a78bb9e
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/device/uav/controller/ArdUavController.java
@@ -0,0 +1,132 @@
+package com.ruoyi.device.uav.controller;
+
+import com.dtflys.forest.exceptions.ForestNetworkException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.pagehelper.util.StringUtil;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.utils.forest.UavClient;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.binary.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import java.util.*;
+
+import org.apache.commons.codec.binary.Base64;
+
+/**
+ * 相机设备Controller
+ *
+ * @author ruoyi
+ * @date 2023-01-31
+ */
+@Slf4j(topic = "uav")
+@RestController
+@RequestMapping("/device/uav")
+@Api(tags = "无人机外部接口")
+public class ArdUavController extends BaseController {
+    public static final String USERNAME = "ardbailu";
+    public static final String PASSWORD = "ardkj12345";
+    public static final String SALT = "0123456789012345";
+
+    //token 登陆后每次请求,在header中携带
+    private String token = null;
+    private ObjectMapper om = new ObjectMapper();
+
+    @Autowired
+    private UavClient uavClient;
+
+    public void uavLogin() {
+        String codedPassword = this.Encrypt(PASSWORD, SALT);
+        String body = "{\"username\":\"" + USERNAME + "\",\"password\":\"" + codedPassword + "\"}";
+        try {
+            String res = uavClient.post("login", null, body);
+            Map resMap = om.readValue(res, Map.class);
+            Map data = (Map) resMap.get("data");
+            this.token = (String) data.get("access_token");
+        } catch (ForestNetworkException e) {
+            e.printStackTrace();
+        } catch (JsonMappingException e) {
+            throw new RuntimeException(e);
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public String getToken() {
+        if (StringUtil.isEmpty(this.token)) {
+            this.uavLogin();
+        }
+        return this.token;
+    }
+
+    @GetMapping("/")
+    @ApiOperation("无人机get接口")
+    public Object get(@RequestParam String url, @RequestParam String data) {
+        String res = null;
+        String token = getToken();
+        try {
+            res = uavClient.get(url, token, data);
+        } catch (ForestNetworkException e) {
+            if (e.getStatusCode() == 401) {
+                this.uavLogin();
+                token = getToken();
+                res = uavClient.get(url, token, data);
+            }
+        }
+
+        return res;
+
+    }
+
+    @PostMapping("/")
+    @ApiOperation("无人机post接口")
+    public Object post(@RequestParam String url, @RequestParam String data) {
+        String res = null;
+        String token = getToken();
+        try {
+            res = uavClient.post(url, token, data);
+        } catch (ForestNetworkException e) {
+            if (e.getStatusCode() == 401) {
+                this.uavLogin();
+                token = getToken();
+                res = uavClient.post(url, token, data);
+            }
+        }catch (Exception e){
+            System.out.println(e.getMessage());
+        }
+
+        return res;
+    }
+
+    public String Encrypt(String sSrc, String sKey) {
+        if (sKey == null) {
+            System.out.print("Key为空null");
+            return null;
+        }
+        // 判断Key是否为16位
+        if (sKey.length() != 16) {
+            System.out.print("Key长度不是16位");
+            return null;
+        }
+        byte[] encrypted = null;
+        try {
+            byte[] raw = sKey.getBytes("utf-8");
+            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
+            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
+            cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
+            encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+            ;
+        }
+        return new Base64().encodeToString(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
+    }
+
+}
diff --git a/ard-work/src/main/java/com/ruoyi/utils/forest/UavAuth.java b/ard-work/src/main/java/com/ruoyi/utils/forest/UavAuth.java
new file mode 100644
index 0000000..78a93f0
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/utils/forest/UavAuth.java
@@ -0,0 +1,18 @@
+package com.ruoyi.utils.forest;
+
+
+import com.dtflys.forest.annotation.MethodLifeCycle;
+import com.dtflys.forest.annotation.RequestAttributes;
+
+import java.lang.annotation.*;
+
+@MethodLifeCycle(UavAuthLifeCircle.class)
+@Documented
+/** 重点: @MethodLifeCycle注解指定该注解的生命周期类*/
+@RequestAttributes
+@Retention(RetentionPolicy.RUNTIME)
+/** 指定该注解可用于类上或方法上 */
+@Target({ElementType.TYPE, ElementType.METHOD})
+public @interface UavAuth {
+    String token();
+}
diff --git a/ard-work/src/main/java/com/ruoyi/utils/forest/UavAuthLifeCircle.java b/ard-work/src/main/java/com/ruoyi/utils/forest/UavAuthLifeCircle.java
new file mode 100644
index 0000000..3173958
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/utils/forest/UavAuthLifeCircle.java
@@ -0,0 +1,40 @@
+package com.ruoyi.utils.forest;
+
+import com.dtflys.forest.http.ForestRequest;
+import com.dtflys.forest.lifecycles.MethodAnnotationLifeCycle;
+import com.dtflys.forest.reflection.ForestMethod;
+
+public class UavAuthLifeCircle implements MethodAnnotationLifeCycle<UavAuth, Object> {
+
+
+    /**
+     * 当方法调用时调用此方法,此时还没有执行请求发送
+     * 次方法可以获得请求对应的方法调用信息,以及动态传入的方法调用参数列表
+     */
+    @Override
+    public void onInvokeMethod(ForestRequest request, ForestMethod method, Object[] args) {
+        System.out.println("Invoke Method '" + method.getMethodName() + "' Arguments: " + args);
+    }
+
+    /**
+     * 发送请求前执行此方法
+     */
+    @Override
+    public boolean beforeExecute(ForestRequest request) {
+        String token = (String) getAttribute(request, "token");
+        System.out.println(" UavAuthLifeCircle token:"+token);
+        if(token!=null){
+            request.addHeader("x-auth-token", token);
+        }
+        return true;
+    }
+
+    /**
+     * 此方法在请求方法初始化的时候被调用
+     */
+
+    @Override
+    public void onMethodInitialized(ForestMethod forestMethod, UavAuth uavAuth) {
+        System.out.println("Method '" + forestMethod.getMethodName());
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java b/ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java
new file mode 100644
index 0000000..4efe3bb
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java
@@ -0,0 +1,26 @@
+package com.ruoyi.utils.forest;
+
+import com.dtflys.forest.annotation.DataVariable;
+import com.dtflys.forest.annotation.Get;
+import com.dtflys.forest.annotation.JSONBody;
+import com.dtflys.forest.annotation.Post;
+import org.springframework.stereotype.Component;
+
+@Component
+public interface UavClient {
+    @Get("http://www.baidu.com")
+    String test();
+
+    public static String IP = "http://112.98.126.2:6100/";
+
+
+    @UavAuth(token = "${token}")
+    @Get(IP + "${url}")
+    String get(@DataVariable("url") String url, @DataVariable("token") String token, @JSONBody String body);
+
+    @UavAuth(token = "${token}")
+    @Post(IP + "${url}")
+    String post(@DataVariable("url") String url, @DataVariable("token") String token, @JSONBody String body);
+
+
+}

--
Gitblit v1.9.3