MQTT

MQTT

MQTT协议是一个应用层协议,他要求使用的传输层协议能提供有序的,可靠的双向字节流传输服务。

MQTT协议通信对象分为客户端和服务端,数据的传输以消息为单位,每个消息包含主题,消息服务质量和有效数据。消息的发送和接收都需要依赖主题:A订阅主题T1,B订阅主题T2,A想发送消息给B,就需要将消息发送到主题T2。

一 客户端

通信双方的身份。mqtt通信双方都是客户端,消息传递是以订阅主题的形式。

发布消息到服务端以转发到其他客户端
订阅主题以接收其他客户端的消息
发起连接/断开

二 服务端

作为客户端与客户端之间通信的中介。

接收客户端发布的消息
接收客户端的连接
转发消息给特定的客户端
接收客户端的订阅主题请求

三 消息服务质量

消息服务质量决定了一个MQTT报文的消息应如何处理。

qos0:客户端仅讲报文发送一次,服务端不需要应答,报文是否送达不保证。
qos1:客户端发送报文,服务端接收到后必须应答,超时重发。
qos2:客户端发送报文,服务端接收到后应答,客户端再次发送一个release报文,服务端发送该报文到指定主题下的客户端,并应答。

qos0-qos2,服务的质量逐步提高。qos2能使客户端对报文的发送有全局的掌控。qos0很不负责任,嫁出去的女儿泼出去的水,不管了。qos1还行。

四 主题

MQTT主题是一个字符串,由服务端维护。客户端通过在服务端订阅主题,可接收来自该主题的消息。客户端可向该主题发送消息,所有订阅该主题的客户端都会受到该消息。实现的方式是:客户端向服务端发送带主题的消息到服务端,由服务端将消息转发给订阅该主题的客户端,所以服务端地位重要。

MQTT主题支持分级,如/Home/BathRoom/Mirror,/Home/LivingRoom/Tv,是同一等级下的主题。

主题也支持通配符#,发送消息到主题 /Home/# 则BathRoom和LivingRoom主题下的客户端都会收到消息。

主题也支持单层通配符+,/Home/+ 则BathRoom和LivingRoom主题下的客户端会受到消息,但/Home/BathRoom/Mirror和/Home/LivingRoom/Tv 不会收到消息,这点需要跟#区别。

五 MQTT控制报文

MQTT协议依靠MQTT控制报文来通信

5.1 固定报头

表示控制报文的类型,报文的一些标志位(包括消息服务质量),以及报文剩余的字节长度

5.2 可变报头

可变报头的内容跟报文类型有关。

包含报文标识符,一个16bit的数据,用于唯一的标记此次通信的报文。当客户端处理完当前报文后,标识符可释放重用。qos0的消息不需要标识符,因为不需要服务端的应答。

5.3 有效载荷

前面都是协议规定必须的,有效载荷是真正的用户数据。不同类型的报文,有效载荷里的数据不同。

5.4 控制报文类型

不同类型的报文,其不同点在于可变报头及有效载荷。就以这两部分看看主要的报文:

5.4.1 连接报文

可变报头:包含 “使用传输层协议名”(TCP),MQTT协议等级(3.1.1),连接标志,保持连接。

连接标志指示有效载荷部分的内容

保持连接MQTT客户端需要在一个时间内给服务端发送心跳报文,服务端也要在规定时间内应答。由此判断通信双方是否在线。

有效载荷

由连接标志指示其内容,出现的顺序为:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码。

客户端标志:字符串,用于唯一标志一个客户端。

遗嘱是一种错误补救方式,当客户端以异常方式断开连接时,服务端长时间未能联系到客户端,则服务端将该客户端的遗嘱消息发布到遗嘱主题。

用户名和密码:字符串,用于识别客户端是否合法。

5.4.2 发布publish

固定报头:

 
DUP*重发标志,是否是一个重发的报文,qos0大咩。

RETAIN:保留标志位。若为1,服务端需要在内存中保留该消息。

可变报头:主题及报文标识符
有效载荷:应用数据,一般是json字符串。

5.4.3 订阅主题subscribe

订阅多个主题

有效载荷:包含一个主题过滤器表示客户端要订阅的主题,消息服务质量qos。主题过滤器是一个字符串,后面跟着一个字节的消息服务质量,组成一组,一个订阅报文可包含多组这样的东西,来支持订阅多个主题。

六,安全

安全的实现主要依赖于传输层协议,推进TLS协议服务端使用8883端口。

轻量加密AES