| 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.io.IOException; | 
| import java.lang.reflect.InvocationTargetException; | 
| import java.lang.reflect.Method; | 
| import java.util.Map; | 
|   | 
| @Service | 
| public class UavService { | 
|     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 Map uavUser;//登录的用户信息 | 
|     private ObjectMapper om = new ObjectMapper(); | 
|     @Autowired | 
|     private UavClient uavClient; | 
|   | 
|     @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 | 
|         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) { | 
|                 ex.printStackTrace(); | 
|             } catch (InvocationTargetException ex) { | 
|                 ex.printStackTrace(); | 
|             } | 
|         } catch (IllegalAccessException e) { | 
|             throw new RuntimeException(e); | 
|         } | 
|   | 
|         return res; | 
|     } | 
|   | 
|     public Map getUavUser() { | 
|         if (this.uavUser==null){ | 
|             this.login(); | 
|         } | 
|         return this.uavUser; | 
|     } | 
|   | 
|     public void login() { | 
|         System.out.println("登录无人机外部接口"); | 
|         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); | 
|             this.uavUser = (Map) resMap.get("data"); | 
|             if (this.uavUser != null) { | 
|                 this.token = (String) this.uavUser.get("access_token"); | 
|             } | 
|         } catch (ForestNetworkException e) { | 
|             e.printStackTrace(); | 
|         } catch (JsonMappingException e) { | 
|             e.printStackTrace(); | 
|         } catch (JsonProcessingException e) { | 
|             e.printStackTrace(); | 
|         } catch (IOException e) { | 
|             e.printStackTrace(); | 
|         } | 
|     } | 
|   | 
|   | 
|     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次加密的作用。 | 
|     } | 
| } |