转战物联网·基础篇08-例说MQTT协议各控制报文
前面讨论了MQTT协议的控制报文的格式,下面分别举例探讨各个控制报文的详细内容。
01、CONNECT – 连接服务端
客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是CONNECT报文。客户端在连接成功后,不能再次发送这个报文,否则服务端应按照违规处理,断开当前网络连接。一个完整的CONNECT报文见下图:

清理会话--Clean Session(1号位)
这个标志位是代表对会话状态的处理方式。
如果设置为0,则服务端必须使用客户端ID找到该客户端的会话恢复通信。如果找不到这个会话则创建一个新会话,然后在断开时,必须保存这个会话信息。
如果设置为1,则客户端和服务端都必须丢弃之前的任何会话,全新开始一个会话。会话持续时间与网络连接时间同样长。这个会话关联的状态数据不能被任何之后的会话重用。
客户端会话关联的状态数据:
◆已经发送给服务端,但是还没有完成确认的QoS 1和QoS 2级别的消息
◆已从服务端接收,但是还没有完成确认的QoS 2级别的消息。
服务端会话关联的状态数据:
◆会话是否存在,即使会话状态的其它部分都是空。
◆客户端的订阅信息。
◆已经发送给客户端,但是还没有完成确认的QoS 1和QoS 2级别的消息。
◆即将传输给客户端的QoS 1和QoS 2级别的消息。
◆已从客户端接收,但是还没有完成确认的QoS 2级别的消息。
◆可选,准备发送给客户端的QoS 0级别的消息。
遗嘱标志(是否有遗嘱)--Will Flag(2号位)
如果设置为0,本次连接没有遗嘱。
如果设置为1,本次连接带有遗嘱,服务端必须保存遗嘱消息并与这个连接关联。本条报文中也必须包含遗嘱消息。
遗嘱服务质量等级--Will QoS(3、4号位)
指定遗嘱消息的服务质量等级,具体可参看前面的QoS说明。
如果遗嘱标志为0,那么这个等级必须设置为0。如果遗嘱标志为1,这个等级可以设置0、1、2中的任何一种。
遗嘱保留--Will Retain(5号位)
如果设置为0,遗嘱消息作为非保留消息发布,在遗嘱标志设置为0时,这里也必须设置为0。
如果设置为1,遗嘱消息作为非保留消息发布。
保持连接--Keep Alive(11、12字节)
是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。客户端负责保证控制报文发送的时间间隔不超过保持连接的值。如果没有任何其它的控制报文可以发送,客户端必须发送一个PINGREQ报文。
保持连接的值为零表示关闭保持连接功能。这意味着,服务端不需要因为客户端不活跃而断开连接。注意:不管保持连接的值是多少,任何时候,只要服务端认为客户端是不活跃或无响应的,可以断开客户端的连接。
响应 Response
本报文的响应报文是:CONNACK
02、CONNACK – 确认连接请求
每次连接建立后服务端发送给客户端的第一个报文,是响应CONNECT报文的,一个完整的CONNACK报文见下图:

当前会话--Session Present(0号位)
如果服务端收到的连接请求中清理会话(CleanSession)标志为1,除了将本报文中的返回码设置为0外,还必须将当前会话(Session Present)标志设置为0 。
如果服务端收到一个CleanSession为0的连接,当前会话标志的值取决于服务端是否已经保存了ClientId对应客户端的会话状态。如果服务端已经保存了会话状态,它必须将本报文中的当前会话标志设置为1 。如果服务端没有已保存的会话状态,则必须将本报文中的当前会话设置为0。还需将返回码设置为0 。
当前会话标志使服务端和客户端在是否有已存储的会话状态上保持一致。
如果服务端发送了一个包含非零返回码的CONNACK报文,它必须将当前会话标志设置为0。
03、PUBLISH – 发布消息
是指从客户端向服务端或者服务端向客户端传输一个应用消息。一个完整的PUBLISH报文见下图:

保留标志--RETAIN(0号位)
如果设置为1,服务端必须存储这个应用消息和它的服务质量等级(QoS),以便它可以被分发给后期订阅匹配的订阅者。如果同时QoS=0,它必须用新的消息替换掉之前为那个主题保留的所有消息。
服务端发送PUBLISH报文给客户端时,如果消息是作为客户端一个新订阅的结果发送,它必须将报文的保留标志设为1。当一个PUBLISH报文发送给客户端是因为匹配一个已建立的订阅时,服务端必须将保留标志设为0,不管它收到的这个消息中保留标志的值是多少。
如果设置为0,服务端不能存储这个消息也不能移除或替换任何现存的保留消息。
响应 Response
本报文的响应报文是:QoS=0时不需要响应;QoS=1时是PUBACK;QoS=2时是PUBREC。
04、PUBACK –发布确认
是对QoS 1等级的PUBLISH报文的响应。一个完整的PUBACK报文见下图:

05、PUBREC – 发布收到(QoS=2,第一步)
是对QoS等级2的PUBLISH报文的响应。它是QoS=2等级协议交换的第二个报文。一个完整的PUBREC报文见下图:

响应 Response
本报文的响应报文是:PUBREL。
06、PUBREL – 发布释放(QoS 2,第二步)
是对PUBREC报文的响应。它是QoS 2等级协议交换的第三个报文。一个完整的PUBREL报文见下图:

响应 Response
本报文的响应报文是:PUBCOMP。
07、PUBCOMP – 发布完成(QoS 2,第三步)
是对PUBREL报文的响应。它是QoS 2等级协议交换的第四个(也是最后一个)报文。一个完整的PUBCOMP报文见下图:

08、SUBSCRIBE - 订阅主题
由客户端向服务端发送的,用于创建一个或多个订阅。每个订阅是该客户端关注的一个或多个主题。服务端依据客户端的订阅来匹配主题,然后将对应的PUBLISH报文发送给客户端。本报文也(为每个订阅)指定了最大的QoS等级,服务端根据这个决定如何发送应用消息给客户端。一个完整的SUBSCRIBE报文见下图:

响应 Response
本报文的响应报文是:SUBACK。
09、SUBACK – 订阅确认
服务端发送本报文给客户端,用于确认它已收到并且正在处理SUBSCRIBE报文。
本报文包含一个返回码清单,它们指定了SUBSCRIBE请求的每个订阅被授予的最大QoS等级。一个完整的SUBACK报文见下图:

10、UNSUBSCRIBE –取消订阅
客户端发送本报文给服务端,用于取消订阅主题。一个完整的UNSUBSCRIBE报文见下图:

响应 Response
本报文的响应报文是:UNSUBACK。
11、UNSUBACK – 取消订阅确认
服务端发送本报文给客户端用于确认收到UNSUBSCRIBE报文。一个完整的UNSUBACK报文见下图:

12、PINGREQ – 心跳请求
客户端发送本报文给服务端的。用于:
◆在没有任何其它控制报文从客户端发给服务的时,告知服务端客户端还活着。
◆请求服务端发送 响应确认它还活着。
◆使用网络以确认网络连接没有断开。
保持连接(Keep Alive)处理中用到这个报文。一个完整的PINGREQ报文见下图:

响应 Response
本报文的响应报文是:PINGRESP。
13、PINGRESP – 心跳响应
服务端发送本报文响应客户端的PINGREQ报文。表示服务端还活着。
保持连接(Keep Alive)处理中用到这个报文。一个完整的PINGREQ报文见下图:

14、DISCONNECT –断开连接
是客户端发给服务端的最后一个控制报文。表示客户端正常断开连接。一个完整的DISCONNECT报文见下图:

关于MQTT控制报文的例说就到这里,希望对进一步理解MQTT协议能有很好的帮助。后面会继续其他内容。
本节完,待续…
转战物联网·基础篇08-例说MQTT协议各控制报文的更多相关文章
- 转战物联网·基础篇07-深入理解MQTT协议之控制报文(数据包)格式
在MQTT协议中,一个控制报文(数据包)的结构按照前后顺序分如下三部分: 结构名 中文名 解释说明 Fixed header 固定报头 报文的最开始部分,所有报文都包含这个部分 Variable ...
- 转战物联网·基础篇05-通俗理解MQTT协议的实现原理和异步方式
网络上搜索MQTT协议,会出现太多的解释,这里就不做官方标准释义的复制了.这一节我们从实战理解角度,通俗的将MQTT协议的作用及实现原理说一下,旨在可以快速理解MQTT协议.所以可能会出现很多看似 ...
- 转战物联网·基础篇06-深入理解MQTT协议之基本术语
通过上一节我们对MQTT协议已经有了初步的印象,这一节我们开始深入的理解一下MQTT协议,介绍常用的MQTT 3.1.1版本,5.0版本后面指介绍新增部分即可.这一节我们先介绍MQTT里常用的术语 ...
- 转战物联网·基础篇09-选择MQTT协议还是CoAP协议
前面章节介绍过,MQTT协议和CoAP协议都是物联网中比较流行的协议,都对传输量做了很大的精简,传输开销小,以适应物理网的网络环境. XMPP协议也有人说是适合物联网通信的,但它是基于XML, ...
- 转战物联网·基础篇03-从JSON数据到短指令谈思维的转变
了解了物联网项目的大体结构之后,我们先从物联网的联网相关部分说起,这也是物联网项目中的关键环节.在联网环节中,不仅要考虑如何连接上,还要考虑连接后如何传输数据.换句话说数据是以什么格式进行传输,对 ...
- iOS系列 基础篇 08 文本与键盘
iOS系列 基础篇 08 文本与键盘 目录: 1. 扯扯犊子 2. TextField 3. TextView 4. 键盘的打开和关闭 5. 打开/关闭键盘的通知 6. 键盘的种类 7. 最后再扯两句 ...
- 物联网防火墙himqtt源码之MQTT协议分析
物联网防火墙himqtt源码之MQTT协议分析 himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Application FireWall,C语言编写,采用epoll模式支持数十万 ...
- Java多线程系列--“基础篇”08之 join()
概要 本章,会对Thread中join()方法进行介绍.涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_40)3. join()示例 转载请注明出处:http ...
- 【物联网云端对接-3】通过MQTT协议与微软Azure IoT Hub进行云端通信
在上一篇文章<通过MQTT协议与阿里云物联网套件进行云端通信>中,我们介绍了通过MQTT对接阿里云的物联网套件.其实同样的代码,稍加调整也可以对接到微软Azure IoT hub上,不过需 ...
随机推荐
- 软件开发工具(第13章: Eclipse插件的使用与开发)
一.插件简介 插件的定义(了解) 插件是一种遵循其所依附的软件的接口规范所编写出来的程序. 插件实际上是对原有软件的扩展,替应用程序增加一些所需要的特定 功能. 插件的构成(重点.记忆) 每个插件都由 ...
- Eclipse——关联源代码
Eclipse——关联源代码 摘要:本文主要说明了如何在Eclipse里关联源代码. 下载源码包 首先去想要关联的jar包的官网下载对应jar包的源代码,拿Tomcat的类库举例,先去官网下载源码包: ...
- C#中的Skip()和Take()
Skip()和Take()方法都是IEnumerable<T> 接口的扩展方法,包括C#中的所有Collections类,如ArrayList,Queue,Stack等等,还有数组和字符串 ...
- 获取zabbix上所有主机的IP和主机名
#coding:utf-8 #获取zabbix上所有主机的IP和主机名 import requests import json import csv import time def get_token ...
- 国内的go get问题的解决 --gopm
一.golang之旅--gopm 1.什么是gopm 在nodejs中我们有npm,可以通过npm来下载安装一些依赖包.在go中也开发了类似的东西,那就是gopm.这玩意儿是七牛开发的.在这里说下,七 ...
- spring boot 加入mail邮件支持
一.添加依赖 <!-- 邮件整合 --> <dependency> <groupId>org.springframework.boot</groupId> ...
- C#中巧用妙法避免嵌套方式使用两个foreach循环
问题:需要对DataGridViewRow的下拉框列Item2所选内容进行判断,看是否跟数据库里面某个配置表的数据列Item1匹配.如果用两个foreach循环进行匹配,会导致逻辑复杂而且容易只bre ...
- facl 用户以及Linux 终端
FACL : Filesystem Access Control List 利用文件扩展保存额外的访问控制权限setfacl -b:Remove all -m:设定 u:UID:perm g:GID: ...
- Linux禁用root用户
在创建各种云主机的时候,云服务商给的都是root用户,这很方便,但是有某些时候会造成一些困扰,日后在服务器上启动各种服务后,仅仅拥有root权限的用户才能访问更改这些服务,这样会造成一些不必要的困扰, ...
- CodeForces - 460C(二分+差分)
题意 https://vjudge.net/problem/CodeForces-460C 一个长度为 n 的序列 a ,你有 m 次操作的机会,每次操作是将其中连续的 w 个元素增加 1 .最大化最 ...