From 89eff0cecfd9fd0efd0999189bd039a679f750f9 Mon Sep 17 00:00:00 2001
From: zhangjian <zhangjianrock@163.com>
Date: Tue, 11 Jul 2023 11:34:27 +0800
Subject: [PATCH] 无人机转发接口反射调用
---
ard-work/src/main/java/com/ruoyi/device/uav/service/IUavService.java | 9 +++
ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java | 3 +
ard-work/src/main/java/com/ruoyi/device/uav/controller/ArdUavController.java | 26 +++++---
ard-work/src/main/java/com/ruoyi/device/uav/service/UavService.java | 115 ++++++++++++++++++++++++++++++++++++++
4 files changed, 143 insertions(+), 10 deletions(-)
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
index cf246b5..feb37e3 100644
--- 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
@@ -25,8 +25,7 @@
import org.apache.commons.codec.binary.Base64;
-import static org.springframework.http.HttpMethod.GET;
-import static org.springframework.http.HttpMethod.POST;
+import static org.springframework.http.HttpMethod.*;
/**
* 相机设备Controller
@@ -39,9 +38,9 @@
@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";
+ public static final String USERNAME = "ardbailu";//用户名
+ public static final String PASSWORD = "ardkj12345";//密码
+ public static final String SALT = "0123456789012345";//盐
//token 登陆后每次请求,在header中携带
private String token;//登录成功返回的token
@@ -81,6 +80,18 @@
}
+ @PostMapping("/")
+ @ApiOperation("无人机post接口")
+ public Object post(@RequestParam String url, @RequestParam String data) {
+ return doUavRequest(POST, url, data);
+ }
+
+ @DeleteMapping("/")
+ @ApiOperation("无人机delete接口")
+ public Object delete(@RequestParam String url, @RequestParam String data) {
+ return doUavRequest(DELETE, url, data);
+ }
+
@Nullable
private String doUavRequest(HttpMethod method, String url, String data) {
String res = null;
@@ -113,11 +124,6 @@
return res;
}
- @PostMapping("/")
- @ApiOperation("无人机post接口")
- public Object post(@RequestParam String url, @RequestParam String data) {
- return doUavRequest(POST, url, data);
- }
public String Encrypt(String sSrc, String sKey) {
if (sKey == null) {
diff --git a/ard-work/src/main/java/com/ruoyi/device/uav/service/IUavService.java b/ard-work/src/main/java/com/ruoyi/device/uav/service/IUavService.java
new file mode 100644
index 0000000..a9e8893
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/device/uav/service/IUavService.java
@@ -0,0 +1,9 @@
+package com.ruoyi.device.uav.service;
+
+import org.springframework.http.HttpMethod;
+
+public interface IUavService {
+ String doUavRequest(HttpMethod method, String url, String data);
+
+ void login();
+}
diff --git a/ard-work/src/main/java/com/ruoyi/device/uav/service/UavService.java b/ard-work/src/main/java/com/ruoyi/device/uav/service/UavService.java
new file mode 100644
index 0000000..1950bfd
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/device/uav/service/UavService.java
@@ -0,0 +1,115 @@
+package com.ruoyi.device.uav.service;
+
+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.ruoyi.utils.forest.UavClient;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+@Service
+public class UavService implements IUavService {
+ public static final String USERNAME = "ardbailu";//用户名
+ public static final String PASSWORD = "ardkj12345";//密码
+ public static final String SALT = "0123456789012345";//盐
+
+ //token 登陆后每次请求,在header中携带
+ private String token;//登录成功返回的token
+ private ObjectMapper om = new ObjectMapper();
+ @Autowired
+ private UavClient uavClient;
+
+ @PostConstruct
+ public void created() {
+ this.login();
+ }
+
+ @Override
+ public String doUavRequest(HttpMethod method, String url, String data) {
+ String res = null;
+ Method requestMethod = null;
+ //获取method
+ try {
+ requestMethod = UavClient.class.getMethod(method.name(), String.class, String.class, String.class);
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
+ }
+ //执行method
+ try {
+ res = (String) requestMethod.invoke(this.uavClient, url, this.token, data);
+ } catch (InvocationTargetException e) {
+ ForestNetworkException fe = (ForestNetworkException) e.getCause();
+ if (fe.getStatusCode() == 401) {//token失效,重新登录
+ this.login();
+ }
+ try {//再次调用接口
+ res = (String) requestMethod.invoke(this.uavClient, url, this.token, data);
+ } catch (IllegalAccessException ex) {
+ throw new RuntimeException(ex);
+ } catch (InvocationTargetException ex) {
+ throw new RuntimeException(ex);
+ }
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+
+ return res;
+ }
+
+ @Override
+ public void login() {
+ 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");
+ if (data != null) {
+ 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 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/UavClient.java b/ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java
index b7d86d4..c90ce14 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java
@@ -22,6 +22,9 @@
@UavAuth(token = "${token}")
@Post(IP + "${url}")
String POST(@DataVariable("url") String url, @DataVariable("token") String token, @JSONBody String body);
+ @UavAuth(token = "${token}")
+ @Post(IP + "${url}")
+ String DELETE(@DataVariable("url") String url, @DataVariable("token") String token, @JSONBody String body);
}
--
Gitblit v1.9.3