MQTT是一种基于客户端和服务端架构的消息传输协议
1.1 服务端
MQTT的服务端通常是一台服务器(broker),它是MQTT信息传输的枢纽,负责将客户端的信息发送给客户端;还负责管理MQTT客户端,以确保客户端之间的通信顺畅,保证MQTT信息得以正确的接收和准确的投递。
1.2 客户端
MQTT客户端可以向服务端发布消息,也可以从服务端收取信息(前提是客户端向服务器订阅了该信息);
发布信息:客户端向服务器发送信息
1.3 主题(topic)
主题是一个非常重要的概念,客户端发布信息以及订阅信息都是围绕“主题”进行的。并且MQTT服务端在管理MQTT信息时,也是使用“主题”来控制的。
客户端之间想实现通信,必须通过MQTT服务端。
MQTT客户端连接服务器
①、客户端向服务器发送CONNECT报文,CONNECT报文的格式或内容不符合MQTTQ规范,服务器会拒绝客户端的连接请求。
上图中左边是名称(变量名),右边是值(变量的具体内容)。图中的“可选”字样代表CONNECT报文既可以包含他们也可以没有,试具体情况而定。
clientId–客户端ID
clientId是MQTT客户端的名字,MQTT的服务端通过clientId来区分不同的客户端。clientId必须是独立的,如果两个客户端使用了相同clientId,服务端会把他们当做同一个客户端处理。
keepAlive–心跳时间间隔
对于不经常向服务端发送信息的客户端,服务端是通过类似心跳检测的方式来判断客户端是否在线。客户端可定时向服务端发送一个心跳包用于告知服务端,当前客户端依然在线,服务端在收到客户端的心跳请求后,会回复一条消息,这条消息被称作心跳相应。
cleanSession–清除会话
布尔值,用于控制客户端与服务端连接和断开连接时的行为。
cleanSession = 0(永久会话)
1、客户端由离线在上线时,离线期间发送给客户端的所有Qos>0的消息仍然可以接收到
2、服务端会在客户端断开连接之后“记住”MQTT 客户端在线期间所订阅的所有“主题”
cleanSession = 1(临时会话)
1、客户端由离线在上线时,离线期间发送给客户端的所有消息全部接收不到
2、每次连接都是新会话
0:连接成功
1:连接被服务端拒绝,原因是不支持客户端的 MQTT 协议版本
2:连接被服务端拒绝,原因是不支持客户端标识符的编码。可能造成此原因的是客户端标识符编码是 UTF-8,但是服务端不允许使用此编码。
3:连接被服务端拒绝,原因是服务端不可用。即,网络连接已经建立,但 MQTT服务不可用
4:连接被服务端拒绝,原因是用户名或密码无效。
5:连接被服务端拒绝,原因是客户端未被授权连接到此服务端。
6~255:保留备用
sessionPresent
布尔值,与 CONNECT 报文中的 cleanSession 有关系
sessionPresent=1:服务端保存了与客户端上一次连接时的会话状态(保存了客户端订阅的主题)
sessionPresent=0:没有保存会话状态
客户端想要断开与服务端的连接时,可以发送DISCONNECT报文。
发布消息使用PUBLISH报文。
packetId–报文标识符
用于对MQTT报文进行标识,不同MQTTQ报文拥有的表示符不同,MQTT 设备可以通过该标识符对 MQTT 报文进行甄别和管理。
报文标识符的内容与 QoS 级别有密不可分的关系。只有 QoS 级别大于 0 时,报文标识符才是非零数值
topicName–主题名字
发布消息时对应的主题的名字
payload–有效载荷
MQTT 所发送的实际内容,可以是字符串文本,图像等格式的内容。
qos–服务质量等级
MQTT 消息的服务质量等级。QoS 有三个级别:0、1 和 2,QoS 决定MQTT 通信有什么样的服务保证。
retain–保留标志
客户端在订阅消息后会马上收到该主题的消息,这种现象会用到保留标志这一信息。
有保留标志的主题,服务器会保留消息,当有客户端订阅该主题后,服务端会立即想客户端发送改主题信息。
dup–重发标志
指示此消息是否重复。
当 MQTT 报文的接收方没有及时向报文发送发回复确认收到报文时,发送方会以为对方没有收到信息,会再次重复发送 MQTT 报文。在重复发送 MQTT 报文时,发送方会将此“dup–重发标
志”设置为 true。请注意,重发标志只在 QoS 级别大于 0 时使用。
订阅主题发送订阅报文->SUBSCRIBE
报文传输方式
客户端向服务端发送SUBSCRIBE报文,服务端回复SUBACK,
SUBSCRIBE报文
SUBACK报文
订阅返回码
服务端会根据客户端订阅的所有主题逐一的回复给客户端返回码
0x00:订阅成功--Qos0
0x01:订阅成功--Qos1
0x02:订阅成功--Qos2
0x80:订阅失败
报文标识符
客户端订阅了某一主题之后,也可以取消订阅,使用UNSUBSCRIBE报文取消订阅,服务端恢复UNSUBACK报文确认取消。
报文传输方式