<物联网>MQTT协议学习笔记

MQTT Version 3.1.1

在这里插入图片描述

1.MQTT(Message Queuing Telemetry Transport)

MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是受限的环境如机器与机器的通信(M2M)以及物联网环境(IOT)。

MQTT协议是一种很轻的通讯协议。与HTTP之类的协议相比,MQTT在通过网络传输数据时表现出众。另一个重要特点是易于在客户端实现。因此,MQTT成为了当今世上最受欢迎的物联网协议。

目前MQTT主流版本有2个,分别是MQTT3.1.1和MQTT5。MQTT3.1.1是在2014年10月发布的,而MQTT5的发布时间距今不久。

MQTT5是在MQTT3.1.1的基础上进行了升级。因此MQTT5是完全兼容MQTT3.1.1的。

2.MQTT基本原理

在MQTT协议通讯中,有两个最为重要的角色。它们分别是服务端客户端

2.1 MQTT服务端

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

2.2 MQTT客户端

MQTT客户端可以向服务端发布信息,也可以从服务端收取信息。把客户端发送信息的行为称为“发布”信息。而客户端要想从服务端收取信息,则首先要向服务端“订阅信息”。

2.3 MQTT主题

MQTT服务端在管理MQTT信息通讯时,就是使用“主题”来控制的。

2.4 MQTT发布/订阅 特性

MQTT通讯的核心枢纽是MQTT服务端。有了服务端对MQTT信息的接受、储存、处理和发送,客户端在发送和订阅消息时,可以相互独立,且在空间上可以分离时间上可以异步

3.连接MQTT服务端

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

MQTT客户端连接服务端一共有两步。

  1. 首先MQTT客户端将会向服务端发送连接请求。该请求实际上是一个包含有请求信息的数据包。这个数据包的官方名称为CONNECT
  2. 服务端收到客户端连接请求后,会向客户端发送连接确认。同样的,该确认也是一个数据包。这个数据包官方名称为CONNACK

在这里插入图片描述
在这里插入图片描述

MQTT客户端要向连接服务端,首先要向服务端发送CONNECT报文。CONNECT报文的格式和内容需符合MQTT规范,否则服务器会拒绝客户端的连接请求。

所谓报文就是一个MQTT数据包。这个数据包中包含多个信息。

a.CONNECT-连接服务端

在这里插入图片描述

3.1 clientId-客户端ID

ClientId是MQTT客户端的标识。MQTT服务端用该标识来识别客户端。因此ClientId必须是独立唯一的。通常ClientId是由一串字符所构成的,如:client-1。

3.2 cleanSession-清除会话

MQTT客户端与服务端的连接可能不是非常稳定,因此,我们要根据客户端对系统运行的重要性来区别对待。

为了保证重要的MQTT报文可以被客户端准确无误地收到,在服务端向客户端发送报文后,客户端会向服务端返回一个确认报文。如果服务端没有收到客户端返回的确认报文,那么服务端就会认为刚刚发送给客户端的报文没有被准确的送达。在这种情况下,服务端就会执行以下两个操作:
操作1:将尚未被客户端确认的报文保存起来
操作2:再次尝试向客户端发送报文,并且再次等待客户端发来确认信息。

如果cleanSession被设置为"true"。那么服务端不需要客户端确认收到报文,也不会保存任何报文。在这种情况下,即使客户端错过了服务端发来的报文,也没办法让服务端再次发送报文。

反过来,我们将cleanSession设置为"false",那么服务端就知道,后续通讯中,客户端可能会要求我保存没有收到的报文。注意,如果需要客户端保存重要报文,光设置cleanSession为false是不够的,还需要传递的MQTT信息Qos级别>0

3.3 keepAlive-心跳时间间隔

KeepAlive用于服务端实时了解客户端是否与其保持连接的情况。

b. CONNACK-确认连接请求

在这里插入图片描述

3.4 returnCode-连接返回码

当服务端收到了客户端的连接请求后,会向客户端发送returnCode(连接返回码),用以说明连接情况。如果客户端与服务端成功连接,则返回数字“0”。如果未能成功连接,连接返回码将会是一个非零的数值。

在这里插入图片描述

3.5 sessionPresent-当前会话

首先,当客户端发送的CONNECT报文中的cleanSession设置为true。在这种情况下,客户端是不需要服务端保存任何报文的。那么服务端发送的确认连接CONNACK报文中,sessionPresent肯定是false,也就是说,服务端没有保存任何报文。

当客户端发送的CONNECT报文中的cleanSession设置为false时,客户端是要求服务端保存报文的。在这种情况下,如果服务端的确保存了没有收到客户端接收确认的报文信息,那么sessionPresent为true,否则为false。

4.服务端连接操作

4.1 mqttfx安装

官网

4.2 first-MQTT连接

在这里插入图片描述
在这里插入图片描述

5.发布、订阅和取消订阅

<

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值