首先说下 应用场景:解析工程师解析了设备的数据后推送数据到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的客户端就行测试 具体可以查看官网 的说明 比较简单
客户端下载地址:
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 = "