MQTT 是一种基于客户端-服务端架构的消息传输协议,所以在 MQTT 协议通信中,有两个最为重要的
角色,它们便是服务端和客户端。
服务端是一台服务器(broker),负责转发客户端的消息
MQTT 是一种基于客户端-服务端架构的消息传输协议,所以在 MQTT 协议通信中,有两个最为重要的
角色,它们便是服务端和客户端。
服务端是一台服务器(broker),负责转发客户端的消息
首先客户端需要向服务端发送连接请求,这个连接请求实际上就是向服务端发送一个 CONNECT报文,也就是发送了一个 CONNECT 数据包
MQTT 服务端收到连接请求后,会向客户端发送连接确认。连接确认实际上是向客户端发送一个CONNACK 报文,也就是 CONNACK 数据包
向服务器发送DISCONNECT报文
当客户端连接到服务端之后,就可以向服务端发布消息了,每条发布的消息必须指定一个“主题”,表示向某主题发布消息;MQTT 服务端可以通过主题来确定将消息转发给哪些客户端(订阅了该主题的客户端)。
MQTT 客户端向服务端发布消息其实就是向服务端发送一个 PUBLISH 报文,服务端收到客户端发送过来的 PUBLISH 报文之后,会向发送发回复一个报文。根据 QoS 的不同,回复的报文类型也是不同的,并且整个发布消息的过程也将会有所区别;譬如对于 QoS=1 时,客户端向服务端发送 PUBLISH 报文,服务端收到 PUBLISH 报文之后会向发送方回复 PUBACK 报文
作为接收时就要订阅。客户端可订阅多个主题,实现接收多个消息
客户端是通过向服务端发送 SUBSCRIBE 报文来实现这一请求的。该报文包含有一系列“订阅主题名”。请留意,一个 SUBSCRIBE 报文可以包含有单个或者多个订阅主题名。也就是说,一个 SUBSCRIBE 报文可以用于订阅一个或者多个主题。
客户端向服务端发送订阅请求后,服务端会给客户端返回一个订阅返回码。
订阅的主题可以随时取消订阅
客户端通过向服务端发送一个 UNSUBSCRIBE 报文来取消订阅主题,当服务端接收到 UNSUBSCRIBE报文后,会向发送发回复一个 UNSUBACK 报文(取消订阅确认报文)
主题是区分大小写的。所以"LEDControl"和"ledControl"是两个不同的主题。
主题可以使用空格。譬如"LED Control",虽然主题允许使用空格,但是笔者建议大家尽量不要使用空格。
不要使用中文主题。虽然有些 MQTT 服务器支持中文主题,但是绝大部分 MQTT 服务器是不支持中文主题的,所以大家不要使用中文主题,而是使用 ASCII 字符来作为 MQTT 主题。
MQTT 设计了一套保证消息稳定传输的机制,包括消息应答、存储和重传。在这套机制下,提供了三种
不同级别的 QoS(Quality of Service),也就是 MQTT 协议有三种服务质量等级:
QoS = 0****:最多发一次;
QoS = 1****:最少发一次;
QoS = 2****:保证收一次。
服务质量是0的时候,MQTT服务器和客户端不会对消息的传输成功进行确认和检查。全看环境是否稳定。
客户端空闲时向服务端发送心跳包判断服务器是否还在线,本质就是PINGREQ报文,收到后回复PINGRESP报文,叫做心跳响应
MQTT 协议中,死亡指的是“客户端掉线”、“与服务端断开了连接”这种意思。
掉线的两种方式:
客户端主动向服务端发送 DISCONNECT 报文,请求断开连接,自然服务端也就知道了客户端要离线了;
客户端意外掉线。被动与服务端断开了连接。
MQTT 从诞生之初就是专为低带宽、高延迟或不可靠网络等环境而设计的;所以针对这种意外掉线的情况,MQTT 协议使用了遗嘱机制来服务客户端、管理客户端。
MQTT 协议允许客户端在“活着”的时候就写好遗嘱,这样一旦客户端意外断线,服务端就可以将客户端的遗嘱公之于众。正常主动掉线的话就不会有这种情况
