【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: 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客户端使用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mac 安装使用NPM及常用命令

环境&#xff1a; Mac 工具&#xff1a; NPM 可通过官网查询一些模块相关 NPM Doc 通过官网文档了解更多的关于NPM的使用 安装 NPM是Node.js的包管理工具&#xff0c;可用于解决 Node.js在代码部署上的问题。 新版本的Node.js已经集成了NPM&#xff0c; 因此可通过下载 Nod…

OpenCV C++ 图像处理实战 ——《缺陷检测》

OpenCV C++ 图像处理实战 ——《缺陷检测》 一、结果演示二、缺陷检测算法2.1、多元模板图像2.2、训练差异模型三、图像配准3.1 功能源码3.1 功能效果四、多元模板图像4.1 功能源码五、缺陷检测5.1 功能源码六、源码测试图像下载总结一、结果演示

Python爬虫基础之Requests详解

目录 1. 简介2. 安装3. 发送请求4. 处理响应5. IP代理6. Cookie登录参考文献 原文地址&#xff1a;https://program-park.top/2023/10/27/reptile_4/ 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由…

【Unity3D】Unity与Android交互

1 Unity 发布 apk 1.1 安装 Android Build Support 在 Unity Hub 中打开添加模块窗口&#xff0c;操作如下。 选择 Android Build Support 安装&#xff0c;如下&#xff08;笔者这里已安装过&#xff09;。 创建一个 Unity 项目&#xff0c;依次点击【File→Build Settings→…

uniapp实现瀑布流

首先我们要先了解什么是瀑布流&#xff1a; 瀑布流&#xff08;Waterfall Flow&#xff09;是一种常见的网页布局方式&#xff0c;也被称为瀑布式布局或砌砖式布局。它通常用于展示图片、博客文章、商品等多个不同大小和高度的元素。 瀑布流布局的特点是每个元素按照从上到下…

制作自己的前端组件库并上传到npm上

最近实现了自己的一个前端组件库demo&#xff0c;目前只上传了几个小组件。话不多说&#xff0c;上图&#xff1a; 我分了三个项目&#xff1a;yt-ui组件库、使用文档、demo。线上地址如下&#xff1a; [yt-ui组件库](mhfwork/yt-ui - npm) [组件库使用文档](介绍 | mhfwork/y…

【Java 进阶篇】解决Java Web应用中请求参数中文乱码问题

在Java Web应用开发中&#xff0c;处理请求参数时经常会遇到中文乱码的问题。当浏览器向服务器发送包含中文字符的请求参数时&#xff0c;如果不正确处理&#xff0c;可能会导致乱码问题&#xff0c;使得参数无法正确解析和显示。本文将详细探讨Java Web应用中请求参数中文乱码…

安全狗安装

安装waf 关闭apache程序及httpd.exe进程; 运行cmd&#xff0c;cd进入apache/bin文件夹目录&#xff0c; 执行httpd.exe -k install -n apache2.4.39; 启动apache,启动phpstudy 安全狗安装服务名称填写apache2.4.39; 安装安全狗之后就会提示报错 IP黑白名单 可以设备黑白名单 …

本机spark 通idea连接Oracle的坑

1. 报错&#xff1a;Exception in thread "main" java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V 查询网上资料&#xff0c;是idea引入的scala运行环境版本与idea默认的scala版本不一样 也就是写的项目中的pom的spark版本与idea默认的版本不…

leetcode经典面试150题---4.删除有序数组中的重复项II

目录 题目描述 前置知识 代码 方法一 双指针 思路 图解 实现 复杂度 题目描述 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&…

Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】

一、创建 VUE 项目 npm create vuelatest二、安装使用 ant-design-vue 安装脚手架工具 $ npm install -g vue/cli # OR $ yarn global add vue/cli使用组件 # 安装 $ npm i --save ant-design-vue4.x全局完整注册 import { createApp } from vue; import Antd from ant-de…

Ubuntu系统编译调试QGIS源码保姆级教程

在之前的文章中&#xff0c;我详细介绍了怎么在Windows下编译QGIS源码&#xff0c;也得到了不错的反馈。但是不足的是Windows下只能编译QGIS的Release模式和RelWithDebInfo模式&#xff0c;想要分析源码&#xff0c;“断点调试”肯定是少不了的&#xff0c;但是这两种模式虽然也…

hdlbits系列verilog解答(移位寄存器)-23

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 您将获得一个具有两个输入和一个输出的模块 my_dff &#xff08;实现 D 触发器&#xff09;。实例化其中的三个&#xff0c;然后将它们链接在一起以形成长度为 3 的移位寄存器。端口 clk 需要连接到所有实例。…

windows下基于vscode的ssh服务远程连接ubuntu服务器

Ubuntu端配置 1.确保ubuntu端已启用ssh服务 首先&#xff0c;安装ssh服务 sudo apt-get install openssh-server 安装后&#xff0c;打开ssh服务 sudo service ssh start 如果显示有sshd就说明成功了。 判断是否成功打开 ps -e|grep ssh 同时也可以通过如下方式确保ss…

docker 中给命令起别名

docker 的有些命令特别复杂&#xff0c;我们可以给它设置别名简化输入&#xff0c;就不用每次都输入那么多了&#xff01;&#xff01;&#xff01; 1. 进入 .bashrc 中修改配置&#xff08; .bashrc 是root下的隐藏文件&#xff09; cd /rootvim .bashrc2. 在 .bashrc 中加入…

Java程序设计进阶

Java异常处理机制 异常 异常的最高父类是 Throwable&#xff0c;在 java.lang 包下。 Throwable 类的方法主要有&#xff1a; 方法说明public String getMessage()返回对象的错误信息public void printStackTrace()输出对象的跟踪信息到标准错误输出流public void printSta…

提高抖音小店用户黏性和商品销量的有效策略

抖音小店是抖音平台上的电商模式&#xff0c;用户可以在抖音上购买各类商品。要提高用户黏性和商品销量&#xff0c;四川不若与众帮你整理了需要注意以下几个方面。 首先&#xff0c;提供优质的商品和服务。在抖音小店中&#xff0c;用户会通过观看商品展示视频和用户评价来选…

Spring-AOP概念及相关术语

AOP概念 一、概述1、相关术语2、作用 二、基于注解的AOP1、准备工作2、各种通知3、切入点表达式语法4、重用切入点表达式5、获取通知的相关信息6、切面的优先级 一、概述 回顾&#xff1a; 什么是面向对象 什么是AOP AOP&#xff08;Aspect Oriented Programming&#xff09;是…

Go语言标准输入

文章目录 Go语言标准输入函数使用 Go语言标准输入 函数 Scan // 使用stdin读取内容&#xff0c;读取的内容以空白&#xff08;换行也属于空白&#xff09;分隔&#xff0c;赋值给函数参数。返回读取的个数和错误 func Scan(a ...interface{}) (n int, err error)Scanf // 和…

深度学习:激活函数曲线总结

深度学习&#xff1a;激活函数曲线总结 在深度学习中有很多时候需要利用激活函数进行非线性处理&#xff0c;在搭建网路的时候也是非常重要的&#xff0c;为了更好的理解不同的激活函数的区别和差异&#xff0c;在这里做一个简单的总结&#xff0c;在pytorch中常用的激活函数的…