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 {

    @Autowired
    private GneMqtt gneMqtt;


    private MqttClient mqttClient;

    /**
     * 在bean初始化后连接到服务器
     */
    @PostConstruct
    public 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需要实现 MqttCallbackExtended
            options.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();
        }
    }

    @PreDestroy
    public 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
     */
    @Override
    public void connectionLost(Throwable throwable) {
        log.debug("与服务器断开连接,可重连");
        throwable.printStackTrace();
    }

    /**
     * 消息到达
     *
     * @param topic       主题
     * @param mqttMessage mqtt消息
     * @throws Exception
     */
    @Override
    public 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交付令牌
     */
    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
        log.debug("发送消息成功");
    }

    /**
     * 连接完成
     *
     * @param reconnect 重新连接
     * @param serverURI 服务器uri
     */
    @Override
    public 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.mfbz.cn/a/597750.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL动态列转行

介绍​​ 在实际的数据库查询中&#xff0c;有时候我们需要将表中的动态列&#xff08;即列数不固定&#xff09;转换为行&#xff0c;以便更好地进行数据分析和展示。在MySQL中&#xff0c;可以通过使用一些技巧和函数来实现动态列转行的功能。本文将介绍怎么实现MySQL动态列…

Babylon.js 7.0开发入门教程

Babylon.js 是一个功能强大的开源 3D 引擎&#xff0c;能够使用 JavaScript 渲染交互式 3D 和 2D 图形。它是为 Web 甚至 VR 创建游戏、演示、可视化和其他 3D 应用程序的绝佳选择。Babylon.js最新版本是7.0。 Babylon.js 是免费、开源和跨平台的&#xff0c;是 Unity 和 Unre…

超实用|新能源汽车充电小程序开发,一键充电很简单!

随着城市化的加速&#xff0c;新能源汽车用户越来越多。由于电池容量和充电时间的限制&#xff0c;新能源汽车用户通常需要在城市各处寻找充电站&#xff0c;充电过程不仅需要耗费时间&#xff0c;而且对于新能源汽车用户而言&#xff0c;充电站的位置分布是否合理、充电设施的…

当下大模型的趋势以及如何让学习大模型?

当下大模型的趋势 近年来&#xff0c;随着计算能力的提升、数据量的增加以及算法的进步&#xff0c;大模型在人工智能领域展现出了显著的发展趋势。以下是截至2024&#xff0c;大模型发展的一些关键趋势&#xff1a; 参数规模持续增长&#xff1a;从OpenAI的GPT-3的1750亿参数…

如何使用 iOS系统恢复软件修复 iPhone 问题

苹果公司向世界推出了他们可以拥有的最智能的手机。但即使是 iPhone 也无法避免智能手机常见的损坏和问题。您将熟悉最常见的问题。屏幕黑屏或卡在 Apple 徽标上&#xff1b;冻结或卡在恢复模式的 iPhone。但这样的问题不胜枚举&#xff0c;每天都有 iOS 用户在他们的设备中遇到…

第八篇:深入探索操作系统架构:从基础到前沿

深入探索操作系统架构&#xff1a;从基础到前沿 1 引言 在当今这个高速发展的数字时代&#xff0c;操作系统无疑是计算机科学领域的基石之一。它不仅是计算机硬件与最终用户之间的桥梁&#xff0c;更是实现高效计算和资源管理的关键。操作系统的架构&#xff0c;即其内部结构和…

Elasticsearch:理解人工智能相似性搜索

理解相似性搜索&#xff08;也称为语义搜索&#xff09;的指南&#xff0c;这是人工智能最新阶段的关键发现之一。 最新阶段人工智能的关键发现之一是根据相似性搜索和查找文档的能力。相似性搜索是一种比较信息的方法&#xff0c;其基于含义而非关键字。 相似性搜索也被称为语…

springboot+vue+elementui实现校园互助平台大作业、毕业设计

目录 一、项目介绍 二、项目截图 管理后台 1.登录&#xff08;默认管理员账号密码均为&#xff1a;admin&#xff09; 2. 用户管理 ​编辑 3.任务管理 互助单&#xff08;学生发布&#xff09; 行政单&#xff08;教师发布&#xff09; ​编辑 审核&#xff08;退回需…

如何完美解决Outlook大文件传送问题,提升办公协作效率?

在日常工作中&#xff0c;邮件是一种常用的通信方式&#xff0c;经常用来发送各类文件&#xff0c;比如报告和文档、合同和协议、财务报表、营销资料、设计文件等。但有时文件会比较大&#xff0c;因此Outlook大文件传送时&#xff0c;会遇到附件大小受限的情况。常用的解决发送…

五分钟了解等级保护、风险评估和安全测评三者的区别和联系?

等级保护 基本概念&#xff1a;网络安全等级保护是指对国家秘密信息、法人和其他组织和公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护&#xff0c;对信息系统中使用的安全产品实行按等级管理&#xff0c;对信息系统中发生的信息安全事件…

已解决SyntaxError: EOL while scanning string literal 亲测有效!!!

已解决SyntaxError: EOL while scanning string literal 亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 报错问题解决思路解决方法 报错问题 SyntaxError: EOL while scanning string literal 这个错误通常发生在Python代码中&#xff0c;表示字符串字面量没有被正确…

打开深度学习的锁:(0)什么是神经网络?有哪些必备的知识点准备?

PS&#xff1a;每每温故必而知新 什么是神经网络&#xff1f; 一、一个单神经元的神经网络二、多个单神经元的神经网络三、到底什么是机器学习&#xff1f;&#xff08;重点&#xff09;1&#xff1a;什么是机器学习的训练&#xff1f;2&#xff1a;什么是模型&#xff1f;权重…

让网络分析更简单高效 - AnaTraf网络流量分析仪

随着互联网的迅速发展,网络流量分析已经成为IT运维人员不可或缺的重要工具。作为网络性能监测与诊断(NPMD)领域的佼佼者,AnaTraf网络流量分析仪凭借其出色的性能和易用性,正在快速占领市场。本文将为您深入解读AnaTraf,让您了解它是如何帮助企业高效管理网络的。 全流量回溯分…

苏州金龙荣获首届无人扫地机器人演示比赛“竞技领跑奖”

4月30日&#xff0c;2024年苏州市首届无人扫地机器人演示比赛在高新区思益街展开比拼。五家企业参赛在道路上实地比拼无人扫地机器人技术&#xff0c;通过清扫垃圾、识别路障等环节展现城市清洁的“未来场景”。经过角逐&#xff0c;苏州金龙的无人驾驶清扫车获得步道演示比赛“…

老旧房屋用电线路故障引起的电气火灾预防对策​

摘 要&#xff1a;在我国新农村建设方针指引下&#xff0c;农村地区的发展水平有了显著提高。在农村经济发展中&#xff0c;我们也要认识到其中存在的风险隐患问题&#xff0c;其中重要的就是火灾事故。火灾事故给农村发展带来的不利影响&#xff0c;不仅严重威胁到农村群众的生…

软件测试与管理-白盒测试-基本路径测试法

知识点&#xff1a; 1.原理 是在程序控制流图的基础上&#xff0c;通过分析控制构造的环路复杂性&#xff0c;导出基本可执行路径的集合&#xff0c;然后根据可执行路径进行测试用例设计的方法。此方法设计出的测试用例需保证被测程序的每个可执行语句至少执行一次。 2.步骤 &a…

连通“数据”,让制造变“聪明”

说起数据智能&#xff0c;你第一时间想到的是什么呢&#xff1f;是科技感十足的智慧城市&#xff1f;还是炫酷的人工智能景象&#xff1f; 数据作为企业的战略资产越来越受到重视&#xff0c;从最初的数据协助业务协同&#xff0c;转化为数据驱动业务&#xff0c;数据驱动运营…

组播应用:SW1、SW2、RT1、RT2、AC1运行PIM-SM

SW1、SW2、RT1、RT2、AC1运行PIM-SM,SW1 Vlan10为C-BSR和C-RP;SW1产品网络(PC1)启用组播,用VLC工具串流播放视频文件“1.mp4”,模拟组播源,设置此视频循环播放,组地址232.1.1.1,端口1234,实现总公司和分公司收看视频,用PC2测试。 一、SW1、SW2、RT1、RT2、AC1配置如…

CV每日论文--2024.5.7

1、Vibe-Eval: A hard evaluation suite for measuring progress of multimodal language models 中文标题&#xff1a;Vibe-Eval: 一个测量多模态语言模型进度的严格评估套件 简介&#xff1a;本文介绍了一种新的开放评估基准 Vibe-Eval,用于评估多模态对话模型的性能。 Vibe…

C++学习笔记——对仿函数的理解

文章目录 思维导图仿函数出现的逻辑仿函数使用上的巧妙 仿函数的本质仿函数的优势仿函数语法的巧妙 思维导图 仿函数出现的逻辑 我们在学习stack时会遇到一些新的问题&#xff0c;这些问题需要我们使用非类型模板参数去解决&#xff0c;即我们需要在设计类时需要有一个途径去快…
最新文章