Android安卓使用MQTT(JAVA)

一、app目录下添加

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
1) 点击Sync Now更新依赖

2) AndroidManifest.xml文件添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>

二、 使用

1) 创建MqttConnect.java文件
package com.you.weight.mqtt;import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;import com.youlian.weight.api.Api;
import com.youlian.weight.app.DeviceStatus;import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;import java.util.ArrayList;public class MqttConnect {private String HOST;private String username;private String password;private String Tag = "MQTT";private String clientId = "";private static MqttClient mqttClient = null;private Context context;Api api = new Api();// 订阅主题public static String shutdown = "";public static String update_app = "";Handler handler = new Handler(Looper.getMainLooper());String[] topic;int[] qos = {0,0,0,0,0,0,0,0,0,0,0,0,0}; // 消息质量private static MqttConnect instance;public MqttConnect(Context context, String host, String username, String password, String clientId) {this.HOST = host;this.context = context;this.username = username;this.password = password;this.clientId = clientId;// 这里是你自己需要订阅的主题shutdown = "$oc/devices/"+username+"/user/shutdown"; // 关机update_app = "$oc/devices/"+username+"/user/update_app"; // 发送更新APPArrayList<String> topicList = new ArrayList<>();topicList.add(shutdown);topicList.add(update_app);topic = topicList.toArray(new String[0]);}/*** 单列模式,只能实例化一次* @param context* @param host* @param username* @param password* @param clientId* @return*/public static synchronized MqttConnect getInstance(Context context, String host, String username, String password, String clientId) {if (instance == null) {instance = new MqttConnect(context, host, username, password, clientId);}return instance;}/*** 客户端connect连接mqtt服务器**/public void mqttClient(){close();handler.postDelayed(new Runnable() {@Overridepublic void run() {try {MqttConnectOptions options = mqttConnectOptions(username, password);mqttClient.setCallback(new MqttInitCallback(context, HOST, username, password, clientId));mqttClient.connect(options);sub(topic,qos);uiTip("MQTT连接成功");}catch (MqttException e){uiTip("MQTT连接失败,准备重连。。。:"+e.getMessage());handler.postDelayed(new Runnable() {@Overridepublic void run() {Log.e(Tag,"开始重连。。。");mqttClient();}},3000);}}},200);}/*** 在主线程弹出消息* @param msg*/private void uiTip(String msg){Log.d(Tag,msg);handler.post(new Runnable() {@Overridepublic void run() {Toast.makeText(context.getApplicationContext(), msg, Toast.LENGTH_SHORT).show();}});}/*** MQTT连接参数设置*/private MqttConnectOptions mqttConnectOptions(String userName, String passWord)throws MqttException {mqttClient = new MqttClient(HOST, clientId, new MemoryPersistence());MqttConnectOptions options = new MqttConnectOptions();options.setUserName(userName);options.setPassword(passWord.toCharArray());options.setConnectionTimeout(10);
//        options.setAutomaticReconnect(false);options.setCleanSession(false);options.setKeepAliveInterval(60);return options;}/*** 关闭MQTT连接*/public void close(){if(mqttClient != null && mqttClient.isConnected()){try {mqttClient.close();mqttClient.disconnect();mqttClient = null;} catch (MqttException e) {Log.e(Tag,"关闭MQTT连接报错:"+e.getMessage());}}else {Log.d(Tag,"Mqtt已关闭");}}/*** 向某个主题发布消息 默认qos:1*/public static void pub(String topic, String msg) throws MqttException {MqttMessage mqttMessage = new MqttMessage();mqttMessage.setPayload(msg.getBytes());MqttTopic mqttTopic = mqttClient.getTopic(topic);MqttDeliveryToken token = mqttTopic.publish(mqttMessage);token.waitForCompletion();}/*** 向某个主题发布消息** @param topic: 发布的主题* @param msg: 发布的消息* @param qos: 消息质量    Qos:0、1、2*/public void pub(String topic, String msg, int qos) throws MqttException {MqttMessage mqttMessage = new MqttMessage();mqttMessage.setQos(qos);mqttMessage.setPayload(msg.getBytes());MqttTopic mqttTopic = mqttClient.getTopic(topic);MqttDeliveryToken token = mqttTopic.publish(mqttMessage);token.waitForCompletion();}/*** 订阅某一个主题 ,此方法默认的的Qos等级为:1** @param topic 主题*/public void sub(String topic){try {mqttClient.subscribe(topic);} catch (MqttException e) {Log.e(Tag,"MQTT主题订阅失败:" + e.getMessage());}}/*** 订阅某一个主题,可携带Qos** @param topic 所要订阅的主题* @param qos* 消息质量:0最多发送一次,不保证消息能够到达接收端,也不负责重发* 1至少发送一次,确保消息能够到达接收端,但可能会导致消息重复* 2确保消息恰好被接收一次*/public void sub(String[] topic, int[] qos){try {mqttClient.subscribe(topic, qos);}catch (MqttException e){Log.e(Tag,"订阅主题失败:"+e.getMessage());}}
}
2) 创建MqttInitCallback.java文件
package com.you.weight.mqtt;import android.content.Context;
import android.util.Log;import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;/*** MQTT回调*/
public class MqttInitCallback implements MqttCallback {private String Tag = "MqttInitCallback";private String HOST;private String username;private String password;private String clientId = "";private MqttConnect mqttConnect = null;private Context context = null;MqttInitCallback(Context context, String host, String username, String password, String clientId){this.context = context;this.HOST = host;this.username = username;this.password = password;this.clientId = clientId;}/*** 连接丢失*/@Overridepublic void connectionLost(Throwable cause) {Log.d(Tag,"mqtt连接断开,执行重连");mqttConnect = MqttConnect.getInstance(context, HOST, username, password, clientId);mqttConnect.mqttClient();}/*** subscribe订阅后得到的消息会执行到这里*/@Overridepublic void messageArrived(String topic, MqttMessage message){
//        Log.d(Tag,"topic");
//        Log.d(Tag,topic);}/*** publish发布成功后会执行到这里*/@Overridepublic void deliveryComplete(IMqttDeliveryToken token) {}
}
3) 调用
import com.you.weight.mqtt.MqttConnect;private MqttConnect mqttConnect = null;mqttConnect = MqttConnect.getInstance(MainActivity.this, host, username, password, clientId);
mqttConnect.mqttClient();

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

使用 ABBYY FineReader PDF 15 在创建或转换 PDF 时自动生成书签

使用 ABBYY 为 PDF 文件添加书签&#xff0c;可以帮助快速定位文档中的主要内容&#xff0c;也能更方便的梳理出一份文档大纲。 有很多 PDF 文件在创建时并没有编辑书签&#xff0c;这里介绍使用 ABBYY FineReader PDF 15&#xff08;Win 系统&#xff09;在 PDF 中自动添加书…

postMessageXss续2

原文地址如下:https://research.securitum.com/art-of-bug-bounty-a-way-from-js-file-analysis-to-xss/ 在19年我写了一篇文章&#xff0c;是基于postMessageXss漏洞的入门教学:https://www.cnblogs.com/piaomiaohongchen/p/14727871.html 这几天浏览mXss技术的时候&#xff…

第三周周三总结

1.给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 1&#xff1a; 输…

RuoYi-后端管理项目入门篇1

目录 前提准备 下载若依前后端 Gitee 地址 准备环境 后端数据库导入 1 克隆完成 若依后端管理后端 Gitte 地址 :若依/RuoYi-Vue 2.1 创建Data Source数据源 2.2 填写好对应的数据库User 和 Password 点击Apply 2.3 新建一个Schema 2.4 填写对应数据库名称 这边演示写的…

【I²C协议】STC89C51单片机IIC通信(代码+原理)

STC89C51单片机IIC通信 什么是IC协议特点构成 通信协议开始信号、结束信号、应答信号数据传输 代码示例 什么是IC协议 IIC,即IC&#xff0c;全称 Inter-Integrated Circuit&#xff0c;字面上的意思是集成电路之间&#xff0c;它其实是IC Bus简称&#xff0c;所以中文应该叫 集…

【Codeforces】Round 957 (Div. 3)_B. Angry Monk

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法刷题 &#x1f43e;或许会很慢&#xff0c;但是不可以停下来&#x1f43e; 文章目录 题目题解try1代码正确题解贪心策略的解释为什么不是直接合并 总结 题目 题目链接 题解 try1代码 我的思路&#xff1a;单纯模拟 循环&a…

【字幕】字幕特效入门

前言 最近两周调研了一下字幕特效的底层程序逻辑&#xff0c;因为工作内容的原因&#xff0c;就分享几个自己找的链接具体细节就不分享了&#xff0c;CSDN也是我的个人笔记&#xff0c;只记录一些简单的内容用于后续自己方便查询&#xff0c;顺便帮助一下正在苦苦查阅资料入门…

基于STC89C51单片机的烟雾报警器设计(煤气火灾检测报警)(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于STC89C51单片机的烟雾报警器设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 摘要 原理图 实物图 仿真图 元件清单 代码 系统论文 资源下载 摘要 随着现代家庭用火、…

【高中数学/指数函数、幂函数】寻找曲线y=2^x与y=x^2的三个交汇点

【问题】 找到曲线y2^x与yx^2的三个交汇点。 【难点】 指数和二次函数摆在一起没法求解。 【解答】 y2^x与yx^2的交汇点&#xff0c;即曲线y2^x-x^2的零点&#xff0c;用Canvas作图就能清晰看到三个零点的存在&#xff0c;如图。 【图一】 其中&#xff0c;2&#xff0c;…

自制连点器

B站使用教程&#xff1a;https://www.bilibili.com/video/BV1SR85e4EKw/?vd_source47eba1800d831e86d4778a128740fe73 下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1Spv_yVPFB3zoS__VL-nhaQ?pwdyxo1 提取码&#xff1a;yxo1

排序算法(4)之快速排序(1)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 排序算法(4)之快速排序(1) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…

langchain循序渐进之langchain 安装及使用

pip安装langchain pip install langchain安装langsmith(可选) langsmith官方提示是用来观察大模型复杂调用情况&#xff0c;可选项。 [LangSmith]点击注册然后把秘钥填进去就行&#xff0c;这里我略过了 export LANGCHAIN_TRACING_V2"true" export LANGCHAIN_A…

【C++】模版初阶以及STL的简介

个人主页~ 模版及STL 一、模版初阶1、泛型编程2、函数模版&#xff08;1&#xff09;概念&#xff08;2&#xff09;函数模版格式&#xff08;3&#xff09;函数模版的原理&#xff08;4&#xff09;函数模版的实例化①显式实例化②隐式实例化 &#xff08;5&#xff09;模版参…

精益六西格玛项目赋能,石油机械龙头企业质量效率双提升!

​国内某石油机械制造龙头&#xff0c;迎接挑战&#xff0c;迈向卓越&#xff0c;携手张驰咨询&#xff0c;启动精益六西格玛项目&#xff0c;开启管理革新新篇章。 在国家政策调整和市场竞争日益激烈的背景下&#xff0c;作为国内石油机械产品制造领域的龙头企业&#xff0c;…

算法 —— LRU算法

算法 —— LRU算法 LRULRU算法的工作原理&#xff1a;实现方法&#xff1a;性能考虑&#xff1a; 模拟过程splice函数对于std::list和std::forward_list基本语法&#xff1a;功能描述&#xff1a; 示例&#xff1a;注意事项&#xff1a; 如果大家已经学习过了Cache的替换算法和…

Linux——Shell脚本和Nginx反向代理服务器

1. Linux中的shell脚本【了解】 1.1 什么是shell Shell是一个用C语言编写的程序&#xff0c;它是用户使用Linux的桥梁 Shell 既是一种命令语言&#xff0c;有是一种程序设计语言 Shell是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问…

开放式耳机2024哪家品牌比较好?2024年爆火开放式耳机推荐

很多小伙伴在后台私信我&#xff0c;滴滴我说&#xff0c;最近开放式耳机这么火&#xff0c;他也想要入手一台问问我&#xff0c;有哪些开放式耳机值得现在入手的&#xff0c;作为一个尽职尽业的数码博主&#xff0c;我本来是一个个回复的&#xff0c;但是私信没想到这么多&…

[C++初阶]list的模拟实现

一、对于list的源码的部分分析 1.分析构造函数 首先&#xff0c;我们一开始最先看到的就是这个结点的结构体&#xff0c;在这里我们可以注意到这是一个双向链表。有一个前驱指针&#xff0c;一个后继指针。然后在有一个存储数据的空间 其次它的迭代器是一个自定义类型&#x…

pyinstall 打包基于PyQt5和PaddleOCR的项目为.exe

简介&#xff1a; 最近做了一个小项目&#xff0c;是基于PyQt5和PaddleOCR的。需要将其打包为.exe&#xff0c;然后打包过程中遇到了很多问题&#xff0c;也看了很多教程&#xff0c;方法千奇百怪的&#xff0c;最后也是一步一步给试出来了。记录一下&#xff0c;防止以后忘记…

CSS基础学习之元素定位(6)

目录 1、定位类型 2、取值 2.1、static 2.2、relative 2.3、absolute 2.4、fixed 2.5、stickty 3、示例 3.1、相对定位(relative) 3.2、绝对定位&#xff08;absolute&#xff09; 3.3、固定定位&#xff08;fixed&#xff09; 3.4、粘性定位&#xff08;sticky&…