Android 接入MQTT服务器

加入MQTT库

加入库可以直接下载对应的jar包,也可以在build.gradle里导入,然后加载进入。

这里直接在build.gradle加库

dependencies {

    implementation(libs.appcompat)
    implementation(libs.material)
    implementation(libs.activity)
    implementation(libs.constraintlayout)
    testImplementation(libs.junit)
    androidTestImplementation(libs.ext.junit)
    androidTestImplementation(libs.espresso.core)
//   MQTT库
    implementation("org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5")
    implementation("org.eclipse.paho:org.eclipse.paho.android.service:1.1.1")



}

然后它还需要一些网络权限

在AndroidManifest.xml中加入

    <!-- 获取网络权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!-- 获取网络权限 -->

还要加入下面这个,啥作用不知道,别人加我也加的。

      <service android:name="org.eclipse.paho.android.service.MqttService">
        </service>

连接MQTT服务器

Activity 我是在Activity里面连接MQTT服务器的,然后采用回调函数的形式获取订阅信息的。

在Fragment里面连接时,总会断开重连,别问我为什么,我也不知道,我自己试出来的,不懂原理。

package com.example.myapplication;

//import android.graphics.drawable.Drawable;
import android.content.Context;
import android.os.Bundle;
import android.provider.Settings;
import android.widget.EditText;
//import android.widget.Toast;
//import android.view.View;
//import android.widget.Button;
//import android.widget.ImageView;
import androidx.activity.EdgeToEdge;
//import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
//import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.fragment.app.Fragment;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
//import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;


public class MainActivity extends AppCompatActivity {

    //************************参数定义******************
    private  fragment_page1 page1;
    private FragmentManager fragmentManager;
    private  FragmentTransaction fragmentTransaction;

    private Activitytopage1 topage1;
    public MqttClient mqtt_client;                         //创建一个mqtt_client对象

    String mqtt_sub_topic = "xxxx";          //需要订阅的主题
    private String serverUri = "tcp://xxxxx:1883";    //这里可以填上各种云平台的物联网云平台的域名+1883端口号,什么阿里云腾讯云百度云天工物接入都可以,
    // 这里我填的是我在我的阿里云服务器上搭建的EMQ平台的地址,
    // 注意:前缀“tcp://”不可少,之前我没写,怎么都连不上,折腾了好久
    private String userName = "xxxx";                    //然后是你的用户名,阿里云腾讯云百度云天工物接入这些平台你新建设备后就自动生成了
    private String passWord = "xxxxxx";                    //用户名对应的密码,同样各种云平台都会对应生成密码,这里我的EMQ平台没做限制,所以用户名和密码可以随便填写
    private String clientId = "xxxx";                        //clientId

    private EditText text;
    public MqttConnectOptions options;//配置  保存控制客户端连接到服务器的方式的选项集。
    //**************************************************************



    //************************************************Activity非UI操作函数
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);

        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        //获取手机ID作为唯一标识
        clientId = getAndroidID(this);


        //连接MQTT
        mqtt_init_Connect();
        //创建页面1
         page1 = new fragment_page1();
         //添加fragment管理器
         fragmentManager = getSupportFragmentManager();
         //添加fragment切换器
         fragmentTransaction = fragmentManager.beginTransaction();
         //切换页面
         fragmentTransaction.replace(R.id.fragment_container,page1);
         //提交切换
         fragmentTransaction.commit();

        try
        {
            //订阅主题
            mqtt_client.subscribe(mqtt_sub_topic,2);
        }
        catch (MqttException e)
        {
            // 处理异常,例如打印堆栈跟踪或执行其他恢复操作
            e.printStackTrace();

        }

    }
    //***********************************************




    //********************给fragment调用用于自己切换页面切换函数
    public void replaceFragment(Fragment fragment)
    {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.fragment_container, fragment);
        transaction.addToBackStack(null); // Optional: Add to back stack for navigation
        transaction.commit();
    }
    //*********************************************



    //******************************************************MQTT连接函数
    public void mqtt_init_Connect()
    {
        try {
            //实例化mqtt_client,填入我们定义的serverUri和clientId,然后MemoryPersistence设置clientid的保存形式,默认为以内存保存
            mqtt_client = new MqttClient(serverUri,clientId,new MemoryPersistence());
            //创建并实例化一个MQTT的连接参数对象
            options = new MqttConnectOptions();
            //然后设置对应的参数
            options.setUserName(userName);                  //设置连接的用户名
            options.setPassword(passWord.toCharArray());    //设置连接的密码
            options.setConnectionTimeout(60);               // 设置超时时间,单位为秒
            options.setKeepAliveInterval(60);               //设置心跳,30s
            options.setAutomaticReconnect(true);            //是否重连
            //设置是否清空session,设置为false表示服务器会保留客户端的连接记录,设置为true表示每次连接到服务器都以新的身份连接
            options.setCleanSession(false);


            //****************************************************设置回调
            mqtt_client.setCallback(new MqttCallback() {
                @Override
                //*****************************突发断开重连
                public void connectionLost(Throwable throwable) {
                    //连接丢失后,一般在这里面进行重连
                    topage1.Tofragment_other("断开重连");
                    try {
                        mqtt_client.reconnect();
                        topage1.Tofragment_other("断开重连成功");
                    } catch (MqttException e) {
                        // 处理异常,例如打印堆栈跟踪或执行其他恢复操作
                        topage1.Tofragment_ERR("断开重连异常");
                        e.printStackTrace();
                    }

                }
                //*****************************************************


                //*****************************************************收到订阅消息后的处理
                @Override
                public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
                    //收到订阅消息后会执行这里
                   topage1.Tofragment_sub(mqttMessage.toString());
                   topage1.Tofragment_sub_topic(s);
                }
                //**********************************

                //*****************************发布消息后处理
                @Override
                public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
                    //publish后会执行到这里
                }
                //*****************************
            });

            //连接mqtt服务器
            mqtt_client.connect(options);
        }
        catch (Exception e)
        {
            topage1.Tofragment_ERR("MQTT连接异常");
            e.printStackTrace();

        }
    }
    //****************************************************



    //****************************************接口回调函数
    public void Activitytopage1_callback(Activitytopage1 callback){
        topage1 = callback;
    }
    //****************************************



    //*************************************释放资源
    @Override
    protected void  onDestroy(){
        super.onDestroy();
        if(mqtt_client.isConnected()){
            try{
                mqtt_client.close();
            }catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
    //*****************************************


    //***********************************************获取设备AndroidID
    public static String getAndroidID(Context context) {
        return Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
    }
    //***********************************************
    
};




发布函数:

我自己进行了一层小封装

    // **********************发布***********************************
    public  void my_publish(String mytopic ,byte[] mypayload){

        try {
            //发布信息
            activity.mqtt_client.publish(mytopic, mypayload, qos, retained);

            Toast.makeText(getContext(),"发布成功",Toast.LENGTH_SHORT).show();
            log.setText("发布成功");

        } catch (MqttException e) {
            // 处理异常,例如打印堆栈跟踪或执行其他恢复操作
            e.printStackTrace();
            Toast.makeText(getContext(),"发布失败",Toast.LENGTH_SHORT).show();
            err.setText("发布失败");
        }

    }
    // ********************************************************

订阅:

 // **********************订阅***********************************
    public  void my_sub(String mytopic_sub ){
        try {
            activity.mqtt_client.subscribe(mytopic_sub,2);
        }catch (MqttException e)
        {
            e.printStackTrace();
        }
    }
    // ********************************************************

这里模拟的远程控制灯泡开关,的例子。

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

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

相关文章

【k8s】:深入理解k8s中的亲和性(Affinity)及其在集群调度中的应用

【k8s】&#xff1a;深入理解k8s中的亲和性&#xff08;Affinity&#xff09;及其在集群调度中的应用 1、什么是亲和性&#xff1f;2、节点亲和性&#xff08;Node Affinity&#xff09;2.1 硬性节点亲和性规则&#xff08;required&#xff09;2.2 软性节点亲和性规则&#xf…

如何制作二维码电子画册?轻松入门,快速上手!

在当今数字化时代&#xff0c;二维码电子画册成为了企业推广和信息传递的重要工具之一。相比传统纸质画册&#xff0c;二维码电子画册不仅环保节能&#xff0c;而且可以通过扫描二维码轻松获取更多详细信息&#xff0c;为用户提供了更加便捷的阅读体验。 今天就教大家如何制作二…

【Java开发指南 | 第三篇】Java 空行、强制类型转换及基本数据类型

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 Java 空行强制类型转换Java 基本数据类型内置数据类型引用类型 Java 空行 空白行或者有注释的行&#xff0c;Java 编译器都会忽略掉。 强制类型转换 当需要将一个数据类型转换为另一个数据类型时&#xff0c…

浅尝 express + ORM框架 prisma 的结合

一、prisma起步 安装&#xff1a; npm i prisma -g查看初始化帮助信息&#xff1a; prisma init -h查看初始化帮助信息结果&#xff1a; Set up a new Prisma projectUsage$ prisma init [options] Options-h, --help Display this help message --datasource-provider …

Intewell-Hyper II_V2.1.1_工业实时操作系统软件版本发布

Intewell-Hyper II_V2.1.1_工业实时操作系统软件版本发布 Intewell-Hyper II_V2.1.1 版本号&#xff1a;V2.1.1 版本特点 新增V1.3.2分支上SHV构型合并及问题回归 版本或修改说明 增加功能&#xff1a; 1.V1.3.2分支上SHV构型合并及问题回归 2.适配NewPre3102和NewPre3101…

node+vue3的websocket前后端消息推送

nodevue3的websocket前后端消息推送 前期写web项目时&#xff0c;前端获取数据的方式一般是向后端发起数据请求&#xff0c;然后后端向前端发送数据&#xff0c;然后对数据进行渲染&#xff0c;这是最常规的一种数据通讯方式&#xff0c;适用于绝大部分前后端分离的项目 实际…

java的ConcurrentHashMap深入理解

概要 怎么保证线程安全&#xff1a; 在初始化数组时用了cas操作&#xff0c;sizectl作为占位标志(U.compareAndSwapInt(this, SIZECTL, sc, -1&#xff09;&#xff1b;获取数组中的元素是否已经有了&#xff0c;用Volatile修饰数组&#xff08;保证可见性&#xff09;&#…

边缘计算网关有哪些优势?-天拓四方

随着信息化、智能化浪潮的持续推进&#xff0c;计算技术正以前所未有的速度发展&#xff0c;而边缘计算网关作为其中的重要一环&#xff0c;以其独特的优势正在逐步改变我们的生活方式和工作模式。本文将详细解析边缘计算网关的优势。 首先&#xff0c;边缘计算网关具有显著的…

【好书推荐6】《Excel函数与公式应用大全for Excel 365 Excel 2021》

【好书推荐6】《Excel函数与公式应用大全for Excel 365 & Excel 2021》 写在最前面《Excel函数与公式应用大全for Excel 365 & Excel 2021》关键点内容简介作者简介前言/序言目录 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&…

Linux之命令行参数的原理以及实现,环境变量限时增加删除和永久增加删除以及代码获取环境变量

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 一.命令行参数 1.1main函数参数 在我们学习c语言时我们的main函数…

Vue - 5( 16000 字 Vue2 入门级教程)

一&#xff1a;Vue 初阶 1.1 组件自定义事件 在 Vue 中&#xff0c;组件间通过自定义事件进行通信是一种常见的模式。自定义事件允许子组件向父组件发送消息&#xff0c;也可以在组件内部进行事件的绑定、触发和解绑。让我们详细讲解这些知识点。 1.1.1 组件自定义事件 在 …

最前沿・量子退火建模方法(2) : Domain wall encoding讲解和python实现

前言 上篇讲的subQUBO属于方法论&#xff0c;这次讲个通过编码量子比特的方式&#xff0c;同样的约束条件&#xff0c;不同的编码&#xff0c;所需的量子比特数是不同的。有的编码方式&#xff0c;很节省量子比特。比如&#xff0c;这次要讲的Domain wall encoding。 一、Doma…

一文总结:Python的封装、继承和多态

整个程序员的生涯&#xff0c;最重要的一个知识根基就是面向对象的理解和掌握深度。如果你意识到了面向对象开发思想的重要性&#xff0c;请仔细学习这篇文章。 希望对你有帮助&#xff01; 这篇详细地解释封装、继承和多态&#xff0c;并在最后提供一个综合示例来总结这三个…

PyQt介绍——弹框介绍和使用

PyQt介绍——弹框介绍和使用 一、QMessageBox QMessageBox是一种通用的弹出式对话框&#xff0c;用于显示消息&#xff0c;允许用户通过单击不同的标准按钮对消息进行反馈 QMessageBox类提供了许多常用的弹出式对话框&#xff0c;如提示、警告、错误、询问、关于等对话框。这…

Hyper-v 新建 Windows 虚拟机卡在“Press any key to boot from CD or DVD...,无法按下任何按键

Hyper-v 新建 Windows 虚拟机卡在“Press any key to boot from CD or DVD…&#xff0c;无法按下任何按键 在显示这个界面之后点击启动&#xff0c;之后立刻狂按F2&#xff0c; 然后就能进去了

​代码混淆的原理是什么?常见代码混淆方法介绍

本文主要想你介绍代码混淆的原理&#xff0c;常见代码混淆方法&#xff0c;欢迎查阅~ 移动应用代码安全非常重要&#xff0c;代码逆向会导致代码逻辑被获取&#xff0c;进一步导致控制流被hook&#xff0c;安全防线被破&#xff0c;给APP安全带来巨大风险&#xff0c;因此开发者…

淘宝扭蛋机小程序:扭转购物新风尚,开启惊喜连连之旅

随着移动互联网的飞速发展&#xff0c;淘宝作为国内领先的电商平台&#xff0c;始终致力于为用户带来更加新颖、有趣的购物体验。如今&#xff0c;我们隆重推出淘宝扭蛋机小程序&#xff0c;将传统扭蛋机的乐趣与电商购物的便捷完美结合&#xff0c;为用户带来前所未有的惊喜与…

PyTorch构建自然语言处理模型

一、整体流程 二、 详细步骤 1. 准备数据 在构建自然语言处理模型之前&#xff0c;首先需要准备数据。可以使用PyTorch提供的Dataset和DataLoader类来加载和处理数据。 # 导入必要的库 import torch from torch.utils.data import Dataset, DataLoader # 定义自定义Dataset类…

Linux进程控制篇

1. 进程创建 fork()函数创建一个进程&#xff1a; 父进程返回子进程的pid子进程返回0 创建进程后&#xff0c;我们希望子进程做的事有两种&#xff1a; 子进程帮父进程完成同样的工作子进程干其他任务 进程 内核的相关管理数据结构(tack_struct mm_struct 页表) 代码和数据…

python零基础入门笔记【源源老师】

1. print() 输出 &#xff08;1&#xff09;认识英文单词 print: 输出&#xff08;2&#xff09;print() 的作用 print()&#xff1a;用于在控制台上输出你想要的内容。 &#xff08;3&#xff09;代码演示 举例1&#xff1a; 【注意&#xff1a;】用双引号包裹的&#xff0…