【Android】MQTT

news2024/11/17 7:38:12

目录

  • MQTT 协议
    • 简介
    • 应用场景
    • 优点
    • 缺点
  • 部署服务端
    • 下载安装包
    • 启动服务器
  • 搭建客户端
    • 下载SDK
    • 添加依赖
    • 配置MQTT服务和权限
    • 建立连接
    • 订阅主题
    • 发布消息
    • 取消订阅
    • 断开连接
  • MQTT客户端工具
  • 最终效果
  • 实现传感器数据采集与监测功能思路

MQTT 协议

简介

MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅模式的轻量级消息传输协议,专门针对低带宽、和不稳定网络环境的物联网应用而设计,它可以用极少的代码为互联网设备提供实时可靠的消息服务。

应用场景

MQTT 协议主要用于物联网和移动设备等资源有限的场景中,其中包括物联网、移动互联网、智能硬件、车联网、智慧城市、远程医疗、电力、石油与能源等领域。案例例如:智能家居设备的控制与监控、传感器数据采集与监测、安防监控系统等。

优点

  • 是一种低带宽占用的即时通讯协议,在低带宽和不稳定的网络环境中也能较好地工作。
  • 针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。
  • 简单轻量,相比于其他传输协议,其代码占用内存少,对硬件要求低,适用于受限环境和低带宽网络。
  • 通过发布-订阅架构,实现了实时可靠的消息服务,并且具有 QoS 服务质量,能够保证消息的可靠传输。

QoS:是MQTT中消息传输的可靠性等级,由低到高分别是:

  • QoS0:最多一次。消息尽力发送一次,但不保证一定会被接收。
  • QoS1:至少一次。消息至少发送一次,但可能会被接收多次。
  • QoS2:有且仅有一次。消息只发送一次,且只会被接收一次

缺点

  • 不提供扩展性的支持,需要使用其他技术来实现分布式消息传递和扩展性。
  • 没有提供加密和身份验证机制。如果需要安全通信,则需要使用TLS/SSL等其他协议。
  • MQTT是一种轻量级的协议,但在高并发和大规模消息传递的环境中,可能会面临性能瓶颈。此外,在使用较高的QoS级别时,可能会导致更多的网络流量和延迟,从而影响系统的性能。

分布式:是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理,可以提供高性能、高可用性和弹性的计算和数据处理能力,满足不同规模和复杂度的应用需求。
TLS/SSL:详情请看文章👉 SSL/TLS 整理

部署服务端

话说在前,本文使用的是 EMQ 集成好的 MQTT 协议,使用起来相当简单,由于我的服务器即将到期,又没有续费的打算,我这里是在我的电脑上部署,如果你只是想着体验体验 MQTT ,跟着搞,准没错。

下载安装包

MQTT 支持部署在 Docker、Debian、Ubuntu、CentOS/RHEL、macOS、Kubernetes、Windows以及源码编译安装,小编电脑使用的是 Windows 系统,使用 Windows 下载 方式👉 前往下载所有版本的EMQX

如果没有服务器,你可以考虑部署在你的自用电脑上。

启动服务器

Windows 版本的 EMQX 下载完成后,解压文件,打开解压后的 bin 目录,使用 CMD 命令启动 EMQX。

# 解压后的 emqx 文件位于 D:\Softwares\emqx-5.2.0-windows-amd64\bin 目录下,因此使用 CMD 命令如下
D:\Softwares\emqx-5.2.0-windows-amd64\bin>emqx start

PS:EMQX 是部署在自用电脑上,当电脑重启时,需要重新启动 EMQX 服务。

完成这一步,打开浏览器,在地址栏输入 http:// 服务器IP :18083/ ,能打开服务器网页即完成部署。

在这里插入图片描述

搭建客户端

下载SDK

客户端,小编使用 Android 的Kotlin进行开发,MQTT 客户端 SDK 截止目前,已支持除 Android 外的 16 种 SDK,可根据自身需求不同,选择适合自身需求的开发包 👉 MQTT SDKs 下载
在这里插入图片描述

添加依赖

打开项目的 build.gradle 文件,添加 Eclipse Paho Java Client 和 Eclipse Paho Android Service 依赖到 dependencies ,并 Sync Now

dependencies {
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.4'
    implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' 
}

配置MQTT服务和权限

打开项目的 AndroidManifest.xml 文件,加入以下配置。

<manifest>
	<uses-permission android:name="android.permission.INTERNET" />
	<!--  指示应用程序需要让设备保持开启状态的机制,通常配合 WakeLock 一起使用  -->
	<uses-permission android:name="android.permission.WAKE_LOCK" />
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

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

建立连接

// 如果你使用的也是自用电脑搭建的 MQTT 服务器,则需要想办法使移动设备、物联网设备与服务器处于同一网段下(例如:自用电脑和设备连接同一个WiFi),否则无法连接上
val serverURI = "tcp://服务器IP:1883"
val username = "服务器账号"
val password = "服务器密码"
private lateinit var mqttClient: MqttAndroidClient

fun connect(context: Context) {
	mqttClient = MqttAndroidClient(context, serverURI, "kotlin_client")
	mqttClient.setCallback(object : MqttCallback {
	    override fun messageArrived(topic: String?, message: MqttMessage?) {
	        Log.d(TAG, "Receive message: ${message.toString()} from topic: $topic")
	    }
	
	    override fun connectionLost(cause: Throwable?) {
	        Log.d(TAG, "Connection lost ${cause.toString()}")
	    }
	
	    override fun deliveryComplete(token: IMqttDeliveryToken?) {
	
	    }
	})
	val options = MqttConnectOptions()
	options.userName = username
	options.password = password.toCharArray()
	
    mqttClient.connect(options, null, object : IMqttActionListener {
	    override fun onSuccess(asyncActionToken: IMqttToken?) {
	        Log.d(TAG, "Connection success")
	    }
	
	    override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {
	        Log.d(TAG, "Connection failure")
	    }
	})
}

订阅主题

mqttClient.subscribe(topic, qos, null, object : IMqttActionListener {
    override fun onSuccess(asyncActionToken: IMqttToken?) {
        Log.d(TAG, "Subscribed to $topic")
    }

    override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {
        Log.d(TAG, "Failed to subscribe $topic")
    }
})

发布消息

mqttClient.publish(topic, message, null, object : IMqttActionListener {
    override fun onSuccess(asyncActionToken: IMqttToken?) {
        Log.d(TAG, "$msg published to $topic")
    }

    override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {
        Log.d(TAG, "Failed to publish $msg to $topic")
    }
})

取消订阅

mqttClient.unsubscribe(topic, null, object : IMqttActionListener {
    override fun onSuccess(asyncActionToken: IMqttToken?) {
        Log.d(TAG, "Unsubscribed to $topic")
    }

    override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {
        Log.d(TAG, "Failed to unsubscribe $topic")
    }
})

断开连接

mqttClient.disconnect(null, object : IMqttActionListener {
    override fun onSuccess(asyncActionToken: IMqttToken?) {
        Log.d(TAG, "Disconnected")
    }

    override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {
        Log.d(TAG, "Failed to disconnect")
    }
})

MQTT客户端工具

至此,代码写完,我们可以使用 EMQ 提供的MQTT客户端工具和我们的应用进行测试。

点击下载 👉 MQTT 客户端工具

如果你只是抱着试一试的心态去了解MQTT,那么,你可以使用 EMQX MQTT Cloud 运营和维护的免费公共 MQTT 服务器, EMQX Cloud 是由 EMQ 推出的安全的 MQTT 物联网云服务平台,它提供一站式运维代管、独有隔离环境的 MQTT 5.0 接入服务。相关信息如下:

  • Broker:broker.emqx.io
  • TCP Port:1883
  • Websocket Port:8083

在这里插入图片描述

最终效果

同时使用 MQTTX 和 Android 客户端的最终效果如下所示:

在这里插入图片描述

实现传感器数据采集与监测功能思路

在文章开头我们有提到,MQTT 应用场景有包含 传感器数据采集与监测 一项,但经过我这段时间的研究,其实 MQTT 只是实现了设备消息的传递,并不能直接使用 MQTT 去对传感器数据进行采集与检测,实现传感器数据采集与监测这一功能,应该是传感器的事情,当传感器监测到设备数据有异常时,通过 MQTT 发送数据到服务端,再由服务端对接收到的异常数据进行处理。如图:
在这里插入图片描述

参考文献 & 资料来源

1、为什么智能硬件首选MQTT
2、MQTT 客户端库 & SDKs 下载
3、Android 使用 Kotlin 连接 MQTT
4、创建 MQTT 连接时如何设置参数?
5、MQTT 协议入门:基础知识和快速教程
6、物联网首选协议,关于 MQTT 你需要了解这些
7、MQTT在Android端的使用详解以及MQTT服务器搭建、Paho客户端使用

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

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

相关文章

【目标跟踪】多目标跟踪测距

文章目录 前言python代码&#xff08;带注释&#xff09;main.pysort.pykalman.pydistance.py 结语 前言 先放效果图。目标框内左上角&#xff0c;显示的是目标距离相机的纵向距离。目标横向距离、速度已求出&#xff0c;没在图片展示。这里不仅仅实现对目标检测框的跟踪&#…

【Django restframework】django跨域问题,解决PUT/PATCH/DELETE用ajax请求无法提交数据的问题

【Django restframework】django跨域问题&#xff0c;解决PUT/PATCH/DELETE用ajax请求无法提交数据的问题 1 问题描述&#xff1a; 我用restframework(ModelSerializerGenericApiView)开发了一组符合RestFul接口标准的接口&#xff0c;这意味着它将支持客户端发来的GET、POST、…

矢量图形编辑软件 illustrator 2023 mac 中文软件特点

illustrator 2023 mac是一款矢量图形编辑软件&#xff0c;用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator 2023 mac软件特点 矢量图形&#xff1a;illustrator创建的图形是矢量图形&#xff0c;可以无限放大而不失真&#xff0c;这与像素图形编辑软…

【接口测试】Jmeter接口实战-Dubbo接口+造10W数据测试(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Windows环境通…

Harmony 个人中心(页面交互、跳转、导航、容器组件)

个人中心 前言正文一、创建工程二、登录① 更换启动页面② 拓展修饰符③ 页面跳转④ 等待进度条 三、导航栏四、首页① 轮播图② 网格列表 五、我的① 带参数跳转 六、源码 前言 今天是1024&#xff0c;祝各位程序员们&#xff0c;钱多事少离家近&#xff0c;不秃也强bug黄。在…

Plooks大型视频在线一起看网站源码

在前段时间&#xff0c;因为想和异地的朋友一起看电影&#xff0c;但是发现有电影的地方没有一起看功能&#xff0c;有一起看功能的视频网站没有电影&#xff0c;所以就想自己做一个一起看网站&#xff0c;于是就有了Plooks。 Plooks是一个完整的视频网站&#xff0c;其中包括…

linux驱动的IO 模型(高级字符设备一)

IO 是英文 Input 和 Output 的首字母&#xff0c;代表了输入和输出。操作系统&#xff08;Linux&#xff09;负责对计算机的资源进行管理和对进程进行调度&#xff0c;应用程序运行在操作系统上&#xff0c;处于用户空间。应用程序不能直接对硬件进行操作&#xff0c;只能通过操…

uniapp把文件中的内复制到另一个文件中

使用的是Html 5的plus.io.resolveLocalFileSystemURL方法&#xff0c;文档&#xff1a;HTML5 API Reference var soursePath file:///storage/emulated/0/a/;//用于读取var removePath file:///storage/emulated/0/w/;//用于移除w这个文件夹var targetPath file:///storage/…

03初始Docker

一、初始Docker 1.什么是Docker 问题 ①大型项目组件复杂&#xff0c;运行环境复杂&#xff0c;部署时依赖复杂&#xff0c;出现兼容性问题。 ②开发&#xff0c;测试&#xff0c;生产环境有差异。不同的环境操作系统不同 解决 ①Docket将应用、依赖、函数库、配置一起打…

ChatGPT AIGC 完成 Excel多条件求和操作

企业产品销售额是企业在一定时间内通过销售其产品获取的收入总额。 这个指标通常用于衡量企业的销售能力、市场占有率以及企业的健康度。企业产品销售额具体的计算方法是将企业在销售商品或服务时所取得的所有收入加总而得出。 在这个过程中,通常会考虑到可能存在的退货、折…

基于nodejs+vue备忘记账系统mysql

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

上传和下载文件到google drive/Local pc

1 上传 参考&#xff1a;使用 Python 将文件上传到 Google 云端硬盘_迹忆客 Upload file to google drive using Python - CodeSpeedy (没起作用&#xff0c;但可以参考一下) 第 1 步&#xff1a;Google API Playground 我们可以通过搜索 Google 找到更多关于 Google API Pla…

Linux 开机启动一条PHP命令

当你开机的时候要自动的启动一条PHP命令场景&#xff1a;比如webman 你需要手动启动项目进程 你可以这样操作 流程&#xff1a; 1、准备好你要执行的命令 2、将命令写入一个服务文件 3、开机自启这个服务 实例&#xff1a; 1、比如这个命令 /usr/local/php/bin/php /ho…

Class类文件中的“咖啡宝贝”

Class文件是一组以8个字节为基础单位的二进制流&#xff0c;各个数据项目严格按照顺序紧凑地排列在文件之中&#xff0c;中间没有添加任何分隔符&#xff0c;整个Class文件中存储的内容几乎全部是程序运行的必要数据&#xff0c;没有空隙存在。 字节码&#xff08;Byte Code&am…

11、Python -- 列表去重的三种方法

目录 方法1&#xff1a;新列表搜集方法2&#xff1a;利用set集合方法3&#xff1a;使用itertools模块 新列表搜集法 使用set集合去重 使用itertools模块的groupby函数去重 方法1&#xff1a;新列表搜集 &#xff08;1&#xff09;创建新列表 &#xff08;2&#xff09;遍历源列…

Webpack 基础以及常用插件使用方法

目录 一、前言二、修改打包入/出口配置步骤 三、常用插件使用html-webpack-plugin打包 CSS 代码提取 CSS 代码优化压缩过程打包 less 代码打包图片文件 一、前言 本质上&#xff0c;Webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时…

如何完善文件传输审批流程,降低企业文件安全风险?

在当今高度信息化的时代&#xff0c;数据的价值日益凸显。然而&#xff0c;如果在文件对外传输过程中缺乏必要的审批和留痕记录&#xff0c;可能会带来严重的安全隐患。企业面临巨额的经济损失&#xff1b;其次&#xff0c;企业的品牌形象也受到了严重损害&#xff1b;此外&…

FreeRTOS 任务调度和任务的状态

目录 什么是任务调度&#xff1f; FreeRTOS的任务调度规则是怎样的&#xff1f; 抢占式调度运行过程​编辑 时间片调度运行过程​编辑 任务的状态 任务调度和任务的状态案例分析 什么是任务调度&#xff1f; 调度器就是使用相关的调度算法来决定当前需要执行的哪个任务。…

NotePad格式化SQL语句

NotePad格式化SQL步骤 今日自己在进行导出一些后台执行的SQL语句,但是在NOTEPAD上是未排版的,想想有没有这个插件呢? 1.导入插件 进入后,输入PoorManT-SqlFormatt进行搜索 2.点击格式化SQL 3.执行效果

Constellation 介绍:Chainlink 黑客马拉松

在 2020 年&#xff0c;Chainlink 举办了其第一次线上黑客马拉松。当时&#xff0c;DeFi 作为一个类别刚刚开始蓬勃发展&#xff0c;而 NFT 也只是刚刚起步。这次黑客马拉松吸引了来自 45 个国家的 1,000 多名注册参与者&#xff0c;并收到了来自 70 个项目提交。 从那时起&am…