当前位置: 首页 > 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…...

CANN asc_copy寄存器搬运API

asc_copy 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/c…...

CAN总线终端电阻:从120Ω与0.25W的选型,看信号完整性与系统鲁棒性设计

1. 为什么CAN总线需要终端电阻? 第一次接触CAN总线设计时,我也曾疑惑:为什么要在总线两端各加一个120Ω的电阻?直接连线不行吗?直到亲眼目睹不加电阻时总线上的信号振荡,才真正理解终端电阻的重要性。 CAN总…...

STM32F4当USB主机,驱动CH340串口模块的保姆级调试笔记(附源码)

STM32F4作为USB主机驱动CH340模块的深度实践指南 在嵌入式开发中,USB主机功能扩展串口资源是常见需求。当标准CDC类设备无法满足特殊场景时,驱动像CH340这样的厂商自定义设备就成了一项必备技能。本文将带您深入探索STM32F4系列微控制器作为USB主机与CH3…...

第四章 数字孪生制作完整流程

4.1 项目需求分析、场景规划、页面布局设计数字孪生项目开发前期必须进行需求分析,明确项目用途、使用人群、展示内容以及功能模块,避免盲目开发造成资源浪费。需求分析是整个项目开发的逻辑起点,决定项目最终呈现效果。4.1.1 需求分析开发者…...

本地待办清单的革命:为什么My-TODOs让数据隐私与高效任务管理完美融合?

本地待办清单的革命:为什么My-TODOs让数据隐私与高效任务管理完美融合? 【免费下载链接】My-TODOs A cross-platform desktop To-Do list. 跨平台桌面待办小工具 项目地址: https://gitcode.com/gh_mirrors/my/My-TODOs 在云端存储成为主流的今天…...

从零到一:手把手教你完成Matlab R2020a的下载、安装与激活【避坑指南】

1. 准备工作:下载与系统检查 第一次安装Matlab的朋友们可能会被复杂的流程吓到,但别担心,跟着我的步骤走绝对没问题。我去年给实验室十几台电脑装过R2020a版本,踩过的坑比你们见过的都多。首先咱们得准备好安装包,这里…...

基于Qwen3-TTS与OpenClaw构建本地化AI资讯电台实践指南

1. 项目概述:打造你的专属AI资讯电台 最近在折腾一个挺有意思的东西,我把它叫做“龙虾电台”。简单来说,这是一个能帮你把任何你感兴趣的新闻、资讯,自动变成一段可以听的播客音频的工具。比如你每天早上通勤路上想听听科技圈发生…...

拆解、对比与优化:LLM工具智能体的五种任务规划与执行模式

大语言模型(LLM)驱动的 AI 智能体,特别是在借助Tools(工具)来完成复杂任务执行的过程中展现出了巨大的潜力。然而,让智能体能够合理规划任务步骤与执行、避免盲目行动是确保其高效可靠完成目标的关键。本篇…...

AI代码生成质量评估2026:如何科学衡量Copilot类工具的真实价值

你的团队用了AI编码助手,但你真的知道它带来了多少价值吗?本文提供一套可落地的AI代码生成质量评估框架,从代码正确性到开发者体验,帮你用数据说话。一、为什么需要系统化评估"用了Copilot感觉快了不少"——这是最常见的…...

从混淆矩阵到mIOU:手把手解析语义分割核心评价指标

1. 从像素战场到成绩单:理解混淆矩阵 第一次接触语义分割任务时,我盯着那些五彩斑斓的分割图直发懵——怎么判断这个模型到底好不好?直到导师扔给我一张"混淆矩阵"的表格,才恍然大悟这就像学生时代的考试成绩单。想象你…...