文章目录
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客户端连接服务端一共有两步。
- 首先MQTT客户端将会向服务端发送连接请求。该请求实际上是一个包含有请求信息的数据包。这个数据包的官方名称为CONNECT。
- 服务端收到客户端连接请求后,会向客户端发送连接确认。同样的,该确认也是一个数据包。这个数据包官方名称为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连接