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的信息
相关推荐
大阿明5 小时前
Spring Boot(快速上手)
java·spring boot·后端
哆啦A梦15885 小时前
Springboot整合MyBatis实现数据库操作
数据库·spring boot·mybatis
bearpping5 小时前
Java进阶,时间与日期,包装类,正则表达式
java
邵奈一6 小时前
清明纪念·时光信笺——项目运行指南
java·实战·项目
sunwenjian8866 小时前
Java进阶——IO 流
java·开发语言·python
sinat_255487816 小时前
读者、作家 Java集合学习笔记
java·笔记·学习
墨香幽梦客6 小时前
API集成技术规范:RESTful与GraphQL在企业系统对接中的应用对比
后端·restful·graphql
皮皮林5516 小时前
如何画出一张优秀的架构图?(老鸟必备)
java
百锦再6 小时前
Java 并发编程进阶,从线程池、锁、AQS 到并发容器与性能调优全解析
java·开发语言·jvm·spring·kafka·tomcat·maven
森林猿7 小时前
java-modbus-读取-modbus4j
java·网络·python