Spring Boot整合MQTT

前言:安装mqtt服务请参考文章:Docker安装EMQX 

Spring Boot整合MQTT

1、在pom文件中引入依赖

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

2、在yml文件中添加配置信息

# Spring配置
spring:
  #MQTT配置信息
  mqtt:
    #MQTT服务端地址,端口默认为1883,如果有多个,用逗号隔开,如tcp://127.0.0.1:1883,tcp://192.168.60.133:1883
    url: tcp://10.10.3.190:1883
    #用户名
    username: admin
    #密码
    password: admin
    #发布客户端id(不能重复)
    clientIdPub: mqttx_fchsoft_pub
    #订阅客户端id(不能重复)
    clientIdSub: mqttx_fchsoft_sub

3、创建配置类

MqttConfig.java   

package com.fch.guideScreen.MqttConfig;

import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;

/**
* @className: MqttConfig
* @description: mqtt配置类
* @author: pxm
* @createTime: 2024/1/17  9:19
* @version: 1.0.0
*/
@Configuration
@Slf4j
public class MqttConfig {

    /**
     * MQTT服务端地址
     */
    @Value("${spring.mqtt.url}")
    private String serverURI;
    /**
     * 订阅客户端id(不能重复)
     */
    @Value("${spring.mqtt.clientIdSub}")
    private String clientIdSub;

    /**
     * 发布客户端id(不能重复)
     */
    @Value("${spring.mqtt.clientIdPub}")
    private String clientIdPub;
    /**
     * 用户名
     */
    @Value("${spring.mqtt.username}")
    private String username;
    /**
     * 密码
     */
    @Value("${spring.mqtt.password}")
    private String password;

    /**
     * 推送的主题
     */
    @Value("${spring.mqtt.topic}")
    private String topic;

    /**
     * mqtt客户端
     */
    private static MqttClient mqttClient;
    /**
     * mqtt发送消息客户端
     */
    private static MqttClient sendMqttClient;
    static String serverURI2;


    @Resource
    private MqttMessageListenerImpl mqttMessageListenerImpl;


    public static MqttClient getSendClient() {

        return sendMqttClient;
    }


    static MqttConnectOptions opts;

    @Bean
    MqttConnectOptions mqttConnectOptions() {
        try {
            opts = new MqttConnectOptions();
            opts.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1);
            opts.setMaxReconnectDelay(5 * 1000);
            opts.setConnectionTimeout(2 * 1000);
            opts.setHttpsHostnameVerificationEnabled(false);
            opts.setCleanSession(false);
            opts.setKeepAliveInterval(5);
            opts.setAutomaticReconnect(true);
            opts.setUserName(username);
            opts.setPassword(password.toCharArray());

        } catch (Exception e) {
            e.printStackTrace();
        }
        serverURI2 = serverURI;
        return opts;
    }


    @Bean
    MqttClient sendMqttClient() {
        MqttClient sendClient = null;
        try {

            MemoryPersistence persistence = new MemoryPersistence();
            sendClient = new MqttClient(serverURI, clientIdPub + "send", persistence);
            IMqttToken token = sendClient.connectWithResult(opts);
            token.waitForCompletion();
            sendMqttClient = sendClient;
        } catch (MqttException e) {
            log.error(e.getMessage());

        }
        return sendMqttClient;
    }

    @Bean
    MqttClient mqttClient() {
        MqttClient client = null;
        try {

            MemoryPersistence persistence = new MemoryPersistence();
            client = new MqttClient(serverURI, clientIdSub, persistence);
            IMqttToken token = client.connectWithResult(opts);
            token.waitForCompletion();

            log.info("=====================订阅所有mqtt服务端下发信息====================");

            IMqttToken iMqttToken = client.subscribeWithResponse(topic, 0, mqttMessageListenerImpl);
            iMqttToken.waitForCompletion();
            String str = new String(token.getResponse().getPayload());
            System.out.println("============================" + str);
            mqttClient = client;
        } catch (MqttException e) {
            log.error(e.getMessage());

        }
        return client;
    }


}

4、订阅消息回调类

MqttMessageListenerImpl.java

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


/**
 * @ClassName: MqttMessageListenerImpl
 */
@Component
@Slf4j
public class MqttMessageListenerImpl implements IMqttMessageListener {



    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        log.info("开始");

        System.out.println("订阅主题名称:"+topic);

        String payload = new String(message.getPayload());

        System.out.println("发送数据:"+payload);

        return;
    }


}

5、实现类

/**
 * 电箱订阅topic
 */
@Value("${spring.mqtt.mqttmessage.topic}")
private String mqttTopic;

try {
    //发布消息
    MqttConfig.getSendClient().publish(mqttTopic, "pubMessage".getBytes(),0,false);
} catch (MqttException e) {
    throw new RuntimeException(e);
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是Spring Boot整合MQTT EMQX的代码过程: 1. 首先,在pom.xml文件中添加下面的依赖: ``` <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-integration</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> <version>5.2.5.RELEASE</version> </dependency> </dependencies> ``` 2. 在application.properties文件中添加EMQX的连接信息: ``` spring.mqtt.username=your_username spring.mqtt.password=your_password spring.mqtt.url=tcp://your_emqx_ip:1883 ``` 3. 创建一个MQTT消息的处理器,代码如下: ``` @Component public class MqttMessageHandler { @ServiceActivator(inputChannel = "mqttInputChannel") public void handleMessage(String message) { System.out.println("Received message: " + message); } } ``` 4. 创建一个MQTT连接的配置类,代码如下: ``` @Configuration @EnableIntegration public class MqttConfig { @Value("${spring.mqtt.username}") private String username; @Value("${spring.mqtt.password}") private String password; @Value("${spring.mqtt.url}") private String url; @Bean public DefaultMqttPahoClientFactory mqttClientFactory() { DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); MqttConnectOptions options = new MqttConnectOptions(); options.setUserName(username); options.setPassword(password.toCharArray()); factory.setConnectionOptions(options); return factory; } @Bean public IntegrationFlow mqttInFlow() { return IntegrationFlows.from( inboundAdapter(), c -> c.poller(Pollers.fixedDelay(1000)) ) .transform(p -> p) .handle("mqttMessageHandler", "handleMessage") .get(); } private MessageProducerSupport inboundAdapter() { MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(url, "testClient", mqttClientFactory(), "testTopic"); adapter.setCompletionTimeout(5000); adapter.setConverter(new DefaultPahoMessageConverter()); adapter.setQos(1); return adapter; } } ``` 5. 测试代码: ``` @RestController public class TestController { @Autowired private MessageChannel mqttInputChannel; @GetMapping("/send") public void sendMqttMessage() { mqttInputChannel.send(MessageBuilder.withPayload("Hello MQTT").build()); } } ``` 6. 运行Spring Boot应用程序,访问http://localhost:8080/send,可以在控制台上看到接收到的MQTT消息。 注意:在运行代码之前,请确保你已经安装并运行了EMQX,并且已经创建了一个名为“testTopic”的主题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值