springboot集成mqtt【启动即连接服务器与订阅主题】

目录

  • 0. 碎碎念
  • 1. 代码部分
    • 1.1 pom.xml
    • 1.2 application.yml
    • 1.3 domain.AjaxResult
    • 1.4 mqtt.callback.MqttMessageListenerCommon
    • 1.5 mqtt.config.MqttConfiguration
    • 1.6 mqtt.service.MqttService
    • 1.7 mqtt.controller.MqttController

0. 碎碎念

    是向小白版的springboot中集成mqtt服务和springboot集成mqtt(超级无敌详细)学习整理的。但是因为我想要弄成一个,不是项目一启动就连接服务器的,而且连接成功服务器就订阅好固定的主题,太菜了一直理不明白(主要是注入的问题一直有点晕)。
    目前这个是项目一启动就连接mqtt,然后连接成功后就可以订阅主题,这样。

1. 代码部分

    按我个人理解的顺序放的,创建项目直接创建的默认springboot项目,jdk默认用的17。

1.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.selma</groupId><artifactId>SpringBootMqttTest</artifactId><version>0.0.1-SNAPSHOT</version><name>SpringBootMqttTest</name><description>SpringBootMqttTest</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 小辣椒 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- MQTT有关依赖 --><dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><version>1.2.5</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

1.2 application.yml

server:port: 8199spring:application:name: SpringBootMqttTest## MQTT配置
mqtt:host: tcp://broker.emqx.io:1883qos: 1clientId: mqtt_server_commontimeout: 10keepalive: 20

1.3 domain.AjaxResult

    用来controller返回值用的

package com.selma.domain;import java.util.HashMap;public class AjaxResult extends HashMap<String, Object> {/*** 初始化一个新创建的 Message 对象*/public AjaxResult() {}/*** 返回错误消息** @return 错误消息*/public static AjaxResult error() {return error(500, "操作失败");}/*** 返回错误消息** @param msg 内容* @return 错误消息*/public static AjaxResult error(String msg) {return error(500, msg);}/*** 返回错误消息** @param code 错误码* @param msg  内容* @return 错误消息*/public static AjaxResult error(int code, String msg) {AjaxResult json = new AjaxResult();json.put("code", code);json.put("msg", msg);return json;}/*** 返回成功消息** @param msg 内容* @return 成功消息*/public static AjaxResult success(String msg) {AjaxResult json = new AjaxResult();json.put("msg", msg);json.put("code", 200);return json;}/*** 返回成功消息** @return 成功消息*/public static AjaxResult success() {return AjaxResult.success("操作成功");}public static AjaxResult success(Object value) {return AjaxResult.successData(200, value);}public static AjaxResult successData(int code, Object value) {AjaxResult json = new AjaxResult();json.put("code", code);json.put("data", value);return json;}/*** 返回成功消息** @param key   键值* @param value 内容* @return 成功消息*/@Overridepublic AjaxResult put(String key, Object value) {super.put(key, value);return this;}
}

1.4 mqtt.callback.MqttMessageListenerCommon

    回调方法综合类

package com.selma.mqtt.callback;import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttMessage;@Slf4j
public class MqttMessageListenerCommon implements MqttCallbackExtended {@Overridepublic void connectComplete(boolean reconnect, String serverURI) {log.info("MQTT {} 连接成功,连接方式:{}", serverURI, reconnect ? "重连" : "直连");}@Overridepublic void connectionLost(Throwable throwable) {log.error("mqtt connectionLost 连接断开: {}", throwable.getMessage());}@Overridepublic void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {log.info("Message received from topic {} : {}", topic, new String(mqttMessage.getPayload()));}@Overridepublic void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {log.info("==========deliveryComplete={}==========", iMqttDeliveryToken.isComplete());}
}

1.5 mqtt.config.MqttConfiguration

    mqtt对象注入config

package com.selma.mqtt.config;import com.selma.mqtt.callback.MqttMessageListenerCommon;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MqttConfiguration {@Value("${mqtt.host}")String mqttHostCommon;@Value("${mqtt.clientId}")String mqttClientIdCommon;@Beanpublic MqttClient mqttClientCommon() {try {MqttClient mqttClient = new MqttClient(mqttHostCommon, mqttClientIdCommon);mqttClient.setCallback(new MqttMessageListenerCommon());MqttConnectOptions options = new MqttConnectOptions();options.setCleanSession(true); // 设置为干净会话mqttClient.connect(options);return mqttClient;} catch (MqttException e) {throw new RuntimeException(e);}}
}

1.6 mqtt.service.MqttService

    mqtt有关方法(目前只有我测试的)

package com.selma.mqtt.service;import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.stereotype.Service;import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;@Service
@Slf4j
public class MqttService {@Resourceprivate MqttClient mqttClientCommon;/*** 项目启动后就调用方法** @throws MqttException*/@PostConstructpublic void defaultSubscribe() {try {//up是传输上来的信息this.subscribeCommon("selma/up", 0);this.publishMessageCommon("selma/down", "hello", 0);
//        } catch (MqttException mqttException) {} catch (Exception e) {e.printStackTrace();}}/*** 给commonClient订阅指定主题** @param topic* @param qos*/public void subscribeCommon(String topic, int qos) {try {mqttClientCommon.subscribe(topic, qos);} catch (MqttException mqttException) {mqttException.printStackTrace();}}/*** 给commonClient的指定主题发送指定消息** @param topic* @param msg* @param qos*/public void publishMessageCommon(String topic, String msg, int qos) {try {byte[] msgBytes = msg.getBytes();MqttMessage message = new MqttMessage(msgBytes);message.setQos(qos);mqttClientCommon.publish(topic, message);} catch (MqttException mqttException) {mqttException.printStackTrace();}}}

1.7 mqtt.controller.MqttController

package com.selma.mqtt.controller;import com.selma.domain.AjaxResult;
import com.selma.mqtt.service.MqttService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/selma/mqtt")
@Slf4j
public class MqttController {@ResourceMqttService mqttService;@PostMapping("/subscribeCommon")public AjaxResult subscribeCommon(String topic) {mqttService.subscribeCommon(topic, 0);return AjaxResult.success();}@PostMapping("/publishMessageCommon")public AjaxResult publishMessageCommon(String topic, String msg) {mqttService.publishMessageCommon(topic, msg, 0);return AjaxResult.success();}
}

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

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

相关文章

Matlab实现白鲸优化算法优化回声状态网络模型 (BWO-ESN)(附源码)

目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 2部分代码 %% 清空环境变量 warning off % 关闭报警信息 close all % 关闭开启的图窗 clear % 清空变量 clc % 清空命令行 tic load bwand %%…

CC2530定时器1中断实现定时1-3

源码 #include "iocc2530.h"//引用CC2530头文件int t1_Count0; //定时器1溢出次数计数void Init_Led(void){ /*******************LED1初始化部分******************/P1SEL &~ 0x01; //设置P1_0口为通用I/O口P1DIR | 0x01; //设置P1_0口为输出口P…

软考越来越难了,2024年软考究竟还值不值得考?

最近不少同学沟通&#xff0c;聊到软考现在越来越难了&#xff0c;考了两三次都没过&#xff0c;也有不少新同学咨询软考考试的一些福利政策&#xff0c;投入大量的物力&#xff0c;财力&#xff0c;精力&#xff0c;那么到底软考值不值得考呢&#xff1f; 01 / 关于软考 软考…

Leetcode 10. 正则表达式匹配

1.题目基本信息 1.1.题目描述 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s 的&#xff0c;而不是部分…

k8s的控制节点不能访问node节点容器的ip地址

master控制node服务器添加容器后,访问不了该node服务器容器的ip,只能在node服务器访问 排查后发现是k8s的master服务器和node节点的网址网段和k8s初始化时提示的ip网段不一致 我之前是192.168.137.50, 实际上master主机期望的是192.168.1.50 解决方案: 1.删除服务器后重建ma…

python爬虫 - 进阶requests模块

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、SSL证书问题 &#xff08;一&#xff09;跳过 SSL 证书验证 &#xff0…

Vue3中提到的Tree-shaking

我们知道&#xff0c;Vue3中提到一个叫Tree-shaking的东西&#xff0c;其实也并不是一个新的东西&#xff0c;有人称之为"摇树优化"&#xff0c;什么意思&#xff1f; 按照作者的原话解释&#xff0c;Tree-shaking其实就是&#xff1a;把无用的模块进行“剪枝”&…

【Linux】进程间通信——System V消息队列和信号量

一、消息队列 1.1 概念 进程间通信的原理是让不同进程看到同一份资源&#xff0c;资源种类的不同就决定了通信方式的差异。如果用管道通信&#xff0c;则资源是文件缓冲区&#xff1b;如果用共享内存&#xff0c;则资源是内存块 消息队列是由操作系统提供的资源&#xff0c;…

postman自动化实战总结

Postman实战总结 简介 本次实战内容主要包括如下几点&#xff1a; l 背景介绍 l Postman使用&#xff0c;侧重于自动化实现&#xff0c;基础使用不做介绍 l 可视化Newman介绍 l 框架特色 l 实战中的坑 背景 随着国内软件技术的高速发展&#xff0c;越来越多的手工测试…

解决谷歌浏览器在安卓手机上的常见问题

在使用安卓手机浏览网页时&#xff0c;谷歌浏览器无疑是许多用户的首选。然而&#xff0c;在使用过程中&#xff0c;用户可能会遇到一些常见问题&#xff0c;如搜索图片困难、缓存积累过多导致浏览器卡顿&#xff0c;以及无法下载视频等。本文将针对这些问题&#xff0c;提供详…

【Linux】详解Linux下的工具(内含yum指令和vim指令)

文章目录 前言1. Linux下软件安装的方式2. yum2.1 软件下载的小知识2.2 在自己的Linux系统下验证yum源的存在2.3 利用yum指令下载软件2.4 拓展yum源&#xff08;针对于虚拟机用户&#xff09; 3. vim编辑器3.1 vim是什么&#xff1f;3.2 如何打开vim3.2 vim各模式下的讲解3.2.1…

【C语言】猜数字小游戏

&#x1f602;个人主页: 起名字真南 &#x1f923;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 随机数的生成1.1 rand1.2 srand1.3 time1.4 设置随机数范围 2 猜数字游戏实现 前言&#xff1a;我们学习完前面的循环以后可以写一个猜数字小游戏 1 随机数的生成 想要完成…

新生培训 day1 C语言基础 顺序 分支 循环 数组 字符串 函数

比赛地址 b牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ C语言数据类型 字符 整型数 int 2e9 long long 9e18 浮点数 代码示例 /** Author: Dduo * Date: 2024-10-8* Description: 新生培训day1 */ #include <stdio.h>int main() {// 定义变量in…

QT-空窗口主窗口对话框

1. QMainWindow QMainWindow 用来创建主窗口 主窗口包含&#xff1a; 标题栏&#xff08;Window title&#xff09;、菜单栏&#xff08;MenuBar&#xff09;、工具栏&#xff08;ToolBar&#xff09;、状态栏&#xff08;StatusBar&#xff09;、停靠部件&#xff08;DockWid…

Ansible学习之ansible-pull命令

想要知道ansible-pull是用来做什么的&#xff0c;就需要了解Ansible的工作模&#xff0c;Ansible的工作模式有两种&#xff1a; push模式 push推送&#xff0c;这是Ansible的默认模式&#xff0c;在主控机上编排好playbook文件&#xff0c;push到远程主机上来执行。pull模式 p…

RISC-V知识点目录

分支预测 分支预测概述https://blog.csdn.net/zhangshangjie1/article/details/136947089?sharetypeblogdetail&sharerId136947089&sharereferPC&sharesourcezhangshangjie1&spm1011.2480.3001.8118分支指令的方向预测https://blog.csdn.net/zhangshangjie1/a…

如何革新源代码保密?七大方法教你应对!

在数字化时代&#xff0c;源代码的安全保密对于企业而言至关重要&#xff0c;它不仅关系到企业的核心竞争力&#xff0c;还涉及到知识产权的保护。源代码一旦泄露&#xff0c;可能会给企业带来无法估量的损失。因此&#xff0c;采取有效的源代码保密措施&#xff0c;是每个企业…

【电路】1.3 电功率和能量

1.3 电功率和能量 电是一种能量存在形式。 1.3.1 电压的定义 将单位正电荷由A点移动至B点&#xff0c;电场力所做的功是 w w w&#xff0c;则 u A B d w d q u_{AB}\frac{dw}{dq} uAB​dqdw​&#xff0c; w w w是功&#xff0c; q q q是电荷量从A到B&#xff0c;沿着任意路…

D3.js中国地图可视化

1、项目介绍 该项目来自Github&#xff0c;基于D3.js中国地图可视化。 D3.js is a JavaScript library for manipulating documents based on data. It uses HTML, SVG, and CSS to display data. The full name of D3 is "Data-Driven Documents," which means it a…

C++11--列表初始化和声明

统一的列表初始化 { } 初始化 C11引入了统一的 列表初始化&#xff08;Uniform Initialization&#xff09;&#xff0c;这是一种使用大括号 { } 初始化变量和对象的新语法&#xff0c;旨在简化初始化过程并提高代码的可读性和一致性。 这种初始化方式适用于几乎所有类型&am…