springboot集成MQTT实现消息接收

MQTT介绍

简单来说MQTT是一种协议,用来解决物联网之间的数据传输,它功耗更低,稳定性也不错,现在很多物联网的设备都在使用mqtt。感兴趣可以查看详情中文介绍

SpringBoot集成Mqtt

  1. 引入pom文件
java 复制代码
<dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-integration</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-stream</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-mqtt</artifactId>
        </dependency>
  1. 编写mqtt的配置类
java 复制代码
publish:
  mqtt:
    host: tcp://你自己的mqtt地址:端口
    clientId: mqtt_id
    userName: 你的账号名
    password: 你的密码
    # 这里表示会话不过期
    cleanSession: false
    # 配置一个默认的主题,加载时不会用到,只能在需要时手动提取
    defaultTopic: devops
    timeout: 1000
    keepAliveInterval: 10
    #断线重连方式,自动重新连接与会话不过期配合使用会导致
    #断线重新连接后会接收到断线期间的消息。需要更改设置请看password联系我
    automaticReconnect: true
    connectionTimeout: 3000
    topic: topic_0
    # 最大链接数
    maxInFlight: 100
    topics: topic_1,topic_2,topic_3,topic_4
java 复制代码
package com.cshf.receive.common;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 */
@Configuration
@ConfigurationProperties(MQTTConfig.PREFIX)
@Data
public class MQTTConfig {
	
	//配置的名称
    public static final String PREFIX = "publish.mqtt";

    private String host;

    private String clientId;

    private String username;

    private String password;

    private boolean cleanSession;

    private String defaultTopic;

    private int timeout;

    private int keepAliveInterval;

    private boolean automaticReconnect;

    private int connectionTimeout;

    private int maxInFlight;

    private String topic;

    private List<String> topics;

}
  1. 编写连接mqtt的配置类
java 复制代码
package com.cshf.receive.mqtt;

import com.cshf.receive.common.MQTTConfig;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.IntegrationComponentScan;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
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;
import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;

@Configuration
@IntegrationComponentScan
@AllArgsConstructor
@Slf4j
public class MqttSenderConfig {

    private final MQTTConfig mqttConfig;

    private MqttMessageHandler messageHandler;

    @Bean
    public MqttConnectOptions getMqttConnectOptions() {
        MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
        mqttConnectOptions.setCleanSession(true);
        mqttConnectOptions.setConnectionTimeout(10);
        mqttConnectOptions.setKeepAliveInterval(90);
        mqttConnectOptions.setAutomaticReconnect(true);
        mqttConnectOptions.setUserName(mqttConfig.getUsername());
        mqttConnectOptions.setPassword(mqttConfig.getPassword().toCharArray());
        mqttConnectOptions.setServerURIs(new String[]{mqttConfig.getHost()});
        mqttConnectOptions.setKeepAliveInterval(2);
        return mqttConnectOptions;
    }

    @Bean
    public MqttPahoClientFactory mqttClientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setConnectionOptions(getMqttConnectOptions());
        return factory;
    }

    @Bean
    @ServiceActivator(inputChannel = "mqttOutboundChannel")
    public MessageHandler mqttOutbound() {
        MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(mqttConfig.getClientId(), mqttClientFactory());
        messageHandler.setAsync(true);
        messageHandler.setDefaultTopic(mqttConfig.getTopic());
        messageHandler.setDefaultQos(1);
        messageHandler.setDefaultRetained(true);
        return messageHandler;
    }

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

    /**
     * 接收通道
     */
    @Bean
    public MessageChannel mqttInputChannel() {
        return new DirectChannel();
    }

    /**
     * 配置client,监听的topic
     */
    @Bean
    public MessageProducer inbound() {
        String[] topicsArr = mqttConfig.getTopics().toArray(new String[0]);
        MqttPahoMessageDrivenChannelAdapter adapter =
                new MqttPahoMessageDrivenChannelAdapter(mqttConfig.getClientId()+"_inbound", mqttClientFactory(), topicsArr);
        adapter.setConverter(new DefaultPahoMessageConverter());
        adapter.setQos(1);
        adapter.setOutputChannel(mqttInputChannel());
        return adapter;
    }

    /**
     * 通过通道获取数据
     */
    @Bean
    @ServiceActivator(inputChannel = "mqttInputChannel")
    public MessageHandler handler() {
        return messageHandler;
    }
}
  1. 编写handler类
java 复制代码
package com.cshf.receive.mqtt;

//import com.cvdmp.domain.exception.ConditionException;
//import com.cvdmp.service.MqttDrugBoxDataService;
import com.cshf.core.exception.ServiceException;
import com.cshf.receive.service.NestDataService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.MessagingException;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;



@Component
@Slf4j
@AllArgsConstructor
public class MqttMessageHandler implements MessageHandler {
	/**
	*接收到的消息和topic
 	*/
    @Override
    public void handleMessage(Message<?> message) throws MessagingException {
        String topic = message.getHeaders().get("mqtt_receivedTopic").toString();
        log.info("消息主题:{},内容:{}", topic, message.getPayload());
        
    }
}
  1. springboot发送消息给mqtt
java 复制代码
package com.cshf.receive.mqtt;

//import com.cvdmp.domain.exception.ConditionException;
//import com.cvdmp.service.MqttDrugBoxDataService;
import com.cshf.core.exception.ServiceException;
import com.cshf.receive.service.NestDataService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.MessagingException;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;


/**
 * @Program iot-platform
 * @ClassName MqttMessageHandler
 * @Author 代志华
 * @Date 2021/10/18 13:16
 * @Description: mqtt处理类
 */
@Component
@Slf4j
@AllArgsConstructor
public class MqttMessageHandler implements MessageHandler {


    private final NestDataService nestDataService;


    @Override
    public void handleMessage(Message<?> message) throws MessagingException {
        String topic = message.getHeaders().get("mqtt_receivedTopic").toString();
        log.debug("消息主题:{},内容:{}", topic, message.getPayload());
        nestDataService.handleMqttData(topic,message.getPayload().toString());
    }
}
java 复制代码
package com.cvdmp.service;

import java.util.Date;


import com.cvdmp.mqtt.MqttGateway;
import com.cvdmp.service.util.DateUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSONObject;


@Service
@Slf4j
@AllArgsConstructor
public class MqttCommandService{


    private final MqttGateway mqttGateway;

    public void sendCommondToMqtt(JSONObject jsonObject) {
        String content = jsonObject.getString("content");
        String topic = jsonObject.getString("topic");
        //log.info("sendCommondToMqtt  -----------------------");
        mqttGateway.sendToMqtt(content,topic);
        log.info("发送mqtt指令成功,topic:{} ,content:{}",topic,content);
    }

    public static void main(String[] args) {
        String date = "2024-06-26 17:46:00";
        Date time = DateUtil.paseHour(date);
        String recomander = time.getTime()/1000+"-"+(time.getTime()+5*60*1000)/1000+"-"+(time.getTime()+10*60*1000)/1000;
        System.out.println(recomander);

        Date ddd = new Date(1634629566000L);
        System.out.println(DateUtil.dateToStr(ddd,"yyyy-MM-dd HH:mm:ss"));
    }
}

总结

总结下来就这几步

  1. 导入依赖
  2. 配置mqtt连接参数(要订阅的topic)
  3. mqtt连接
  4. handle服务获取topic的信息
相关推荐
小信丶1 分钟前
Spring Cloud Stream EnableBinding注解详解:定义、应用场景与示例代码
java·spring boot·后端·spring
s1mple“”3 分钟前
互联网大厂Java面试实录:谢飞机的AIGC求职之旅 - JVM并发编程到Spring Cloud微服务
spring boot·aigc·微服务架构·java面试·分布式系统·rag技术·redis数据库
无限进步_5 分钟前
【C++】验证回文字符串:高效算法详解与优化
java·开发语言·c++·git·算法·github·visual studio
亚历克斯神6 分钟前
Spring Cloud 2026 架构演进
java·spring·微服务
七夜zippoe9 分钟前
Spring Cloud与Dubbo架构哲学对决
java·spring cloud·架构·dubbo·配置中心
海派程序猿10 分钟前
Spring Cloud Config拉取配置过慢导致服务启动延迟的优化技巧
java
阿维的博客日记20 分钟前
为什么不逃逸代表不需要锁,JIT会直接删掉锁
java
William Dawson22 分钟前
CAS的底层实现
java
ffqws_26 分钟前
Spring Boot入门:通过简单的注册功能串联Controller,Service,Mapper。(含有数据库建立,连接,及一些关键注解的讲解)
数据库·spring boot·后端
程序边界32 分钟前
行标识符机制的技术演进与实践(下)——ROWID与实战应用
后端