MQTT协议详解,非常易懂

article/2025/9/29 13:39:41

MQTT协议详解一


协议地址:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html

当然也有PDF版的,百度一下,不过个人感觉不是官网上的字体和排版最舒服。

那么这个协议是用做什么或有什么特色呢?下面是mqtt.org上的首段介绍:

It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is
required and/or network bandwidth is at a premium. For example, it has been used in sensors communicating to a broker via satellite link, over occasional dial-up connections with healthcare providers, and in a range of home automation and small device scenarios.
It is also ideal for mobile applications because of its small size, low power usage, minimised data packets, and efficient distribution of information to one or many receivers

MQTT轻量级基于代理的发布/订阅的消息传输协议,它可以通过很少的代码和带宽和远程设备连接。例如通过卫星和代理连接,通过拨号和医疗保健提供者连接,以及在一些自动化或小型设备上,而且由于小巧,省电,协议开销小和能高效的向一和多个接收者传递信息,故同样适用于称动应用设备上。

相信在想深入学习这协议必是奔着解决某个问题而来的,上面给出了适用的场景,我之所以想深入的学习和了解这个协议,理由如下:

1、可以实现手机消息推送(PUSH)

2、协议简单,最小的头部只需2个字节,特别适合于嵌入式中。

3、这是个了解什么是协议绝好的例子。相比于其它复杂的协议例如tcp,http协议,至少说明文档看的下去。

在这里,我以推送为例子说明,虽然现在现成的推送解决方案已经比较成熟,但是这个Repeat ReInvent the Whell还是要做一下,什么都是拿来主义,和搬运工有什么区别。

一、需要的环境:

1、PHP+Apache或Nginx

2、安装开源代理程序Mosquitto,这里用其做为代理服务器,负责连接和分发。

安装方法很简单,http://mosquitto.org/files/   binary是编译好的,source是源码安装需要的(make & make install 就行)

唯 一要配置的就是在解压后的config.mk,安装完后设置文件是mosquitto.conf

当然主要是设置是否支持ssl,还有就是config.mk最下面的安装位置的设定。这里一切默认。

默认启动是绑定的IP是本地IP,端口是1883可以在mosquitto.conf里设置(要去掉前面的#字注释),linux 中 -c 可以指定设置文件并运行

比 如: mosquitto -c /etc/mosquitto.conf

二、协议初解

先说一下整个协议的构造,整体上协议可拆分为:

                    固定头部+可变头部+消息体

协议说白了就是对于双方通信的一个约定,比如传过来一段字符流,第1个字节表示什么,第2个字节表示什么。。。。一个约定。

所以在固定头部的构造如下:

1、MessageType(0和15保留,共占4个字节)

public $operations=array("MQTT_CONNECT"=>1,//请求连接"MQTT_CONNACK"=>2,//请求应答"MQTT_PUBLISH"=>3,//发布消息"MQTT_PUBACK"=>4,//发布应答"MQTT_PUBREC"=>5,//发布已接收,保证传递1"MQTT_PUBREL"=>6,//发布释放,保证传递2"MQTT_PUBCOMP"=>7,//发布完成,保证传递3"MQTT_SUBSCRIBE"=>8,//订阅请求"MQTT_SUBACK"=>9,//订阅应答"MQTT_UNSUBSCRIBE"=>10,//取消订阅"MQTT_UNSUBACK"=>11,//取消订阅应答"MQTT_PINGREQ"=>12,//ping请求"MQTT_PINGRESP"=>13,//ping响应"MQTT_DISCONNECT"=>14//断开连接); 

2、DUP flag

 其是用来在保证消息传输可靠的,如果设置为1,则在下面的变长头部里多加MessageId,并需要回复确认,保证消息传输完成,但不能用于检测消息重复发送。

3、Qos

主要用于PUBLISH(发布态)消息的,保证消息传递的次数。

00表示最多一次 即<=1

01表示至少一次  即>=1

10表示一次,即==1

11保留后用

4、Retain

 主要用于PUBLISH(发布态)的消息,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它。如果不设那么推送至当前订阅的就释放了。

5、固定头部的byte 2

是用来保存接下去的变长头部+消息体的总大小的。

但是不是并不是直接保存的,同样也是可以扩展的,其机制是,前7位用于保存长度,后一部用做标识。

我举个例了,即如果计算出后面的大小为0<length<=127的,正常保存

如果是127<length<16383的,则需要二个字节保存了,将第一个字节的最大的一位置1,表示未完。然后第二个字节继续存。

拿130来说,第一个字节存10000011,第二个字节存000000001,也就是0x83,0x01,把两个字节连起来看,第二个字节权重从2的8次开始。

同起可以加第3个字节,最多可以加至第4个字节。故MQTT协议最多可以实现268 435 455 (0xFF, 0xFF, 0xFF, 0x7F)将近256M的数据。可谓能伸能缩。

 可变头部

这个是可变头部的全貌。

1、首先最上面的8个字节是Protocol Name(编码名),UTF编码的字符“MQIsdp”,头两个是编码名提长为6。

这里多说一些,接下去的协议多采用这种方式组合,即头两个字节表示下一部分的长,然后后面跟上内容。这里头两个字节长为6,下面跟6个字符“MQIsdp”。

2、Protocol Version,协议版本号,v3 也是固定的。

3、Connect Flag,连接标识,有点像固定头部的。8位分别代表不同的标志。第1个字节保留。

Clean Session,Will flag,Will Qos, Will Retain都是相对于CONNECT消息来说的。

Clean Session:0表示如果订阅的客户机断线了,那么要保存其要推送的消息,如果其重新连接时,则将这些消息推送。

                            1表示消除,表示客户机是第一次连接,消息所以以前的连接信息。

Will Flag表示如果客户机在不是在发送DISCONNECT消息中断,比如IO错误等,将些置为1,要求重传。并且下且的WillQos和WillRetain也要设置,消息体中的Topic和MessageID也要设置,就是表示发生了错误,要重传。

Will Qos,在CONNECT非正常情况下设置,一般如果标识了WillFlag,那么这个位置也要标识。

Will RETAIN:同样在CONNECT中,如果标识了WillFlag,那么些位也一定要标识

usename flag和passwordflag,用来标识是否在消息体中传递用户和密码,只有标识了,消息体中的用户名和密码才用效,只标记密码而不标记用户名是不合法的。

4、Keep Alive,表示响应时间,如果这个时间内,连接或发送操作未完成,则断开tcp连接,表示离线。

5、Connect Return Code即通常于CONNACK消息中,表示返回的连接情况,我可以通过此检验连接情况。

6、Topic Name,订阅消息标识,MQTT是基于订阅/发布的消息,那么这个就是消息订阅的标识,像新闻客户端里的订阅不同的栏目一样。用于区别消息的推送类别。

主要用于PUBLISH和SUBSCRIBE中。最大可支持32767个字符,即4个字节。

消息体(PayLoad)

只有3种消息有消息体CONNECT,SUBSCRIBE,SUBACK

CONNECT主要是客户机的ClientID,订阅的Topic和Message以及用户名和密码,其于变长头部中的will是对应的。

SUBSCRIBE是包含了一系列的要订阅的主题以及QOS。

SUBACK是用服务器对于SUBSCRIBE所申请的主题及QOS进行确认和回复。

PUBLISH是消息体中则保存推送的消息,以二进制形式,当然这里的编辑可自定义。

7、Message Identifier

包含于PUBLISH, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK.

其为16位字符表示,用于在Qos为1或2时标识Message的,保证Message传输的可靠性。

至于具体的消息例子,我们在后面的代码中慢慢体现。


http://chatgpt.dhexx.cn/article/ECZ2986g.shtml

相关文章

看见协议,浅析TCP、HTTP、MQTT

如果对tcp还不了解的&#xff0c;可以看看计算机网络基础简单了解一下&#xff1b; 如果对tcp的深入感兴趣&#xff0c;看了上一篇还不过瘾的可以看吊打面试官&#xff01;近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题 好了&#xff0c;如果看回来了我们来进入正题…

MQTT协议简介

一、mqtt协议简介1.1 MQTT协议特点1.2 发布和订阅1.3 QoS&#xff08;Quality of Service levels&#xff09;QoS 0QoS 1QoS 2 二、MQTT 数据包结构2.1 MQTT固定头 ( FixedHeader )2.2 MQTT可变头 ( Variable header )2.3 消息体 ( Payload ) 三、环境搭建3.1 MQTT服务器搭建3.…

MQTT 协议是什么

MQTT 协议是什么 随着 5G 时代的来临&#xff0c;万物互联的伟大构想正在成为现实。联网的 物联网设备 在 2018 年已经达到了 70 亿&#xff0c;在未来两年&#xff0c;仅智能水电气表就将超过10亿。 海量的设备接入和设备管理对网络带宽、通信协议以及平台服务架构都带来了很…

简述MQTT协议

目录 简介MQTT协议组成MQTT三种QOS 1.简介 1.1 MQTT介绍 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输&#xff09;&#xff1a; 是IBM推出的一种针对移动终端设备基于TCP/IP的发布/订阅协议&#xff1b;可以连接大量的远程传感器和…

MQTT协议详解(完整版)

1 MQTT协议概念: 1.1 MQTT特点: 基于Publish/Subscribe(发布订阅)模式的物联网通信协议简单易实现支持Qos(服务质量)报文精简基于TCP/IP 发布订阅模式: 客户端只需要订阅这个主题&#xff0c;当有其他客户端向这个服务端发布消息时&#xff0c;这个客户端就可以收到这个消息…

MQTT协议-MQTT协议简介及协议原理

MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的“轻量级”通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff0c;由IBM在1999年发布…

MQTT协议详解及v5.0实践——实践类

本文主要包含了以下内容&#xff1a; 1&#xff09;MQTT协议演进历史及协议特点&#xff0c;总结和分析MQTT协议族的优缺点&#xff0c;分析和总结了为什么相比于其他协议&#xff0c;MQTT适合IoT&#xff0c;业内支持现状等。 2&#xff09;阿里云IoT MQTT3和5协议在实践中的…

MQTT与TCP通信协议的对比

一、背景 在物联网场景开发中&#xff0c;大多数通信模组都支持TCP、UDP、MQTT、CoAP、HTTP、LwM2M等网络通信协议&#xff0c;其中既有负责传输层协议&#xff0c;也有应用层协议&#xff0c;不同协议适用的场景也不尽相同。 二、协议分层 上图中举例了网络分层中最常见的几…

MQTT协议介绍

MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议)&#xff0c;是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff0c;由IBM在1999年发布。MQTT最大优点在于&#xff0c;可以以极少的代码…

MQTT协议超全面总结来啦

一、概念 MQTT 是基于 Publish/Subscribe 模式的物联网通信协议&#xff0c;凭借简单易实现、支持 QoS、报文小等特点&#xff0c;占据了物联网协议的半壁江山。 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c…

【MQTT协议详解】MQTT协议

文章前注&#xff1a;本文的大量素材来自于百度百科和MQTT协议3.1.1中文板 MQTT协议3.1.1中文版网址&#xff1a;http://blog.mcxiaoke.com/mqtt/protocol/MQTT-3.1.1-CN.html 一、认识MQTT MQTT(消息队列遥测传输) 是ISO 标准(ISO/IEC PRF 20922)下基于 发布/订阅 范式的消息…

MQTT协议 详解

文章目录 一、啥是MQTT&#xff1f;1. MQTT协议特点2. 发布和订阅3. QoS&#xff08;Quality of Service levels&#xff09;QoS 0 —— 最多1次QoS 1 —— 最少1次QoS 2 —— 只有1次 二、MQTT 数据包结构1. MQTT固定头2. MQTT可变头 / Variable header3. Payload消息体 三、M…

MQTT协议图解,一文看懂MQTT协议数据包(真实报文数据解析解释)

文章目录 一、MQTT协议二、协议详解2.1 协议结构2.1.1 固定报头2.1.2 可变报头2.1.3 有效载荷 三、具体协议报文详解3.1 连接服务器报文详解3.2 发布消息报文详解 四、开源的MQTT实现五、官方文档3.1.1中文翻译下载六、官方文档5.0中文翻译下载 本文主要介绍MQTT协议的结构和具…

MQTT协议(概括与详解)

I概括 一&#xff0c;MQTT协议 1、MQTT协议可以以极少的代码和有限的带宽&#xff0c;为连接远程设备提供实时可靠的消息服务。 2、使用发布/订阅消息模式&#xff0c;提供一对多的消息发布&#xff0c;解除应用程序耦合。 对负载内容屏蔽的消息传输。 使用 TCP/IP 提供网络…

大数据挖掘分析经典案例,主要包含哪几种?

1.预测产品未来一段时间用户是否会流失&#xff0c;流失情况怎么样&#xff1b; 2.公司做了某个促销活动&#xff0c;预估活动效果怎么样&#xff0c;用户接受度如何&#xff1b; 3.评估用户信用度好坏&#xff1b; 4.对现有客户市场进行细分&#xff0c;到底哪些客户才是目…

用户复购行为预测--数据挖掘分析案例(天池/python)

–阿里天池新人赛中的一个&#xff0c;记录分享。 Repeat Buyers Prediction-Challenge the Baseline-天池大赛-阿里云天池 第一次提交&#xff1a;8简单特征&#xff0c;随机森林模型&#xff0c;score:0.5507327&#xff0c;排名&#xff1a;278 第二次提交&#xff1a;13特…

数据挖掘简介

数据挖掘&#xff08;Data Mining&#xff0c;DM&#xff09;又称数据库中的知识发现&#xff08;Knowledge Discover in Database&#xff0c;KDD&#xff09; 数据挖掘又称数据库中的知识发现&#xff08;Knowledge Discover in Database&#xff0c;KDD&#xff09;&#xf…

数据挖掘实战(聚类分析)

目录 数据探索 数据初步认识 查看数据相关信息 图形数据探索 回归分析 矩阵图分析 相关性分析 数据预处理 k-means聚类 算法简介 算法实现 k-medoids方法 算法简介 算法实现 层次聚类 som方法 实验对比 数据探索 数据初步认识 为研究我国31个省市的城镇居民…

基于数据挖掘的疾病数据可视化分析与预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 随着医院信息系统&#xff08;HIS&#xff09;在全国各大医院的推广和应用&#xff0c;会有大量和病人相关的临床数据每天在医院中记录&#xff0c;而这些真实的数据随着规模积累的增加&a…

2019疫情海量数据挖掘分析与可视化实战(源码数据见附件)

海量数据挖掘分析与可视化实战报告 课程名称&#xff1a;海量数据挖掘分析与可视化实战 实训学期&#xff1a; 2021-2022学年第二学期 实训时间&#xff1a; 第16周 专 业&#xff1a; 数据科学与大数据技术 班 级&#xff1a; …