MQTT协议的初浅认识之连接建立

匆匆过客 提交于 2021-02-17 08:12:38

MQTT百科

MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。

从危机百科可以看出,MQTT是一种协议,不是一种消息队列。尽管,它有消息队列的设计,但更侧重是一种网络协议。 一般推荐使用2014年10月30日发布的MQTT 3.1.1版本,关于MQTT3.1.1版本优势的文章

几个概念

客户端(Client)

MQTT客户端是运行MQTT客户端库并通过网络连接到MQTT中间件的任何设备(从嵌入式设备到服务器)。MQTT客户端库可由各种编程语言实现。 例如,Android,Arduino,C,C ++,C#,Go,iOS,Java,JavaScript和.NET。

中间件(Broker)

MQTT中间件是MQTT协议的核心。负责接收所有消息,过滤消息,确定订阅每条消息的客户端,以及将消息发送给这些订阅的客户端。还包括对持久会话的管理,以及客户端的认证和授权等功能。例如:Mosquitto就是由Eclipse基金会维护开发的MQTT中间件。由Apache基金会维护开发的ActiveMQ消息中间件支持MQTT协议。

MQTT 连接

这里借用hivemq的几张图.

MQTT连接过程

mqtt-tcp-ip-stack

MQTT协议是基于TCP/IP的。客户端和中间件建立连接的时候:

  • 客户端先发送CONNECT消息给中间件
  • 中间件收到客户端的连接请求后返回CONNACK消息

connect-flow

CONNECT消息

connect

参数说明:

  • clientId:表示客户端id,可以是设备唯一id,或者是业务系统用户id
  • cleanSession:false表示使用持久会话;true表示不使用持久会话
  • username:mqtt中间件的验证用户名
  • password:mqtt中间件的验证密码
  • lassWill开头:表示客户端从中间件中意外断开时中间件应该怎么做
  • keepAlive:表示客户端与中间件之间在没有任何消息的推送的时候,多久启用一次客户端发一次PINGREQ消息,中间件收到PINGREQ消息后,必须给客户端回复PINGRESP消息。这个参数很重要。

CONNACK消息

CONNACK消息包含两个部分:

  • 会话是否持久标识
  • mqtt连接状态标识

connack1

参数说明:

  • sessionPresent::true表示是持久会话;否则,反之。
  • returnCode:见下表。
Return Code Return Code Response
0 Connection accepted
1 Connection refused, unacceptable protocol version
2 Connection refused, identifier rejected
3 Connection refused, server unavailable
4 Connection refused, bad user name or password
5 Connection refused, not authorized

后面,我们再谈谈MQTT的订阅发布过程

参考

MQTT Essentials: Part 1 – Introducing MQTT

MQTT

Mosquitto服务器日志分析总结

MQTT Essentials Part 10: Keep Alive and Client Take-Over

MQTT Essentials Part 3: Client, Broker, and Connection Establishment

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!