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

MQTT:轻量级物联网通信协议详解

引言

在物联网(IoT)迅速发展的今天,设备之间的高效通信变得至关重要。MQTT(Message Queuing Telemetry Transport)作为一种轻量级的发布/订阅消息传输协议,因其低带宽、低延迟和易于实现的特性,成为物联网通信的首选协议之一。本文将深入探讨MQTT的工作原理、核心概念以及实际应用场景,并通过 Java 代码示例展示如何实现 MQTT 通信。

一、MQTT 概述

MQTT 是一种基于客户端-服务器架构的消息传输协议,最初由 IBM 开发,用于连接远程设备与网络。其设计目标是实现轻量级、低带宽消耗和可靠的消息传递,特别适用于网络不稳定或带宽有限的场景。

二、MQTT 的核心概念

  1. 发布/订阅模式

    MQTT 采用发布/订阅模式,客户端分为发布者(Publisher)和订阅者(Subscriber)。发布者将消息发送到特定的主题(Topic),而订阅者通过订阅主题来接收消息。这种模式解耦了消息的生产者和消费者,提高了系统的灵活性和可扩展性。

  2. 主题(Topic)

    主题是消息的分类标识符,采用分层结构。例如,sensor/temperaturesensor/humidity 是两个不同的主题。订阅者可以通过通配符(如 +#)订阅多个主题。

  3. 服务质量(QoS)

    MQTT 提供了三种服务质量等级:

    • QoS 0:最多一次,消息可能丢失。
    • QoS 1:至少一次,消息可能重复。
    • QoS 2:恰好一次,确保消息可靠传递。
  4. Broker(代理)

    Broker 是 MQTT 的核心组件,负责接收发布者的消息并将其转发给订阅者。常见的 MQTT Broker 包括 Mosquitto、EMQX 和 HiveMQ。

三、MQTT 协议图示

以下是一个典型的 MQTT 通信流程图示:

Publisher Broker Subscriber CONNECT CONNACK PUBLISH (Topic, Message) PUBLISH (Topic, Message) PUBACK (if QoS > 0) PUBACK (if QoS > 0) DISCONNECT Publisher Broker Subscriber

说明

  1. Publisher 连接到 Broker
  2. Publisher 向 Broker 发布消息(包含主题和内容)。
  3. Broker 将消息转发给所有订阅该主题的 Subscriber
  4. 如果 QoS > 0,Subscriber 会向 Broker 发送确认消息。
  5. Publisher 断开与 Broker 的连接。

四、MQTT 协议中的方法

MQTT 协议定义了多种方法,用于客户端与 Broker 之间的通信。以下是主要方法:

  1. CONNECT
    • 客户端连接到 Broker。
    • 包含客户端 ID、用户名、密码、Will 消息等。
  2. CONNACK
    • Broker 对 CONNECT 请求的响应。
    • 包含连接状态(成功或失败)。
  3. PUBLISH
    • 客户端向 Broker 发布消息。
    • 包含主题、消息内容、QoS 等级等。
  4. PUBACK
    • Broker 对 PUBLISH 请求的确认(QoS 1)。
  5. PUBREC
    • Broker 对 PUBLISH 请求的接收确认(QoS 2)。
  6. PUBREL
    • 客户端对 PUBREC 的确认(QoS 2)。
  7. PUBCOMP
    • Broker 对 PUBREL 的确认(QoS 2)。
  8. SUBSCRIBE
    • 客户端订阅主题。
    • 包含主题列表和 QoS 等级。
  9. SUBACK
    • Broker 对 SUBSCRIBE 请求的响应。
    • 包含每个主题的订阅状态。
  10. UNSUBSCRIBE
    • 客户端取消订阅主题。
    • 包含主题列表。
  11. UNSUBACK
    • Broker 对 UNSUBSCRIBE 请求的响应。
  12. PINGREQ
    • 客户端发送心跳请求,保持连接。
  13. PINGRESP
    • Broker 对 PINGREQ 的响应。
  14. DISCONNECT
    • 客户端断开与 Broker 的连接。

五、MQTT 协议数据包结构

MQTT 数据包由固定头(Fixed Header)、可变头(Variable Header)和有效载荷(Payload)三部分组成。

  1. 固定头(Fixed Header)
    • 包含数据包类型、标志位和剩余长度。
    • 数据包类型:4 位,表示数据包的类型(如 CONNECT、PUBLISH 等)。
    • 标志位:4 位,用于特定数据包类型的标志。
    • 剩余长度:表示可变头和有效载荷的总长度。
  2. 可变头(Variable Header)
    • 包含与数据包类型相关的附加信息。
    • 例如,CONNECT 数据包的可变头包含协议名称、协议版本、连接标志等。
  3. 有效载荷(Payload)
    • 包含数据包的具体内容。
    • 例如,PUBLISH 数据包的有效载荷包含消息内容,SUBSCRIBE 数据包的有效载荷包含主题列表。

示例:PUBLISH 数据包结构

+-------------------+-------------------+-------------------+
| Fixed Header      | Variable Header   | Payload           |
| (Packet Type,     | (Topic Name,      | (Message Content) |
| Flags, Length)    | Packet ID)        |                   |
+-------------------+-------------------+-------------------+

六、MQTT 协议数据包示例

以下是一个 QoS 1 的 PUBLISH 数据包示例:

  1. 固定头
    • 数据包类型:PUBLISH (0011)
    • 标志位:QoS 1 (0010)
    • 剩余长度:20
  2. 可变头
    • 主题名称:sensor/temperature
    • 数据包 ID:1234
  3. 有效载荷
    • 消息内容:25.5

完整数据包(十六进制表示):

30 14 00 13 73 65 6E 73 6F 72 2F 74 65 6D 70 65 72 61 74 75 72 65 04 D2 32 35 2E 35

七、MQTT 的优势

  1. 轻量级:协议头小,适合低带宽网络。
  2. 低延迟:快速的消息传递机制。
  3. 跨平台:支持多种编程语言和操作系统。
  4. 可靠性:提供多种 QoS 等级,确保消息传递的可靠性。

八、MQTT 的应用场景

  1. 智能家居:设备状态监控和控制。
  2. 工业物联网:传感器数据采集和设备管理。
  3. 车联网:车辆状态监控和远程控制。
  4. 医疗健康:远程医疗和健康监测。

九、MQTT 的实践示例

以下是一个使用 Java 和 Eclipse Paho 库实现的简单 MQTT 示例:

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;public class MqttExample {public static void main(String[] args) {String broker = "tcp://broker.hivemq.com:1883";String clientId = "JavaClient";MemoryPersistence persistence = new MemoryPersistence();try {MqttClient client = new MqttClient(broker, clientId, persistence);// 设置回调client.setCallback(new MqttCallback() {@Overridepublic void connectionLost(Throwable cause) {System.out.println("Connection lost: " + cause.getMessage());}@Overridepublic void messageArrived(String topic, MqttMessage message) {System.out.println("Received message: " + new String(message.getPayload()) + " on topic " + topic);}@Overridepublic void deliveryComplete(IMqttDeliveryToken token) {System.out.println("Delivery complete: " + token.isComplete());}});// 连接到 Brokerclient.connect();System.out.println("Connected to broker: " + broker);// 订阅主题String topic = "test/topic";client.subscribe(topic);System.out.println("Subscribed to topic: " + topic);// 发布消息String content = "Hello MQTT from Java";MqttMessage message = new MqttMessage(content.getBytes());client.publish(topic, message);System.out.println("Message published: " + content);// 保持连接Thread.sleep(5000);// 断开连接client.disconnect();System.out.println("Disconnected from broker");} catch (MqttException | InterruptedException e) {e.printStackTrace();}}
}

十、总结

MQTT 作为一种高效、可靠的通信协议,在物联网领域展现了强大的优势。通过其轻量级的设计和灵活的发布/订阅模式,MQTT 能够满足各种复杂场景的需求。无论是智能家居、工业物联网还是车联网,MQTT 都为设备间的通信提供了可靠的解决方案。

相关文章:

MQTT:轻量级物联网通信协议详解

引言 在物联网(IoT)迅速发展的今天,设备之间的高效通信变得至关重要。MQTT(Message Queuing Telemetry Transport)作为一种轻量级的发布/订阅消息传输协议,因其低带宽、低延迟和易于实现的特性&#xff0c…...

C 语言逻辑运算符:组合判断,构建更复杂的条件

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ 在 C 语言编程中,我们已经学习了如何使用比较运算符(如 ​​==​​​, ​​<​​​, ​​>​​)来判断两个值之间的关系,从而得到“真”或“假”的结果。但很多时候,我们需要根据多个条件的组合…...

基于OpenCV的人脸识别:EigenFaces算法

文章目录 引言一、概述二、代码解析1. 准备工作2. 加载训练图像3. 设置标签4. 准备测试图像5. 创建和训练识别器6. 进行预测7. 显示结果 三、代码要点总结 引言 人脸识别是计算机视觉领域的一个重要应用&#xff0c;今天我将通过一个实际案例来展示如何使用OpenCV中的EigenFac…...

【深度学习新浪潮】智能追焦技术全解析:从算法到设备应用

一、智能追焦技术概述 智能追焦是基于人工智能和自动化技术的对焦功能,通过深度学习算法识别并持续跟踪移动物体(如人、动物、运动器械等),实时调整焦距以保持主体清晰,显著提升动态场景拍摄成功率。其核心优势包括: 精准性:AI 算法优化复杂运动轨迹追踪(如不规则移动…...

网络研讨会开发注册中, 5月15日特励达力科,“了解以太网”

在线研讨会主题 Understanding Ethernet - from basics to testing & optimization 了解以太网 - 从基础知识到测试和优化 注册链接# https://register.gotowebinar.com/register/2823468241337063262 时间 北京时间 2025 年 5 月 15 日 星期四 下午 3:30 - 4:30 适宜…...

在 Spring Boot 中实现动态线程池的全面指南

动态线程池是一种线程池管理方案&#xff0c;允许在运行时根据业务需求动态调整线程池参数&#xff08;如核心线程数、最大线程数、队列容量等&#xff09;&#xff0c;以优化资源利用率和系统性能。在 Spring Boot 中&#xff0c;动态线程池可以通过 Java 的 ThreadPoolExecut…...

STL?vector!!!

一、前言 之前我们借助手撕string加深了类和对象相关知识&#xff0c;今天我们将一起手撕一个vector&#xff0c;继续深化类和对象、动态内存管理、模板的相关知识 二、vector相关的前置知识 1、什么是vector&#xff1f; vector是一个STL库中提供的类模板&#xff0c;它是存储…...

从黔西游船侧翻事件看极端天气预警的科技防线——疾风气象大模型如何实现精准防御?

近日,贵州省黔西市一起载人游船侧翻事故令人痛心。调查显示,事发时当地突遇强风暴雨,水面突发巨浪导致船只失控。这一事件再次凸显:在极端天气频发的时代,传统“经验式防灾”已不足够,唯有依靠智能化的气象预警技术,才能筑牢安全底线。 极端天气预警的痛点:为什么传统方…...

LDO与DCDC总结

目录 1. 工作原理 2. 性能对比 3. 选型关键因素 4. 典型应用 总结 1. 工作原理 LDO LDO通过线性调节方式实现降压&#xff0c;输入电压需略高于输出电压&#xff08;压差通常为0.2-2V&#xff09;&#xff0c;利用内部PMOS管或PNP三极管调整压差以稳定输出电压。其结构简单…...

FastChat部署大模型

一、前提条件 1、系统环境&#xff08;使用的 autodl 算力平台&#xff09; 2、安装相关库 安装 modescope pip3 install -U modelscope # 或使用下方命令 # pip3 install -U modelscope -i https://mirror.sjtu.edu.cn/pypi/web/simple安装 fastchat git clone https://gi…...

智汇云舟亮相第二十七届北京科博会

5月8日&#xff0c;备受瞩目的第二十七届中国北京国际科技产业博览会&#xff08;以下简称&#xff1a;北京科博会&#xff09;在国家会议中心盛大开幕。作为我国科技领域的重要盛会&#xff0c;北京科博会汇聚了众多前沿科技成果与创新力量&#xff0c;为全球科技产业交流搭建…...

Redis最新入门教程

文章目录 Redis最新入门教程1.安装Redis2.连接Redis3.Redis环境变量配置4.入门Redis4.1 Redis的数据结构4.2 Redis的Key4.3 Redis-String4.4 Redis-Hash4.5 Redis-List4.6 Redis-Set4.7 Redis-Zset 5.在Java中使用Redis6.缓存雪崩、击穿、穿透6.1 缓存雪崩6.2 缓冲击穿6.3 缓冲…...

北斗三号手持终端设备功能与应用

北斗三号卫星系统是我国自主建设、独立运行的全球卫星导航系统。通过多颗不同轨道卫星组成的&#xff0c;这些卫星持续向地球发射携带精确时间和位置信息的信号。地面上的北斗手持终端接收到至少四颗卫星信号后&#xff0c;利用信号传播时间差&#xff0c;通过三角函数等算法&a…...

提升编程效率的利器:Zed高性能多人协作代码编辑器

在当今这个快节奏的开发环境中&#xff0c;一个高效、灵活的代码编辑器无疑对开发者们起着至关重要的支持作用。Zed&#xff0c;作为来自知名编辑器Atom和语法解析器Tree-sitter的创造者的心血之作&#xff0c;正是这样一款高性能支持多人合作的编辑神器。本文将带领大家深入探…...

【数据机构】2. 线性表之“顺序表”

- 第 96 篇 - Date: 2025 - 05 - 09 Author: 郑龙浩/仟墨 【数据结构 2】 文章目录 数据结构 - 2 -线性表之“顺序表”1 基本概念2 顺序表(一般为数组)① 基本介绍② 分类 (静态与动态)③ 动态顺序表的实现**test.c文件:****SeqList.h文件:****SeqList.c文件:** 数据结构 - 2 …...

Java如何获取电脑分辨率?

以下是一个 Java 程序示例&#xff0c;用于获取电脑的主屏幕分辨率&#xff1a; import java.awt.*; public class ScreenResolutionExample { public static void main(String[] args) { // 获取默认的屏幕设备 GraphicsDevice device GraphicsEnvironm…...

opencv中的图像特征提取

图像的特征&#xff0c;一般是指图像所表达出的该图像的特有属性&#xff0c;其实就是事物的图像特征&#xff0c;由于图像获得的多样性&#xff08;拍摄器材、角度等&#xff09;&#xff0c;事物的图像特征有时并不特别突出或与无关物体混杂在一起&#xff0c;因此图像的特征…...

dropout层

从你提供的图片来看&#xff0c;里面讨论了 Dropout 层&#xff0c;让我为你解释一下它的工作原理和作用。 Dropout 层是什么&#xff1f; Dropout 是一种常用的正则化技术&#xff0c;用于避免神经网络的 过拟合&#xff08;overfitting&#xff09;。过拟合是指模型在训练数…...

极狐GitLab 容器镜像仓库功能介绍

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 极狐GitLab 容器镜像库 (BASIC ALL) 您可以使用集成的容器镜像库&#xff0c;来存储每个极狐GitLab 项目的容器镜像。 要为您…...

【JVM-GC调优】

一、预备知识 掌握GC相关的VM参数&#xff0c;会基本的空间调整掌握相关工具明白一点&#xff1a;调优跟应用、环境有关&#xff0c;没有放之四海而皆准的法则 二、调优领域 内存锁竞争cpu占用io 三、确定目标 【低延迟】&#xff1a;CMS、G1&#xff08;低延迟、高吞吐&a…...

shopping mall(document)

shopping mall&#xff08;document&#xff09; 商城的原型&#xff0c;学习&#xff0c;优化&#xff0c;如何比别人做的更好&#xff0c;更加符合大众的习惯 抄别人会陷入一个怪圈&#xff0c;就是已经习惯了&#xff0c;也懒了&#xff0c;也不带思考了。 许多产品会迫于…...

qiankun微前端任意位置子应用

qiankun微前端任意位置子应用 主项目1、安装qiankun2、引入注册3、路由创建4、路由守卫 二、子项目1、安装sh-winter/vite-plugin-qiankun2、main.js配置3、vite.config.js配置 三、问题解决 主项目 1、安装qiankun npm i qiankun -S2、引入注册 创建存放子应用页面 //whpv…...

【LeetCode Solutions】LeetCode 176 ~ 180 题解

CONTENTS LeetCode 176. 第二高的薪水&#xff08;SQL 中等&#xff09;LeetCode 177. 第 N 高的薪水&#xff08;SQL 中等&#xff09;LeetCode 178. 分数排名&#xff08;SQL 中等&#xff09;LeetCode 179. 最大数&#xff08;中等&#xff09;LeetCode 180. 连续出现的数字…...

前端面试每日三题 - Day 29

这是我为准备前端/全栈开发工程师面试整理的第29天每日三题练习&#xff1a; ✅ 题目1&#xff1a;Web Components技术全景解析 核心三要素 Custom Elements&#xff08;自定义元素&#xff09; class MyButton extends HTMLElement {constructor() {super();this.attachShado…...

第十五章,SSL VPN

前言 IPSec 和 SSL 对比 IPSec远程接入场景---client提前安装软件&#xff0c;存在一定的兼容性问题 IPSec协议只能够对感兴趣的流量进行加密保护&#xff0c;意味着接入用户需要不停的调整策略&#xff0c;来适应IPSec隧道 IPSec协议对用户访问权限颗粒度划分的不够详细&…...

spring5.x讲解介绍

Spring 5.x 是 Spring Framework 的重要版本升级&#xff0c;全面拥抱现代 Java 技术栈&#xff0c;其核心改进涵盖响应式编程、Java 8支持、性能优化及开发模式创新。以下从特性、架构和应用场景三个维度详细解析&#xff1a; 一、核心特性与架构改进 Java 8 全面支持 Spring …...

荣耀A8互动娱乐组件部署实录(第3部分:控制端结构与房间通信协议)

作者&#xff1a;曾在 WebSocket 超时里泡了七天七夜的苦命人 一、控制端总体架构概述 荣耀A8控制端主要承担的是“运营支点”功能&#xff0c;也就是开发与运营之间的桥梁。它既不直接参与玩家行为&#xff0c;又控制着玩家的行为逻辑和游戏规则触发机制。控制端的主要职责包…...

levelDB的数据查看(非常详细)

起因:.net大作业天气预报程序(WPF)答辩时&#xff0c;老师问怎么维持数据持久性的&#xff0c;启动时加载的数据存在哪里&#xff0c;我明白老师想考的应该是json文件的解析&#xff08;正反&#xff09;&#xff0c;半天没答上来存那个文件了&#xff08;老师默认这个文件是自…...

在Fiddler中添加自定义HTTP方法列并高亮显示

在Fiddler中添加自定义HTTP方法列并高亮显示 Fiddler 是一款强大的 Web 调试代理工具&#xff0c;允许开发者检查和操作 HTTP 流量。一个常见需求是自定义 Web Sessions 列表&#xff0c;添加显示 HTTP 方法&#xff08;GET、POST 等&#xff09;的列&#xff0c;并通过颜色区…...

基于公共卫生大数据收集与智能整合AI平台构建测试:从概念到实践

随着医疗健康数据的爆发式增长,如何有效整合、分析和利用这些数据已成为公共卫生领域的重要挑战。传统方法往往难以应对数据的复杂性、多样性和海量性,而人工智能技术的迅猛发展为解决这些挑战提供了新的可能性。基于数据整合与公共卫生大数据的AI平台旨在构建一个全面的生态…...