MQTT(Message Queuing Telemetry Transport)
是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。
它工作在TCP协议之上,与HTTP同属于应用层协议,默认端口号是1883,通常情况下使用TCP长连接进行通信。

MQTT是一个C/S架构的发布/订阅模式的消息传输协议。
服务器端称为broker,broker不负责具体业务,只负责转发客户端的消息,将客户端发布的数据,转发到所有订阅了该主题的客户端。

MQTT的应用模式是多个客户端之间的通信,某个客户端订阅了主题后,它将会收到所有客户端发布到该主题下面的数据。
这个“主题”和HTTP协议中的URI类似,是一串标识符。
在MQTT的协议框架下,实际处理业务数据的服务器本质上也是一个MQTT客户端。
业务服务器只需要实现一个MQTT客户端,而broker已经有大量成熟的软件可以直接使用,大大降低了传统服务器软件的开发难度。因此使得MQTT在物联网场景广泛应用。


MQTT客户端一般工作流程:
1.建立TCP连接(1883端口);
2.发送连接请求(附带客户端ID、用户名、密码等信息,进行登陆和认证),等待响应;
3.订阅一个或多个主题(还可以使用通配符);
4.发布一个或多个主题(附带有效载荷数据);
5.空闲时发起心跳请求,保有活连接;
6.接收已订阅的主题数据;
7.发送断开请求;
8.断开TCP连接;


MQTT协议使用2进制数据模式,数据包格式为:

固定包头

可变包头

有效载荷

最小2字节,最大5字节

可选长度

可选长度

固定包头包含控制类型和包长度:

Bit

7

6

5

4

3

2

1

0

BYTE1

MQTT控制报文的类型

用于指定控制报文类型的标志位

BYTE2

剩余长度

BYTE3

剩余长度(可选,当BYTE2大于0x80时有效)

BYTE4

剩余长度(可选,当BYTE3大于0x80时有效)

BYTE5

剩余长度(可选,当BYTE4大于0x80时有效)

可变包头和有效载荷在此不详述,详见参考资料。

 

参考资料:https://mcxiaoke.gitbooks.io/mqtt-cn/content/