mqtt 5.0版本 实现消息的推送和消费 具体代码实例

首先说下 应用场景:解析工程师解析了设备的数据后推送数据到mqtt,java 服务订阅mqtt消息 并进行持久化处理和其他业务逻辑处理。前端订阅mqtt消息进行物联网数据的展示,实现数据的互联互通。这个过程中MQTT扮演了了重要消息收发角色。

什么是 MQTT?

MQTT 是一种基于标准的消息传递协议或规则集,用于机器对机器的通信。智能传感器、可穿戴设备和其他物联网(IoT)设备通常必须通过带宽有限的资源受限网络传输和接收数据。这些物联网设备使用 MQTT 进行数据传输,因为它易于实施,并且可以有效地传输物联网数据。MQTT 支持设备到云端和云端到设备之间的消息传递。

为什么本文章要着重写mqtt 5的技术实现。因为官方目前也是推荐使用 mqtt 5来实现消息收发的,

MQTT 5: Seven Reasons to Upgrade to it from MQTT 3.1.1 – MQTT 5 Essentials Part 3

链接进去有详细的描述 有兴趣可以看看。

整体简单来说 mqtt 5更加的强大 

其实mqtt 5.0协议的 实现还是比较新,网上大部分都是mqtt v3的版本资料和示例,mqtt5的 很少,mqtt java实现主要是 用开源 组件org.eclipse.paho,但是官方源码里面关于 mqtt 5的实现也是残缺不全,似乎作者还没有写完完整的实例,根本没法用。 本文章的实例是 spring 结合 org.eclipse.paho来完整实现 mqtt 5.0协议的发送。

博主也是摸索了很久 才实现正常的功能,在此分享也是希望能够帮助大家少走弯路。

言归正传我们先讲mqtt 5的发送

首先大家要安装 一个mqtt 的服务 。这个我走了一点弯路 一开始按照安装 MQTT 服务(Rocky Linux 9)

这个 博文安装了 Eclipse Mosquitto  发现 这个只适合个人学习,功能非常简陋,连管理平台都没有。我记得以前公司有个后台管理配置的地方啊,还能查看消息什么的?

后来确认了下 是要安装 EMQX。官网:EMQX:用于物联网、车联网和工业物联网的企业级 MQTT 平台

他分开源版和企业版,企业版比较强力可以直接在mqtt上读取解析设备数据,并持久化到大数据表,可自定义配置大数据持久化,不需要额外实现。

开源版只能自己实现 比如clickhouse的数据持久化。

因为刚开始干活什么都没有 不太好向公司申请企业版,所以先用开源版。

安装教程官网都有 这是交出教程 MQTT 协议入门:基础知识和快速教程 | EMQ

开源版 安装配置教程:下载 EMQX 开源版

安装好mqtt 服务就可以下载一个mqtt的客户端就行测试 具体可以查看官网 的说明 比较简单

客户端下载地址:

MQTTX 下载

maven 依赖

首先是 spring 的 mqtt依赖

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

其实点进去看 他里面有两个版本的 mqtt依赖

红框的部分就是mqtt5

我们也可以单独的引用 mqtt 5 依赖包 

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

1,mqtt 5推送消息 代码实现


import com.alibaba.fastjson.JSONObject;
import org.eclipse.paho.mqttv5.client.*;
import org.eclipse.paho.mqttv5.client.persist.MemoryPersistence;
import org.eclipse.paho.mqttv5.common.MqttException;
import org.eclipse.paho.mqttv5.common.MqttMessage;

import java.time.LocalDateTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * QoS 0(至多一次,At most once):
 * <p>
 * 特性:消息可能会丢失,也可能会重复传输。
 * 保证:不进行确认,也不重试。消息最多发送一次,发送成功与否不做保证。
 * 适用场景:适用于对消息丢失或重复不敏感的场景,例如实时数据流。
 * QoS 1(至少一次,At least once):
 * <p>
 * 特性:消息至少会被传递一次,但可能会重复传输。
 * 保证:发送者会等待接收者的确认(PUBACK)。如果发送者未收到确认,会重新发送消息,确保消息到达。
 * 适用场景:适用于需要确保消息传递但可以接受重复的场景,如日志记录。
 * QoS 2(仅一次,Exactly once):
 * <p>
 * 特性:消息只会被传递一次,不会丢失或重复。
 * 保证:使用四步握手过程来确保消息只会传递一次。最复杂、开销最大,但最可靠。
 * 适用场景:适用于对消息重复和丢失都非常敏感的场景,如支付交易。
 */
public class TestSendMqtt5 {
    private static final String MQTT_BROKER = "
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,常用于物联网设备之间的通信。在Java中,可以使用Eclipse Paho库来实现MQTT协议的消息推送。 首先,你需要在项目中引入Eclipse Paho库的依赖。可以在Maven项目中的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.5</version> </dependency> ``` 接下来,你可以使用以下代码实现MQTT协议的消息推送: ```java import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; public class MqttPublisher { public static void main(String[] args) { String broker = "tcp://mqtt.eclipse.org:1883"; // MQTT broker地址 String clientId = "JavaPublisher"; // 客户端ID String topic = "test/topic"; // 发布的主题 int qos = 1; // 消息质量 try { MqttClient client = new MqttClient(broker, clientId, new MemoryPersistence()); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); System.out.println("Connecting to broker: " + broker); client.connect(connOpts); System.out.println("Connected"); String content = "Hello, MQTT!"; MqttMessage message = new MqttMessage(content.getBytes()); message.setQos(qos); System.out.println("Publishing message: " + content); client.publish(topic, message); System.out.println("Message published"); client.disconnect(); System.out.println("Disconnected"); } catch (MqttException e) { e.printStackTrace(); } } } ``` 上述代码中,我们创建了一个MqttClient对象,并指定了MQTT broker的地址、客户端ID、发布的主题和消息质量。然后,我们连接到MQTT broker,发布一条消息,最后断开连接。 请注意,上述代码仅为示例,你需要根据实际情况修改broker地址、客户端ID、主题和消息内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值