【Android】MQTT

目录

  • 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: MqttAndroidClientfun 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 = usernameoptions.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.mzph.cn/news/118083.shtml

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

相关文章

Centos7卸载minio

如果是按照上一篇文章安装的minio 1.停止minio pkill minio2.删除相关配置文件(在/usr/local目录下执行) rm -rf minio 如果配置了开机自启 1.取消注册minio服务 chkconfig --del startMinio.sh2.禁用开机自启动 chkconfig startMinio.sh off3.删除启动脚本 rm /etc/rc…

Windows Server扩展卷变灰怎么办?

当Windows Server中的某一个分区&#xff0c;特别是系统&#xff08;C&#xff09;分区磁盘空间不足时&#xff0c;您可能需要使用内置磁盘管理工具的“扩展卷”功能扩展分区了。但不幸的是&#xff0c;当您尝试扩展C盘驱动器时&#xff0c;很有可能会出现Windows Server扩展卷…

Android底层摸索改BUG(一):Android系统状态栏显示不下Wifi图标

这是我入职的第一个BUG&#xff0c;头疼&#xff0c;隔壁实习生一周解决了&#xff0c;我多花了几天 其中最大的原因就是我思考复杂了&#xff0c;在公司系统上&#xff0c;此BUG标题为&#xff1a; 请确认Wifi优先级&#xff0c;状态栏Wifi被忽略 BUG意思就是&#xff1a;当…

云原生Docker Cgroups资源控制操作

目录 资源控制 cgroups四大功能 CPU 资源控制 设置CPU使用率上限 进行CPU压力测试 设置50%的比例分配CPU使用时间上限 设置CPU资源占用比&#xff08;设置多个容器时才有效&#xff09; 设置容器绑定指定的CPU 对内存使用的限制 限制容器可以使用的最大内存 限制可用的…

2023年5个美国代理IP推荐,最佳代理花落谁家?

美国代理IP指的是代理服务器位于美国的IP地址&#xff0c;对于跨境业务来说&#xff0c;这些代理IP地址可以用于隐藏用户的真实IP地址&#xff0c;将其网络流量路由通过美国的服务器&#xff0c;以实现一些特定的目的。由于近年来&#xff0c;面向美国市场的跨境商家越来越多&a…

软件测试面试1000问(含文档)

前前后后面试了有20多家的公司吧&#xff0c;最近抽空把当时的录音整理了下&#xff0c;然后给大家分享下 开头都是差不多&#xff0c;就让做一个自我介绍&#xff0c;这个不用再给大家普及了吧 同时&#xff0c;我也准备了一份软件测试视频教程&#xff08;含接口、自动化、…

java发送邮件

java发送邮件工具类 JavaMailSenderImpl JavaMailSenderImpl 类是 Spring 框架提供的一个实现了 JavaMailSender 接口的邮件发送类&#xff0c;用于发送邮件&#xff0c;提供接口如下&#xff1a; setJavaMailProperties&#xff1a;设置属性Properties setProtocol&#xff1…

如何从单体架构迁移到微服务架构:挑战和最佳实践

当单体架构成为项目增长的瓶颈时&#xff0c;迁移到微服务架构就成了必然的选择。 微服务虽然具有明显的优点&#xff0c;但由于其内在复杂性和缺乏一种通用的迁移方案&#xff0c;实施过程中可能会遇到不少挑战。本文旨在分享解决方案架构师在单体架构向微服务迁移过程中的专…

OpenCV实现物体尺寸的测量

一 &#xff0c;项目分析 物体尺寸测量的思路是找一个确定尺寸的物体作为参照物&#xff0c;根据已知的计算未知物体尺寸。 如下图所示&#xff0c;绿色的板子尺寸为220*300&#xff08;单位&#xff1a;毫米&#xff09;&#xff0c;通过程序计算白色纸片的长度。 主要是通过…

C盘满了怎么清理文件?

电脑的C盘是我们电脑存储系统文件和应用程序的一个重要盘符&#xff0c;很多人经常会遇到C盘空间不足的问题&#xff1b;虽然我们可以通过卸载程序或者删除文件来释放空间&#xff0c;但是在这个过程中往往会误删掉一些重要的文件&#xff0c;造成部分程序可能无法正常使用。 因…

【EI会议征稿】第五届大数据与信息化教育国际学术会议(ICBDIE 2024)

【有往届检索记录】第五届大数据与信息化教育国际学术会议&#xff08;ICBDIE 2024&#xff09; 2023 5th International Conference on Big Data and Informatization Education 第五届大数据与信息化教育国际学术会议&#xff08;ICBDIE 2024&#xff09;定于2024年01月19-…

怒刷LeetCode的第28天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;动态规划 方法二&#xff1a;迭代 方法三&#xff1a;斐波那契数列公式 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;栈 方法二&#xff1a;路径处理类 方法三&#xff1a;正则表达式 方法…

机器学习(新手入门)-线性回归 #房价预测

题目&#xff1a;给定数据集dataSet&#xff0c;每一行代表一组数据记录,每组数据记录中&#xff0c;第一个值为房屋面积&#xff08;单位&#xff1a;平方英尺&#xff09;&#xff0c;第二个值为房屋中的房间数&#xff0c;第三个值为房价&#xff08;单位&#xff1a;千美元…

RTL SDR的PYTHON开发环境搭建

不得不说RTL SDR真是神器&#xff0c;直接把SDR的入门门槛拉低到了几十块钱。对于RTL SDR的学习开发&#xff0c;有大佬写的《Software_Defined_Radio_using_MATLAB_Simulink_and_the_RTL-SDR》&#xff0c;另外&#xff0c;除了MATLAB&#xff0c;近些年爆火的PYTHON当然也是可…

系统集成测试(SIT)/系统测试(ST)/用户验收测试(UAT)

文章目录 单元测试集成测试系统测试用户验收测试黑盒测试白盒测试压力测试性能测试容量测试安全测试SIT和UAT的区别 单元测试 英文 unit testing&#xff0c;缩写 UT。测试粒度最小&#xff0c;一般由开发小组采用白盒方式来测试&#xff0c;主要测试单元是否符合“设计”。 …

智能振弦传感器:参数智能识别技术的重要科技创新

智能振弦传感器&#xff1a;参数智能识别技术的重要科技创新 智能振弦传感器是一种能够自动识别传感器参数的高科技产品。它的研发得益于河北稳控科技的不断创新和努力&#xff0c;其电子标签专用读数模块模块TR01将传感器生产和标定过程实现了自动化。该模块将温度电阻两芯线…

Mysql第四篇---数据库索引优化与查询优化

文章目录 数据库索引优化与查询优化索引失效案例数据准备1. 全值匹配2 最佳左前缀法则(联合索引)主键插入顺序4 计算、函数导致索引失效5 类型转换(自动或手动)导致索引失效6 范围条件右边的列索引失效7 不等于(!或者<>)索引失效8 is null可以使用索引, is not null无法使…

【Mongo】数据删了磁盘空间但没有减少

Author:skate Time:2023/10/22 一、问题描述 产线用户反馈&#xff0c;一个华为云的mongo实例磁盘空间告警&#xff0c;使用率超过90%&#xff08;使用状况 1630.9/1800GB&#xff09;&#xff0c;让其通过数据库运维平台找到占用大空间的表&#xff0c;然后清理历史数据&…

爱创科技携手洽洽食品,探索渠道数字化最优解!

坚果的下半场&#xff0c;是从吃到喝。 消费升级大潮下&#xff0c;健康养生理念逐渐深入人心。以“天然健康”为核心的食品新消费潮流正加速形成&#xff0c;一个个打着“美味与营养”黄金设定的品类风口正被不断创建&#xff0c;其中人气有增无减的当属植物基饮品。据相关报告…

Anaconda/minAnaconda下配置虚拟环境并安装pytorch相关

Anaconda/minAnaconda下配置虚拟环境并安装pytorch相关 官网下载对应版本anaconda/minAnaconda进入Anaconda Prompt创建虚拟环境 conda create -n 虚拟环境名 python版本 -c https://mirrors.bfsu.edu.cn/anaconda/pkgs/main查看当前环境&#xff0c;如果之前anaconda3文件夹…