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/