Android集成MQTT教程:实现高效通信和实时消息传输

MQTT是一种基于发布/订阅模式的消息传输协议,它使用TCP/IP协议进行通信。MQTT的设计原则是轻量级、简单和可靠,适用于各种网络环境和设备。MQTT采用了订阅(Subscribe)和发布(Publish)的模式,客户端可以订阅感兴趣的主题(Topic),同时也可以发布消息到指定的主题。

接入:
一:添加MQTT依赖库 在Android项目的build.gradle文件中添加MQTT依赖库的引用,例如:复制

implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
implementation('org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0')

2:添加申请权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" /><!--mqtt协议--><service android:name=".data.mqtt.MqttService" /><service android:name="org.eclipse.paho.android.service.MqttService" /> <!--MqttService-->

3:创建Mqttservice继承自service

/*** date:2023/8/16* author:wangsimin* funcation:mqtt协议*/
public class MqttService extends Service {public static final String TAG = "MqttService";private static MqttAndroidClient client;private MqttConnectOptions conOpt;private String serverURI = "tcp://xxx.xxx.xxx:0000";   //服务器地址private String userName = "";   //账号private String passWord = "";   //密码private static String topic = "";   //订阅名private String clientId = Settings.Secure.ANDROID_ID;   //客户端IDprivate int qos = 2;@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {init();return super.onStartCommand(intent, flags, startId);}@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}private void init() {Log.i(TAG, "initMqtt");// 服务器地址(协议+地址+端口号)client = new MqttAndroidClient(App.instance(), serverURI, clientId);conOpt = new MqttConnectOptions();// 清除缓存conOpt.setCleanSession(true);// 设置超时时间,单位:秒conOpt.setConnectionTimeout(10);// 心跳包发送间隔,单位:秒conOpt.setKeepAliveInterval(20);// 用户名conOpt.setUserName(userName);// 密码conOpt.setPassword(passWord.toCharArray());try {// 设置MQTT监听并且接受消息client.setCallback(mqttCallback);} catch (Exception e) {e.printStackTrace();}// last will messageboolean doConnect = true;// 最后try {conOpt.setWill(topic, clientId.getBytes(), qos, false);} catch (Exception e) {e.printStackTrace();doConnect = false;iMqttActionListener.onFailure(null, e);}if (doConnect) {doClientConnection();}}/*** 连接MQTT服务器*/private void doClientConnection() {try {if (!client.isConnected() && isConnectIsNomarl()) {client.connect(conOpt, null, iMqttActionListener);}} catch (MqttException e) {e.printStackTrace();}}// MQTT是否连接成功IMqttActionListener iMqttActionListener = new IMqttActionListener() {@Overridepublic void onSuccess(IMqttToken arg0) {Log.i(TAG, "connect onSuccess " + topic);try {// 订阅myTopic话题,当订阅多条频道,需要遍历逐条订阅,否则有可能订阅失败client.subscribe(topic, qos, null, new IMqttActionListener() {@Overridepublic void onSuccess(IMqttToken asyncActionToken) {Log.i(TAG, "subscribe onSuccess ");}@Overridepublic void onFailure(IMqttToken asyncActionToken, Throwable exception) {exception.printStackTrace();Log.e(TAG, "subscribe onFailure ");}});} catch (MqttException e) {e.printStackTrace();}}@Overridepublic void onFailure(IMqttToken arg0, Throwable arg1) {Log.e(TAG, "connect onFailure ");arg1.printStackTrace();doClientConnection();//连接失败,重连(可关闭服务器进行模拟)}};// MQTT监听并且接受消息MqttCallback mqttCallback = new MqttCallback() {@Overridepublic void messageArrived(String topic, MqttMessage message) {Log.i(TAG, "messageArrived:" + new String(message.getPayload()));//订阅信息,接收的信息messagetry {if (TextUtils.isEmpty(new String(message.getPayload()))) {return;}} catch (Exception e) {e.printStackTrace();}}@Overridepublic void deliveryComplete(IMqttDeliveryToken arg0) {Log.e(TAG, "deliveryComplete");}@Overridepublic void connectionLost(Throwable arg0) {Log.e(TAG, "connectionLost");// 如果是登录状态 失去连接,重连doClientConnection();}};/*** 判断网络是否连接*/private boolean isConnectIsNomarl() {ConnectivityManager connectivityManager = (ConnectivityManager) this.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo info = connectivityManager.getActiveNetworkInfo();return info != null && info.isAvailable();}//发布消息 msgpublic static void publish(String msg) {try {client.publish(topic, msg.getBytes(), 2, false);} catch (MqttException e) {e.printStackTrace();}}/*** 开启服务** @param context*/public static void startService(Context context) {context.startService(new Intent(context, MqttService.class));}public static void stopService(Context context) {context.stopService(new Intent(context, MqttService.class));}@Overridepublic void onDestroy() {try {if (client != null) {client.disconnect();  //服务销毁,断开连接}} catch (MqttException e) {e.printStackTrace();}super.onDestroy();}}

最后调用即可使用

//启动服务MqttService.startService(this);

最后总结下遇到的问题
不可识别的包(32108)
解决:换了serverURI的端口号即可

相关错误码:
1=无效协议版本
2=无效客户机标识
3=代理程序不可用
4=错误的用户名或密码
5=无权连接
6=意外错误
32000=等待来自服务器的响应时超时
32100=已连接客户机
32101=已断开客户机连接
32102=客户机正在断开连接
32103=无法连接至服务器
32104=客户机未连接
32105=指定的 SocketFactory 类型与代理程序 URI 不匹配
32106=SSL 配置错误
32107=不允许通过回调方法断开连接
32108=不可识别的包
32109=已断开连接
32110=已在进行连接
32111=客户机已关闭
32200=持久性已在使用中
32201=令牌已在使用中
32202=正在进行过多的发布

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

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

相关文章

面试题-React(二):React中的虚拟DOM是什么?

一、什么是虚拟DOM&#xff1f; 虚拟DOM是React的核心概念之一&#xff0c;它是一个轻量级的JavaScript对象树&#xff0c;用于表示真实DOM的状态。在React中&#xff0c;当数据发生变化时&#xff0c;首先会在虚拟DOM上执行DOM更新&#xff0c;而不是直接操作真实DOM。然后&a…

FPGA:uart原理+tx发送模块+rx接收模块

文章目录 一、串口通信二、UART通信三、tx发送模块四、rx模块接收 一、串口通信 处理器与外部设备通信的两种方式&#xff1a; 串行通信&#xff1a; 指数据的各个位使用多条数据线同时进行传输。 并行通信&#xff1a; 将数据分成一位一位的形式在一条数据线上逐个传输。 串…

Pycharm找不到Conda可执行文件路径(Pycharm无法导入Anaconda已有环境)

在使用Pycharm时发现无法导入Anaconda创建好的环境&#xff0c;会出现找不到Conda可执行文件路径的问题。 解决 在输入框内输入D:\anaconda3\Scripts\conda.exe&#xff0c;点击加载环境。 注意前面目录是自己Anaconda的安装位置&#xff0c;之后就可以找到Anaconda的现有环…

Dubbo之DubboBootstrap源码解析

功能描述 DubboBootstrap是Dubbo的启动类&#xff0c;包含服务启动、初始化、预处理配置、销毁清理等核心功能 功能分析 核心DubboBootstrap类分析 主要成员变量分析 private static volatile DubboBootstrap instance; //缓存者启动类的实例对象&#xff0c;以static形式…

Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析

Spring之AnnotationConfigApplicationContext源码分析 源码分析 源码分析 以上一篇文章《Spring之Bean的生命周期》的代码进行源码分析 AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(SpringConfig02.class); LifeCycleBe…

第17集丨Vue中的render函数

目录 一、脚手架中不能使用template配置二、基本使用三、关于不同版本的Vue 一、脚手架中不能使用template配置 // 引入vue import Vue from vue import App from ./Appnew Vue({el:#app,template:<h1>hhh</h1>,comments:{App},})上面案例中&#xff0c;配置了temp…

电子商务的安全防范

(1)安全协议问题&#xff1a;我国大多数尚处在 SSL&#xff08;安全套接层协议&#xff09;的应用上&#xff0c;SET 协议的应用还只是刚刚试验成功&#xff0c;在信息的安全保密体制上还不成熟&#xff0c;对安全协议 还没有全球性的标准和规范&#xff0c;相对制约了国际性…

Mac 使用 rar 命令行工具解压和压缩文件

在 Mac 中常遇到的压缩文件有 zip 和 rar 格式的&#xff0c;如果是 zip 格式的 Mac 系统默认双击一下文件就能直接解压了&#xff0c;但 rar 文件就不行。 需要额外下载 rar 工具了实现。 第一步&#xff1a;下载 rar 工具 工具网址&#xff1a;https://www.rarlab.com/dow…

大语言模型之四-LlaMA-2从模型到应用

最近开源大语言模型LlaMA-2火出圈&#xff0c;从huggingface的Open LLM Leaderboard开源大语言模型排行榜可以看到LlaMA-2还是非常有潜力的开源商用大语言模型之一&#xff0c;相比InstructGPT&#xff0c;LlaMA-2在数据质量、培训技术、能力评估、安全评估和责任发布方面进行了…

微服务—远程调用(RestTemplate)

在微服务的所有框架中&#xff0c;SpringCloud脱颖而出&#xff0c;它是目前国内使用的最广泛的微服务框架 &#xff08;官网地址&#xff09;&#xff0c;它集成了各种微服务功能组件&#xff0c;并基于SpringBoot实现了这些组件的自动装配&#xff0c;从而提供了良好的开箱…

3D- vista:预训练的3D视觉和文本对齐Transformer

论文&#xff1a;https://arxiv.org/abs/2308.04352 代码: GitHub - 3d-vista/3D-VisTA: Official implementation of ICCV 2023 paper "3D-VisTA: Pre-trained Transformer for 3D Vision and Text Alignment" 摘要 三维视觉语言基础(3D- vl)是一个新兴领域&…

在 React+Typescript 项目环境中创建并使用组件

上文 ReactTypescript清理项目环境 我们将自己创建的项目环境 好好清理了一下 下面 我们来看组件的创建 组件化在这种数据响应式开发中肯定是非常重要的。 我们现在src下创建一个文件夹 叫 components 就用他专门来处理组件业务 然后 我们在下面创建一个 hello.tsx 注意 是t…

Azure共享映像库构建VM镜像

什么是Azure共享映像库 Azure共享映像库是一项在Microsoft Azure中以共享方式存储和管理映像的服务。映像是预配置的虚拟机操作系统和应用程序的快照&#xff0c;可以用来创建多个虚拟机实例。通过将映像存储在共享映像库中&#xff0c;用户可以轻松地共享映像给其他Azure订阅…

go文件基本操作

一、文件读操作 文件内容如下&#xff1a; 水陆草木之花&#xff0c;可爱者甚蕃。 晋陶渊明独爱菊。自李唐来&#xff0c;世人甚爱牡丹。 予独爱莲之出淤泥而不染&#xff0c;濯清涟而不妖&#xff0c;中通外直&#xff0c;不蔓不枝&#xff0c;香远益清&#xff0c;亭亭净植…

探索无限创造力的星辰大道,画出想象的浩瀚宇宙!-turtle

介绍 视频教程地址在此&#xff1a;https://www.bilibili.com/video/BV1Pm4y1H7Tb/ 大家好&#xff0c;欢迎来到本视频&#xff01;今天&#xff0c;我们将一同探索Python编程世界中的一个有趣而创意的库——Turtle库。无需专业绘画技能&#xff0c;你就可以轻松地用代码绘制…

【微服务技术一】Eureka、Nacos、Ribbon(配置管理、注册中心、负载均衡)

微服务技术一 技术栈图一、注册中心Eureka概念&#xff1a;搭建EurekaServer服务注册服务发现&#xff08;消费者对提供者的远程调用&#xff09; 二、Ribbon负载均衡负载均衡的原理&#xff1a;LoadBalanced负载均衡的策略&#xff1a;IRule懒加载 三、Nacos注册中心Nacos的安…

elementplus select选择框自动展开方法

select选择器下拉框自动展开显示 // 通过:name的方法可以从ref里面拿到当前选择框绑定的值来做判断 //&#xff08;仅针对于循环出来的多个选择框的情况下&#xff09; <el-select v-model"value" placeholder"Select"><el-optionref"selec…

什么是单例模式

什么是单例模式 文章目录 什么是单例模式1. 单例(单个的实例)2. 单例模式应用实例3. 饿汉式 VS 懒汉式 1. 单例(单个的实例) 所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一…

使用 useEffect 和 reactStrictMode:优化 React 组件的性能和可靠性

使用useEffect和React.StrictMode是一种优化React组件性能和可靠性的常见做法。下面是关于如何使用这两个特性的示例&#xff1a; import React, { useEffect } from react;function MyComponent() {useEffect(() > {// 在组件挂载/更新时执行的副作用代码// 可以进行数据获…

nginx介绍

Nginx是什么&#xff1f; Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力确实在同类型的网页服务器中表现较好&#xff0c;中国大陆使用ng…