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";                        //clientIdprivate EditText text;public MqttConnectOptions options;//配置  保存控制客户端连接到服务器的方式的选项集。//**************************************************************//************************************************Activity非UI操作函数@Overrideprotected 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);//连接MQTTmqtt_init_Connect();//创建页面1page1 = 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 navigationtransaction.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);               //设置心跳,30soptions.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();}}//*****************************************************//*****************************************************收到订阅消息后的处理@Overridepublic void messageArrived(String s, MqttMessage mqttMessage) throws Exception {//收到订阅消息后会执行这里topage1.Tofragment_sub(mqttMessage.toString());topage1.Tofragment_sub_topic(s);}//**********************************//*****************************发布消息后处理@Overridepublic 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;}//****************************************//*************************************释放资源@Overrideprotected void  onDestroy(){super.onDestroy();if(mqtt_client.isConnected()){try{mqtt_client.close();}catch (Exception e){e.printStackTrace();}}}//*****************************************//***********************************************获取设备AndroidIDpublic 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();}}// ********************************************************

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

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

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

相关文章

clickhouse深入浅出

基础知识原理 极致压缩率 极速查询性能 列式数据库管理 &#xff0c;读请求多 大批次更新或无更新 读很多但用很少 大量的列 列的值小数值/短字符串 一致性要求低 DBMS&#xff1a;动态创建/修改/删除库 表 视图&#xff0c;动态查/增/修/删&#xff0c;用户粒度设库…

控ID型sd生成 - AI写真

1.lora 2.dreambooth 3.串联型&#xff1a;facechain 4.串联型&#xff1a;easyphoto 5.instanceid 6.photomaker 7.ip-adapter-faceid

关于Java 中的Optional的一些事

开始 定义一个实体类User,实现get、set方法 public class User {String name;String sex;public User(String name, String sex) {this.name name;this.sex sex;}public String getName() {return name;}public void setName(String name) {this.name name;}public String…

Xinstall:专业的App下载量统计工具,让推广效果可衡量

在移动互联网时代&#xff0c;App的下载量是衡量一个应用受欢迎程度的重要指标。然而&#xff0c;很多开发者和广告主在推广App时&#xff0c;都面临着一个共同的问题&#xff1a;如何准确统计App的下载量&#xff1f;这不仅关系到推广效果的评估&#xff0c;还直接影响到广告R…

DC-1渗透测试复现

DC-1渗透测试复现 目的&#xff1a; 获取最高权限以及5个flag 过程&#xff1a; 信息打点-cms框架漏洞利用-数据库-登入admin-提权 环境&#xff1a; 攻击机&#xff1a;kali(192.168.85.136) 靶机&#xff1a;DC_1(192.168.85.131) 复现&#xff1a; 一.信息收集 扫…

Python爬虫基础快速入门

目录 前言一、什么是爬虫二、快速编写一个爬虫2.1 爬虫需要用到的库2.2 搭建项目工程2.3 安装三方库2.4 案例编写 三、爬虫实战3.1 目标分析3.2 清洗数据 四、代码改进 前言 本博客旨在分享爬虫技术相关知识&#xff0c;仅供学习和研究之用。使用者在阅读本博客的内容时&#…

Qt/C++推流组件使用说明

2.1 网络推流 公众号&#xff1a;Qt实战&#xff0c;各种开源作品、经验整理、项目实战技巧&#xff0c;专注Qt/C软件开发&#xff0c;视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发。 公众号&#xff1a;Qt入门和进阶&#xff0c;专门介绍Qt/C相关知识点学…

镗床工作台开槽的作用

镗床工作台开槽的作用主要有以下几点&#xff1a; 改善工作台的刚度和稳定性&#xff1a;开槽可以增加工作台的刚度&#xff0c;使其能够承受更大的切削力和振动力&#xff0c;提高工作台的稳定性。 方便工件夹紧和定位&#xff1a;开槽可用于夹紧和定位工件&#xff0c;使其能…

【DM8】序列

创建序列 图形化界面创建 DDL CREATE SEQUENCE "TEST"."S1" INCREMENT BY 1 START WITH 1 MAXVALUE 100 MINVALUE 1;参数&#xff1a; INCREMENT BY < 增量值 >| START WITH < 初值 >| MAXVALUE < 最大值 >| MINVALUE < 最小值…

PostgreSQL入门到实战-第十弹

PostgreSQL入门到实战 PostgreSQL数据过滤(三)官网地址PostgreSQL概述PostgreSQL中OR操作理论PostgreSQL中OR实操更新计划 PostgreSQL数据过滤(三) 了解PostgreSQL OR逻辑运算符以及如何使用它来组合多个布尔表达式。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列…

MQ之————如何保证消息的可靠性

MQ之保证消息的可靠性 1.消费端消息可靠性保证&#xff1a; 1.1 消息确认&#xff08;Acknowledgements&#xff09;&#xff1a; 消费者在接收到消息后&#xff0c;默认情况下RabbitMQ会自动确认消息&#xff08;autoAcktrue&#xff09;。为保证消息可靠性&#xff0c;可以…

Thingsboard PE智慧运维仪表板实例(二)【智慧排口截污实例】

ThingsBoard 的仪表板是一个用于可视化和监控物联网数据的重要组件。 它具有以下特点: 1. 可定制性:用户可以根据自己的需求创建各种类型的图表、表格和指标。 2. 数据可视化:以直观的方式展示设备数据,帮助用户快速了解系统状态。 3. 实时更新:实时反映设备的最新数据…

Vant DropdownMenu 下拉菜单带搜索功能

Vant DropdownMenu 下拉菜单带搜索功能 效果图&#xff1a; 上代码&#xff1a; <van-dropdown-menu active-color"#E33737"><van-dropdown-item ref"dropdownItem"><template #title><span>{{ dropdownItem.text }}</span…

PVE下安装配置openwrt和ikuai

开端 openwrt 和 ikuai 是比较出名的软路由系统。我最早接触软路由还是因为我的一个学长要改自己家里的网络&#xff0c;使用软路由去控制网络。我听说后便来了兴致&#xff0c;也在我家搞了一套软路由系统。现在我已经做完了&#xff0c;就想着写个文章记录一下。 软路由简介…

java操作linux

文章目录 远程连接服务器执行linux命令或shell脚本介绍Process的方法相关类UML 工具类基本工具类依赖第三方的工具类 远程连接服务器 java程序远程linux服务器有两个框架分别是&#xff1a;jsch与ganymed-ssh2框架。推荐使用jsch框架&#xff0c;因为ganymed-ssh2框架不支持麒…

百度驾驶证C++离线SDK V1.1 C#接入

百度驾驶证C离线SDK V1.1 C#接入 目录 说明 效果 项目 代码 下载 说明 自己根据SDK封装了动态库&#xff0c;然后C#调用。 SDK包结构 效果 项目 代码 using Newtonsoft.Json; using OpenCvSharp; using System; using System.Collections.Generic; using System.D…

C++矩阵库Armadillo出现warning solve() system is singular错误的解决

本文介绍使用C 语言的矩阵库Armadillo时&#xff0c;出现报错system is singular; attempting approx solution的解决方法。 在之前的文章中&#xff0c;我们介绍过Armadillo矩阵库在Visual Studio软件C环境中的配置方法&#xff08;https://blog.csdn.net/zhebushibiaoshifu/a…

使用midjourney搞出一套三国人物画像!

当下已进入如火如荼的全民AI时代&#xff0c;最近体验了下midjourney&#xff0c;使用它的以图生图功能生成出来一套三国人物画像&#xff0c;和大家分享下使用心得。 使用midjourney的准备工作 下载工具 使用midjourney生产图片依赖的工具和流程&#xff0c;大致如下&#…

vue3移动端H5 瀑布流显示列表

以上效果 是之前发送的改进版 waterList <template><view class"pro-cons" v-if"data.length"><view class"cons-left"><template v-for"(item, index) in data"><template v-if"(index 1) % 2 1…

NLP在搜索召回领域中的应用场景

自然语言处理&#xff08;NLP&#xff09;在搜索召回领域中的应用场景非常广泛&#xff0c;它通过理解和分析人类语言&#xff0c;提高了信息检索的准确性和效率。以下是一些具体的应用场景&#xff1a; 1. 搜索引擎优化 NLP技术可以用于优化搜索引擎的查询处理&#xff0c;通…