MQTT连接建立全流程解析

野火IM的TCP MQTT服务架构与连接管理解析 MQTT协议作为轻量级的物联网通信协议,基于TCP连接实现设备与服务端的可靠通信。其核心原理采用发布/订阅模式,通过主题过滤实现消息路由,具有低功耗、低带宽占用的技术特点。在工程实践中,MQTT over TCP的组合需要解决连接保活、消息顺序保证等关键问题,这对构建高可用IM系统尤为重要。野火IM的开源实现通过Netty框架优化TCP连接管理,采用责任链模式处理协议解码,并实现自适应心跳机制提升移动网络下的连接稳定性。该方案在物联网和即时通讯场景中展现出40%以上的资源利用率提升,其连接数扩展和QoS保障 阅读详情

wireshark 抓取的数据包

在这里插入图片描述

1. 连接建立概览流程图

MQTT 代理MQTT 客户端MQTT 代理MQTT 客户端阶段 1: TCP/TLS 握手 (底层网络)阶段 2: MQTT 协议握手包含: ClientID,用户名/密码,遗嘱消息,Keep Alive 等包含: 返回码 0x00 (成功),会话呈现标志连接建立成功,进入通信循环包含: 非零返回码 (如 0x04, 0x05)连接终止alt[验证通过][验证失败 (如非法ID、认证错误)]发起 TCP 连接 (可选 TLS 握手)TCP 连接建立发送 CONNECT 报文返回 CONNACK 报文返回 CONNACK 报文关闭 TCP 连接

2. 核心步骤详解

第一步:建立底层连接 (TCP/TLS)

在发送任何 MQTT 报文之前,客户端必须先与代理服务器建立 TCP 连接。

  • 端口:默认端口为 1883 (非加密) 或 8883 (TLS 加密)。
  • 操作:MQTT 是基于 TCP 的长连接协议。如果需要安全性,会在 TCP 握手后进行 TLS/SSL 握手。

第二步:客户端发送 CONNECT 报文

客户端构造并发送 CONNECT 报文。这是 MQTT 连接的第一个报文,用于声明自己的身份和连接参数。
CONNECT 报文主要载荷包含:

字段名说明
Client ID客户端的唯一标识符。必须为 1-23 字节。如果为空,需由代理分配唯一 ID(需 Clean Session = true)。
Clean Session (v3.1.1) / Clean Start (v5.0)为 true 时,表示连接断开后不保留之前的会话状态(订阅、QoS 1/2 消息)。
Keep Alive保活时间(秒)。在此时间内如果没有数据交互,客户端需发送 PINGREQ 保持连接。
User Name / Password用于连接认证的用户名和密码。
Will Message (遗嘱)如果客户端异常断开,代理将自动发布的消息(包含 Will Topic 和 Will Payload)。
协议级别客户端支持的 MQTT 版本号(如 4 代表 3.1.1,5 代表 5.0)。

第三步:代理验证 CONNECT

代理收到 CONNECT 报文后,会对报文内容进行校验。校验内容通常包括:

  1. 协议版本匹配:代理是否支持客户端请求的 MQTT 版本。
  2. Client ID 合法性:是否符合长度限制,是否已被允许重复连接。
  3. 认证鉴权:用户名和密码是否正确(或通过扩展插件/服务认证)。
  4. 权限检查:是否有权限连接、是否允许设置遗嘱等。

第四步:代理返回 CONNACK 报文

无论验证成功与否,代理都必须回复 CONNACK 报文。
CONNACK 报文核心内容:

  • 会话呈现标志:
    • 0:服务端已恢复与客户端之前的会话状态。
    • 1:服务端没有已存储的会话状态(这是一个全新的会话)。
  • 连接返回码:最关键的字段,决定连接是否成功。
返回码 (十进制)含义描述
0已连接连接成功,可以开始通信。
1连接不可接受 (协议错误)协议版本不匹配。
2标识符拒绝Client ID 格式错误。
3服务器不可用服务端当前无法处理请求。
4用户名或密码错误认证失败。
5未经授权客户端未被授权连接。
结果判定:
  • 如果 Return Code = 0:连接正式建立,TCP 通道保持打开,可以开始发送 SUBSCRIBE 或 PUBLISH 报文。
  • 如果 Return Code ≠ 0:表示连接被拒绝。代理发送完 CONNACK 后,会主动断开 TCP 连接。

3. 关键注意事项

  1. Keep Alive 机制:连接建立后,如果 Keep Alive 时间设置为 60秒,那么在 60秒内如果没有其他报文流动,客户端必须发送 PINGREQ,代理回复 PINGRESP。如果超过 1.5 倍 Keep Alive 时间没有收到任何报文,代理会认为客户端已断开。
  2. Clean Session vs 持久会话:
    • Clean Session = true:适合在线采集设备,断线即重置,不关心离线消息。
    • Clean Session = false:适合需要高可靠性的场景。客户端断线后,代理会为其保留未确认的 QoS 1/2 消息和订阅关系,待客户端重连后(ClientID 一致)立即推送。
  3. 遗嘱机制:主要用于检测设备异常掉线(如断电)。如果是正常发送 DISCONNECT 报文断开,代理将不会发送遗嘱消息。

4. Mermaid 代码 (可直接复制使用)

MQTT BrokerMQTT ClientMQTT BrokerMQTT ClientTCP 连接建立发送 CONNECT 报文- ClientID- Clean Session- Keep Alive- Username/Password- Will Flag验证 ClientID 和 鉴权**连接建立成功**主动断开 TCPalt[认证成功且参数合法][认证失败或参数错误]TCP SYN1TCP SYN/ACK2TCP ACK3MQTT CONNECT4MQTT CONNACK (Return Code: 0)5MQTT CONNACK (Return Code: 2-5)6TCP FIN7
MQTT建立连接 阅读详情

相关推荐

【物联网】物1— 初步认识MQTT、连接到MQTT服务端

MQTT的基本概念、原理以及如何连接到MQTT服务端

h17047的博客 4398

MQTT连接建立全流程解析与实战优化

MQTT作为物联网领域广泛采用的轻量级通信协议,其核心机制基于发布/订阅模式实现设备间高效通信。协议通过CONNECT/CONNACK报文交互建立持久化连接,这种设计显著降低了物联网场景下的通信开销。在工程实践中,合理设置KeepAlive参数和Clean Session标志对保障连接稳定性至关重要,特别是在移动网络等不稳定环境中。典型应用场景包括智能家居设备控制、工业传感器数据采集等需要实时双向通信的物联网系统。通过TCP/TLS传输层保障和MQTT协议层的会话管理,开发者可以构建高可靠的物联网通信架构,

weixin_27014595的博客 139

【MQTT】用MQTT.fx连接阿里云

首先,需要在阿里云上创建设备 打开阿里云官网https://www.aliyun.com/,注册并登录: 打开控制台: 点击左侧的栏目找到“产品与服务”,在里面继续找到“应用与服务下面的”“物联网平台” 依次找到《设备管理》《产品》,然后“创建产品”: 下面还有一些不是必填项,可以根据需要自行填写,之后点击保存即可。 创建好产品之后就要开始创建设备了,产品是一个大类,设备就是产品下的一个具体的分支,相当于领导和下属的关系,领导发布任务,下属实际执行,设备就是实现具体执行某个任务的功能。 接下来要给

qq_45097019的博客 8412

mqtt中clientid怎么查_【零基础学物联网】MQTT篇 13 连接MQTT服务端

MQTT客户端之间要想实现通讯,必须要通过MQTT服务端。因此MQTT客户端无论是发布消息还是订阅消息,首先都要连接MQTT服务端。下面我们看一下MQTT客户端连接服务端的详细过程。MQTT客户端连接服务端一共有两步。1. 首先MQTT客户端将会向服务端发送连接请求。该请求实际上是一个包含有连接请求信息的数据包。这个数据包的官方名称为CONNECT。2. MQTT服务端收到客户端连接请求...

weixin_39766258的博客 8322

MQTT连接过程与步骤

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)的连接过程相对直接且灵活,主要涉及到客户端与服务器之间的一系列握手和认证流程。

道亦无名 1103

CNN卷积神经网络手写数字识别实例及代码详解

本文的代码来自githup的Deep Learning的toolbox,是用Matlab实现的。感谢该toolbox的作者付出和分享。 我在应该该代码进行训练时,出现一些报错,如expand函数应用不对,flipall函数未定义等问题,对这些问题进行了修正,完成网络训练和验证。 本文mnist_uint8.mat的获取可以参照我的另一篇博客:MNIST数据库处理--matlab生成mnist_

VivienFu的专栏 6万+

MQTT通讯协议接入

MQTT是一种基于发布/订阅模式的轻量级消息传输协议,常用于低带宽、不可靠网络环境下传输消息,适用于物联网设备之间的通信。

LB_bei的博客 3499

Zephyr、FreeRTOS 和 RT-Thread

你是…更适合用嵌入式新手,刚接触 RTOSFreeRTOS(入门简单)IoT 项目开发,需要 BLE/WiFi/MQTTZephyr(协议全)想快速构建可部署的产品Zephyr(模块统一)只做单个任务或简单状态机控制FreeRTOS(轻量)做平台化、持续集成、自动测试Zephyr(CI 支持强)

is0815的博客 2246

MQTT协议连接建立全流程解析与物联网实践

MQTT协议作为物联网领域的核心通信标准,其轻量级的发布/订阅模式特别适合低带宽设备。从TCP/IP协议栈的基础原理出发,MQTT通过三次握手建立可靠传输通道,并在此基础上实现高效的设备间通信。在物联网工程实践中,合理配置Keep Alive参数和Clean Session标志对维持稳定连接至关重要。通过分析CONNECT/CONNACK报文交互,开发者可以优化智能家居、工业传感器等场景下的设备连接策略。针对移动网络切换和资源受限设备等特殊场景,采用动态心跳调整和精简Client ID等技巧能显著提升连接可

weixin_26897585的博客 267

锐捷路由器DNS Proxy保姆级配置教程:从零到实战,手把手教你搞定内网域名解析

本文提供锐捷路由器DNS Proxy功能的详细配置教程,从基础环境搭建到实战测试,手把手教你实现内网域名解析。涵盖上游DNS设置、内网域名映射、故障排查等关键步骤,帮助网络管理员快速解决内网访问难题,提升工作效率。

weixin_29284657的博客 555

保姆级教程:用ncnn把自训练的YOLOv8模型塞进Android App(附完整代码)

本文提供了一份详细的保姆级教程,指导开发者如何将自训练的YOLOv8模型通过ncnn框架部署到Android应用中。教程涵盖环境配置、模型训练与转换、Android工程集成及性能优化等全流程,并附完整代码实现,帮助开发者快速掌握移动端AI模型部署技术。

weixin_42659194的博客 255

从AT指令到智能家居:ESP8266与OneNET MQTT的物联网开发实战解析

本文详细解析了如何通过ESP8266的AT指令与OneNET MQTT协议进行交互,实现智能家居设备的云端连接与控制。内容涵盖环境搭建、指令解析、平台连接、数据通信及微信小程序集成,并提供调试技巧与项目优化方案,帮助开发者快速构建稳定可靠的物联网应用。

Pepper的专栏 440

基于Matlab-Simulink的大林算法控制系统设计与振铃消除实验

本文详细介绍了基于Matlab-Simulink的大林算法控制系统设计与振铃消除实验。通过分析纯滞后系统的控制难题,探讨大林算法在工业控制中的应用优势,并提供Matlab-Simulink环境搭建、控制器D(z)设计、振铃消除及仿真实验的完整流程。文章还对比了大林算法与PID控制的性能差异,为工程实践提供参考。

dropout6artist的博客 796

手把手教你用AT命令搞定MQTT连接与发布(附阿里云物联网平台日志排查法)

本文详细介绍了如何使用AT命令实现MQTT连接与消息发布,重点解析了AT+QMTOPEN、AT+QMTCONN、AT+QMTPUB等核心命令的使用技巧和常见错误排查方法,并结合阿里云物联网平台日志进行深度验证,帮助开发者快速掌握物联网设备通信的关键技术。

weixin_29214559的博客 178

Claude Code × SolidWorks:批量填属性、格式转换、BOM 汇总自动化实战

摘要:本文介绍利用 Claude Code 生成 VBA 宏实现 SolidWorks 批量处理任务的自动化方案。包含5个实战案例:批量填写自定义属性(60分钟任务→10秒)、批量格式转换(80分钟→30秒)、多配置工程图自动生成(120分钟→2分钟)、滚珠丝杠选型计算(15分钟→10秒)和装配体递归BOM导出(40分钟→1分钟)。所有代码基于SolidWorks 2020+ API,提供完整VBA实现和操作指南,可显著提升设计效率。

m0_64424835的博客 613

从零到一:基于Matlab的二阶系统时域性能指标计算与可视化实战

本文提供了一份基于Matlab的二阶系统时域性能指标计算与可视化实战指南。通过详细的代码示例,手把手教你如何利用Matlab计算超调量、调节时间等关键指标,并绘制阶跃响应曲线进行可视化分析,帮助控制工程学习者和从业者快速掌握系统性能评估方法。

weixin_29096377的博客 269

MQTT已连接却无法说话?音频通道协议选型与排查指南

在物联网与智能语音设备开发中,MQTT常被误认为能直接传输音频,实则它仅是信令通道。音频流传输依赖WebSocket、UDP等协议,涉及TCP与UDP在实时性、可靠性上的本质差异。理解信令与流媒体分离架构,掌握协议自适应与降级逻辑,是解决“MQTT已连接但无法说话”问题的关键。本文深入剖析音频通道协议选型、参数匹配及常见排查技巧,适用于智能语音终端、实时对讲等场景,帮助开发者快速定位并修复音频通道建立失败问题。

weixin_34129696的博客 364

Python 爬虫实战:爬取知乎问答与评论数据并分析

摘要:本文以Python为核心工具,系统讲解知乎问答与评论数据爬取的技术方案。通过分析知乎API接口结构,详细阐述Requests库结合正则表达式的数据获取方法,涵盖请求头构造、鉴权参数处理等关键技术。文章对比了HTML解析、API调用和Selenium模拟三种爬取方案的优劣,提供完整的代码实现,包括问题信息获取、回答列表爬取和评论数据提取。同时介绍了数据存储(JSON/Excel)和基础文本分析(词云生成)方法,并给出合规使用建议和技术优化方向,为开发者提供了一套可落地的知乎数据爬取与分析解决方案。

2503_91057718的博客 1820

Air780EP携手OneNET:AT指令+MQTT快速实现数据上云全流程

物联网设备接入云端时,常需兼顾通信稳定性与开发效率。MQTT作为轻量级发布/订阅协议,天然适配低带宽、高延迟的蜂窝网络场景,而AT指令则让模组控制变得像文本对话一样简单。Cat.1模组Air780EP凭借运营商LTE网络覆盖广、无需配网、BOM成本可控等优势,结合OneNET平台的设备管理与数据流能力,可快速搭建从传感器到云端的完整链路。理解MQTT承载于TCP之上的层级关系、OneNET特有的数据流Topic结构、以及产品ID/设备ID与APIKey的映射规则,是避免鉴权失败和静默丢包的关键。本文从串口接

weixin_33912453的博客 471

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

从CONNECT到CONNACK:深入解析MQTT连接建立的握手协议

本文深入解析MQTT连接建立的握手协议,从CONNECT到CONNACK的全过程,涵盖ClientId设置、CleanSession参数、安全认证及连接保活等关键细节。通过实战案例和代码示例,帮助开发者优化物联网设备连接稳定性与安全性,提升MQTT协议在代理与客户端通信中的效率。

weixin_30691871的博客 410

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

嵌入式MQTT客户端联调:连接、订阅、JSON解析与响应发布

MQTT是物联网设备接入云平台的核心轻量级消息协议,基于发布/订阅模型实现解耦通信。其工作原理依赖TCP连接建立、主题订阅、QoS服务质量控制及事件驱动的消息收发机制。在嵌入式端(如ESP-IDF)实践中,技术价值体现在低资源占用、断线重连鲁棒性与TLS安全扩展能力。典型应用场景包括智能传感器数据上报、远程设备指令下发与边缘-云协同响应闭环。本文聚焦接入层工程落地,涵盖MQTT客户端初始化、事件状态机处理、JSON载荷解析(cJSON库)、结构体映射及异步发布等关键环节,直击‘rc异常’‘乱码解析’‘转移制

weixin_35238815的博客 83

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MQTT 连接建立流程及 paho mqtt 源码分析

文章转自:https://www.whqft.com/tech/ba0fbbea4fbe52ab5c48a1a3680b38c0.html 目录 目录 前言 连接流程 连接配置 源码分析 总结 前言 在上篇分析了mqtt的基础后,接下来就分析下mqtt协议连接建立流程。在阅读本文之前,需要大家去了解一下Mqtt报文格式,还没有看的同学可以参考下此文:https://blog.youkuaiyun.com/l...

rockstore的博客 1万+

用AT指令透传发MQTT报文,建立MQTT连接的过程

安装参考地址:https://blog.youkuaiyun.com/sky_dsy/article/details/78912461 使用参考地址:https://blog.youkuaiyun.com/wen2204/article/details/82663412 MQTT报文算法:https://www.arduino.cn/forum.php?mod=viewthread&tid=82905&amp...

QQ号:1252595878 6318

MQTT入门:在Spring Boot中建立连接及测试

通过以上步骤,我们成功地在Spring Boot项目中集成了MQTT客户端,并通过JUnit进行了简单的连接测试。

Takumilove的博客 2288

MQTT 连接建立与断开流程详解(一)

TCP 连接基础,MQTT 连接请求(CONNECT 报文)与确认(CONNACK 报文)的交互过程,断开连接(DISCONNECT 报文)的处理机制,连接保持(心跳机制)的配置与作用。

1713

MQTT客户端、代理(broker)和连接建立

在IoT场景中,一个MQTT客户端通常代理一个发布者或订阅者。一个发布者客户端发送信息,而订阅者客户端接收信息。但是,一个MQTT客户端可既是发布者又是订阅者。一个MQTT客户端可以是任意设备,从一个微控制器到一个大的服务器,运行着MQTT库且通过网络连接到MQTT代理(broker)。一个MQTT库是一个实现了MQTT协议的软件模块或包,为设备或程序提供一个接口和MQTT通信。这些库可以更轻松的将MQTT支持添加到应用程序和设备中,而无需从头开始实现协议。

yudaxiaye的博客 7171
上一篇: MQTT连接失败定位步骤
下一篇: mqtt在TLSv1.3下连接失败的核心原因
未来创世纪
博客等级 码龄18年 960粉丝 209原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值