springboot整合mqtt实现android推送功能

1、mqtt服务器使用emqx

EMQX: The World's #1 Open Source Distributed MQTT Broker

2、下载安装

下载地址:

Download EMQX

选择系统,版本,安装方法

3、springboot连接mqtt服务方法:

引包:

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

自定义配置信息:

spring:#MQTT配置信息mqtt:enable: true#MQTT服务地址,端口号默认1883,如果有多个,用逗号隔开url: tcp://localhost:1883#用户名username: admin#密码password: public#客户端id(不能重复)provider-id: server-provider#MQTT默认的消息推送主题,实际可在调用接口是指定default-topic: topic

 配置参数对应的自定义配置类:

package com.gnetek.monitor.api.bean;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** @Description mqtt客户端配置信息* @Author Darren Huang* @Date 2024-04-28 13:16*/
@Data
@Component
@ConfigurationProperties(prefix = "spring.mqtt")
public class GneMqtt {/*** 启用*/private boolean enable;/*** url*/private String url;/*** 用户名*/private String username;/*** 密码*/private String password;/*** 提供者id*/private String providerId;/*** 消费者id*/private String consumerId;/*** 默认主题*/private String defaultTopic;
}

启动连接mqtt服务器配置类 

注意,发送消息retained=true表示保留消息,发送后,才有客户端订阅也能收到,如果收到retained的消息后要删除消息,需要再发一个空的消息(payload= new byte[0])到此主题上

package com.gnetek.monitor.api.config;import cn.hutool.json.JSONUtil;
import com.gnetek.monitor.api.bean.GneMqtt;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;/*** @Description 消息生产者客户端配置* @Author Darren Huang* @Date 2024-04-28 13:19*/
@Slf4j
@Configuration
@ConditionalOnProperty(name = "spring.mqtt.enable", havingValue = "true")
public class MqttProviderClient {@Autowiredprivate GneMqtt gneMqtt;private MqttClient mqttClient;/*** 在bean初始化后连接到服务器*/@PostConstructpublic void init(){connect();}/*** 客户端连接服务端*/public void connect(){try{//创建MQTT客户端对象mqttClient = new MqttClient(gneMqtt.getUrl(), gneMqtt.getProviderId(), new MemoryPersistence());//连接设置MqttConnectOptions options = new MqttConnectOptions();//是否清空session,设置false表示服务器会保留客户端的连接记录(订阅主题,qos),客户端重连之后能获取到服务器在客户端断开连接期间推送的消息//设置为true表示每次连接服务器都是以新的身份options.setCleanSession(true);//设置连接用户名options.setUserName(gneMqtt.getUsername());//设置连接密码options.setPassword(gneMqtt.getPassword().toCharArray());//设置超时时间,单位为秒options.setConnectionTimeout(100);//设置心跳时间 单位为秒,表示服务器每隔 1.5*30秒的时间向客户端发送心跳判断客户端是否在线options.setKeepAliveInterval(30);// 自动重连  setCallback需要实现 MqttCallbackExtendedoptions.setAutomaticReconnect(true);//设置遗嘱消息的话题,若客户端和服务器之间的连接意外断开,服务器将发布客户端的遗嘱信息
//            options.setWill("willTopic", (mqttClient + "与服务器断开连接").getBytes(),0,false);//设置回调mqttClient.setCallback(new MqttProviderCallBack());mqttClient.connect(options);} catch(MqttException e){e.printStackTrace();}}/*** 发布** @param topic   主题* @param message 消息*/public void publish(String topic, Object message) {publish(topic, message, true, 0);}/*** 发布** @param topic    主题* @param message  消息* @param retained 保留* @param qos      qos 最多一次 (QoS0) 至少一次 (QoS1) 有且仅有一次 (QoS2)*/public void publish(String topic, Object message, boolean retained, int qos){MqttMessage mqttMessage = new MqttMessage();mqttMessage.setQos(qos);mqttMessage.setRetained(retained);byte[] payload = JSONUtil.toJsonStr(message).getBytes();mqttMessage.setPayload(payload);//主题的目的地,用于发布/订阅信息MqttTopic mqttTopic = mqttClient.getTopic(topic);//提供一种机制来跟踪消息的传递进度//用于在以非阻塞方式(在后台运行)执行发布是跟踪消息的传递进度MqttDeliveryToken token;try {//将指定消息发布到主题,但不等待消息传递完成,返回的token可用于跟踪消息的传递状态//一旦此方法干净地返回,消息就已被客户端接受发布,当连接可用,将在后台完成消息传递。token = mqttTopic.publish(mqttMessage);token.waitForCompletion();} catch (MqttException e) {e.printStackTrace();}}@PreDestroypublic void destroy() {try {if (mqttClient.isConnected()) {mqttClient.disconnect();}} catch (MqttException e) {e.printStackTrace();}}
}

 mqtt客户端监听:

注意如果你需要与服务器断开连接后重新连接,需要实现MqttCallbackExtended方法,

// 自动重连  setCallback需要实现 MqttCallbackExtended
 options.setAutomaticReconnect(true);

package com.gnetek.monitor.api.config;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;/*** @Description 生产者客户端消息回调* @Author Darren Huang* @Date 2024-04-28 13:28*/
@Slf4j
public class MqttProviderCallBack implements MqttCallbackExtended {/*** 连接丢失** @param throwable throwable*/@Overridepublic void connectionLost(Throwable throwable) {log.debug("与服务器断开连接,可重连");throwable.printStackTrace();}/*** 消息到达** @param topic       主题* @param mqttMessage mqtt消息* @throws Exception*/@Overridepublic void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {log.debug("接收消息的主题 : {}", topic);log.debug("接收消息的内容 : {}", new String(mqttMessage.getPayload()));log.debug("接收消息的Qos : {}", mqttMessage.getQos());log.debug("接收消息的retained : {}", mqttMessage.isRetained());}/*** 交付完成** @param iMqttDeliveryToken MQTT交付令牌*/@Overridepublic void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {log.debug("发送消息成功");}/*** 连接完成** @param reconnect 重新连接* @param serverURI 服务器uri*/@Overridepublic void connectComplete(boolean reconnect, String serverURI) {// 可以做订阅主题 if(reconnect) 如果是重连 订阅主题log.debug("与服务器断连接完成 是否是重连={}, serverURI={}", reconnect, serverURI);}
}

4、android连接mqtt服务

参考:Android 使用 Kotlin 连接 MQTT | EMQ (emqx.com)

里面用到了

implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' 

高版本的android需要修改一些代码,它的源码地址是:eclipse/paho.mqtt.android: MQTT Android (github.com)

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

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

相关文章

[附源码]SpringBoot+Vue网盘项目_仿某度盘

视频演示 [附源码]SpringBootVue网盘项目_仿某度盘 功能介绍 支持秒传支持视频音频播放、拖拽进度条、倍速播放等支持图片预览&#xff0c;旋转&#xff0c;放大支持多人一起上传&#xff0c;共享上传进度&#xff08;例如a上传苍老师学习资料到50%&#xff0c;突然b也上传苍老…

uniapp + uView动态表单校验

项目需求&#xff1a;动态循环表单&#xff0c;并实现动态表单校验 页面&#xff1a; <u--form label-position"top" :model"tmForm" ref"tmForm" label-width"0px" :rulesrules><div v-for"(element, index) in tmForm…

Docker依旧没有过时

【A】Docker 是一种开源的容器化平台&#xff0c;它允许开发人员将应用程序及其所有依赖项打包到一个统一的容器中&#xff0c;并在不同环境中进行部署和运行。以下是 Docker 的一些基本概念和优势&#xff1a; 容器&#xff1a;Docker 使用容器来隔离应用程序和其依赖项&#…

【信息系统项目管理师知识点速记】范围管理:确认范围

9.7 确认范围 确认范围是正式验收已完成的项目可交付成果的过程。其主要作用是使验收过程具有客观性,通过确认每个可交付成果来提高最终产品、服务或成果获得验收的可能性。确认范围过程应根据需要在整个项目期间定期开展。 1. 确认范围的步骤 确认范围应贯穿项目始终。一般…

低功耗数字IC后端设计实现典型案例| UPF Flow如何避免工具乱用Always On Buffer?

下图所示为咱们社区低功耗四核A7 Top Hierarchical Flow后端训练营中的一个案例&#xff0c;设计中存在若干个Power Domain&#xff0c;其中Power Domain2(简称PD2)为default Top Domain&#xff0c;Power Domain1&#xff08;简称PD1&#xff09;为一个需要power off的domain&…

mac/windows下安装docker,minikube

1、安装docker Get Started | Docker 下载安装docker 就行 启动后&#xff0c;就可以正常操作docker了 使用docker -v 验证是否成功就行 2、安装minikube&#xff0c;是基于docker-desktop的 2.1、点击设置 2.2、选中安装&#xff0c;这个可能需要一点时间 这样安装后&…

JavaScript实现在线屏幕录制

本文主要介绍在线屏幕录制 Demo Its sole method is MediaDevices.getDisplayMedia() !移动端暂不支持 环境要求 新版本 Chrome,Edge,Firefox 桌面浏览器 常见问题 1. navigator.mediaDevices为undefined 在不安全的情况下&#xff0c;navigator.mediaDevices是undefine…

机器学习实战 —— 工业蒸汽量预测(二)

目录 文章描述背景描述数据说明数据来源实战内容2.数据特征工程2.1数据预处理和特征处理2.1.1 异常值分析2.1.2 归一化处理2.1.3 特征相关性 2.2 特征降维2.2.1 相关性初筛2.2.2 多重共线性分析2.2.3 PCA处理降维 文章描述 数据分析&#xff1a;查看变量间相关性以及找出关键变…

面试经典算法题之双指针专题

力扣经典面试题之双指针 ( 每天更新, 每天一题 ) 文章目录 力扣经典面试题之双指针 ( 每天更新, 每天一题 )验证回文串收获 392. 判断子序列 验证回文串 思路 一: 筛选 双指针验证 class Solution { public:bool isPalindrome(string s) {// 所有大写字母 > 小写 去除非字母…

深度学习中的模块化设计

模块化设计在机器学习和深度学习领域中是一个重要的概念&#xff0c;特别是在构建和改进像编码器-解码器这样的复杂模型时。以下是模块化设计如何帮助快速集成最新研究成果的一些关键点&#xff1a; 即插即用&#xff1a;模块化设计允许研究人员将新的研究成果如新的注意力机制…

掌握JavaScript面向对象编程核心密码:深入解析JavaScript面向对象机制对象基础、原型模式与继承策略全面指南,高效创建高质量、可维护代码

ECMAScript&#xff08;简称ES&#xff0c;是JavaScript的标准规范&#xff09;支持面向对象编程&#xff0c;通过构造函数模拟类&#xff0c;原型链实现继承&#xff0c;以及ES6引入的class语法糖简化面向对象开发。对象可通过构造函数创建&#xff0c;使用原型链共享方法和属…

max各种相机导出到ue4匹配镜头的工具集

总览 rollout export_UE4Cam_v2 "导出UE4Cam_v2:半自动" width:200 height:120(HyperLink explain "在打开的max文件中使用" pos:[25,12] width:200 height:15 color:(color 255 155 0) GroupBox grp1 "要导出的相机名" pos:[5,28] width:179 …

一个单例模式中使用std::unique_ptr引起的莫名其妙的COFF损坏的问题(未解决)

使用static std::unique_ptr和static std::shared_ptr都不行struct IElementAgendaEvents {//! Called to allow listeners to modify the agenda by adding/removing entries before applying tool operation. Return true if entries added or invalidated.virtual bool …

如何使用Scrapy和Python 3爬取网页

简介 网络爬虫&#xff0c;通常称为网络爬行或网络蜘蛛&#xff0c;是以编程方式浏览一系列网页并提取数据的行为&#xff0c;是处理网络数据的强大工具。 通过使用网络爬虫&#xff0c;您可以挖掘有关一组产品的数据&#xff0c;获取大量文本或定量数据以进行分析&#xff0…

1、FreeCAD概述与架构

FreeCAD介绍 FreeCAD的诞生&#xff1a;2002年10月29日&#xff0c;由Jrgen Riegel上传了版本0.0.1的初始上传。FreeCAD的维基百科页面显示&#xff0c;FreeCAD基本上是由不同强大的库组成的集合&#xff0c;其中最重要的是openCascade&#xff0c;用于管理和构建几何体&#x…

【Vue 2.x】学习vue之一基础部分

文章目录 Vue 一基础部分第一章1、git两个分支主分支子分支 使用方法方式1&#xff1a;采用命令的方式操作分支方式2&#xff1a;在idea中使用git的分支 向git远程仓库提交时忽略文件使用git时的一些冲突注意事项 2、Vue问题1&#xff1a;什么是Vue&#xff1f;问题2&#xff1…

泰勒创造力达到顶峰?(下)

上文说了一半&#xff0c;回顾看文&#xff1a; https://blog.csdn.net/weixin_41953346/article/details/138336524 继续看下文 “Like I lost my twin /Fuck it if I cant have him,"she sings in “Down Bad". 在《Down Bad》这首歌中&#xff0c;她唱道&#xff…

TiDB系列之:使用TiUP部署TiDB集群最新版本,同时部署TiCDC的详细步骤

TiDB系列之:使用TiUP部署TiDB集群最新版本,同时部署TiCDC的详细步骤 一、部署TiDB集群二、准备环境三、安装 TiUP四、安装TiUP cluster组件五、初始化包含TiCDC的TiDB集群拓扑文件六、检查和修复集群存在的潜在风险七、查看可以安装的tidb版本八、部署 TiDB 集群:九、查看集…

Activiti7 开发快速入门【2024版】

记录开发最核心的部分&#xff0c;理论结合业务实操减少废话&#xff0c;从未接触工作流快速带入开发。假设你是后端的同学学过JAVA和流程图&#xff0c;则可以继续向后看&#xff0c;否则先把基础课程书准备好先翻翻。 为什么要工作流 比起直接使用状态字段&#xff0c;工作…

工业互联网常用开源库

libopen62541 opc-ua开源库 libmodbus modbus开源库 libsocketcan can 开源库 canutils&#xff1a;ubuntu 中socket can 与can通道绑定命令ifconfig -a 查看当前can设备名如can0ip link set down can0ip link set can0 type can bitrate 5000ip link set up can0cansend ca…