# MQTT协议 #### 1. 简介 \*\*MQTT(Message Queuing Telemetry Transport)\*\*,是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。 MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。 #### 2. 特点 \*\*低协议开销\*\* MQTT 的独特之处在于,它的每消息标题可以短至 2 个字节。MQ 和 HTTP 都拥有高得多的每消息开销。对于 HTTP,为每个新请求消息重新建立 HTTP 连接会导致重大的开销。MQ 和 MQTT 所使用的永久连接显著减少了这一开销。 \*\*对不稳定网络的容忍\*\* MQTT 和 MQ 能够从断开等故障中恢复,而且没有进一步的代码需求。但是,HTTP 无法原生地实现此目的,需要客户端重试编码,这可能增加幂等性问题。 \*\*低功耗\*\* MQTT 是专门针对低功耗目标而设计的。HTTP 的设计没有考虑此因素,因此增加了功耗。 \*\*数百万个连接的客户端\*\* 在 HTTP 堆栈上,维护数百万个并发连接,需要做许多的工作来提供支持。尽管可以实现此支持,但大多数商业产品都为处理这一数量级的永久连接而进行了优化。IBM 提供了 IBM MessageSight,这是一个单机架装载服务器,经过测试能处理多达 100 万个通过 MQTT 并发连接的设备。相反,MQ 不是为大量并发客户端而设计的。 \*\*推送通知\*\* 您需要能够及时地将通知传递给客户。为此,必须采用某种定期轮询或推送方法;从电池、系统负载和带宽角度讲,推送是最佳解决方案。 我们的企业可能需要在没有第三方中介的情况下发送敏感的信息。这降低了特定于操作系统的解决方案(比如 Apple iOS、Google Play 通知)作为主要传输机制的价值。 HTTP 只允许使用一种称为COMET 的方法,使用持久的 HTTP 请求来执行推送。从客户端和服务器的角度讲,此方法都很昂贵。MQ 和 MQTT 都支持推送,这是它们的一个基本特性。 \*\*客户端平台差异\*\* HTTP 和 MQTT 客户端都已在大量平台上实现。MQTT 的简单性有助于以极少的精力在额外的客户端上实现 MQTT。 \*\*防火墙容错\*\* 一些企业防火墙将出站连接限制到一些已定义的端口。这些端口通常被限制为 HTTP(80 端口)、HTTPS(443 端口)等。HTTP 显然可以在这些情况下运行。MQTT 可封装在一个 WebSockets 连接中,显示为一个 HTTP 升级请求,从而允许在这些情况下运行。MQ 不允许采用这种模式。 !\[img\](https://img-blog.csdnimg.cn/20200214140634920.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhbmRhb3l1,size_16,color_FFFFFF,t_70) #### 3. MQTT通讯运行方式 使用\*\*发布/订阅消息模式\*\*,提供一对多的消息发布,解除应用程序耦合; 1.在MQTT通讯过程中,有三种身份,分别是\*\*发布者(publisher)、代理(broker)、和订阅者(subscriber)\*\*。 2.MQTT传输的\*\*消息\*\*分为:\*\*主题(topic)\*\*和\*\*负载(payload)\*\*两部分(都是字符串的形式)。 客户端向代理发布topic的\*\*消息\*\*到代理(MQTT服务程序),代理将该消息推送到所有订阅该topic的客户端。 (说通俗点就是手机或硬件设备将数据发送到代理,即云服务器,云服务器再通过订阅的方式转发给订阅者) \* 发布消息的客户端就是发布者,可以为手机、电脑或硬件设备等 \* 订阅topic消息的客户端就是订阅者, \* 代理(服务器)一般指云服务器 !\[img\](https://img-blog.csdnimg.cn/20200214140722918.png) ![image-20240329204512996](https://hgh-typora-image.oss-cn-guangzhou.aliyuncs.com/img/image-20240329204512996.png) #### 4. MQTT协议帧格式 在MQTT协议中,一个MQTT数据包由:\*\*固定头(Fixed header)、可变头(Variable header)、消息体(payload\*\*)三部分构成。 协议帧 = 固定头部+可变头部+消息体 \> 参考:https://blog.csdn.net/bandaoyu/article/details/104311367