精华内容
下载资源
问答
  • 物联网MQTT协议详解
    千次阅读
    2021-09-25 22:23:21

    一、什么是MQTT协议

    Message Queuing Telemetry Transport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与 HTTP 一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。

    原理:

    (1)MQTT协议身份和消息格式

    有三种身份:发布者(Publish)代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

    MQTT传输的消息分为主题(Topic)负载(payload)两部分

    • Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload
    • payload,消息的内容

    (2) 网络传输与应用消息

    MQTT会构建底层网络传输:它将建立客户端到服务器的连接,提供两者之间的一个有序的、无损的、基于字节流的双向传输

    应用数据通过MQTT网络发送时,MQTT会把与之相关的服务质量(QoS)和主题名(Topic)相关连

    (3)MQTT客户端作用

    • 发布其他客户端可能会订阅的信息
    • 订阅其它客户端发布的消息
    • 退订或删除应用程序的消息
    • 断开与服务器连接

    (4)MQTT服务端作用

    可以是一个应用程序或一台设备

    • 接受来自客户的网络连接
    • 接受客户发布的应用信息
    • 处理来自客户端的订阅和退订请求
    • 向订阅的客户转发应用程序消息

    (5) MQTT协议中的订阅、主题、会话

    订阅(Subscription):

    订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器会话(Session):

    每个客户端与服务器建立连接后就是一个会话

     主题名(Topic Name):

    就是连接到一个应用程序消息的一个标签。该标签与服务器的订阅的相匹配,服务器会将消息发送给订阅所匹配标签的每个客户端。

    主题筛选器(Topic Filter):

    表示订阅所匹配到的多个主题

    负载(Payload):

    其实就是内容。消息订阅者所具体接收的内容

    二、MQTT协议的特点

    轻量、简单、开放,是低开销、低带宽占用的即时通讯协议。使用场景有:机器与机器(M2M)、物联网(IoT)。MQTT协议当前版本为,2014年发布的MQTT v3.1.1。除标准版外,还有一个简化版MQTT-SN,该协议主要针对嵌入式设备,这些设备一般工作于TCP/IP网络,如ZigBee

    • 使用的发布/订阅消息模式,它提供了一对多消息分发,以实现与应用程序的解耦。
    • 对负载内容屏蔽的消息传输机制。
    • 对传输消息有三种服务质量(QoS)
    1. QoS  0:最多一次,这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1

        2.QoS  1:最少一次(承诺消息将至少传送一次给订阅者),这一级别会确保消息到达,但消息可能会重复。即:>=1

        3.QoS  2:只有一次(承诺消息仅传送到目的地一次),确保消息只有一次到达。即:=1。在一些要求比较严格的计费系统中,可以使用此级别

    (注意:带有唯一消息 ID 的消息会存储两次,首先来自发送者,然后是接收者。QoS 级别 2 在网络中具有最高的开销,因为在发送方和接收方之间需要两个流)

    • 数据传输和协议交换的最小化(协议头部只有2字节),以减少网络流量
    • 通知机制,异常中断时通知传输双方

    三、MQTT协议数据包结构

    (1)固定头(Fixed header)

    存在于所有MQTT数据包中,表示数据包类型、数据包的分组类标识;

    (2)可变头(Variable header)

    存在于部分MQTT数据包中,数据包类型决定了可变头是否存在 及具体内容

    (3)消息体(Payload)

    存在于部分MQTT数据包中,表示客户端收到的具体内容

    整体MQTT的消息格式:

    四、客户端使用

    配置好连接信息连接进来之后,可以进行消息推送和订阅等工作

       参考:

     MQTT协议及协议原理

    MQTT协议,终于有人讲清楚了​​​​​​​

    若对你有帮助,欢迎关注!!点赞!!评论!!

    更多相关内容
  • 文章大纲引言一、MQTT 协议1、MQTT协议概述2、MQTT的主要特点3、MQTT 设计原则二、MQTT 协议核心角色1、 MQTT客户端2、 MQTT服务器三、MQTT 主要工作流程和服务质量QoS1、MQTT 通信核心流程2、MQTT 消息发布的三种...

    引言

    在AIoT 如此流行的今天,未来智能家居、智能车联网、智能物联网必将有广阔的天空,而MQTT 作为一种专门为物联网设计的协议,接下来文章就好好总结相关理论知识。系列文章链接:

    一、MQTT 协议

    本文档基于 MQTT 协议版本v3.1.1,部分理论摘自MQTT中文网,其他见图片水印。

    1、MQTT协议概述

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)广泛应用于机器对机器(M2M)/物联网(IoT)的应用层连接协议,使用极其轻量级的发布/订阅二进制消息模型通信。对于需要较小代码占用空间和或网络带宽非常宝贵的远程连接非常有用,是专为受限设备(电池功率非常高的移动应用设备)和低带宽、高延迟或不可靠的环境通信而设计的。不仅为新兴的“机器到机器”(M2M)或物联网(IoT)世界提供连接,还被用于通过卫星链路与代理通信的传感器、与医疗服务提供者的拨号连接以及一系列家庭自动化和小型设备场景。

    主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN

    在这里插入图片描述

    2、MQTT的主要特点

    MQTT协议工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

    • 底层基于TCP/IP (或者UDP) 协议传输,采用发布/订阅模式的二进制消息模式,提供一对多的消息发布

    • 控制包结构精简,第一个 1字节固定报头,第二个2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量。

    • 消息QoS支持,可靠传输保证

    • 使用Last Will和Testament特性通知有关各方客户端异常中断的机制。

      Last Will即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接;而Testament遗嘱机制,功能类似于Last Will。

    3、MQTT 设计原则

    由于物联网的环境是非常特别的,所以MQTT遵循以下设计原则:

    • 精简,不添加可有可无的功能,理解客户端计算能力可能很低
    • 发布/订阅(Pub/Sub)模式,方便消息在传感器之间传递;
    • 允许用户动态创建主题,零运维成本;
    • 把传输量降到最低以提高传输效率,支持低带宽、高延迟、不稳定的网络等因素考虑在内;
    • 支持连续的会话控制;
    • 提供服务质量管理;
    • 假设数据不可知,不强求传输数据的类型与格式,保持灵活性。

    二、MQTT 协议核心角色

    MQTT 协议主要有三大核心角色:发布者(Publisher)、Broker代理服务器(转发者)订阅者(Subscriber)。其中消息的发布者和订阅者都是客户端角色,消息代理是服务器,消息发布者可以同时是订阅者。

    1、 MQTT客户端

    MQTT客户端身兼二职:既可以是发布者角色,又可以是订阅者角色。一个使用MQTT协议的应用程序或者设备就是一个MQTT 客户端,工作时它需要主动去连接到代理服务器,所以MQTT客户端的功能有:

    • 主动与Broker 建立连接,主动断开Broker的连接

    • 作为发布者角色,发布给其他客户端订阅的Topic

    • 作为订阅者,主动订阅其它客户端发布的Topic

    • 退订之前订阅的Topic

    • 清空服务端之前保留的Message

    2、 MQTT服务器

    MQTT通信必须依赖一个MQTT Broker,Broker(服务器)可以看出是MQTT网络的Hub,负责处理客户端的订阅逻辑并转发给其他订阅的客户端,如下图所示。

    在这里插入图片描述

    MQTT服务器又称为"消息代理"服务器(Broker),可以是一个应用程序或一台设备,它是位于消息发布者和订阅者之间,具有以下功能:

    • 接受来自客户端的网络连接并建立通信链路
    • 接收发布者的Topic并转发给订阅者
    • 处理来自客户端的订阅和退订请求
    • 向订阅的客户转发相应地Topic

    三、MQTT 主要工作流程和服务质量QoS

    在这里插入图片描述

    1、MQTT 通信核心流程

    如图https://blog.p2hp.com/archives/4100所示,MQTT 的工作流程十分便捷,MQTT 客户端之间的通信都是需要通过Broker 间接实现,两个客户端想要通信,它们必须具备以下前提:

    • 两个MQTT 客户端成功与同一个Broker 建立连接
    • 两个MQTT 客户端之间约定一个相同的Topic(不一定完全相同,可以用通配符“+”替代)

    发布者和订阅者在成功和同一个Broker 建立连接后,发布者向Broker 发布一个Topic,Broker 转发给订阅了这个Topic 的所有订阅者。

    2、MQTT 消息发布的三种服务质量(QoS

    在这里插入图片描述

    2.1、QoS 0:At most once(deliver and forget)至多分发一次

    “至多一次”,消息发布完全依赖底层TCP/IP网络可能会发生消息丢失或重复,接收者不发送响应,发送者也不重新尝试。接收者只能收到一次消息或者一次也收不到。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。

    在这里插入图片描述

    2.2、QoS 1 :At least once至少分发一次

    确保消息到达,但消息重复可能会发生。可以确保消息至少一次抵达接收者。QoS 1的PUBLISH包的可变包头包含包唯一标识,而且有PUBACK包确认。在QoS 1的分发协议中,发送者

    • 每次发布新的应用消息,必须分配一个没有用过的包唯一标识。
    • 包含唯一标识的PUBLISH包也必须是QoS=1,DUP=0。
    • 必须把PUBLISH包当作“未确认的”,直到从接收者那里收到对应的PUBACK包。

    一旦发送者收到PUBACK包,包唯一标识就可以重用了。而在QoS 1的分发协议中,接收者

    • 必须响应一个包含与PUBLISH包相同的包唯一标识,来接受应用消息的所属关系。
    • 在发送PUBACK包之后,接收者必须把所有收到的包含相同包唯一标识的PUBLISH包当作一个新的发布,无论是否设置了DUP标识。

    在这里插入图片描述

    2.3、QoS 2 :Exactly once只有一次

    最高的服务质量,用在丢失和重复消息都不能被接受的情况确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。QoS 2消息的可变包头包含包唯一标识,QoS 2的PUBLISH包的接收者分两步确认接收,在QoS 2的分发协议中,发送者

    • 每次发布新的应用消息,必须分配一个没有用过的包唯一标识。
    • 包含唯一标识的PUBLISH包也必须是QoS=1,DUP=0。
    • 必须把PUBLISH包当作“未确认的”,直到从接收者那里收到对应的PUBACK包。
    • 当从接收者那里收到PUBREC包时要发送PUBREL包。PUBREL包必须包含与原始PUBLISH包相同的包唯一标识。
    • 必须把PUBREL包当作“未确认的”,直到从接收者那里收到对应的PUBCOMP包。
    • 一旦已经发送了相应的PUBREL包,就不能再重发PUBLISH包。

    当发送者收到PUBCOMP包之后,包唯一标识就可以重用了。在QoS 2的分发协议中,接收者

    • 必须响应一个包含与PUBLISH包相同的包唯一标识,来接受应用消息的所属关系。
    • 直到收到相应的PUBREL包,接收者必须发送包含相同包唯一标识的PUBREC来确认后来的PUBLISH包。这样一定不会导致重复的消息被分发到接下来的接收者。
    • 必须用包含相同包唯一标识的PUBCOMP包来响应一个PUBREL包。
    • 在发送PUBCOMP之后,接收者必须把所有收到的包含相同包唯一标识的PUBLISH包当作一个新的发布。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y4lonIFS-1612843447180)(assets/image-20200910155846957.png)]
    未完待续…

    展开全文
  • MQTT协议详解

    千次阅读 2022-01-27 09:28:04
    *简而言之,MQTT其实就是一个用于TCP通信的消息协议而已。既然消息协议,"消息" 自然是表示MQTT其实本质就是消息,消息在某种理解上,可以理解报文,报文包,数据等等;既然是协议,自然表示它有着自己的规则,什么...

    文章前注:本文的大量素材来自于百度百科和MQTT协议3.1.1中文板
    MQTT协议3.1.1中文版网址:http://blog.mcxiaoke.com/mqtt/protocol/MQTT-3.1.1-CN.html

    一、认识MQTT

    1. MQTT(消息队列遥测传输) 是ISO 标准(ISO/IEC PRF 20922)下基于 发布/订阅 范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。

      *简而言之,MQTT其实就是一个用于TCP通信的消息协议而已。既然消息协议,“消息” 自然是表示MQTT其实本质就是消息,消息在某种理解上,可以理解报文,报文包,数据等等;既然是协议,自然表示它有着自己的规则,什么叫规则?就是规定这个消息该以怎样的固定格式(详见二 协议内容)去传输。

    2. MQTT既然发布,自然是会有它实际应用的,MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议

    3. MQTT协议主要特性:
      ①使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
      ②对负载内容屏蔽的消息传输;
      ③使用 TCP/IP 提供网络连接;
      ④有三种消息发布服务质量:小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
      ⑤使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制

      这些特性都是什么意思呢?不用管,先接着往下看,最后再来看它的特性…

    二、MQTT协议通信过程概述

    首先,MQTT是利用TCP通信协议的,那么它必然是 有序、可靠、面向连接、双向传输的

    其次,MQTT是通过交换预定义的MQTT控制报文来通信(控制报文详见三 协议控制报文)

    ​​ *协议流程如下:
    在这里插入图片描述
    对MQTT协议进行概述:
    第一步:
    1.网络建立连接后,如果服务器在合理的时间内没有收到CONNECT报文,那么服务端必须断开原有的客户端连接

    2.在收到CONNECT报文后,服务端进行验证,如果CONNECT报文不符合规范,则服务端不会发送CONNACK报文,且直接关闭网络连接

    3.服务端验证CONNECT报文规范,其中就有验证身份和授权的用户名和密码 ,如果有一项不符合规范,则直接关闭网络连接

    4.服务端如果验证成功,则会创建会话(会话可以看做通信内容,详见三 清理会话标志)

    5.会话创建成功,服务端发送CONNACK报文作为CONNECT报文的确认响应

    6.开始消息的分发和保持连接状态的监测

    第二步:发布和订阅
    如果是发布
    1.客服端使用 PUBLISH报文 发送应用消息给服务端,目的是分发给其他订阅了相同主题的客户端,也就是服务端其实是个中转的地方

    2.服务端使用 PUBLISH报文 发送应用消息给每一个订阅匹配的客户端(*这里与其说使用,说转发会更好,服务端存储客户端A发布的应用消息,如果客户端B订阅该主题,那么服务端就会发送PUBLISH报文给客户端B)

    3.收到一个PUBLISH报文时,接受者(可能是客户端,也可能是服务端)的动作取决于Qos等级,根据等级发送不同的回应报文(详见三 PUBLISH报文)

    如果是订阅
    1.服务端收到客户端发送的一个SUBSCRIBE报文时,会发送SUBACK报文响应

    2.允许服务端在发送SUBACK之前就开始发送与订阅匹配的PUBLISH报文,如果服务端收到的SUBSCRIBE报文的主题过滤器与一个现存的主题过滤器相同,那么服务器就会使用新的订阅去替换现存的订阅

    3.如果服务端接收到的主题过滤器不同于任何现存订阅的过滤器,服务端就会创建一个新的订阅并发送所有匹配的保留消息

    4.服务端发送给客户端的SUBACK报文对每一对主题过滤器和Qos等级都必须包含一个返回码,这个返回码必须表示那个订阅被授权的最大Qos等级或者订阅失败

    三、MQTT协议控制报文

    在介绍MQTT控制报文前,了解两个东西,一是控制报文的结构,一是控制报文有哪些类型

                  MQTT控制报文结构 = 固定报头 + 可变报头 + 有效载荷
    注意,所有的控制报文都有固定报头,但不一定有可变报头和有效载荷
    

    控制报文类型有如下:
    在这里插入图片描述
    在这里插入图片描述
    接下来就详细介绍各个控制报文的结构:
    之前提到过,

    	              控制报文 = 固定报头 + 可变报头 + 有效载荷
    

    固定报头共2个字节,一个字节占8位。第一个字节前4位是用于指定控制报文类型的标志位,后4位是控制报文类型;第二个字节是剩余长度。
    剩余长度表示当前报文剩余部分的字节数,包括可变报头和有效负载。

    *看到这里有人可能就会疑惑,为什么固定报头的剩余长度会包括可变报头和负载呢?这样的话是不是就表示 可变报头和负载其实只占一个字节?

    *其实不是的,固定报头占两个字节,可变报头和负载最大可以占四个字节,剩余长度包括可变报头和负载,但它却不包括自己本身的字节数。

    *简而言之就是,剩余长度本身占一个字节,是属于固定报头的,可变报头和负载的四个字节与 剩余长度本身占的一个字节无关,只是都把 可变报头和负载笼统地都归纳到是 剩余长度 这么个叫法而已
    在这里插入图片描述
    控制报文类型标志位的4位具体数值为:
    在这里插入图片描述
    可变报头同样占2个字节,2个字节共同作用表示报文标识符,第一个字节表示报文标识符的最高有效字节MSB(most significant bit),第二个字节表示报文标识符的最低有效字节(least significant bit)
    在这里插入图片描述
    *那么什么是报文标识符呢,最高有效位和最低有效位是多少呢?

    当客户端或服务端发送以下新的报文类型时,必须分配一个未使用的报文标识符,不同的控制报文有不同的报文标识符(*可以理解为以下各个报文都有着自己的专属报文标识符,这个标识符是一个16位的值,如0x1234,这个值是可以自己定义的)

    如果 客/服 重发旧的报文时,必须使用相同的报文标识符(*可见报文标识符一旦分配,是不会再去改变值的,只会释放),在发送时分配,在收到回应后释放。

    含有可变报头,即报文标识符的控制报文
    PUBLISH
    PUBACK
    PUBREC
    PUBREL
    PUBCOMP
    SUBSCRIBE
    SUBACK
    UNSUBSCRIBE
    UNSUBACK

    1. CONNECT控制报文
    客户端与服务端建立连接后,客户端发送给服务端的第一个报文,一旦建立连接之后,CONNECT报文只会被发送一次。

    固定报头
    在这里插入图片描述
    可变报头
    CONNECT控制报文的可变报头包含四个字段:协议名,协议级别,连接标志和保持连接
    (1)协议名
    在这里插入图片描述在这里插入图片描述
    (2)协议级别
    协议级别的字段的值是0x04
    在这里插入图片描述
    (3)连接标志
    在这里插入图片描述
    Reserved:保留标志,该标志为0表示连接验证通过,为1时表示断开客户端连接

    Clean Session:清理会话标志,指定了会话状态的处理方式,该标志为0时表示 服务端必须创建一个新的会话(如果没有会话)或者恢复当前的会话(如果有会话,*会话可以理解为与客户端成功建立连接)。并且在之后断开连接后,客户端和服务端都必须保存会话信息;该标志为1时,客户端和服务端必须丢弃之前的任何会话并开始一个新的会话,且这个新的会话信息是不能被之后任何一个会话重用的。

    *简而言之,清理会话标志设置为 1 的客户端不会收到旧的应用消息,而且在每次连接成功后都需要重新订阅任何相关的主题。清理会话标志设置为 0 的客户端会收到所有在它连接断开期间发布的 QoS 1 和 QoS 2 级别的消息。因此,要确保不丢失连接断开期间的消息,需要使用 QoS 1 或 QoS 2 级别,同时将清理会话标志设置为 0。

    Will Flag:遗嘱标志,当服务端检测到了一个I/O错误或者网络故障;或者客户端在保持连接的时间内未能通讯;或者客户端没有先发送DISCONNECT控制报文直接关闭了网络连接;或者由于协议错误服务端关闭了网络连接 等情况时,才会将 Will Flag 置1,并请求服务端发布这个遗嘱消息

    该标志置1表示如果连接请求被接受了,遗嘱消息必须被存储在服务端,待网络连接关闭时,服务端必须发布这个遗嘱消息。

    如果服务端接收到了客户端发送DISCONNECT报文,那么这个遗嘱消息就会被删除,而不会发布

    该标志置0时,Will Qos 和 Will Retain 字段必须也置0,表示网络连接断开时,不能发送遗嘱消息

    Will Qos:发布遗嘱消息时使用的服务质量等级(Qos)。当 Will Flag 被置0时,Will Qos 也置0;当Will Flag 被置1时, Will Qos可以置为 0,1,2
    在这里插入图片描述
    最多分发一次:消息发布一次,接收端最多能收到一次。*收到就收到,收不到就算了

    至少分发一次:消息发布至少一次,确保接收端必定能收到一次,但因为多次发送,有可能会造成重复。*一定给你完整送到一次,如果有多余的,权当送你了,但是后果自负的哈

    只分发一次:消息发布一次,各种机制作用,最后确保接收端收到一次且只有一次。*确保你无重复无缺失的收到消息

    Will Retain:遗嘱保留。当Will Flag 置0时, Will Retain只能置0;当Will Flag 置1时,Will Retain置0表示服务端必须将遗嘱消息当作非保留消息发布,Will Retain置1表示服务端必须将遗嘱消息当作保留消息发布

    Password Flag:密码标志,置0表示有效载荷中不能包含密码字段;置1表示有效载荷中必须包含密码字段

    User Name Flag:用户名标志,置0表示有效载荷中不能包含用户名字段;置1表示有效载荷中必须包含用户名字段

    (4)保持连接
    *保持连接是理解心跳报文的重中之中,也是写代码最核心的部分

    保持连接是一个以秒为单位的时间间隔,16位(最大设定为16位全1,即18个小时),表示在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。

    客户端负责保证 控制报文 发送的时间间隔不超过设定的保持连接的值,如果没有任何其他的控制报文可以发送,则达到时间间隔尽头,发送PINGREQ控制报文(*就是心跳请求控制报文,当然也可以不在时间间隔尽头发送,只是几乎所有的项目代码都设定为时间间隔尽头而已)

    如果客户端发送了PINGREQ报文之后,如果在设定的心跳回应时间间隔内没有收到PINGRESP报文(心跳回应报文),它应该关闭与服务端的连接
    在这里插入图片描述
    有效载荷
    CONNECT控制报文的有效载荷字段长度,首先要看 可变报头的标志 是否包含这些字段,如果包含的话,有效载荷就有:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码
    (1)客户端标识符
    客户端标识符是服务端用于识别客户端的。连接服务端的每一个客户端都有唯一的客户端标识符。

    客户端标识符必须存在且必须是CONNECT控制报文的有效负载的第一个字段

    (2)遗嘱主题
    如果遗嘱标志 Will Flag 被设置为1,则有效载荷的下一个字段是遗嘱主题

    (3)遗嘱消息
    如果遗嘱标 Will Flag 被设置为1,则有效载荷的下一个字段是遗嘱消息。遗嘱消息定义了将被发布到遗嘱主题的应用消息

    (4)用户名
    如果用户名标志被设置为1,有效载荷的下一个字段就是它,服务端可以将它用于身份验证和授权

    (5)密码
    如果密码标志被设置为1,有效载荷的下一个字段就是它,服务端可以将它用于身份验证和授权
    在这里插入图片描述
    2.CONNACK报文
    服务端发送CONNACK报文响应从客户端收到的CONNECT报文。服务端发送给客户端的第一个报文必须是CONNACK报文。CONNACK报文只有固定报头和可变报头。

    如果客户端在设定的保持连接时间段内没有收到服务端的CONNACK报文,客户端应该关闭网络连接

    固定报头
    在这里插入图片描述
    可变报头

    由连接确认标志和连接返回码组成
    在这里插入图片描述
    (1)SP:当前会话标志 Session Present,当服务端收到CONNECT报文中的清理会话标志为1的连接时,CONNACK报文中的返回码置0,SP置0

    当服务端收到CONNECT报文中的清理回话标志为0的连接时,如果服务端已经有保存的客户端的会话状态(*即清理会话标志为1,会删除已有的会话),则CONNACK的SP置1;如果服务端没有已保存客户端的会话状态(*即清理会话标志为0,会保存当前的会话状态),则CONNACK的SP置0,返回码置0

    SP使服务端和客户端在是否有已存储的会话状态上保持一致

    (2)连接返回码:如果服务端收到一个合法的CONNECT报文,但出于某些原因无法处理它,服务器就会尝试发送一个包含非零返回码的CONNACK报文,客户端接收到这个回应报文后会关闭网络连接;如果CONNECT报文合法且没有其他错误,则服务端会发送一个包含 零值返回码的CONNACK报文给客户端,从而实现会话的接通
    在这里插入图片描述在这里插入图片描述
    3.PUBLISH控制报文
    PUBLISH控制报文是指客户端向服务端或者服务端向客户端传输一个应用消息

    固定报头
    在这里插入图片描述
    (1)DUP:重发标志,如果该标志被置0,表示这是客户端或服务端第一次请求发送这个PUBLISH报文。如果该标志被置1,表示这可能是一个早前报文请求的重发

    客户端或服务端请求重发一个PUBLISH报文时,必须将DUP标志置1

    (2)RETAIN:保留标志

    如果客户端发给服务端的PUBLISH报文中的 RETAIN 标志被置1,服务端必须存储这个应用消息和它的服务质量等级(Qos),以便它可以被分发给未来的主题名匹配的订阅者。倘若Qos为0,即最多分发一次,那么服务端必须丢弃之前为那个主题保留的任何消息,而将这个新的Qos 0 的消息作为那个主题的新保留消息。

    如果客户端发送给服务端的PUBLISH报文的 RETAIN 标志被置0,服务端不能存储这个消息也不能移除或替换任何现存的保留消息

    可变报头

    PUBLISH的可变报头包含主题名和报文标识符
    在这里插入图片描述

    (1)主题名:用于识别有效载荷数据应该被发布到哪一个信息通道

    (2)报文标识符:只有当Qos等级是 1 或 2 时,报文标识符字段才会出现在PUBLISH报文中

    有效载荷

    有效载荷包含将被发布的应用消息。数据内容和格式是应用特定的 。

    PUBLISH报文的接受者必须按照 PUBLISH报文中的Qos等级发送响应
    在这里插入图片描述
    4.PUBACK控制报文

    PUBACK报文是对 Qos 1 等级的PUBLISH报文的响应。PUBACK没有有效载荷。

    固定报头
    在这里插入图片描述
    在这里插入图片描述
    可变报头
    在这里插入图片描述
    5.PUBREC控制报文 PUBREL控制报文 PUBCOMP控制报文

    这三个报文是对 Qos 2 等级的PUBLISH报文的响应,响应顺序如题

    所有的回应控制报文都没有有效载荷

    (1)PUBREC控制报文

    固定报头
    在这里插入图片描述
    可变报头
    在这里插入图片描述
    (2)PUBREL控制报文

    固定报头
    在这里插入图片描述
    PUBREL控制报文固定报头的保留位必须是0010,否则服务端将会认为其不合法从而关闭网络连接

    可变报头
    在这里插入图片描述
    (3)PUBCOMP控制报文

    固定报头
    在这里插入图片描述
    可变报头
    在这里插入图片描述
    6.SUBSCRIBE控制报文

    客户端向服务器发送SUBSCRIBE报文用于创建一个或多个订阅。每个订阅注册客户端关心的一个或多个主题。为了将应用消息转发给与那些订阅匹配的主题,服务器发送PUBLISH报文给客户端。SUBSCRIBE报文为每个订阅指定了最大的Qos等级,服务端根据这个发送应用消息给客户端

    固定报头
    在这里插入图片描述
    SUBSCRIBE控制报文固定报头的保留位必须为0010,服务端收到其他值均不合法,都会断开连接

    可变报头
    在这里插入图片描述
    有效载荷

    SUBSCRIBE报文的有效载荷包含了一个主题过滤器列表,它们表示客户端想要订阅的主题。

    SUBSCRIBE报文的有效载荷必须包含至少一个主题过滤器和 Qos等级字段。
    在这里插入图片描述
    以下举个栗子

    如果有效载荷是下面这样
    在这里插入图片描述
    那么整个有效载荷的格式是下面这样
    在这里插入图片描述
    在这里插入图片描述
    以上是个栗子

    7.SUBACK控制报文

    服务端发送SUBACK报文给客户端,用于确认它已收到并且正在处理SUBSCRIBE报文

    SUBACK报文包含一个返回码清单,它们指定了SUBSCRIBE请求的每个订阅被授权的最大Qos等级

    固定报头
    在这里插入图片描述
    可变报头
    在这里插入图片描述
    有效载荷

    有效载荷包含一个返回码清单。每个返回码对应等待确认的SUBSCRIBE报文中的一个主题过滤器。返回码的顺序必须和SUBSCRIBE报文中主题过滤器的顺序相同
    在这里插入图片描述
    在这里插入图片描述
    (8)UNSUBSCRIBE控制报文

    客户端发送 UNSUBSCRIBE报文给服务端,用于取消订阅主题

    固定报头
    在这里插入图片描述
    UNSUBSCRIBE报文固定报头的保留位必须是0010,否则服务端判定其不合法

    可变报头
    在这里插入图片描述
    有效载荷

    UNSUBSCRIBE报文的有效载荷包含客户端想要取消订阅的主题过滤器列表。

    (9)UNSUBACK控制报文

    服务端发送UNSUBACK报文给客户端用于确认收到UNSUBSCRIBE报文,其没有有效载荷

    固定报头
    在这里插入图片描述
    可变报头
    在这里插入图片描述
    (10)PINGREQ控制报文

    没有可变报头和有效负载
    在这里插入图片描述
    固定报头
    在这里插入图片描述
    在这里插入图片描述
    (11)PINGRESP控制报文

    服务端发送PINGRESP报文响应客户端的PINGREQ报文。表示服务端还活着,保持连接处理中就用到了这个报文,其也没有可变报头和有效负载

    固定报头
    在这里插入图片描述
    (12)DISCONNECT控制报文

    DISCONNECT报文是客户端发送给服务端的最后一个控制报文,表示客户端正常断开连接。该报文没有可变报头和有效负载。

    固定报头
    在这里插入图片描述
    服务端必须验证保留位为0000,如果不为0必须断开连接(*这里的连接是异常断开的)

    以上MQTT协议就介绍到这啦~

    展开全文
  • MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以...

    一、MQTT协议简介

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

    MQTT协议通常作为连接云服务器的通道,比如阿里云、京东云等厂商用就将mqtt作为连接其云服务器的底层通信协议。为了保证数据的安全,通常还需要在mqtt上面加上一层安全传输协议(SSL)。

    二、MQTT的通信原理

    MQTT的主要角色:

    • 客户端(Client)
    • 服务器(Broker)
    • 消息发布者(Publisher)
    • 消息订阅者(subscriber)

    MQTT Broker 也称为 MQTT 消息服务器,它可以是运行了 MQTT 消息服务器软件的一台服务器或一个服务器集群。MQTT Broker 负责接收来自客户端的网络连接,并处理客户端的订阅/取消订阅(Subscribe/Unsubscribe)、消息发布(Publish)请求,同时也会将客户端发布的消息转发给其他订阅者。broker在转发消息的同时也可以主动下发消息给订阅了相应主题的订阅者。

    MQTT客户端(Client)既可以发布消息,也可以订阅消息,所以MQTT客户端的身份可以是消息发布者(Publisher),也可以是消息订阅者(subscriber)。同一个客户端也可以订阅自己发布的消息。

    MQTT的这种通信模型类似于古老的邮局,订阅者和发布者相当于订阅报纸的用户,服务器就相当于邮局,邮局负责将用户订阅的报纸、杂志送到用户手里,用户也可以通过邮局寄送(发布)邮件到其他用户。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-muW4AvZW-1607504325398)(3E4082888815408BBC6EAD2827B206CD)]

    三、MQTT数据帧格式

    MQTT数据包结构由三部分组成:

    1. 固定报头
    2. 可变报头
    3. 消息内容
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DxrZr5D6-1607504325400)(385FC1875FB34F4994530272868E953B)]

    3.1、固定报头

    每一个MQTT消息都包含固定报头。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rb4DFcbn-1607504325402)(CE508F415249454ABDB2083C13708858)]
    MQTT Control Packet type一共4bit,指明了MQTT数据包的类型,其定义如下:

    NameValueDirection of flowDescription
    Reserved0ForbiddenReserved
    CONNECT1Client to ServerClient request to connect to Server
    CONNACK2Server to ClientConnect acknowledgment
    PUBLISH3Client to Server or Server to ClientPublish message
    PUBACK4Client to Server or Server to ClientPublish acknowledgment
    PUBREC5Client to Server or Server to ClientPublish received (assured delivery part 1)
    PUBREL6Client to Server or Server to ClientPublish release (assured delivery part 2)
    PUBCOMP7Client to Server or Server to ClientPublish complete (assured delivery part 3)
    SUBSCRIBE8Client to ServerClient subscribe request
    SUBACK9Server to ClientSubscribe acknowledgment
    UNSUBSCRIBE10Client to ServerUnsubscribe request
    UNSUBACK11Server to ClientUnsubscribe acknowledgment
    PINGREQ12Client to ServerPING request
    PINGRESP13Server to ClientPING response
    DISCONNECT14Client to ServerClient is disconnecting
    Reserved15ForbiddenReserved

    从表格中可以看出,MQTT消息的发布、订阅,以及MQTT连接的建立、心跳的保持都是由客户端主动发起的,服务器端只负责响应这些消息。

    3.2、Flags

    Bit3-Bit0通常在发布消息(Publish)的过程中使用,表示MQTT的消息质量(Qos)、Dup、Retain特征。

    • DUP = Duplicate delivery of a PUBLISH Control Packet
    • QoS = PUBLISH Quality of Service
    • RETAIN = PUBLISH Retain flag

    1. DUP Flag

    如果DUP标识被设置为0,标识这是服务端或客户端第一次尝试发送MQTT PUBLISH包。如果DUP标识被设置为1,标识这可能是在重复发送早前尝试发送过的数据包。所有QoS为0的消息DUP标识必须也设置为0。

    2. Qos

    Qos表示发布消息的质量,0表示来自客户端的消息至最多达一次,1表示消息最少到达一次,2表示消息只到达1次。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t5nPIi9S-1607504325405)(CD730AF8188B40BAA05642AE3F86F36A)]

    3. Retain

    如果客户端Publish数据包中的Retain位设置为1,服务器会将这条消息存储,并在下一次客户端订阅该消息时自动将该topic发送给订阅者。如果Publish数据包的Retain位设置为0,客户端在重新订阅该消息的时候,服务器不会主动发送数据给订阅者。

    我们可以使用Mqtt.fx做个测试,首先连接一个免费的broker(broker.hivemq.com),然后向Broker Publish一条主题为TopicA的消息,Qos设置为1,Retain设置为1,点击发布。之后我们断开并重新连接Broker,分别订阅主题TopicA和主题TopicB,这时我们会发现TopicA会接收到我们上次发送的那条消息,而TopicB没有任何消息到达。

    四、Clean Session和Will Flag

    MQTT客户端在连接服务器的时候(CONNECT)需要指明是否清除回话(Clean Session)和遗嘱消息(Will Flag)。在Connect过程中,这两个字段都位于第8个字节:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R1oBHSor-1607504325404)(5BA99A80EC2748C59AE738C198194C89)]

    4.1、Clean Sesson

    Clean Session为0表示不清除上一次的会话信息,这种情况下服务器会保存上一次和客户端的连接信息。比如当连接重新建立之后,服务器会发送上一次没有收到PUBACK的消息到客户端。

    Clean Session为1表示清除上一次的会话信息,每一重新连接都会建立一个新的Session。

    客户端会话状态的构成:

    • 已经发送到服务端,但没有收到确认的QoS 1和QoS 2消息
    • 接收到的从服务端QoS 2消息,还没有收到确认的

    服务端会话状态的构成:

    • 即使会话状态为空,会话本身也必须存在。
      客户端的订阅。
    • 发送到客户端的但没有得到确认的QoS 1和QoS 2消息。
    • 等待发送到客户端的QoS 1和QoS 2消息。
    • 从客户端收到的QoS 2消息,但还没有确认的。
    • 可选项,等待发送到客户端的QoS 0消息。

    4.2、Will Flag

    Will Flag表示是否设置遗嘱消息,当客户端和服务器之间因为某些原因正常或者异常断开时,服务器必须发布响应的遗嘱消息到客户端,如果客户端在发送Connect请求时删除了遗嘱消息,则服务器不需要发送遗嘱消息。

    遗嘱消息对应的Topic也包含Qos、Retain等字段,Qos的同样表示消息的质量等级,Retain表示服务器在发布遗嘱消息后是否需要保留。

    详细内容请参考MQTT协议3.1.2.5章的内容。

    举个例子,在客户端 A 进行连接时候,遗嘱消息设定为”offline“,客户端 B 订阅这个遗嘱主题。当 A 异常断开时,客户端 B 会收到这个”offline“的遗嘱消息,从而知道客户端 A 离线了。

    五、使用wireshark分析MQTT协议

    下图抓取了MQTT的CONNECT、CONNACK、PING、PINGREQ、PINGRESP、PUBLISH、DISCONNECT的过程。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zghSsP72-1607504325409)(367C5132B53E479DAA077D236F9B7EA5)]

    wireshark是可以直接解析mqtt协议的,我们点击Publish message一栏,可以得到如下信息
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gS1307JS-1607504325411)(2316810051E543DEB0C8453160517BCA)]

    六、MQTT客户端源代码获取

    官网地址:http://mqtt.org/

    MQTTv3.1.1下载地址:https://os.mbed.com/teams/mqtt/code/MQTTPacket/

    展开全文
  • 文章大纲引言五、MQTT协议控制包结构概述1、 MQTT固定包头1.1、 MQTT控制包类型1.2、 标识位1.3、 剩余长度2、 MQTT可变头2.1、包唯一标识3、载荷 Payload4、MQTT控制包之CONNECT 包的结构4.1、固定包头4.2、可变...
  • MQTT协议详解01

    2020-11-05 10:50:39
    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于订阅和发布(Publish/Subscribe)模式的轻量级通讯协议。它承载在TCP/IP协议上,适用于在嵌入式这种硬件资源不是很丰富的情况下(有限...
  • MQTT物联网协议详解

    万次阅读 多人点赞 2018-01-23 10:09:45
    MQTT物联网协议详解 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM...
  • MQTT协议(概括与详解

    千次阅读 2021-08-25 16:30:09
    3、实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是...
  • 文章大纲引言四、MQTT协议原理1、 MQTT协议的具体实现2、 MQTT协议中的核心术语2.1、订阅(Subscription)2.2、会话(Session)2.3、主题(Topic )和 主题筛选器(Topic Filter)2.4、负载(Payload)2.5、 MQTT...
  • MQTT协议详解 一、MQTT简介

    千次阅读 2020-10-26 17:15:52
    MQTT协议详解 一 前言 本章将首先讲解一些关于MQTT协议的基础概念。 一、简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级...
  • MQTT协议目前在物联网技术中应用非常广泛,各种公有云的IOT平台通信基本上都是按照该协议来实现的,这里先简单的做个总结: (1)MQTT协议框架及内容比较标准,可以认为是“物联网行业的Modbus协议”。 (2)...
  • MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它是一种轻量级的、基于代理的“发布/订阅”模式的消息传输协议。其具有协议简洁、小巧、可扩展性强、省流量、省电等优点...
  • 文章大纲引言6、MQTT控制包之PUBLISH包的结构6.1 固定包头6.1.1 DUP6.1.2 QoS6.1.3 RETAIN6.1.4、Remaining Length6.2 可变包头6.2.1 话题名6.2.2 包唯一标识6.3 载荷6.4 响应6.5 行为7、MQTT控制包之PUBACK包的结构...
  • C语言实现MQTT 通讯协议资源下载此资源下载价格为3D币,请先登录资源文件列表MQTT-c/CMakeLists.txt,375MQTT-c/include/Clients.h,4475MQTT-c/include/connector.h,965MQTT-c/include/Heap.h,2281MQTT-c/include/...
  • MQTT 是客户端服务器发布/订阅消息传输协议。它重量轻、开放、简单,并且设计易于实施。这些特性使其非常适合在许多情况下使用,包括受限制的环境,例如机器对机器 (M2M) 和物联网 (IoT) 环境中的通信,其中需要

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,444
精华内容 577
关键字:

mqtt通讯协议详解

友情链接: Objects_Classes.rar