springboot整合mqtt实现消息订阅和推送

前言

mica-mqtt-client-spring-boot-starter是一个基于Spring Boot的MQTT客户端启动器,它集成了mica-mqtt客户端,提供了在Spring Boot应用程序中使用MQTT协议进行消息通信的能力。以下是关于mica-mqtt-client-spring-boot-starter的简介:

特点:

  • 简单易用:通过Spring Boot的自动配置,可以轻松地集成到Spring应用程序中,并使用Spring的注解或Java配置进行MQTT客户端的配置。

  • 低延迟:支持MQTT协议,能够实现实时消息通信,具有较低的延迟。

  • 高性能:基于mica-mqtt客户端,具有高效的消息处理和网络通信能力,能够处理大量的并发连接和消息。

  • 集群支持:支持基于Redis的发布/订阅模式的集群,可以实现多个节点之间的消息同步和负载均衡。

  • 使用场景:适用于需要使用MQTT协议进行消息通信的物联网、实时应用、移动应用等领域。可以在云端或边缘端使用,实现设备与设备之间、设备与服务器之间的消息通信。

  • 集成方式:通过在Spring Boot项目中添加相关依赖,并配置MQTT客户端的相关参数,即可快速集成mica-mqtt-client-spring-boot-starter。具体的使用方法可以参考官方文档和示例代码。

  • 注意事项:在使用过程中需要注意确保网络连接的稳定性和安全性,并根据实际需求进行适当的配置和优化。同时,也需要关注数据安全和隐私保护等方面的问题。

总之,mica-mqtt-client-spring-boot-starter是一个方便、高效、可靠的MQTT客户端启动器,适用于需要使用MQTT协议进行消息通信的Spring Boot应用程序。

功能

  • 支持 MQTT v3.1、v3.1.1 以及 v5.0 协议。

  • 支持 websocket mqtt 子协议(支持 mqtt.js)。

  • 支持 http rest api,http api 文档详见[1]。

  • 支持 MQTT client 客户端。

  • 支持 MQTT server 服务端。

  • 支持 MQTT client、server 共享订阅支持(捐助VIP版采用 topic 树存储,跟 topic 数无关,百万 topic 性能依旧)。

  • 支持 MQTT 遗嘱消息。

  • 支持 MQTT 保留消息。

  • 支持自定义消息(mq)处理转发实现集群。

  • MQTT 客户端 阿里云 mqtt 连接 demo。

  • 支持 GraalVM 编译成本机可执行程序。

  • 支持 Spring boot 项目快速接入(mica-mqtt-spring-boot-starter)。

  • mica-mqtt-spring-boot-starter 支持对接 Prometheus + Grafana。

  • 基于 redis pub/sub 实现集群,详见 mica-mqtt-broker 模块[2]

教程

添加依赖

在springboot项目中添加maven依赖:

        <!-- https://mvnrepository.com/artifact/net.dreamlu/mica-mqtt-client-spring-boot-starter --><dependency><groupId>net.dreamlu</groupId><artifactId>mica-mqtt-client-spring-boot-starter</artifactId><version>2.2.8</version></dependency>

配置参数

在spring配置文件中配置mqtt相关参数,配置如下:

mqtt:server:    enabled: false              # 是否开启服务端,默认:falseclient:enabled: true               # 是否开启客户端,默认:falseip: 172.16.10.203   # 连接的服务端 ip ,默认:127.0.0.1port: 1883                  # 端口:默认:1883name: Mica2-Mqtt2-Client      # 名称,默认:Mica-Mqtt-ClientclientId: coalface_safety_3d            # 客户端Id(非常重要,一般为设备 sn,不可重复)user-name: admin           # 认证的用户名 你的用户名password: 3@!cHy@j       # 认证的密码timeout: 5                  # 连接超时时间,单位:秒,默认:5秒reconnect: true             # 是否重连,默认:truere-interval: 5000           # 重连时间,默认 5000 毫秒version: MQTT_3_1           # mqtt 协议版本,默认:3.1.1read-buffer-size: 8092      # 接收数据的 buffer size,默认:8092max-bytes-in-message: 8092  # 消息解析最大 bytes 长度,默认:8092buffer-allocator: heap      # 堆内存和堆外内存,默认:堆内存keep-alive-secs: 60         # keep-alive 心跳维持时间,单位:秒clean-session: false         # mqtt clean session,默认:truewill-message:                # 消息遗嘱qos: at_least_oncessl:enabled: false            # 是否开启 ssl 认证,2.1.0 开始支持双向认证keystore-path:            # 可选参数:ssl 双向认证 keystore 目录,支持 classpath:/ 路径。keystore-pass:            # 可选参数:ssl 双向认证 keystore 密码truststore-path:          # 可选参数:ssl 双向认证 truststore 目录,支持 classpath:/ 路径。truststore-pass:          # 可选参数:ssl 双向认证 truststore 密码
  • 注意:ssl 存在三种情况
服务端开启ssl客户端
ClientAuth 为 NONE(不需要客户端验证)仅仅需要开启 ssl 即可不用配置证书
ClientAuth 为 OPTIONAL(与客户端协商)需开启 ssl 并且配置 truststore 证书
ClientAuth 为 REQUIRE (必须的客户端验证)需开启 ssl 并且配置 truststore、 keystore证书

创建订阅

创建一个mqtt订阅消息监听类,例如SimulationSubscriber,代码如下:


import com.alibaba.fastjson.JSONObject;
import net.dreamlu.iot.mqtt.spring.client.MqttClientSubscribe;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import org.tio.utils.buffer.ByteBufferUtil;/*** @author tarzan*/
@Component
@Slf4j
public class SimulationSubscriber {@MqttClientSubscribe("tuoyuan/publish/zj/#")public void zjOne(String topic, byte[] payload){String[] strs=topic.split("/");String ID=strs[strs.length-1];log.info("topic:{} payload:{} ID:{}", topic, new String(payload, StandardCharsets.UTF_8),ID);}@MqttClientSubscribe("/sys/${deviceName}/thing/sub/register")public void thingSubRegister(String topic, byte[] payload) {// 1.3.8 开始支持,@MqttClientSubscribe 注解支持 ${} 变量替换,会默认替换成 +// 注意:mica-mqtt 会先从 Spring boot 配置中替换参数 ${},如果存在配置会优先被替换。logger.info("topic:{} payload:{}", topic, new String(payload, StandardCharsets.UTF_8));}@MqttClientSubscribe("/tianma/publish/cmj")public void cmj(@Header("topic") String topic,@Payload byte[] payload) {System.out.println("*****************gc**************************************"+topic);JSONObject jsonObject = JSONObject.parseObject(ByteBufferUtil.toString(payload));//业务的处理System.out.println("*****************test**************************************"+jsonObject);}@MqttClientSubscribe("/tianma/publish/zj")public void zj(@Header("topic") String topic,@Payload byte[] payload) {System.out.println("*****************gc**************************************"+topic);JSONObject jsonObject = JSONObject.parseObject(ByteBufferUtil.toString(payload));//业务的处理System.out.println("*****************test**************************************"+jsonObject);}@MqttClientSubscribe("/tianma/publish/gbj")public void gbj(@Header("topic") String topic,@Payload byte[] payload) {System.out.println("*****************gc**************************************"+topic);JSONObject jsonObject = JSONObject.parseObject(ByteBufferUtil.toString(payload));//业务的处理System.out.println("*****************test**************************************"+jsonObject);}@MqttClientSubscribe("/tianma/publish/ltl")public void ltl(@Header("topic") String topic,@Payload byte[] payload) {System.out.println("*****************gc**************************************"+topic);JSONObject jsonObject = JSONObject.parseObject(ByteBufferUtil.toString(payload));//业务的处理System.out.println("*****************test**************************************"+jsonObject);}@MqttClientSubscribe("/tianma/publish/ntl")public void ntl(@Header("topic") String topic,@Payload byte[] payload) {System.out.println("*****************gc**************************************"+topic);JSONObject jsonObject = JSONObject.parseObject(ByteBufferUtil.toString(payload));//业务的处理System.out.println("*****************test**************************************"+jsonObject);}@MqttClientSubscribe("/tianma/publish/ccl")public void ccl(@Header("topic") String topic,@Payload byte[] payload) {System.out.println("*****************gc**************************************"+topic);JSONObject jsonObject = JSONObject.parseObject(ByteBufferUtil.toString(payload));//业务的处理System.out.println("*****************test**************************************"+jsonObject);}}
  • @Header(“topic”) 和@Payload 注解可以省略

  • tuoyuan/publish/zj/# 中的# 是通配符

    • 在MQTT协议中,#是一个通配符,代表匹配该主题的所有子主题。例如,如果你订阅了主题sports/baseball/#,那么你将接收到所有以sports/baseball/开头的主题的消息。

    • 请注意,通配符#只能用于多层的主题名称中,并且只能用于最后一个级别。例如,sports/baseball/#是有效的,但#sports/baseball或sports/#/baseball都是无效的。

    • 除了#之外,MQTT协议还支持一个单层通配符+,它代表只匹配该级别的主题。例如,如果你订阅了主题sports/baseball/+,那么你将只接收到以sports/baseball/开头,且后面跟着至少一个字符的主题的消息。

    • 请注意,使用通配符时需要谨慎,因为它们可能会匹配到意外的主题。确保你的订阅主题明确,并且只匹配你感兴趣的主题。

  • /sys/${deviceName}/thing/sub/register

    • 1.3.8 开始支持,@MqttClientSubscribe 注解支持 ${} 变量替换,会默认替换成 +
    • 注意:mica-mqtt 会先从 Spring boot 配置中替换参数 ${},如果存在配置会优先被替换。

创建发布

创建一个mqtt消息发布接口类,例如 MqttTestController,代码如下:


import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.dreamlu.iot.mqtt.spring.client.MqttClientTemplate;
import org.springblade.core.secure.annotation.NoToken;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.nio.charset.StandardCharsets;/*** @author tarzan*/
@RestController
@Api(tags = "mqtt测试")
@NoToken
@RequestMapping("/mqtt")
@AllArgsConstructor
@Slf4j
public class MqttTestController {private final MqttClientTemplate mqttClientTemplate;@ApiOperation(value = "消息发送")@PostMapping("/publish")private R<Boolean> publish(String topic, String msg) {return R.status(mqttClientTemplate.publish(topic, msg.getBytes(StandardCharsets.UTF_8)));}}

接口测试

接口调用
在这里插入图片描述
控制台输出
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/442139.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装 vant-ui 实现底部导航栏 Tabbar

本例子使用vue3 介绍 vant-ui 地址&#xff1a;介绍 - Vant 4 (vant-ui.github.io) Vant 是一个轻量、可定制的移动端组件库 安装 通过 npm 安装&#xff1a; # Vue 3 项目&#xff0c;安装最新版 Vant npm i vant # Vue 2 项目&#xff0c;安装 Vant 2 npm i vantlatest-v…

Vue3下载WEBAPI导出的Excel文件

webApi查询数据保存为Excel /// <summary>/// 获取LMI3D相机涂胶测量数据/// </summary>/// <returns></returns>[HttpPost(Name "GetLMI3DGlueDataToExcel")]public async Task<IActionResult> GetLMI3DGlueDataToExcel(QueryGlueM…

一站式在线协作办公软件ONLYOFFICE,协作更便捷

1、ONLYOFFICE是什么&#xff1f; ONLYOFFICE是一款功能强大的在线协作办公软件&#xff0c;可以创建编辑Word文档、Excel电子表格&#xff0c;PowerPoint&#xff08;PPT&#xff09;演示文稿、Forms表单等多种文件。ONLYOFFICE支持多个平台&#xff0c;无论使用的是 Windows、…

河南省考后天网上确认,请提前准备证件照哦

✔报名时间&#xff1a;2024年1月18号一1月24号 ✔报名确认和缴费&#xff1a;2024年1月 31号一2月4号 ✔准考证打印&#xff1a;2024年3月12号一3月17号 ✔笔试时间&#xff1a;2024年3月16日-2024年3月17日。 ✔面试时间&#xff1a;面试时间拟安排在2024年5月中旬 报名网址&…

微信投票小程序源码系统:无限多开,吸粉利器, 礼物道具,功能强大 带完整的安装代码包以及搭建教程

随着互联网的不断发展&#xff0c;社交媒体已成为人们生活中不可或缺的一部分。而微信作为中国最大的社交软件之一&#xff0c;拥有着庞大的用户群体和广泛的影响力。在这样的背景下&#xff0c;微信投票小程序应运而生。今天小编要向大家介绍的是一个功能强大的微信投票小程序…

SpringBoot 结合 liteflow 规则引擎使用

1、前言 在日常的开发过程中&#xff0c;经常会遇到一些串行或者并行的业务流程问题&#xff0c;而业务之间不必存在相关性。 在这样的场景下&#xff0c;使用策略和模板模式的结合可以很好的解决这个问题&#xff0c;但是使用编码的方式会使得文件太多,在业务的部分环节可以…

5G智慧钢铁厂数字孪生三维可视化,推进钢铁新型工业化数字化转型

5G智慧钢铁厂数字孪生三维可视化&#xff0c;推进钢铁新型工业化数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为钢铁企业转型升级的必经之路。而5G技术的广泛应用&#xff0c;为钢铁企业数字化转型提供了新的机遇。其中&#xff0c;5G智慧钢铁厂数字孪生三维可…

Leetcode—2396. 严格回文的数字【中等】

2024每日刷题&#xff08;一零六&#xff09; Leetcode—2396. 严格回文的数字 算法思想 实现代码 class Solution { public:bool isStrictlyPalindromic(int n) {return false;} };运行结果 之后我会持续更新&#xff0c;如果喜欢我的文章&#xff0c;请记得一键三连哦&…

在centos 7 中 安装 配置 并 远程连接 MySQL5.7

目录 安装MySQL 1.卸载CentOS7系统自带的mariadb 2.安装依赖库 3.上传MySQL并解压 4.安装MySQL 配置MySQL 1.修改登录密码 2.修改字符集 3.配置远程连接 前言&#xff1a; 安装MySQL版本&#xff1a;mysql-5.7.30-1.el7.x86_64.rpm-bundle 文件需求后台私信 以下7条为…

云纱网签约百望云,联手打造数字化产业闭环

近日&#xff0c;百望云签约广东云纱数字科技有限公司&#xff0c;共建数字化发票管理系统&#xff0c;赋能产业链上下游供应商的协同交易与运营&#xff0c;助力企业实现数字化四流合一交易&#xff0c;打造数字化产业闭环。 云纱网是广东云纱数字科技有限公司依托于深厚的产业…

动态分析C语言代码生成函数调用关系的利器——perf

大纲 环境准备安装开启监控 分析采集解析 可视化处理环境准备转换成dot转换为图片 参考资料 perf是一套linux操作系统上分析工具集&#xff0c;分析函数调用关系只是其一个子集功能。它并不像《动态分析C语言代码生成函数调用关系的利器——gprof》中介绍的需要在被分析程序的编…

JUC多并发编程-->CAS和原子操作类

文章目录 CAS是什么unsafe自旋锁 spinlockCAS缺点 原子操作类分类LongAdder为什么快 CAS是什么 类似于乐观锁 compare and swap&#xff0c;比较与交换&#xff0c;实现并发算法时常用的一种技术。 包含三个操作数— 内存位置、预期原值以及更新值。 执行CAS操作的时候&#x…