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.jetbrains.annotations.Nullable; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.http.HttpMethod; 
 | 
import org.springframework.web.bind.annotation.*; 
 | 
  
 | 
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.*; 
 | 
  
 | 
import org.apache.commons.codec.binary.Base64; 
 | 
  
 | 
import static org.springframework.http.HttpMethod.*; 
 | 
  
 | 
/** 
 | 
 * 相机设备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;//登录成功返回的token 
 | 
    private ObjectMapper om = new ObjectMapper(); 
 | 
  
 | 
    @Autowired 
 | 
    private UavClient uavClient; 
 | 
  
 | 
    @PostConstruct 
 | 
    public void created() { 
 | 
        this.uavLogin(); 
 | 
    } 
 | 
  
 | 
    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"); 
 | 
            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); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @GetMapping("/") 
 | 
    @ApiOperation("无人机get接口") 
 | 
    public Object get(@RequestParam String url, @RequestParam String data) { 
 | 
        return doUavRequest(GET, url, data); 
 | 
  
 | 
    } 
 | 
  
 | 
    @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; 
 | 
        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.uavLogin(); 
 | 
            } 
 | 
            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; 
 | 
    } 
 | 
  
 | 
  
 | 
    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次加密的作用。 
 | 
    } 
 | 
  
 | 
} 
 |