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次加密的作用。 
 | 
    } 
 | 
} 
 |