RabbitMQ+MQTT通讯

这个类中涉及的包有

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

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

直接上代码

package com.example.robot.util;

import com.example.config.MqttConfig;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
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.support.DefaultPahoMessageConverter;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.*;

import javax.annotation.Resource;
import java.util.UUID;

/**
 * @Auther: suge
 * @DateTime: 2022/11/15-17:02
 * @Description: TODO
 **/
@Configuration
@IntegrationComponentScan
@ComponentScan(basePackages = "com.example.config")
@Slf4j
public class MqttUtil {

    @Resource
    private MqttConfig mqttConfig;

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

    @Bean
    public MqttPahoClientFactory mqttPahoClient() {
        System.out.println(mqttConfig);
        DefaultMqttPahoClientFactory defaultMqttPahoClientFactory = new DefaultMqttPahoClientFactory();
        String[] split = mqttConfig.getUrl().split(",");
        MqttConnectOptions options = new MqttConnectOptions();
        options.setServerURIs(split);

        options.setUserName(mqttConfig.getUsername());
        options.setPassword(mqttConfig.getPassword().toCharArray());
        options.setKeepAliveInterval(2); //心跳包超时设置,不设置默认是60s

        //接收离线消息
        options.setCleanSession(false);//客户端掉线服务端是否清除session
        defaultMqttPahoClientFactory.setConnectionOptions(options);
        return defaultMqttPahoClientFactory;
    }


    @Bean
    public MessageProducer inbound() {
        String[] split = mqttConfig.getTopics().split(",");

        MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(mqttConfig.getUrl()
                , mqttPahoClient(), split);

        adapter.setCompletionTimeout(5000);
        adapter.setQos(0);
        adapter.setConverter(new DefaultPahoMessageConverter());
        adapter.setOutputChannel(mqttInputChannel());

        return adapter;
    }

    @Bean
    @ServiceActivator(inputChannel = "mqttInputChannel")
    public MessageHandler handler() {
        return message -> {
            Object payload = message.getPayload();
            MessageHeaders headers = message.getHeaders();
            UUID id = headers.getId();
            Object qos = headers.get(MqttHeaders.QOS);
            Object topic = headers.get(MqttHeaders.RESPONSE_TOPIC);
            log.info("-----message数据{}----", payload);//这里是mqtt通道消息展示
        };
    }

}

上面代码中的MqttConfig代码如下

package com.example.config;

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

/**
 * @Auther: suge
 * @DateTime: 2022/11/15-16:55
 * @Description: TODO
 **/
@Component
@ConfigurationProperties(prefix = "mqtt")
public class MqttConfig {
    private String url;
    private String clientId;
    private String topics;
    private String username;
    private String password;
    private String timeout;
    private String keepalive;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getClientId() {
        return clientId;
    }

    public void setClientId(String clientId) {
        this.clientId = clientId;
    }

    public String getTopics() {
        return topics;
    }

    public void setTopics(String topics) {
        this.topics = topics;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getTimeout() {
        return timeout;
    }

    public void setTimeout(String timeout) {
        this.timeout = timeout;
    }

    public String getKeepalive() {
        return keepalive;
    }

    public void setKeepalive(String keepalive) {
        this.keepalive = keepalive;
    }
}

地址以及一些其他需要设置的topic我都写在了yml里面如下图所示


以上呢是收消息的代码下面是发送消息的代码

package com.example.robot.util.listener.util;

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

public class MqttUtil {
    //mqtt服务器默认的地址和端口号
    private static final String HOST = "";
    //连接MQTT的客户端ID,一般以唯一标识符表示
    private static final String CLIENTID = "";
    //连接的用户名密码(非必需)
    private String userName = "admin";
    private String password = "password";
//    private String password = "123";

    private MqttClient mqttClient;
    //构造方法,启动mqttClient

    public MqttUtil() {
        try {
            // MemoryPersistence设置clientid的保存形式,默认为以内存保存
            mqttClient = new MqttClient(HOST, CLIENTID, new MemoryPersistence());
            MqttConnectOptions options = new MqttConnectOptions();
            options.setCleanSession(true);
            options.setConnectionTimeout(60);
            options.setKeepAliveInterval(10);
            options.setUserName(userName);
            options.setPassword(password.toCharArray());
            //定义回调函数
            mqttClient.setCallback(new PushCallBack(mqttClient, options));
            mqttClient.connect(options);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

//    private static void printEnv(){
//        //获取环境变量
//        Map<String, String> envs = System.getenv();
//        envs.forEach( (key,value) ->{
//            //System.out.println("env---key是: "+key +" ; "+"env---value是: "+ value);
//        });
//
//        //获取jvm属性
//        Properties properties = System.getProperties();
//        properties.forEach((key, value) -> {
//            System.out.println("jvm---key是: "+key +" ; "+"jvm---value是: "+ value);
//        });
//
//
//    }这里我是当时需要获取环境变量,解决发送消息为乱码问题
    
    //发布主题
    public  void publish(String topic, MqttMessage message) {
        try {
            mqttClient.publish(topic, message);

        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
    
}

如果发送消息为乱码这里则需要在pom文件中给项目属性设置为UTF-8即可,上面代码中查看环境变量以及jvm属性就是为了确定打包出来的项目不是UTF-8编码的

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值