SpringBoot 集成 MQTT

@Slf4j
@Configuration
public class MqttConfig {

    private static MqttClient mqttClient = null;

    static {
        try {
            initializeMqttClient();
        } catch (Exception e) {
            log.error("Failed to initialize MQTT client", e);
        }
    }

    private static void initializeMqttClient() throws IOException, MqttException {
        String topic = "topic";
        String brokerUrl = "tcp://127.0.0.1:1883";
        String clientId = "clientId";

        // 使用临时目录作为持久化存储
        String tempDir = Files.createTempDirectory("mqtt").toString();
        MqttDefaultFilePersistence persistence = new MqttDefaultFilePersistence(tempDir);

        mqttClient = new MqttClient(brokerUrl, clientId, persistence);

        MqttConnectionOptions options = new MqttConnectionOptions();
        options.setUserName("");
        options.setPassword("".getBytes());
        options.setCleanStart(false);
        options.setSessionExpiryInterval(3600L * 24L);
        options.setKeepAliveInterval(60);

        mqttClient.setCallback(new MyMqttCallback(clientId));
        mqttClient.connect(options);
        mqttClient.subscribe(topic, 2);

        log.info("MQTT client initialized successfully with persistence dir: {}", tempDir);
    }

    public static boolean publishMessage(String topic, String payload, int qos) {
        if (mqttClient != null && mqttClient.isConnected()) {
            try {
                MqttMessage message = new MqttMessage(payload.getBytes());
                message.setQos(qos);
                mqttClient.publish(topic, message);
                return true;
            } catch (MqttException e) {
                log.error("Failed to publish message to topic: {}", topic, e);
                return false;
            }
        } else {
            log.warn("MQTT client is not connected, cannot publish message to topic: {}", topic);
            return false;
        }
    }

    @PreDestroy
    public void disconnect() {
        if (mqttClient != null && mqttClient.isConnected()) {
            try {
                mqttClient.disconnect();
                log.info("MQTT client disconnected successfully");
            } catch (MqttException e) {
                log.error("Error disconnecting MQTT client", e);
            }
        }
    }

    @Bean
    public MessageChannel mqttOutboundChannel() {
        return new DirectChannel();
    }
}

  

class MyMqttCallback implements MqttCallback {
    private final String clientId;

    public MyMqttCallback(String clientId) {
        this.clientId = clientId;
    }

    @Override
    public void connectComplete(boolean reconnect, String serverURI) {
        System.out.println(clientId + "::MyMqttCallback, reconnect=" + reconnect + ", serverURI=" + serverURI);
    }
    @Override
    public void disconnected(MqttDisconnectResponse disconnectResponse) {
        System.out.println(clientId + "::disconnected, reason=" + disconnectResponse.getReasonString());
    }
    @Override
    public void deliveryComplete(IMqttToken token) {
        System.out.println(clientId + "::deliveryComplete, complete=" + token.isComplete());
    }
    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        System.out.println(clientId + "::messageArrived, topic=" + topic + ", qos=" + message.getQos() + ", message=" + new String(message.getPayload()));
    }
    @Override
    public void mqttErrorOccurred(MqttException exception) {
        System.out.println(clientId + "::mqttErrorOccurred, error=" + exception.getMessage());
    }
    @Override
    public void authPacketArrived(int reasonCode, MqttProperties properties) {
        System.out.println(clientId + "::authPacketArrived, reasonCode=" + reasonCode);
    }
}

  

posted @ 2025-11-04 10:31  gz狗柱  阅读(9)  评论(0)    收藏  举报