在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实践系列文章