MQTT在Android端的使用详解以及MQTT服务器搭建、Paho客户端使用

2023-11-11

前言

最近的项目中使用了MQTT来接收后端推送过来的一些数据,这篇文章来介绍下Android端如何集成使用,关于MQTT相关介绍将不再阐述。

由于光写代码不实践的接收下数据很难验证我们写的是否正确,所以我将简单介绍下如何配置个MQTT服务端,并使用工具来发送数据到服务端,使得手机端能接收到数据。话不多说直接看。

1. MQTT服务器配置

1.1 下载EMQX

下载地址

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 启动EMQX

在解压后的bin目录下打开cmd命令,输入emqx.cmd start即可启动。

如果你在启动时遇到could’t load module…,那就是因为你的路径中包含中文名导致启动不了,将该文件夹放到纯英文目录下即可启动。
在这里插入图片描述

完事后在浏览器内输入http://127.0.0.1:18083即可打开web管理界面,帐号为admin,密码为public

按如图方式将语言改为中文
在这里插入图片描述

1.3 界面说明

左侧的Clients标签下可以看到当前连接的客户端
在这里插入图片描述
左侧的Topics标签下可以看到当前订阅的主题
在这里插入图片描述

1.4 个人理解

到这服务端就算是配置完成了,你可能会问,服务端就是这,那我手机客户端怎么接收消息呢,服务端从哪里发送消息呢?其实EMQX服务是消息中间件服务,有点像是转发。一个客户端发送消息并指定主题,该消息发送到服务端,那么连接了服务端并且订阅了该主题的所有客户端就都能接收到该消息,所以我们手机客户端想要接收到消息,还需要有一端来给EMQX服务端来发送消息才行。

2. MQTT客户端软件 Paho

2.1 下载MQTT客户端软件

下载地址
在这里插入图片描述

下载勾选中的那个文件即可,下载完后解压得到paho.exe,即我们需要的客户端软件。

2.2 MQTT客户端使用

2.2.1 连接服务器

在这里插入图片描述

按如图所示步骤进行点击,1、新增一个连接,2、填写服务器地址和客户标识,这里的标识为自己定义的,服务器地址可在该地址那查看,可以看到是本地地址,端口号是1883或者11883 点击连接后可以看到连接状态变为已连接,就代表我们客户端已经连接到了EMQX。
在这里插入图片描述

2.2.2 发送消息

在这里插入图片描述

在1处填写主题名,2处填写消息然后3处点击发布,然后可以看到4处显示已发布,代表我们已经发送到服务端了。

2.2.3 订阅主题

订阅我们刚才发送消息的那个主题

在这里插入图片描述

点击1处来新增订阅,点击2处输入我们要订阅的主题,这里我们设置为刚才发布消息的那个主题,然后点击3处的订阅,可以看到历史记录那里显示已订阅。

接下来我们再发送一次该主题消息,观察历史记录

在这里插入图片描述

可以看到,当我们发布后,由于我们订阅了该主题,所以就接收到了该主题消息。

在MQTT服务端配置完成以及MQTT客户端软件测试可行后,现在来看我们的安卓端如何订阅并接收消息。

3. Andoird端集成使用

3.1 添加依赖、权限等配置

//MQTT
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'

AndroidManifest文件配置

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myfittinglife.mqttdemo">

<!--必要的三个权限-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<application
	...>
	...
	<!--添加该Service-->
	<service android:name="org.eclipse.paho.android.service.MqttService"/>
</application>

3.2 使用

3.2.1 创建MqttAndroidClient对象

var mClient: MqttAndroidClient? = null

private fun createClient() {

    //1、创建接口回调
    //以下回调都在主线程中(如果使用MqttClient,使用此回调里面的都是非主线程)
    val mqttCallback: MqttCallbackExtended = object : MqttCallbackExtended {
        override fun connectComplete(reconnect: Boolean, serverURI: String) {
            //连接成功
            Log.i(TAG, "connectComplete: ")
            showToast("连接成功")
        }

        override fun connectionLost(cause: Throwable) {
            //断开连接
            Log.i(TAG, "connectionLost: ")
            showToast("断开连接")

        }

        @Throws(Exception::class)
        override fun messageArrived(topic: String, message: MqttMessage) {
            //得到的消息
            var msg = message.payload
            var str = String(msg)
            Log.i(TAG, "messageArrived: $str")
            showToast("接收到的消息为:$str")

        }

        override fun deliveryComplete(token: IMqttDeliveryToken) {
            //发送消息成功后的回调
            Log.i(TAG, "deliveryComplete: ")
            showToast("发送成功")

        }
    }

    //2、创建Client对象
    try {
        mClient = MqttAndroidClient(this, "tcp://192.168.14.57:1883", "客户端名称,可随意")
        mClient?.setCallback(mqttCallback) //设置回调函数
    } catch (e: MqttException) {
        Log.e(TAG, "createClient: ", e)
    }
}

3.2.2 设置MQTT连接的配置信息

val mOptions = MqttConnectOptions()
mOptions.isAutomaticReconnect = false //断开后,是否自动连接
mOptions.isCleanSession = true //是否清空客户端的连接记录。若为true,则断开后,broker将自动清除该客户端连接信息
mOptions.connectionTimeout = 60 //设置超时时间,单位为秒
//mOptions.userName = "Admin" //设置用户名。跟Client ID不同。用户名可以看做权限等级
//mOptions.setPassword("Admin") //设置登录密码
mOptions.keepAliveInterval = 60 //心跳时间,单位为秒。即多长时间确认一次Client端是否在线
mOptions.maxInflight = 10 //允许同时发送几条消息(未收到broker确认信息)
mOptions.mqttVersion = MqttConnectOptions.MQTT_VERSION_3_1_1 //选择MQTT版本

3.2.3 建立连接

try {
    mClient?.connect(mOptions, this, object : IMqttActionListener {
        override fun onSuccess(asyncActionToken: IMqttToken?) {
            Log.i(TAG, "onSuccess:连接成功 ")
        }

        override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {
            Log.i(TAG, "onFailure: " + exception?.message)
        }

    })
} catch (e: MqttException) {
    Log.e(TAG, "onCreate: ", e)
}

3.2.4 订阅主题

//设置监听的topic
try {
    mClient?.subscribe("topicName", 0)
} catch (e: MqttException) {
    Log.e(TAG, "onCreate: ", e)
}

3.2.5 发送消息

try {
    var str = "要发送的消息"
    var msg = MqttMessage()
    msg.payload =str.toByteArray()
    mClient?.publish(Const.Subscribe.mTopic,msg)
} catch (e: MqttException) {
    Log.e(TAG, "onCreate: ",e )
}

3.3 最终效果

在我们的Paho MQTT Utility软件发送消息后,我们的手机端由于订阅了该主题,所以就可以接收到该消息。
在这里插入图片描述

4. 注意事项

  • 别忘记在manifest中添加service,否则在connect()的时候会报mClient为空。

    <service android:name="org.eclipse.paho.android.service.MqttService"/>
    
  • 别忘记添加localbroadcastmanager依赖,否则会报Failed resolution of: Landroidx/localbroadcastmanager/content/LocalBroadcastManager错误。

    implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
    
  • 启动emqx服务时,一定要将该文件目录放到纯英文的目录下,不能包含中文,否则会出现could't load module的错误。

5. 总结

按以上步骤即可完成最基本的功能,以上只是简单的使用,其实还可以设置用户登录名和密码、设置服务质量、重连的操作等。关于MQTT的相关内容可以看这篇文章MQTT

项目Github地址

如果本文对你有帮助,请别忘记三连,如果有不恰当的地方也请提出来,下篇文章见。

觉得不错还望老板打个赏呗,帮我买条秋裤穿 (*꒦ິ⌓꒦ີ)

6. 参考文章

在线API文档

免费的MQTT测试服务器,实测发现用不了

paho网站

阿里使用文档

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MQTT在Android端的使用详解以及MQTT服务器搭建、Paho客户端使用 的相关文章

  • Express初学之入门

    1 Express简介 基于Node的极简MVC框架 提供灵活的路由功能 提供强大的中间件机制 内核极小 扩展性很好 使用广泛 2 路由机制 Express概念 定义了Api的地址 请求 响应方式 方法 天然支持HTTP Method 中的
  • node封装传formdata数据的接口(多文件上传)

    前文 这个星期的主要完成的东西我想就是多文件上传了 这也是我第一次封装传formdata数据类型的数据 因为也是刚学不久node 很多东西都是要自己摸索的 关于这个多文件上传我也是查阅了不少的博客 也是问了学长 最后问题才得以解决 关于接口
  • ESP8266_MQTT协议

    1 了解下MQTT协议 虽然上一篇用起来了MQTT 但是并不十分了解 基本就局限于 发布主题是发送数据 订阅主题是接收数据 今天就再好好了解一下吧 分享下网页版的 MQTT协议中文版 链接 Introduction MQTT协议中文版 1
  • EMQ关闭MQTT客户端匿名认证

    本文默认已经安装并且开启emqttd 做的事是关闭MQTT客户端匿名认证并且通过username和passward认证 且有一定的Linux命令基础 环境 Ubuntu16 04 emq v3 2 1 正文 关闭匿名认证 emq安装时 默认
  • 如何解决:ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

    python编写mqtt服务时候出现如下问题 ConnectionRefusedError WinError 10061 由于目标计算机积极拒绝 无法连接 尝试了网上的很多方法都无法解决 发现主要问题在于broker没有打开 可以下载emq
  • Vue项目的部署(服务器)

    Vue项目的部署 服务器 前几天帮朋友写了一个可以动态查看地点温度的前端项目 目前已经部署上线了 访问链接点这里 服务器是朋友的 倒时候打不开会很正常 说不定又使用服务器玩大数据项目去了 效果图 图一 图二 当然 温度也都是实时跟新的 而且
  • 发送大量发布消息:正在进行中的发布过多错误

    这是泛美卫生组织异步客户端 client new MqttAsyncClient appProps getProperty mqtt broker appProps getProperty mqtt clientId new MemoryP
  • 如何使用 libmosquitto 进行编译

    我正在尝试编译 libmosquitto 网站 底部 上提供的代码示例 http mosquitto org man libmosquitto 3 html 我使用 Ubuntu 12 04 并且安装了 libmosquitto1 和 li
  • 使用 MQTT Android 服务从飞行模式重新连接

    我正在实现此处找到的 Dale Lane MQTT Android 服务示例http dalelane co uk blog p 1599 http dalelane co uk blog p 1599 这个例子对于我的特定目的来说工作得很
  • 如何在 RSMB 中配置 MQTT-SN 主题 ID

    我的问题是关于通过 MQTT SN 网关使用 MQTT 主题名称和 MQTT SN 主题 ID 来配置 RSMB 使用 Really Small Message Broker 入门 信息对于了解在将两个 Very Small Message
  • 在 Android 中使用 MQTT 的基本步骤

    我是 Android 新手 希望使用 MQTT 作为来自服务器的 Android 推送通知程序 我读过有关 MQTT 的内容 但不太了解 如果有人使用过这个库 请告诉我我必须做什么才能开始使用它 我有一个 Java 服务器 在 Window
  • MQTT 连接在 Node 中工作,但不能作为 ReactJS 组件

    当我在 nodeJS 中运行它时 我有这个 mqtt 连接工作正常 但是当我将它移动到反应组件中时 我收到此错误 WebSocket 握手期间出错 net ERR CONNECTION RESET 我读过这是由与这里的默认端口有关的事情引起
  • Cumulocity smarREST 响应模板

    我正在尝试设置 Cumulocity smartREST 响应模板以提供应用程序存储的设备对象的信息 我认为这是不可能的 但我想确认一下 因为文档很简短而且不清楚 我之前已经成功实现了测量发布模板 但我现在正在尝试执行库存获取 我已经在设备
  • 最大 MQTT 连接数

    我需要创建一个服务器场 可以处理 5 100 万个连接 5 00000 个主题 每个客户端一个 每秒处理 300k 消息 我尝试了解各种消息代理的功能 因此我目前使用两个 RHEL EC2 实例 r3 4xlarge 来获取大量可用资源 所
  • 在 mqtt.js 中发布无法访问的主题时如何捕获“访问错误”?

    我正在使用带有 mqtt js 的 node js 和 mosquitto 代理创建一个项目 在 mosquitto 配置文件中 我设置了 pwfile aclfile 来控制哪个用户可以访问哪个主题 如果用户名 密码 发布主题和订阅主题正
  • 无法在 Istio 代理后面的 k8s 中建立与 VerneMQ 集群的 mqtt 连接

    我正在设置 k8s 本地 k8s 集群 对于测试 我在使用 kubeadm 设置的虚拟机上使用单节点集群 我的要求包括在 k8s 中运行 MQTT 集群 vernemq 并通过 Ingress istio 进行外部访问 无需部署 ingre
  • 如何在 Amazon AWS Lambda 函数中发布到 MQTT 主题?

    我想要一个简单的命令 就像我在 bash 中使用的那样 将某些内容发布到 AWS Lambda 函数内的 MQTT 主题 沿着以下思路 mosquitto pub h my server com t 灯 设置 m 开 背景 我想用 Alex
  • Spring集成MQTT发布订阅多个主题

    我正在尝试构建一个订阅多个 mqtt 主题的应用程序 获取信息 处理它并形成 xml 并在处理时触发一个事件 以便这些可以发送到某个云服务器 并将成功的响应从那里发送回MQTT 通道
  • 简化情况下能否保证mqtt消息送达顺序?

    如果只有一个代理 一个发布者 一个主题和干净的会话 在这个简化的情况下 能否保证订阅者端的消息传递顺序与发布者端的发送顺序相同 会受到QoS的影响吗 Section 4 6 http docs oasis open org mqtt mqt
  • OPC-UA 的替代方案 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 作为访问由各种 PLC 组成的系统的过程数据的解决方案 是否有 OPC UA 的合适替代方案 独立于平

随机推荐

  • 数字盲打怎么练_键盘上的数字键怎么练才能盲打?

    展开全部 副键盘的数字键练习 保证数32313133353236313431303231363533e4b893e5b19e31333431363663字锁定键指示灯亮 如果没有亮 需要按一次 Num Lock 键 使小键盘区为数字输入状态
  • 2020.9.17课堂笔记(Hive数据库常用DDL操作)

    数据库基本操作database 数据库模式定义语言DDL Data Definition Language 是用于描述数据库中要存储的现实世界实体的语言 create database if not exists 数据库名 创建数据库 sh
  • java如何合并_Java中如何把两个数组合并为一个

    在Java中 如何把两个String 合并为一个 看起来是一个很简单的问题 但是如何才能把代码写得高效简洁 却还是值得思考的 这里介绍四种方法 请参考选用 一 apache commons 这是最简单的办法 在apache commons中
  • numpy找非零元素并计数 numpy.nonzero 和 numpy.count_nonzero

    numpy nonzero a Return the indices of the elements that are non zero 示例 x np array 3 0 0 0 4 0 5 6 0 np nonzero x array
  • OCR图像识别技术的JAVA实现(一)

    转自 https blog csdn net weistin article details 78839804 OCR图像识别技术的JAVA实现 最近有个需求需要用图像识别 学习记录一下 目前网络上的开源的图像识别技术有很多 例如 OCRE
  • win10系统下 VS2019点云库PCL1.12.0的安装与配置

    目录 版本信息 安装教程 环境变量设置 VS中PCL的配置 使用 PCL的简单demo PCL简介 点云库全称是Point Cloud Library PCL 是一个独立的 大规模的 开放的2D 3D图像和点云处理项目 PCL根据BSD许可
  • 微信errcode大全

    errArr 1 gt errMsg system error errDesc 系统繁忙 此时请开发者稍候再试 40009 gt errMsg Invalid image size errDesc 图片大小为0或者超过1M 40097 gt
  • oracle open resetlogs

    oracle数据库在使用alter database open resetlogs后 oracle会重置日志序列号 而且会重置 联机重做日志内容 这样做是为了防止不完全恢复后日志序列会发生冲突 所以在执行完resetlogs后 需要重新备份
  • Win7专业版 下安装ArcGIS 9.3总结

    这几天在Win7专业版下安装ArcGIS 9 3 简直逼疯我了 废话不多说 进入正题 边说遇见问题边说步骤和解决方法 1 下载破解文件 下载地址http download csdn net source 3117196 有以下文件夹 图1
  • 【目标检测】24、VarifocalNet: An IoU-Aware Dense Object Detector

    文章目录 一 背景 二 动机 三 方法 3 1 IACS IoU Aware Classification Score 3 2 Varifocal loss 3 3 Star Shaped Box Feature Representatio
  • ios-swift-导入Alamofire出坑

    前言 在最近的swift项目中要用到网络请求 就用到了Alamofire网络库 是AFNetworking库的swift版本 将Alamofire利用Cocoapods导入到项目里面 总是下载不了新的版本 下载不了新的版本就是报错 我用的x
  • Jenkins 配置邮件通知

    1 安装邮件插件 通过系统管理 管理插件 可选插件 选择Email Extension Plugin插件进行安装 2 系统配置 系统管理 系统设置
  • MyBatis和Spring整合+Spring扩展

    ctrl shift t搜索类 ctrl o查看所有的属性和方法 ctrl t查看继承体系 jar包版本需要一致 MyBatis和Spring整合 在配置文件中 不要写空格 空格也会被解析 JavaSE基础内容 Java语法阶段 Java是
  • Cookie 和 Session 的工作流程(模拟网页登录)

    目录 今日良言 欲望以提升热忱 毅力以磨平高山 一 Cookie 和 Session的工作流程 二 模拟网页登录 三 Cookie 和 Session的区别和联系 1 联系 2 区别 今日良言 欲望以提升热忱 毅力以磨平高山 一 Cooki
  • java base64转Binary

    java base64转Binary Base64转byte byte bytes DatatypeConverter parseBase64Binary base64字符串 byte 转base64 String base64Str Da
  • Unity3d 按钮控制视频播放暂停

    有好几个办法 这边选择最简单的办法 创建一个游戏物体 啥都行 组件就是孙悟空的技能 我让游戏物体有啥技能就加啥组件 这里创建了个Quad平面 直接给他添加了组件叫Video Player 任何组件都有对应的类来存放它 直接把放到Unity
  • MyBatis复杂sql:多对一处理(association)和一对多(collection)

    多对一 association标签 老师和学生的例子 以学生为出发点 就是一个多对一的例子 即多个学生关联一个老师 首先搭建数据库 CREATE TABLE teacher id INT 10 NOT NULL name VARCHAR 3
  • 帮我用python写一个一组因变量和一组自变量的网络模型

    答 我可以帮你用Python实现一个网络模型 它可以实现一组自变量和一组因变量之间的关系 首先 你需要定义一个合理的损失函数 然后设计一个网络拓扑结构 用于连接输入和输出层 然后 你可以使用Python中的优化函数来最小化损失函数 以获得最
  • uniapp获取当前路由地址

    uniapp微信小程序获取当前路由地址 最近开发中有跳过或者返回的需求 所以需要获取到当前页面的路径 建议将代码放到公共js里面 所有也能均可调用 getCurrentRouter let routes getCurrentPages 获取
  • MQTT在Android端的使用详解以及MQTT服务器搭建、Paho客户端使用

    前言 最近的项目中使用了MQTT来接收后端推送过来的一些数据 这篇文章来介绍下Android端如何集成使用 关于MQTT相关介绍将不再阐述 由于光写代码不实践的接收下数据很难验证我们写的是否正确 所以我将简单介绍下如何配置个MQTT服务端