4_4_MQTT 协议讲解|学习笔记

简介: 快速学习4_4_MQTT 协议讲解。

开发者学堂课程【HaaS 物联网应用开发课程4_4_MQTT 协议讲解】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/801/detail/13838


4_4_MQTT 协议讲解

 

内容介绍:

一、MQTT 基本介绍

二、MQTT 协议细节

 

一、MQTT 基本介绍

1. MQTT 简介

MQTT ( Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅 ( publish/subscribe )模式的"轻量级"通讯协议,该协议构建于 TCP/IP 协议上,由 IBM 在1999年发布。MQTT 最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

image.png

如图,MQTT 作为左侧发布端,通过 MQTT Broker 发送给右侧订阅端。

2. 物联网常见协议介绍

物联网最常用的协议主要有下面两种:

MQTT (Message Queuing Telemetry Transport,消息队列遥测传输)

·最早由 IBM 开发的,专门为计算能力有限,工作在低带宽,不可靠网络的控制设备进行通信而设计的

·基于 TCP/IP,开销小,支持 QoS

·常连接,支持多对多的协议

COAP (Constrained Application Protocol,受限制的应用协议)·基于 UDP,采用请求响应的工作模式

·无连接,只支持一对一

一般 loT 与云端通信用 MQTT 协议要多一些,局域网通信一般采用 CoAP 协议

其余常用的网络通信协议,如 http,https 等协议很复杂,对计算能力要求较高,不适合计算能力有限的 loT 设备,在 loT 领域应用相对比较少

3.MQTT 和 COAP 帧结构介绍

image.png

Payload length <128时

- payload 占比为 payload/(payload + variable header +3)

-在 variable header=0时,payload 占比介于25%~97.7%

image.png

Payload length <128时

- payload 占比为 payload/(4 + token + options 1 + payload)

-在 tokenloptions 长度为0时,payload 占比介于20%~96.2%

图中可以看出 MQTT 帧结构和 CoAP 帧结构中头部占比相对较少。MQTT 头部占用有固定两个字节和可变字节。

loT 设备跟云端进行交互的消息一般都比较短,HTTPHTTPS 协议头部少则几十多则上百字节,传输效率相比MQTT/CoAP 低太多。

 

二、MQTT 协议细节

1.MQTT 主要特点

MQTT 最早设计用于监控穿越沙漠中的油管的监控状况其主要特点如下:

·基于 TCP 长连接

·使用发布者/订阅者的模式,提供一对多的消息发布·构建并提供底层传输通道,不关心负载内容

·QoS 支持“至少一次”,“至多一次”,“只有一次”三种不同的模式

·开销很小(固定字节的头部只有2个 Byte)

截止目前,MQTT 有三个版本,3.1.0,3.1.1和最新的5.0版本,5.0版本也已经被纳入 OASIS 标准

image.png

2.MQTT 模式与角色

一种模式:发布者/订阅者模式

三种角色:发布者、代理服务器、订阅者

发布者/订阅者模式:

分为发布者(Publish)、代理(Broker)服务器、订阅者(Subscribe)三种角色

消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者也可以同时是订阅者。

客户端和服务器的两种角色

·客户端

·MQTT 连线的发起者

·发布消息供到其它订阅者订阅的主题

·订阅/退订主题(用于接收其它客户端向该主题发布的消息)服务器

·接收来自客户端的连线请求

·接收客户端的的订阅/退订主题需求向订阅的客户端转发其订阅主题的消息

image.png

3. MQTT 模式与角色举例

image.png

图中空调既是发布者又是订阅者,发布状态信息,订阅温度、定时等控制指令。所有信息都会以中间 MQTT Broker作为中介来传输。当作为发布者时,状态信息通过 MQTT Broker 发送给订阅者监控面板。如果想人为控制空调,可以通过上报信息实施控制。比如温度定时等控制指令,通过 MQTT Broker 发送给空调,从而完成整个数据通信。

完成这个模式需要协议内部的帧来完成。

 4. MQTT 数据帧类型

方法定义

数据帧类型

说明


连线

CONNECT

连线请求帧



CONNACK

连线请求响应帧


断线

DISCONNECT

断线帧


订阅

SUBSCRIBE

订阅主题帧



SUBACK

订阅主题响应帧



UNSUBSCRIBE

取消订阅主题帧



UNSUBACK

取消订阅主题响应帧


发布

PUBLISH

发布消息帧



PUBACK

发布消息响应帧



PUBREC

发布消息接收确认帧

QoS2专用


PUBREL

发布消息接收确认响应帧

QoS2专用


PUBCOMP

发布消息确认完成帧

QoS2专用

心跳

PINGREQ

保活请求帧

客户端发送


PINGRESP

保活确认帧

服务器发送

其中 CONNECTCONNACK、SUBSCRIBESUBACKPUBLISHPUBACKPINGREQPINGRESP 使用较多。

应用场景可以 MQTT QOS 机制来看。

5. MQTT QOS 机制

MQTT 传输的消息分为:主题和负载两部分

·主题(Topic)

·消息的类型,订阅者订阅(Subscribe)一个主题后,就会收到该主题的消息内容(payload)

·负载( payload)

·消息的内容,是指订阅者具体要使用的内容

MQTT 会构建底层网络传输:它将建立客户端到服务器的连接,提供两者之间的一个有序的、无损的、基于字节流的双向传输。MQTT 协议中规定了消息服务质量(Quality of Service),它保证了在不同的网络环境下消息传递的可靠性。

MQTT 设计了3个 QoS 等级。

QoS 0:消息最多传递一次,如果当时客户端不可用,则会丢失该消息。QoS 1:消息传递至少1次。

QoS 2:消息仅传送一次。

Qos O是:Sender (可能是Publisher或者Broker)发送一条消息之后,就不再关心它有没有发送到对方,也不设置任何重发机制。QoS1包含了简单的重发机制,Sender 发送消息之后等待接收者的 ACK,如果没收到 ACK 则重新发送消息。这种模式能保证消息至少能到达一次,但无法保证消息重复。

QoS 2设计了重发和重复消息发现机制,保证消息到达对方并且严格只到达一次。

6. MQTT QOS0

QoS0:- Fire and Forget 机制,一般局域网信息或无关紧要的互联网信息传输

·最多传输一次

·适用于不重要的消息传输

image.png

传输方式为从发送者发送 Publisher 的消息给 Broker,Broker 再调用 Publish 发送给订阅者,最后 Publisher 会自动删除。

7. MQTT QOS1

QoS1:-简单的 ACK 机制,适用于一般互联网实时消息的传递

·最少传输一次

·适用于对可靠性有要求,但对重复度没有要求的消息传输

image.png

流程为首先保存将要发送的消息,调用 Publish 发送消息,Broker 收到消息之后保存下来,再发送消息到订阅者,并且回复 Publisher ACK 表示收到了 Publish,Publisher 发送消息并且收到回应,说明消息至少传输了一次,Broker 需要等到订阅者收到 Publish 后回应后再删除消息,因为引入了 Store 机制存储信息,从而保证至少传输一次的功能。

8. MQTT QOS2

QoS2:-复杂的消息及 ACK 流程,适用于敏感信息(如国防工业及医疗设备等应用场景)的传递

·只传输一次

·适用于有可靠性要求,也不允许发生重复的消息传输

image.png

具体流程为 Publisher 首先把消息保存下来,通过 Publish 发送给 Broker,Broker 收到消息后也会保存下来并且回复收到的消息。Publisher 收到回复的 ACK 之后会再回应一个确认的 ACK,Broker 收到确认之后保障前面不会再发送,此时再把消息发送给订阅者。发送结束之后会回应一个 Publish 表示完成,此时把消息删除。对于 Publisher 来说就只传输了一次。

Subscriber 收到消息之后也会把消息保存下来并且回应确认帧。Broker 收到确认帧之后回应确认。

Subscribe 通知之后会回应表示 Publish 环节完成,Broker 最后删除消息,Subscribe 处理完之后也会删除消息。

9. MQTT 应用一般流程

image.png

通过 Client 数据帧和 Server 端建立联接。此处 Client 和 Server 就是订阅方和 Broker 作为连接,Server 回应 ACK 从而连接,连接后 Client 会做订阅,即 SUSCRIBE 以及订阅的 ACK。订阅可有多个主题,每一个主题的订阅都需要SUSCRIBE 的报文并且订阅成功会回应 SUBACK。订阅之后如果 Client 想要发送消息,把 Publish 发送给 Server,Server 收到消息之后回应 PUBACK,从而完成数据传输。经常也会 Client 发送 Request,Server 端回应 Response,完成整个过程长连接的维护。如果想要断开则需要调用 Disconnect 的数据帧。

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
2月前
|
传感器 网络协议 物联网
在Linux中搭建Mosquitto MQTT协议消息服务端并结合内网穿透工具实现公网访问
Mosquitto是一个开源的消息代理,它实现了MQTT协议版本3.1和3.1.1。它可以在不同的平台上运行,包括Windows、Linux、macOS等。mosquitto可以用于物联网、传感器、移动应用程序等场景,提供了一种轻量级的、可靠的、基于发布/订阅模式的消息传递机制。
|
4月前
|
网络协议 物联网 网络性能优化
物联网网络协议-MQTT协议的使用
物联网网络协议-MQTT协议的使用
137 2
|
6月前
|
Java 物联网 Maven
Spring Boot 如何集成 MQTT,实现基于 MQTT 协议的消息传递?
Spring Boot 如何集成 MQTT,实现基于 MQTT 协议的消息传递?
1130 2
Spring Boot 如何集成 MQTT,实现基于 MQTT 协议的消息传递?
|
3月前
|
物联网 Go 网络性能优化
使用Go语言(Golang)可以实现MQTT协议的点对点(P2P)消息发送。MQTT协议本身支持多种消息收发模式
使用Go语言(Golang)可以实现MQTT协议的点对点(P2P)消息发送。MQTT协议本身支持多种消息收发模式【1月更文挑战第21天】【1月更文挑战第104篇】
98 1
|
9天前
|
消息中间件 存储 算法
RocketMQ学习笔记
RocketMQ学习笔记
53 0
|
22天前
|
传感器 网络协议 中间件
Mqtt学习笔记--交叉编译移植(1)
Mqtt学习笔记--交叉编译移植(1)
18 0
|
1月前
|
监控 网络性能优化 网络安全
【MODBUS】Modbus主站为边缘设备通过MQTT协议上云
【MODBUS】Modbus主站为边缘设备通过MQTT协议上云
34 1
|
6月前
|
网络协议 物联网 开发者
详细介绍 MQTT 的工作原理,包括 MQTT 协议的特点、核心概念以及消息传递的流程
详细介绍 MQTT 的工作原理,包括 MQTT 协议的特点、核心概念以及消息传递的流程
811 1
|
2月前
|
物联网 Linux 开发工具
MQTT协议接入问题之连接失败如何解决
MQTT接入是指将设备或应用通过MQTT协议接入到消息服务器,以实现数据的发布和订阅;本合集着眼于MQTT接入的流程、配置指导以及常见接入问题的解决方法,帮助用户实现稳定可靠的消息交换。
138 2
|
2月前
|
JSON 物联网 开发工具
MQTT协议问题之如何搭建物联网空调的服务器
MQTT协议是一个轻量级的消息传输协议,设计用于物联网(IoT)环境中设备间的通信;本合集将详细阐述MQTT协议的基本原理、特性以及各种实际应用场景,供用户学习和参考。
79 1

热门文章

最新文章