From 2db1aa88e8ab53096a936163d686b90d8e056a99 Mon Sep 17 00:00:00 2001
From: rain <167982779@qq.com>
Date: Wed, 21 Aug 2024 23:18:33 +0800
Subject: [PATCH] 国土对接返回信息加密

---
 src/main/java/com/dji/sample/component/mqtt/config/MqttConfiguration.java |  102 +++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 79 insertions(+), 23 deletions(-)

diff --git a/src/main/java/com/dji/sample/component/mqtt/config/MqttConfiguration.java b/src/main/java/com/dji/sample/component/mqtt/config/MqttConfiguration.java
index 750ba58..86ad1d9 100644
--- a/src/main/java/com/dji/sample/component/mqtt/config/MqttConfiguration.java
+++ b/src/main/java/com/dji/sample/component/mqtt/config/MqttConfiguration.java
@@ -1,5 +1,11 @@
 package com.dji.sample.component.mqtt.config;
 
+import com.auth0.jwt.algorithms.Algorithm;
+import com.dji.sample.common.util.JwtUtil;
+import com.dji.sample.component.mqtt.model.MqttClientOptions;
+import com.dji.sample.component.mqtt.model.MqttProtocolEnum;
+import com.dji.sample.component.mqtt.model.MqttUseEnum;
+import com.dji.sample.control.model.dto.MqttBrokerDTO;
 import lombok.Data;
 import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
 import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -7,6 +13,9 @@
 import org.springframework.context.annotation.Configuration;
 import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
 import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
+import org.springframework.util.StringUtils;
+
+import java.util.Map;
 
 /**
  *
@@ -16,39 +25,86 @@
  */
 @Configuration
 @Data
-@ConfigurationProperties(prefix = "mqtt")
+@ConfigurationProperties
 public class MqttConfiguration {
 
-    private String protocol;
+    private static Map<MqttUseEnum, MqttClientOptions> mqtt;
 
-    private String host;
-
-    private Integer port;
-
-    private String username;
-
-    private String password;
-
-    private String clientId;
+    public void setMqtt(Map<MqttUseEnum, MqttClientOptions> mqtt) {
+        MqttConfiguration.mqtt = mqtt;
+    }
 
     /**
-     * The topic to subscribe to immediately when client connects.
+     * Get the configuration options of the basic link of the mqtt client.
+     * @return
      */
-    private String inboundTopic;
+    static MqttClientOptions getBasicClientOptions() {
+        if (!mqtt.containsKey(MqttUseEnum.BASIC)) {
+            throw new Error("请先配置基本的mqtt连接参数,否则应用程序无法启动。");
+        }
+        return mqtt.get(MqttUseEnum.BASIC);
+    }
+
+    /**
+     * Get the mqtt address of the basic link.
+     * @return
+     */
+    public static String getBasicMqttAddress() {
+        return getMqttAddress(getBasicClientOptions());
+    }
+
+    /**
+     * Splice the mqtt address according to the parameters of different clients.
+     * @param options
+     * @return
+     */
+    private static String getMqttAddress(MqttClientOptions options) {
+        StringBuilder addr = new StringBuilder()
+                .append(options.getProtocol().getProtocolAddr())
+                .append(options.getHost().trim())
+                .append(":")
+                .append(options.getPort());
+        if ((options.getProtocol() == MqttProtocolEnum.WS || options.getProtocol() == MqttProtocolEnum.WSS)
+                && StringUtils.hasText(options.getPath())) {
+            addr.append(options.getPath());
+        }
+        return addr.toString();
+    }
+
+    /**
+     * Get the connection parameters of the mqtt client of the drc link.
+     * @param clientId
+     * @param username
+     * @param age   The validity period of the token. unit: s
+     * @param map   Custom data added in token.
+     * @return
+     */
+    public static MqttBrokerDTO getMqttBrokerWithDrc(String clientId, String username, Long age, Map<String, ?> map) {
+        if (!mqtt.containsKey(MqttUseEnum.DRC)) {
+            throw new RuntimeException("请先在后端配置文件中配置mqtt的drc链接参数。");
+        }
+        Algorithm algorithm = JwtUtil.algorithm;
+
+        String token = JwtUtil.createToken(map, age, algorithm, null, null);
+
+        return MqttBrokerDTO.builder()
+                .address(getMqttAddress(mqtt.get(MqttUseEnum.DRC)))
+                .username("root")
+                .clientId(clientId)
+                .expireTime(System.currentTimeMillis() / 1000 + age)
+                .password("root")
+                .build();
+    }
+
 
     @Bean
     public MqttConnectOptions mqttConnectOptions() {
+        MqttClientOptions customizeOptions = getBasicClientOptions();
         MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
-        mqttConnectOptions.setServerURIs(new String[]{
-                new StringBuilder()
-                        .append(protocol.trim())
-                        .append("://")
-                        .append(host.trim())
-                        .append(":")
-                        .append(port)
-                        .toString()});
-        mqttConnectOptions.setUserName(username);
-        mqttConnectOptions.setPassword(password.toCharArray());
+        mqttConnectOptions.setServerURIs(new String[]{ getBasicMqttAddress() });
+        mqttConnectOptions.setUserName(customizeOptions.getUsername());
+        mqttConnectOptions.setPassword(StringUtils.hasText(customizeOptions.getPassword()) ?
+                customizeOptions.getPassword().toCharArray() : new char[0]);
         mqttConnectOptions.setAutomaticReconnect(true);
         mqttConnectOptions.setKeepAliveInterval(10);
         return mqttConnectOptions;

--
Gitblit v1.9.3