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.sdk.cloudapi.control.DrcModeMqttBroker; import lombok.Data; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; 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; /** * * @author sean.zhou * @date 2021/11/10 * @version 0.1 */ @Configuration @Data @ConfigurationProperties public class MqttPropertyConfiguration { private static Map mqtt; public void setMqtt(Map mqtt) { MqttPropertyConfiguration.mqtt = mqtt; } /** * Get the configuration options of the basic link of the mqtt client. * @return */ static MqttClientOptions getBasicClientOptions() { if (!mqtt.containsKey(MqttUseEnum.BASIC)) { throw new Error("Please configure the basic mqtt connection parameters first, otherwise application cannot be started."); } 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 DrcModeMqttBroker getMqttBrokerWithDrc(String clientId, String username, Long age, Map map) { if (!mqtt.containsKey(MqttUseEnum.DRC)) { throw new RuntimeException("Please configure the drc link parameters of mqtt in the backend configuration file first."); } Algorithm algorithm = JwtUtil.algorithm; String token = JwtUtil.createToken(map, age, algorithm, null, null); return new DrcModeMqttBroker() .setAddress(getMqttAddress(mqtt.get(MqttUseEnum.DRC))) .setUsername(username) .setClientId(clientId) .setExpireTime(System.currentTimeMillis() / 1000 + age) .setPassword(token) .setEnableTls(false); } /** * Get the connection parameters of the mqtt client of the drc link. * @param clientId * @param age The validity period of the token. unit: s * @return */ public static DrcModeMqttBroker getMqttBrokerWithDrc(String clientId, Long age) { if (!mqtt.containsKey(MqttUseEnum.DRC)) { throw new RuntimeException("Please configure the drc link parameters of mqtt in the backend configuration file first."); } Algorithm algorithm = JwtUtil.algorithm; MqttClientOptions drc = mqtt.get(MqttUseEnum.DRC); // String token = JwtUtil.createToken(map, age, algorithm, null, null); return new DrcModeMqttBroker() .setAddress(getMqttAddress(mqtt.get(MqttUseEnum.DRC))) .setUsername(drc.getUsername()) .setClientId(clientId) .setExpireTime(System.currentTimeMillis() / 1000 + age) .setPassword(drc.getPassword()) .setEnableTls(false); } @Bean public MqttConnectOptions mqttConnectOptions() { MqttClientOptions customizeOptions = getBasicClientOptions(); MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); 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; } @Bean public MqttPahoClientFactory mqttClientFactory() { DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); factory.setConnectionOptions(mqttConnectOptions()); return factory; } }