spring boot 集成mqtt

本文将介绍如何在Spring Boot项目中集成MQTT协议,并提供了相关的代码示例。

1. 什么是MQTT协议?

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,适用于低带宽、高延迟或不可靠网络环境下的通信。MQTT被设计为一种发布/订阅模式的消息协议,可以支持多种应用场景,如物联网、传感器网络等。

2. Spring Boot集成MQTT的步骤

2.1 添加依赖

首先,在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-mqtt</artifactId>
</dependency>

2.2 配置MQTT连接

application.properties文件中添加MQTT连接相关的配置信息:

spring.mqtt.url=tcp://localhost:1883
spring.mqtt.username=admin
spring.mqtt.password=123456

2.3 实现消息订阅

创建一个消息订阅的服务类,例如MqttSubscriber

import org.springframework.integration.annotation.MessagingGateway;
import org.springframework.integration.annotation.ServiceActivator;

@MessagingGateway(defaultRequestChannel = "mqttInputChannel")
public interface MqttSubscriber {
    
    @ServiceActivator(inputChannel = "mqttInputChannel")
    void handleMessage(String message);
}

2.4 实现消息发布

创建一个消息发布的服务类,例如MqttPublisher

import org.springframework.integration.annotation.MessagingGateway;

@MessagingGateway(defaultRequestChannel = "mqttOutputChannel")
public interface MqttPublisher {

    void publish(String topic, String payload);
}

2.5 配置Spring Integration

创建一个配置类,例如MqttIntegrationConfig,配置Spring Integration相关的bean:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.IntegrationComponentScan;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.config.EnableIntegration;
import org.springframework.integration.core.MessageProducer;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;

@Configuration
@EnableIntegration
@IntegrationComponentScan
public class MqttIntegrationConfig {

    private static final String CLIENT_ID = "mqttClient";

    @Bean
    public MqttPahoClientFactory mqttClientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setServerURIs("tcp://localhost:1883");
        factory.setUserName("admin");
        factory.setPassword("123456");
        return factory;
    }

    @Bean
    public MessageProducer inbound() {
        MqttPahoMessageDrivenChannelAdapter adapter =
                new MqttPahoMessageDrivenChannelAdapter(CLIENT_ID, mqttClientFactory(), "topic1", "topic2");
        adapter.setCompletionTimeout(5000);
        adapter.setConverter(new DefaultPahoMessageConverter());
        adapter.setQos(1);
        return adapter;
    }

    @Bean
    public DirectChannel mqttInputChannel() {
        return new DirectChannel();
    }

    @Bean
    public DirectChannel mqttOutputChannel() {
        return new DirectChannel();
    }
}

2.6 编写业务代码

在业务逻辑类中注入MqttPublisherMqttSubscriber,并使用它们进行消息的发布和订阅:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    private final MqttPublisher mqttPublisher;
    private final MqttSubscriber mqttSubscriber;

    @Autowired
    public MyService(MqttPublisher mqttPublisher, MqttSubscriber mqttSubscriber) {
        this.mqttPublisher = mqttPublisher;
        this.mqttSubscriber = mqttSubscriber;
    }

    public void publishMessage(String topic, String message) {
        mqttPublisher.publish(topic, message);
    }

    public void handleMessage(String message) {
        // 处理接收到的消息
    }
}

3. 类图

下面是本文介绍的类的类图,使用mermaid语法表示:

classDiagram
    class MqttSubscriber
    class MqttPublisher
    class MqttIntegrationConfig
    class MyService

    MqttSubscriber --|> MessagingGateway
    MqttPublisher --|> MessagingGateway

    MqttSubscriber ..> Mqtt