【MQTT学习 一】基本概念

文章目录

  • 通信基本原理
    • MQTT
    • MQTT发布/订阅特性
    • 连接MQTT服务端
    • MQTT报文组成
    • CONNECT 报文
    • CONNACK报文
    • 断开连接
    • 发布消息
    • 订阅主题
    • 取消订阅

通信基本原理

MQTT

MQTT是一种基于客户端和服务端架构的消息传输协议

1.1 服务端

MQTT的服务端通常是一台服务器(broker),它是MQTT信息传输的枢纽,负责将客户端的信息发送给客户端;还负责管理MQTT客户端,以确保客户端之间的通信顺畅,保证MQTT信息得以正确的接收和准确的投递。

1.2 客户端

MQTT客户端可以向服务端发布消息,也可以从服务端收取信息(前提是客户端向服务器订阅了该信息);

发布信息:客户端向服务器发送信息

1.3 主题(topic)
主题是一个非常重要的概念,客户端发布信息以及订阅信息都是围绕“主题”进行的。并且MQTT服务端在管理MQTT信息时,也是使用“主题”来控制的。

MQTT发布/订阅特性

  • 客户端相互独立:每个客户端之间互不干扰,无需了解彼此的存在。
  • 空间可分离:客户端和服务端只要处于同一个网络即可,不需要在同一物理范围。
  • 时间上可异步:接收消息不需要实时在线。

连接MQTT服务端

客户端之间想实现通信,必须通过MQTT服务端。

MQTT客户端连接服务器
①、客户端向服务器发送CONNECT报文,CONNECT报文的格式或内容不符合MQTTQ规范,服务器会拒绝客户端的连接请求。
【MQTT学习 一】基本概念_第1张图片

②、服务端向客户端发送CONNACK报文
【MQTT学习 一】基本概念_第2张图片

MQTT报文组成

  • 固定头(Fixed header):存在于所有报文,含有报文类型标识。
  • 可变头(Variable header):存在于部分报文中,报文的类型决定可变头是否存在。
  • 有效载荷(Payload,消息体):存在于部分报文中,消息实体内容。

CONNECT 报文

【MQTT学习 一】基本概念_第3张图片
上图中左边是名称(变量名),右边是值(变量的具体内容)。图中的“可选”字样代表CONNECT报文既可以包含他们也可以没有,试具体情况而定。

clientId–客户端ID
clientId是MQTT客户端的名字,MQTT的服务端通过clientId来区分不同的客户端。clientId必须是独立的,如果两个客户端使用了相同clientId,服务端会把他们当做同一个客户端处理。

keepAlive–心跳时间间隔
对于不经常向服务端发送信息的客户端,服务端是通过类似心跳检测的方式来判断客户端是否在线。客户端可定时向服务端发送一个心跳包用于告知服务端,当前客户端依然在线,服务端在收到客户端的心跳请求后,会回复一条消息,这条消息被称作心跳相应。

cleanSession–清除会话
布尔值,用于控制客户端与服务端连接和断开连接时的行为。

cleanSession = 0(永久会话)
1、客户端由离线在上线时,离线期间发送给客户端的所有Qos>0的消息仍然可以接收到
2、服务端会在客户端断开连接之后“记住”MQTT 客户端在线期间所订阅的所有“主题”

cleanSession = 1(临时会话)
1、客户端由离线在上线时,离线期间发送给客户端的所有消息全部接收不到
2、每次连接都是新会话

CONNACK报文

【MQTT学习 一】基本概念_第4张图片
returnCode–连接返回码
说明连接情况,

0:连接成功
1:连接被服务端拒绝,原因是不支持客户端的 MQTT 协议版本
2:连接被服务端拒绝,原因是不支持客户端标识符的编码。可能造成此原因的是客户端标识符编码是 UTF-8,但是服务端不允许使用此编码。
3:连接被服务端拒绝,原因是服务端不可用。即,网络连接已经建立,但 MQTT服务不可用
4:连接被服务端拒绝,原因是用户名或密码无效。
5:连接被服务端拒绝,原因是客户端未被授权连接到此服务端。
6~255:保留备用

sessionPresent
布尔值,与 CONNECT 报文中的 cleanSession 有关系

 sessionPresent=1:服务端保存了与客户端上一次连接时的会话状态(保存了客户端订阅的主题)
 sessionPresent=0:没有保存会话状态

断开连接

客户端想要断开与服务端的连接时,可以发送DISCONNECT报文。

发布消息

发布消息使用PUBLISH报文。
【MQTT学习 一】基本概念_第5张图片
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
报文传输方式
【MQTT学习 一】基本概念_第6张图片
客户端向服务端发送SUBSCRIBE报文,服务端回复SUBACK,

SUBSCRIBE报文

  1. 一个订阅报文可以包含一个或多个订阅主题名,
  2. 同时还要明确Qos,服务端会根据提供的Qos提供相应的服务保证。
  3. 报文标识符,用于对MQTT报文标识。

SUBACK报文

  1. 订阅返回码
    服务端会根据客户端订阅的所有主题逐一的回复给客户端返回码

     0x00:订阅成功--Qos0
     0x01:订阅成功--Qos1
     0x02:订阅成功--Qos2
     0x80:订阅失败	
    
  2. 报文标识符

取消订阅

客户端订阅了某一主题之后,也可以取消订阅,使用UNSUBSCRIBE报文取消订阅,服务端恢复UNSUBACK报文确认取消。

报文传输方式

【MQTT学习 一】基本概念_第7张图片

你可能感兴趣的:(#,MQTT,学习,网络,服务器)