SpringBoot 集成 MQTT (新版)

文章转载自:Springboot中使用MQTT的详细教程

注意:本文已做稍加改动,如有出处以原文章为准

一、安装 maven 包

<dependency>
  <groupId>org.eclipse.paho</groupId>
	<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
	<version>1.2.5</version>
</dependency>

二、代码实现

1. 代码目录

在这里插入图片描述

2. MqttProperties.java

package com.voice.mqtt.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "mqtt")
public class MqttProperties {

    private String clientId;

    private String address;

    private String username;

    private String password;
}

3. application.yml

mqtt:
  clientId: server_client
  address: tcp://127.0.0.1:1883
  username: emqx
  password: public

4. MqttFactory.java

package com.voice.mqtt.factory;

import cn.hutool.extra.spring.SpringUtil;
import com.voice.mqtt.properties.MqttProperties;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;

@Slf4j
public class MqttFactory {

    private static MqttClient client;

    /**
     *   获取客户端实例
     *   单例模式, 存在则返回, 不存在则初始化
     */
    public static MqttClient getInstance() {
        if (client == null) {
            init();
        }
        return client;
    }

    /**
     *   初始化客户端
     */
    public static void init() {
        MqttProperties configuration = SpringUtil.getBean(MqttProperties.class);
        try {
            client = new MqttClient(configuration.getAddress(), configuration.getClientId());
            // MQTT配置对象
            MqttConnectOptions options = new MqttConnectOptions();
            options.setUserName(configuration.getUsername());
            options.setPassword(configuration.getPassword().toCharArray());
            options.setCleanSession(true);
            options.setConnectionTimeout(3000);
            options.setKeepAliveInterval(20);
            // 设置自动重连, 其它具体参数可以查看MqttConnectOptions
            options.setAutomaticReconnect(true);
            if (!client.isConnected()) {
                client.connect(options);
            }
        } catch (MqttException e) {
            log.error(String.format("MQTT: 连接消息服务器[%s]失败", configuration.getAddress()));
        }
    }

}

5. MessageListener.java

package com.voice.mqtt.listener;

import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
import org.eclipse.paho.client.mqttv3.MqttMessage;

@Slf4j
public class MessageListener implements IMqttMessageListener {


    /**
     * 处理消息
     * @param topic 主题
     * @param mqttMessage 消息
     */
    @Override
    public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
        log.info(String.format("MQTT: 订阅主题[%s]发来消息[%s]", topic, new String(mqttMessage.getPayload())));
    }

//使用示例
//    public static void main(String[] args) {
//        //订阅主题test01, 使用MessageListener来处理它的消息
//        MqttUtil.subscribe("test01", new MessageListener());
//    }


}

6. MqttUtil.java

package com.voice.mqtt.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.voice.mqtt.factory.MqttFactory;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;

import java.nio.charset.StandardCharsets;

@Slf4j
public class MqttUtil {

    /**
     *   发送消息
     *   @param topic 主题
     *   @param data 消息内容
     */
    public static void send(String topic, Object data){
        // 获取客户端实例
        MqttClient client = MqttFactory.getInstance();
        ObjectMapper mapper = new ObjectMapper();
        try {
            // 转换消息为json字符串
            String json = mapper.writeValueAsString(data);
            client.publish(topic, new MqttMessage(json.getBytes(StandardCharsets.UTF_8)));
        } catch (JsonProcessingException e) {
            log.error(String.format("MQTT: 主题[%s]发送消息转换json失败", topic));
        } catch (Exception e) {
            log.error(String.format("MQTT: 主题[%s]发送消息失败", topic));
        }
    }


    /**
     * 订阅主题
     * @param topic 主题
     * @param listener 消息监听处理器
     */
    public static void subscribe(String topic, IMqttMessageListener listener) {
        MqttClient client = MqttFactory.getInstance();
        try {
            client.subscribe(topic, listener);
        } catch (MqttException e) {
            log.error(String.format("MQTT: 订阅主题[%s]失败", topic));
        }
    }

}

7.测试

@RestController
public class TestController {

    @GetMapping("/test")
    public String index(){
        Map<String, Object> map = new HashMap<>();
        map.put("age",111);
        MqttUtil.send("/room",map);

        return "test";
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值