MQTT简单使用总结

本文概述了MQTT工具MQTTX的使用,并详细介绍了在Java中使用MQTT的四个步骤:引入库、配置信息注入、创建MQTT消费者及实现回调函数处理消息的接收和重连。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本文介绍MQTT消息队列的简单使用

一、MQTT工具

MQTT的工具有很多,这里选择MQTTX测试: MQTTX客户端

二、使用步骤

1.引入库

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

2.注入配置信息

mqtt:
  host: tcp://127.0.0.1
  clientid: admin
  username: admin
  password: admin
  timeout: 10000
  keepalive: 60

这里选择自己的配置信息

public class MqttCofigBean {

    @Value("${mqtt.username}")
    private String username;

    @Value("${mqtt.password}")
    private String password;

    @Value("${mqtt.host}")
    private String hostUrl;

    @Value("${mqtt.clientid}")
    private String clientId;

    @Value("${mqtt.timeout}")
    private int completionTimeout;
}

3.MQTT消费者

主要功能是初始化连接信息,推送MQTT消息,订阅MQTT主题.

@Slf4j
@Component
public class MqttConsumer implements ApplicationRunner {


    private static MqttClient client;

    private static MqttTopic mqttTopic;

    private static volatile MqttConsumer mqttConsumer = null;

    public static MqttConsumer getInstance() {

        if (null == mqttConsumer) {
            synchronized (MqttConsumer.class) {
                if (null == mqttConsumer) {
                    mqttConsumer = new MqttConsumer();
                }
            }
        }
        return mqttConsumer;

    }

    /**
     * MQTT连接属性配置对象
     */
    @Autowired
    public MqttCofigBean mqttCofigBean;

    /**
     * 初始化参数配置
     */
    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.info("初始化启动MQTT连接");
        this.connect();
    }

    /**
     * 用来连接服务器
     * @throws Exception 异常
     */
    private void connect() throws Exception {
        client = new MqttClient(mqttCofigBean.getHostUrl(), mqttCofigBean.getClientId() + "_" + StrUtil.uuid(), new MemoryPersistence());
        MqttConnectOptions options = new MqttConnectOptions();
        options.setUserName(mqttCofigBean.getUsername());
        options.setPassword(mqttCofigBean.getPassword().toCharArray());
        //是否清除session
        options.setCleanSession(true);
        // 设置超时时间
        options.setConnectionTimeout(30);
        // 设置会话心跳时间
        options.setKeepAliveInterval(60);
        try {
            String[] msgtopic = MqttCofigBean.SUB_TOPICS;
            int[] qos = new int[msgtopic.length];
            client.setCallback(new TopMsgCallback(client, options, msgtopic, qos));
            client.connect(options);
            log.info("MQTT连接成功:" + mqttCofigBean.getClientId());
            if (msgtopic.length != 0 && !"".equals(msgtopic[0])) {
                //订阅消息
                for (int i = 0; i < msgtopic.length; i++) {
                    qos[i] = 0;
                }
                client.subscribe(msgtopic, qos);
            }

        } catch (Exception e) {
            log.error("MQTT连接异常:" + e);
        }
    }

    /**
     * 重新连接
     * @throws Exception 异常
     */
    public void reConnect() throws Exception {
        if (null != client) {
            this.connect();
        }
    }

    /**
     * 发布,默认qos为0,非持久化
     *
     * @param topic       主题
     * @param pushMessage 推送消息
     */
    public void publish(String topic, String pushMessage) throws Exception {
        publish(0, false, topic, pushMessage);
    }

    /**
     * 发布
     *
     * @param qos         qos
     * @param retained    保留
     * @param topic       主题
     * @param pushMessage 推送消息
     */
    public void publish(int qos, boolean retained, String topic, String pushMessage) {
        MqttMessage message = new MqttMessage();
        message.setQos(qos);
        message.setRetained(retained);
        message.setPayload(pushMessage.getBytes());
        MqttTopic mTopic = client.getTopic(topic);
        if (null == mTopic) {
            log.error("topic not exist");
        }
        MqttDeliveryToken token;
        try {
            token = mTopic.publish(message);
            token.waitForCompletion();
        } catch (MqttPersistenceException e) {
            e.printStackTrace();
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    /**
     * 订阅某个主题
     *
     * @param topic 主题
     * @param qos   qos
     */
    public void subscribe(String topic, int qos) {
        try {
            log.info("topic:" + topic);
            client.subscribe(topic, qos);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    public MqttClient getClient() {
        return client;
    }

    public MqttTopic getMqttTopic() {
        return mqttTopic;
    }
}

4.MQTT回调函数

回调函数主要是负责,连接中断后重连,收到消息的处理,也可以使用监听器的方式,来处理收到消息的业务在处理.

@Slf4j
public class TopMsgCallback implements MqttCallback {

    /**
     * MqttClient
     */
    private MqttClient client;
    /**
     * MqttConnectOptions
     */
    private MqttConnectOptions options;
    /**
     * topic数组
     */
    private String[] topic;
    /**
     * qos
     */
    private int[] qos;


    public TopMsgCallback() {
    }

    public TopMsgCallback(MqttClient client, MqttConnectOptions options) {
        this.client = client;
        this.options = options;
    }

    public TopMsgCallback(MqttClient client, MqttConnectOptions options, String[] topic, int[] qos) {
        this.client = client;
        this.options = options;
        this.topic = topic;
        this.qos = qos;
    }

    /**
     * 断开重连
     */
    @Override
    public void connectionLost(Throwable cause) {
        log.info("MQTT连接断开,发起重连");
        while (true) {
            try {
                Thread.sleep(30000);
                client.connect(options);
                log.info("MQTT重新连接成功:" + client);
                String[] msgtopic = MqttCofigBean.SUB_TOPICS;
                int[] qos = new int[msgtopic.length];
                if (msgtopic.length != 0 && !"".equals(msgtopic[0])) {
                    //订阅消息
                    for (int i = 0; i < msgtopic.length; i++) {
                        qos[i] = 0;
                    }
                    client.subscribe(msgtopic, qos);
                }
                break;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * 接收到消息调用令牌中调用
     */
    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
    }

    /**
     * 消息处理
     * 封装数据,储存存活设备存入Redis,推送数据到kafka
     */
    @Override
    public void messageArrived(String topic, MqttMessage message) {
        JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(message));
        // TODO 升级结果推送至业务处理
        log.info("接收到的消息是{}", message);
    }
}

总结

没有总结

### MQTT 下载与使用教程 #### 1. MQTT 的简介 MQTT 是一种轻量级的消息传递协议,专为低带宽和不可靠网络环境设计。其核心功能是通过发布/订阅模式实现设备间通信[^4]。 --- #### 2. 安装 Mosquitto MQTT Broker 为了使用 MQTT 协议,首先需要安装一个 MQTT 代理(Broker)。在此示例中,我们将使用 Eclipse 开发的 Mosquitto 来作为 MQTT 代理,并将其部署在 Raspberry Pi 上。 ##### 步骤说明: - **添加 GPG 密钥** 使用 SSH 或远程桌面工具连接到 Raspberry Pi 后,在终端输入以下命令以获取 Mosquitto 存储库的密钥: ```bash wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key sudo apt-key add mosquitto-repo.gpg.key ``` - **添加存储库** 添加 Mosquitto 的官方软件源: ```bash cd /etc/apt/sources.list.d/ sudo wget http://repo.mosquitto.org/debian/mosquitto-buster.list ``` - **更新并安装 Mosquitto** 更新本地包索引并安装 Mosquitto: ```bash sudo apt update sudo apt install mosquitto mosquitto-clients ``` 完成上述操作后,Mosquitto 就会作为一个服务运行,默认监听端口 `1883` 和 `8883`(TLS 加密)[^1]。 --- #### 3. 创建一个简单MQTT 应用程序 以下是基于 Java 编写的简单 MQTT 客户端代码示例: ```java import org.fusesource.mqtt.client.*; public class MqttExample { public static void main(String[] args) { MQTT mqtt = new MQTT(); // 设置主机地址和端口号 mqtt.setHost("tcp://localhost", 1883); try { // 建立连接 BlockingConnection connection = mqtt.blockingConnection(); connection.connect(); // 发布消息至指定主题 connection.publish("/test/topic", "Hello MQTT!".getBytes(), QoS.EXACTLY_ONCE, false); // 订阅某个主题 connection.subscribe(new Topic[]{new Topic("/test/topic", QoS.EXACTLY_ONCE)}); // 接收消息 Message message = connection.receive(); System.out.println("Received: " + new String(message.getPayload())); // 断开连接 connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } } } ``` 这段代码实现了以下几个功能: - 配置客户端连接到本地运行的 Mosquitto 代理。 - 向 `/test/topic` 主题发送一条消息。 - 订阅同一主题并接收已发布的消息[^2]。 --- #### 4. 性能测试工具——JMeter 插件 如果希望对 MQTT 系统进行压力测试或性能评估,可以借助 Apache JMeter 及其插件支持 MQTT 测试。具体步骤如下: - **安装 JMeter** 下载最新版本的 JMeter 并解压即可使用。 - **加载 MQTT 插件** 在 JMeter 的 lib 文件夹下放置所需的依赖项(如 Paho MQTT Client Jar),并通过 GUI 工具配置测试计划。 - **执行测试** 配置线程组、采样器以及断言规则,模拟多用户并发访问场景下的行为表现[^3]。 --- #### 5. 特性和应用场景总结 MQTT 的主要特点包括但不限于以下几点: - 极少的资源消耗; - 支持高延迟或不稳定网络条件; - 提供三种服务质量等级(QoS=0 至 QoS=2)以满足不同需求; - 易于扩展和支持大规模分布式架构。 典型的应用领域涵盖了物联网设备管理、智能家居控制面板交互、车载导航系统数据同步等方面。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值