1. MQTT报文
1.1连接MQTT服务端
1.1.1 CONNECT 连接请求
客户端连接服务端需要两步:
- MQTT客户端向服务端发送连接请求
- MQTT服务端发送连接确认
clientId - 客户端ID
是MQTT客户端的标识,服务端使用该标识识别客户端
cleanSession - 清除会话
区分报文重要性,true为不重要信息,false为重要信息;将尚未被客户端确认的报文保存起来;并再次尝试向客户端发送报文,并再次等待客户端发来确认信息;结合QoS使用
true:服务端不需要客户端确认收到报文,不会保存任何报文
false:服务端需要客户端确认收到报文,会保存没有收到确认的报文
username
password
有些MQTT服务端需要客户端在连接时提供用户名和密码。只有客户端正确提供了用户名和密码后,才能连接服务端。否则服务端将会拒绝客户端连接,那么客户端也就无法发布和订阅消息了。
username(用户名)和password(密码)是可选的CONNECT信息。也就是说,有些服务端开启了客户端用户密码认证,这种服务端需要客户端在连接时正确提供认证信息才能连接。当然,那些没有开启用户密码认证的服务端无需客户端提供用户名和密码认证信息。
在以上示例中,我们看到此CONNECT报文中所包含的用户名是“hans”,密码是“letmein”。
用户名和密码除了有以上功能外,有些公用MQTT服务端也利用此信息来识别客户端属于哪一个用户,从而对客户端进行管理。比如用户可以拥有私人主题,这些主题只有该用户可以发布和订阅。对于私人主题,服务端就可以利用客户端连接时的用户名和密码来判断该客户端是否有发布订阅该用户私人主题的权限。
lastWillTopic
lastWillQos
lastWillMessage
lastWillRetain
lastWillTopic – 遗嘱主题
遗嘱消息和普通MQTT消息很相似,也有主题和正文内容。lastWillTopic的作用正是告知服务端,本客户端的遗嘱主题是什么。只有那些订阅了这一遗嘱主题的客户端才会收到本客户端的遗嘱消息。以上图为例,此遗嘱主题为”hans/will”。也就是说,只有订阅了主题”hans/will”的客户端,才会收到这台客户端的遗嘱消息。
lastWillMessage – 遗嘱消息
遗嘱消息定义了遗嘱消息内容。在本示例中,那些订阅了主题”hans/will”的客户端会在客户端意外断线时,收到服务端发布的“unexpected exit”。
lastWillQoS – 遗嘱QoS
对于遗嘱消息来说,同样可以使用服务质量来控制遗嘱消息的传递和接收。这里的服务质量与普通MQTT消息的服务质量是一样的概念。也可以设置为0、1、2。对于不同的服务质量级别,服务端会使用不同的服务质量来发布遗嘱消息。
lastWillRetain – 遗嘱保留
遗嘱消息也可以设置为保留消息,关于保留消息的具体内容,我们在之前的课程中曾经学习过。遗嘱保留用于设置遗嘱消息是否需要进行保留处理。服务端会根据此处内容,对遗嘱消息进行相应的保留与否处理。
keepAlive - 心跳时间间隔
服务端了解客户端连接情况
客户端在心跳间隔时间内,如果有消息发布,那就不发布心跳请求。但是在心跳间隔时间内,客户端没有消息发布,那么它就会发布一条心跳请求给服务端,这个心跳请求的目的就是为了告诉服务端,“我还在线,你放心吧”。
在实际运行中,如果服务端没有在1.5倍心跳时间间隔内收到客户端发布消息(PUBLISH)或发来心跳请求(PINGREQ),那么服务端就会认为这个客户端已经掉线。
举例来说,如果心跳时间间隔是60秒。那么服务端在90秒内没有收到客户端发布的消息也没有收到PINGREQ请求,那么它就会认为客户端已经掉线。
另外,心跳机制不仅仅用于服务端判断客户端是否在线。客户端也可以利用这一机制来判断自己是否与服务端仍保持连接。如果客户端发送了心跳请求(PINGREQ)给服务端一段时间后,仍然没有收到服务端回复的心跳确认。那么客户端也会认为自己已经断开了与服务端的连接。
1.1.2 CONNACK 连接确认/应答
sessionPresent - 当前会话
当重要客户端连接服务端时,服务端可能保存着没有得到确认的报文。如果是这样的话,那么客户端在连接服务端时,就会通过sessionPresent来了解服务端是否有之前未能确认的信息。
简言之,CONNACK报文的sessionPresent与CONNECT报文的cleanSession相互配合。其作用是客户端发送连接请求时,服务端告知客户端有没有保存报文信息。这个被服务端保存的报文信息是来自于上一次客户端连接时,服务端曾经发送此报文给客户端,但是发送后没有收到客户端接收确认。
受cleanSession影响
cleanSession为true时,客户端不需要服务端保存任何报文,sessionPresent是false;
cleanSession为false时,客户端要求服务端保存报文,若服务端的确保存了没有收到客
户端接收确认的报文信息,那么sessionPresent为true,否则为false;
returnCode - 连接返回码
当服务端收到了客户端的连接请求后,会向客户端发送returnCode(连接返回码),用以说明连接情况。如果客户端与服务端成功连接,则返回数字“0”。如果未能成功连接,连接返回码将会是一个非零的数值,具体这个数值的含义,请见下列说明:
0 - 成功连接
1 - 连接被服务端拒绝,原因是不支持客户端的MQTT协议版本
2 - 连接被服务端拒绝,原因是不支持客户端标识符的编码。
3 - 连接被服务端拒绝,原因是服务端不可用。
4 - 连接被服务端拒绝,原因是用户名或密码无效。
5 - 连接被服务端拒绝,原因是客户端未被授权连接到此服务
1.2发布、订阅
1.2.1 PUBLISH 发布信息
topicName - 主题名
主题名用于识别此信息应发布到哪一个主题。关于MQTT主题的应用,我们在之前的课程中已经做了详细介绍,在后续课程中我们还会对主题的高级应用进行更加详细的讲解。
QoS – 服务质量等级
QoS(Quality of Service)表示MQTT消息的服务质量等级。QoS有三个级别:0、1和2。QoS决定MQTT通讯有什么样的服务保证。有关QoS的详细信息我们会在后续课程中详细讲解。
packetId – 报文标识符
报文标识符可用于对MQTT报文进行标识。不同的MQTT报文所拥有的标识符不同。MQTT设备可以通过该标识符对MQTT报文进行甄别和管理。请注意:报文标识符的内容与QoS级别有密不可分的关系。只有QoS级别大于0时,报文标识符才是非零数值。如果QoS等于0,报文标识符为0。
retainFlag – 保留标志
在默认情况下,当客户端订阅了某一主题后,并不会马上接收到该主题的信息。只有在客户端订阅该主题后,服务端接收到该主题的新信息时,服务端才会将最新接收到的该主题信息推送给客户端。
但是在有些情况下,我们需要客户端在订阅了某一主题后马上接收到一条该主题的信息。这时候就需要用到保留标志这一信息。关于保留标志的具体使用方法,我们将在本教程的后续部分进行详细讲解。
Payload – 有效载荷
有效载荷是我们希望通过MQTT所发送的实际内容。我们可以使用MQTT协议发送文本,图像等格式的内容。这些内容都是通过有效載荷所发送的。
dupFlag – 重发标志
当MQTT报文的接收方没有及时确认收到报文时,发送方会重复发送MQTT报文。在重复发送MQTT报文时,发送方会将此“重发标志”设置为true。请注意,重发标志只在QoS级别大于0时使用。有关QoS的详细信息,我们将会在后续教程中为您做详细介绍。
1.2.2 SUBSCRIBM 订阅主题
客户端要想接收消息,首先要订阅该消息的主题。当有客户端向该主题发布消息后,订阅了该主题的客户端就能接收到消息了。
客户端要想订阅主题,首先要向服务端发送主题订阅请求。客户端是通过向服务端发送SUBSCRIBE报文来实现这一请求的。该报文包含有一系列“订阅主题名”。请留意,一个SUBSCRIBE报文可以包含有单个或者多个订阅主题名。也就是说,一个SUBSCRIBE报文可以用于订阅一个或者多个主题。
在以上PUBLISH报文讲解中,曾经提到过QoS(服务质量等级)这一概念。同样的,客户端在订阅主题时也可以明确QoS。服务端会根据SUBSCRIBE中的QoS来提供相应的服务保证。
另外每一个SUBSCRIBE报文还包含有“报文标识符”。报文标识符可用于对MQTT报文进行标识。不同的MQTT报文所拥有的标识符不同。MQTT设备可以通过该标识符对MQTT报文进行甄别和管理。
1.2.3 SUNACK 订阅确认
服务端接收到客户端的订阅报文后,会向客户端发送SUBACK报文确认订阅。SUBACK报文包含有“订阅返回码”和“报文标识符”这两个信息。
客户端向服务端发送订阅请求后,服务端会给客户端返回一个订阅返回码。客户端可通过一个SUBSCRIBE报文发送多个主题的订阅请求。服务端会针对SUBSCRIBE报文中的所有订阅主题来逐一回复给客户端一个返回码。这个返回码的作用是告知客户端是否成功订阅了主题。以下是返回码的详细说明。
returnCode – 订阅返回码
0 - 订阅成功 – QoS 0
1 - 订阅成功- QoS 1
2 - 订阅成功- QoS 2
128 - 订阅失败
针对不同的主题订阅QoS,服务端的返回码会有所不同。另外每一个SUBACK报文也包含有“报文标识符”。MQTT设备可以通过该标识符对报文进行管理。
1.2.4 UNSUBSCRIBE 取消订阅
当客户端要取消订阅某主题时,可通过向服务端发送UNSUBSCRIBE – 取消订阅报文来实现。
packetId – 报文标识符
MQTT设备可以通过该标识符对报文进行管理。
topic - 取消订阅的主题名称
同一个UNSUBSCRIBE报文可以同时包含多个取消订阅的主题名称。
当服务端接收到UNSUBSCRIBE报文后,会向客户端发送取消订阅确认报文 – UNSUBACK报文。该报文含有客户端所发送的“取消订阅报文标识符”。客户端接收到UNSUBACK报文后就可以确认取消主题订阅已经成功完成了。
1.2.5 UNSUBSCRACK 取消订阅确认
2.概念分析
2.1 主题
【零基础学物联网】MQTT篇 1-7 MQTT主题进阶 - 哔哩哔哩
2.2 QoS服务质量等级
【零基础学物联网】MQTT篇 2-1 QoS 服务质量等级 - 哔哩哔哩
2.3 保留消息
【零基础学物联网】MQTT篇 2-3 保留消息 - 哔哩哔哩
2.4 心跳机制
【太极创客】零基础入门学用物联网 - MQTT篇 2-5 心跳机制 - 哔哩哔哩
2.5 MQTT遗嘱
【零基础学物联网】MQTT篇 2-6 MQTT遗嘱 - 哔哩哔哩
2.6 MQTT用户密码认证
【零基础学物联网】MQTT篇 2-8 MQTT用户密码认证 - 哔哩哔哩
3. MQTT测试
3.1电脑客户端平台
3.2移动客户端平台
3.3开发板客户端平台
3.4代码
3.5MQTT连接阿里云物联网平台
使用MQTT.fx接入物联网平台,阿里云文章:
使用MQTT协议模拟设备快速接入物联网平台_物联网平台(IoT)-阿里云帮助中心
CSDN文章:
其它见word文档