【EMQX实践】MQTT连接/断开

363 阅读4分钟

在MQTT协议中,建立连接和断开连接是通过特定的控制报文来完成的。以下是使用MQTT协议建立连接和断开连接的详细步骤:

建立MQTT连接

客户端请求连接(CONNECT) :

  • 客户端向服务器发送一个CONNECT报文,请求建立连接。
  • CONNECT报文中包含了客户端的标识(Client ID)、是否清除会话(Clean Session标志)、遗嘱消息(Last Will and Testament,如果需要)、用户名(如果有)和密码(如果有)等信息。

服务器响应连接请求(CONNACK) :

  • 服务器接收到CONNECT报文后,会检查客户端的请求,并决定是否接受连接。
  • 如果连接被接受,服务器会发送一个CONNACK报文给客户端,其中包含连接是否成功的标识(Return Code)。

客户端处理连接确认:

  • 客户端接收到CONNACK报文后,会检查返回码以确定连接是否成功。
  • 如果连接成功,客户端可以开始发送SUBSCRIBE报文订阅主题,或者发送PUBLISH报文发布消息。

MQTT 连接建立报文:CONNECT

固定头(Fixed Header) :

  • 消息类型(Message Type) : 1,表示 CONNECT 报文。
  • 标志位: 所有标志位(DUP、QoS、RETAIN)在 CONNECT 报文中都不使用,因此都设置为 0。
  • 剩余长度(Remaining Length) : 表示可变头和负载的长度。

可变头(Variable Header) :

  • 协议名: 字符串 "MQIsdp",表示 MQTT 协议。
  • 协议级别: 协议的版本号,对于 MQTT 3.1.1 是 4。
  • 连接标志: 一个字节,包含 Clean Session、Will Flag、Will QoS、Will Retain、Password Flag 和 Username Flag。
  • 保持活动的时间间隔(Keep Alive Timer) : 以秒为单位,表示客户端和服务器之间心跳的时间间隔。

负载(Payload) :

  • 客户端标识(Client Identifier) : 客户端的唯一标识符。
  • 遗嘱消息主题(Will Topic) : 如果设置了遗嘱标志,需要提供遗嘱消息的主题。
  • 遗嘱消息(Will Message) : 如果设置了遗嘱标志,需要提供遗嘱消息。
  • 用户名(Username) : 如果设置了用户名标志,需要提供用户名。
  • 密码(Password) : 如果设置了密码标志,需要提供密码。

连接响应报文:CONNACK

固定头:

  • 消息类型: 2,表示 CONNACK 报文。
  • 标志位: DUP、QoS 和 RETAIN 标志在 CONNACK 报文中不使用,都设置为 0。
  • 剩余长度: 表示可变头的长度。

可变头:

  • 包含一个字节的连接返回码(Connect Return Code),用于指示连接请求是否成功。

负载:

  • 没有负载。

断开MQTT连接

客户端发起断开连接(DISCONNECT) :

  • 当客户端准备断开连接时,它会发送一个DISCONNECT报文给服务器。
  • 这个报文用于告知服务器客户端即将关闭TCP/IP连接,并进行清理。

服务器处理断开连接:

  • 服务器接收到DISCONNECT报文后,会进行必要的清理工作。
  • 如果客户端开启了Clean Session,服务器会清除与该客户端相关的所有订阅和遗嘱消息。

客户端关闭TCP/IP连接:

  • 发送完DISCONNECT报文后,客户端会关闭与服务器之间的TCP/IP连接。

服务器关闭TCP/IP连接:

  • 服务器在接收到DISCONNECT报文并完成清理工作后,也会关闭TCP/IP连接。

MQTT 断开连接报文:DISCONNECT

固定头:

  • 消息类型: 14,表示 DISCONNECT 报文。
  • 标志位: DUP、QoS 和 RETAIN 标志在 DISCONNECT 报文中不使用,都设置为 0。
  • 剩余长度: 因为可变头为空,所以剩余长度为 0。

可变头:

  • 没有可变头。

负载:

  • 没有负载。

在 MQTT 中,当客户端发送 DISCONNECT 报文时,它表明客户端即将关闭其 TCP/IP 连接,并希望服务器知道这一点,以便进行适当的清理工作。服务器接收到 DISCONNECT 报文后,将关闭与客户端的连接,并释放所有相关的资源。 这些报文确保了 MQTT 协议的连接和断开过程的可靠性和效率。开发者可以根据这些报文的结构来实现 MQTT 客户端和服务器的功能。

其它

关注公众号【 java程序猿技术】获取EMQX实践系列文章