aijinhui
2023-11-01 9088fae65c0e433b21fd56351d0e1dc8e76debeb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package com.ruoyi.device.uav.service;
 
import com.dtflys.forest.exceptions.ForestNetworkException;
import com.dtflys.forest.exceptions.ForestRuntimeException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.utils.forest.UavClient;
import lombok.extern.slf4j.Slf4j;
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.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
 
@Service
@Slf4j(topic = "uav")
public class UavService {
    public static final String USERNAME = "kaifabailu";//用户名
    public static final String PASSWORD = "ardkj@2014";//密码
    public static final String SALT = "0123456789012345";//盐
 
    private Map uavUser;//登录的用户信息
    private ObjectMapper om = new ObjectMapper();
    @Autowired
    private UavClient uavClient;
    @Autowired
    private RedisCache redisCache;
 
    @PostConstruct
    public void created() {
        this.login();
    }
 
    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
        this.getToken();//获取token验证,验证token有效性
        try {
            String token = this.getToken();
            res = (String) requestMethod.invoke(this.uavClient, url, token, data);
        } catch (IllegalAccessException e) {
            System.out.println("doUavRequest 访问失败" + e.getMessage());
        } catch (InvocationTargetException e) {
            System.out.println("doUavRequest 执行失败" + e.getMessage());
            e.printStackTrace();
        }
 
        return res;
    }
 
    public Map getUavUser() {
        return redisCache.getCacheMap("uav:uavUser");
    }
 
    public String getToken() {
        //获取uav用户信息
        Map uavUser = redisCache.getCacheMap("uav:uavUser");
        String token = (String) uavUser.get("access_token");
        //验证token有效性
        try {
            String res = uavClient.GET("manage/api/v1/devices", token, "{}");
            System.out.println(res);
        } catch (ForestNetworkException fe) {
            if (fe.getStatusCode() == 401) {//token失效,重新登录
                this.login();
                //再次获取token
                uavUser = redisCache.getCacheMap("uav:uavUser");
                token = (String) uavUser.get("access_token");
                return token;
            }
        }
        return token;
    }
 
    public void login() {
        log.debug("登录无人机外部接口");
        String codedPassword = this.Encrypt(PASSWORD, SALT);
        String body = "{\"username\":\"" + USERNAME + "\",\"password\":\"" + codedPassword + "\"}";
        try {
            //uavClient.GET("logout", null, "{}");
            String res = uavClient.POST("login", null, body);
            Map resMap = om.readValue(res, Map.class);
            if (resMap != null) {
                redisCache.setCacheMap("uav:uavUser", (Map) resMap.get("data"));
            }
        } catch (ForestRuntimeException e) {
            log.error("无人机连接超时" + e.getMessage());
        } catch (JsonMappingException e) {
        } catch (JsonProcessingException e) {
        } catch (IOException e) {
        }
    }
 
 
    public String Encrypt(String sSrc, String sKey) {
        if (sKey == null) {
            return null;
        }
        // 判断Key是否为16位
        if (sKey.length() != 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次加密的作用。
    }
}