当前位置: 首页 > news >正文

MQTT协议详解

前言

MQTT是一个即时通讯协议,它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。它使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。MQTT是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。在通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

主要特点

  1. 使用发布/订阅消息模式,提供一对多的消息发布,解除了应用程序之间的耦合。
  2. 对负载内容屏蔽的消息传输。
  3. 使用TCP/IP提供基础的网络连接。
  4. 三种消息传递服务质量:“at most once”至多一次:消息发布完全依赖于底层的TCP/IP网络,会发生消息丢失或重复;“at least once”至少一次:确保消息到达,但可能发生消息重复;“exactly once”只有一次:确保消息指到达一次。
  5. 小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。
  6. 提供一种机制,是的客户端异常中断时,能够使用LastWill和Testament特性通知有关各方。
  7. 为大量计算能力有限且工作在低带宽、不可靠网络的远程传感器和控制设备通讯而设计。

MQTT协议具有以上特点,它是一种轻量级的发布/订阅模型协议,广泛应用于物联网领域。

应用场景

MQTT协议在物联网领域有许多应用场景,以下是其中的一些:

  1. 实时数据传输 :MQTT协议可以用于传输实时数据,如股票市场数据、实时天气信息、即时更新的新闻等。
  2. 传感器网络 :MQTT也可用于其他传感器网络应用,例如环境监测、智能农业、工业自动化等。
  3. 科学研究 :在科学研究领域,MQTT可以用于实时数据收集和分发,例如天文学中的望远镜观测数据、气候研究中的传感器数据等。
  4. 移动应用后端 :对于移动应用开发者来说,MQTT可以用作移动应用的后端通信协议,实现应用之间的实时通信、推送通知等功能。
  5. 物流和供应链管理 :MQTT可以用于跟踪物流和供应链中的物品或货物的位置和状态,以实现实时的物流监控和管理。

综上所述,MQTT协议在物联网领域有着广泛的应用场景,包括实时数据传输、传感器网络、科学研究、移动应用后端和物流和供应链管理等。

MQTT协议变种

MQTT协议有许多变种,其中比较主要的变种有MQTT-S、MQTT-SN和MQTT-X等。

  1. MQTT-S(MQTT Secure):MQTT-S是MQTT协议的安全版本,提供了加密和身份验证功能,以保护消息的安全性。它支持SSL/TLS连接,以及多种身份验证方法,如用户名和密码、数字证书等。
  2. MQTT-SN(MQTT-S Narrowband):MQTT-SN是针对非TCP/IP网络(如低带宽、不可靠网络)的嵌入式设备主要协议的变种。它是一种轻量级的发布/订阅模型协议,广泛应用于物联网领域。
  3. MQTT-X(MQTT eXtended):MQTT-X是MQTT协议的扩展版本,增加了一些新的特性和功能,以支持更多的应用场景。例如,它支持离线消息、持久性会话、共享订阅等。

此外,还有一些其他的MQTT变种,如MQTT-C(MQTT forconstrained devices)和MQTT-L(MQTT Light),这些变种都是针对特定应用场景或设备类型进行优化和扩展的。

MQTT在消息队列中的应用

MQTT在消息队列中有着广泛的应用,它是一种轻量级的发布/订阅模型协议,适用于大量计算能力有限且工作在低带宽、不可靠网络的远程传感器和控制设备通讯。

在消息队列中,MQTT协议的优点主要有以下几点:

  1. 轻量级:MQTT协议的头部只有2个字节,开销很小,协议交换最小化,以降低网络流量。
  2. 发布/订阅模式:MQTT采用发布/订阅模式,可以方便地实现消息的广播和订阅,适用于需要一对多消息传递的应用场景。
  3. 异步通信:MQTT支持异步通信,可以实现消息的异步接收和处理,适用于需要异步处理消息的应用场景。
  4. 可靠性保证:MQTT提供了三种消息传递服务质量:“at most once”、“at least once”和“exactly once”,可以根据需要选择合适的服务质量来保证消息的可靠性。
  5. 跨平台性:MQTT是一种跨平台协议,可以在各种操作系统和设备上运行,适用于各种物联网应用场景。

在消息队列中,MQTT协议可以与其他消息队列技术结合使用,例如RabbitMQ、Kafka等。它可以作为消息中间件,实现应用程序之间的解耦和消息传递,提高系统的可靠性和可扩展性。同时,MQTT协议也支持持久化消息和离线消息,可以保证消息的不丢失和可靠传递。

不适合的场景

MQTT协议在消息队列中有着广泛的应用,但也存在一些不适合的场景:

  • 需要高性能的场景 :MQTT协议相对较重,对于需要高性能的终端设备,如高性能计算机或服务器,可能不是最佳选择。
  • 单一设备的场景 :MQTT协议适用于大量设备的通信,但如果只需要对单一设备进行通信,使用MQTT可能会显得过于复杂。
  • 低功耗的场景 :MQTT协议需要定期发送心跳包以保持长连接,这可能会消耗较多的电力。因此,在低功耗的场景下,如物联网的某些设备,可能不适合使用MQTT。
  • 对时间要求非常高的场景 :虽然MQTT具有一定的实时性,但如果需要极致的时间控制,例如毫秒级别的响应时间,那么MQTT可能不是最佳选择。

MQTT用Java实现的示例

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;public class MqttClientDemo {public static void main(String[] args) {String broker = "tcp://mqtt.eclipse.org:1883";String clientId = "JavaSample";MemoryPersistence persistence = new MemoryPersistence();try {MqttClient client = new MqttClient(broker, clientId, persistence);MqttConnectOptions connOpts = new MqttConnectOptions();connOpts.setCleanSession(true);client.connect(connOpts);System.out.println("Connected to broker: " + broker);String topic = "test/topic";int qos = 0;client.subscribe(topic, qos);System.out.println("Subscribed to topic: " + topic);String content = "Hello, MQTT!";MqttMessage message = new MqttMessage(content.getBytes());message.setQos(qos);client.publish(topic, message);System.out.println("Message published: " + content);client.disconnect();System.out.println("Disconnected from broker.");} catch (MqttException me) {System.out.println("reason:" + me.getReasonCode());System.out.println("msg:" + me.getMessage());System.out.println("loc:" + me.getLocalizedMessage());System.out.println("cause:" + me.getCause());System.out.println("excep:" + me);}}
}

在这个示例中,我们使用Eclipse Paho客户端库来实现MQTT协议。我们首先定义了MQTT代理的地址、客户端ID和一些其他参数。然后,我们创建一个MqttClient对象并使用MqttConnectOptions对象来设置一些连接参数。在连接到代理之后,我们订阅一个主题,并向该主题发布一条消息。最后,我们关闭连接并退出程序。

MQTT协议的Java实现有很多示例,以下是其中几个:

  1. Eclipse Paho客户端库 :Eclipse Paho是一个开源的MQTT客户端库,支持多种编程语言,包括Java。它提供了Java API,可以方便地实现MQTT协议的客户端和服务器端应用程序。
  2. MQTT.js :MQTT.js是一个在浏览器中实现的MQTT客户端库,可以在前端应用程序中使用。它也提供了Java实现,可以在Java应用程序中使用。
  3. Spring Integration :Spring Integration是一个基于Spring框架的集成框架,支持多种消息传递协议,包括MQTT。它提供了Java实现,可以方便地在Java应用程序中使用MQTT协议。
  4. Apache ActiveMQ :Apache ActiveMQ是一个开源的消息代理,支持多种消息传递协议,包括MQTT。它提供了Java API,可以方便地在Java应用程序中使用MQTT协议。
  5. RabbitMQ :RabbitMQ是一个开源的消息代理,支持多种消息传递协议,包括MQTT。它提供了Java客户端库,可以方便地在Java应用程序中使用MQTT协议。

以上是一些常见的MQTT协议的Java实现示例,你可以根据自己的需求选择合适的库来实现你的应用程序。

拓展

通过下面的链接,我们一起来来了解更多的常用的一些网络协议

HTTP/2.0协议详解

HTTP1.1协议详解

gRPC协议详解

QUIC协议详解

Dubbo协议详解

RMI协议详解

Hessian协议详解

HTTP1.0协议详解

WebSocket协议详解

相关文章:

MQTT协议详解

前言 MQTT是一个即时通讯协议,它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。它使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。MQTT是轻量、简单、…...

WordPress画廊插件Envira Gallery v1.9.7河蟹版下载

Envira Gallery是一款功能强大的WordPress画廊插件。通过使用这个插件,你可以在WordPress的前台页面上创建出令人赏心悦目的图片画廊展示形式。 拖放生成器:轻松创建精美照片和视频画廊 自定义主题,打造独特外观 使用预设模板,为…...

认识前端包常用包管理工具(npm、cnpm、pnpm、nvm、yarn)

随着前端的快速发展,前端的框架越来越趋向于工程化,所以对于包的使用也越来越多,为了优化性能和后期的维护更新,对于前端包的管理也尤为重要,本文主要阐述对node中包管理工具的理解和简单的使用方法。也欢迎各位大佬和同行们多多指教。😁😁😁 👉1. npm 安装npm 通…...

使用树莓派学习Linux系统编程的 --- 库编程(面试重点)

在之前的Linux系统编程中,学习了文件的打开;关闭;读写;进程;线程等概念.... 本节补充“Linux库概念 & 相关编程”,这是一个面试的重点! 分文件编程 在之前的学习中,面对较大的…...

vs2017打开工程提示若要解决此问题,请使用以下选择启动 Visual Studio 安装程序: 用于 x86 和 x64 的 Visual C++ MFC

下载安装文件。 下载之后点击C项目,他会提示需要安装编译依赖。这个时候需要选择 用于 x86 和 x64 的 Visual C MFCWindows SDK 版本8.1 点击右下角的安装等待即可 error MSB8036: 找不到 Windows SDK 版本8.1。请安装所需的版本的 Windows SDK 或者在项目属性页…...

Redis学习笔记17:基于spring data redis及lua脚本批处理scan指令查询永久有效的key

Redis的KEYS和SCAN指令都可以用于在数据库中搜索匹配指定模式的键。然而,它们之间有一些关键的区别; KEYS指令会在整个数据库中阻塞地执行匹配操作,并返回匹配的键列表。如果数据库很大,或者匹配的键很多,将会对性能产…...

今天遇到Windows 10里安装的Ubuntu(WSL)的缺点

随着技术的发展,越来越多开发者转向使用 Windows Subsystem for Linux(WSL)在 Windows 10 上进行开发,也就是说不用虚拟机,不用准备多一台电脑,只需要在Windows 10/11 里安装 WSL 就能体验 Linux 系统。因此…...

hive sql多表练习

hive sql多表练习 准备原始数据集 学生表 student.csv 讲师表 teacher.csv 课程表 course.csv 分数表 score.csv 学生表 student.csv 001,彭于晏,1995-05-16,男 002,胡歌,1994-03-20,男 003,周杰伦,1995-04-30,男 004,刘德华,1998-08-28,男 005,唐国强,1993-09-10,男 006,陈道…...

论文速览 Arxiv 2023 | DMV3D: 单阶段3D生成方法

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 论文速览 Arxiv 2023 | DMV3D: DENOISING MULTI-VIEW DIFFUSION USING 3D LARGE RECONSTRUCTION MODEL 使用3D大重建模型来去噪多视图扩散 论文原文:https://arxiv.org/pdf/2311.09217.pdf…...

访问限制符说明面向对象的封装性

1 问题 Java中4种“访问控制符”分别为private、default、protected、public,它们说明了面向对象的封装性,所以我们要利用它们尽可能的让访问权限降到最低,从而提高安全性。 private表示私有,只有自己类能访问,属性可以…...

python趣味编程-5分钟实现一个贪吃蛇游戏(含源码、步骤讲解)

Python 贪吃蛇游戏代码是用 Python 语言编写的。在这个贪吃蛇游戏中,Python 代码是增强您在创建和设计如何使用 Python 创建贪吃蛇游戏方面的技能和才能的方法。 Python Tkinter中的贪吃蛇游戏是一个简单干净的 GUI,可轻松玩游戏。游戏设计非常简单,用户不会觉得使用和理解…...

如何在虚拟机的Ubuntu22.04中设置静态IP地址

为了让Linux系统的IP地址在重新启动电脑之后IP地址不进行变更,所以将其IP地址设置为静态IP地址。 查看虚拟机中虚拟网络编辑器获取当前的子网IP端 修改文件/etc/netplan/00-installer-config.yaml文件,打开你会看到以下内容 # This is the network conf…...

代码随想录算法训练营第二十九天| 491 递增子序列 46 全排列

目录 491 递增子序列 46 全排列 491 递增子序列 在dfs中进行判断,如果path的长度大于1,则将其添加到res中。 本题nums中的元素的值处于-100与100之间,可以将元素映射0到199之间并且通过布尔数组st来记录此层中元素是否被使用过,…...

(动手学习深度学习)第13章 实战kaggle竞赛:CIFAR-10

导入相关库 import collections import math import os import shutil import pandas as pd import torch import torchvision from torch import nn from d2l import torch as d2l下载数据集 d2l.DATA_HUB[cifar10_tiny] (d2l.DATA_URL kaggle_cifar10_tiny.zip,2068874e4…...

Go 语言中的map和内存泄漏

map在内存中总是会增长;它不会收缩。因此,如果map导致了一些内存问题,你可以尝试不同的选项,比如强制 Go 重新创建map或使用指针。 在 Go 中使用map时,我们需要了解map增长和收缩的一些重要特性。让我们深入探讨这一点…...

前缀和(c++,超详细,含二维)

前缀和与差分 当给定一段整数序列a1,a2,a3,a4,a5…an; 每次让我们求一段区间的和,正常做法是for循环遍历区间起始点到结束点,进行求和计算,但是当询问次数很多并且区间很长的时候 比如,10^5 个询问和10^6区间长度,相…...

详解FreeRTOS:二值信号量和计数信号量(高级篇—2)

目录 1、二值信号量 1.1、二值信号量运行机制 1.2、创建二值信号量 1...

持续集成交付CICD:Jenkins通过API触发流水线

目录 一、理论 1.HTTP请求 2.调用接口的方法 3.HTTP常见错误码 二、实验 1.Jenkins通过API触发流水线 三、问题 1.如何拿到上一次jenkinsfile文件进行自动触发流水线 一、理论 1.HTTP请求 (1)概念 HTTP超文本传输协议,是确保服务器…...

【Python】12 GPflow安装

概述 GPflow 是一个基于TensorFlow 在 Python 中构建高斯过程模型的包。高斯过程是一种监督学习模型。 高斯过程的一些优点是: 不确定性是高斯过程的固有部分。高斯过程可以在不知道答案时告诉您。适用于小型数据集。如果您的数据有限,高斯过程可以从…...

Ubuntu源码编译gdal3.6.2

在华为云申请了一台Ubuntu v18的机器,乱七八糟的不要装。 apt install build-essential pkg-config -y cmake-3.21.1 apt-get install openssl libssl-dev 过程参考:Yukon for PostgreSQL_格來羙、日出的博客-CSDN博客 zlib-1.2.9(不需要) 如果用系统的后面gd…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

JVM垃圾回收机制全解析

Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...