什么是MQTT
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的轻量级协议,该协议构建于TCP/IP协议之上。
MQTT特征
- 基于 TCP 协议的应用层协议;
- 采用 C/S 架构;
- 使用订阅/发布模式,将消息的发送方和接受方解耦;
- 提供 3 种消息的 QoS(Quality of Service): 至多一次,最少一次,只有一次;
- 收发消息都是异步的,发送方不需要等待接收方应答。
与传统MQ的区别
虽然 MQTT 协议名称有 Message Queue 两个词,但是它并不是一个像 RabbitMQ 那样的一个消息队列,MQTT 跟传统的消息队列相比,有以下一些区别:
- 在传统消息队列中,在发送消息之前,必须先创建相应的队列;在 MQTT 中,不需要预先创建要发布的主题(可订阅的 Topic);
- 在传统消息队列中,未被消费的消息总是会被保存在某个队列中,直到有一个消费者将其消费;在 MQTT 中,如果发布一个没有被任何客户端订阅的消息,这个消息将被直接扔掉;
- 在传统消息队列中,一个消息只能被一个客户端获取,在 MQTT 中,一个消息可以被多个订阅者获取,MQTT 协议也不支持指定消息被单一的客户端获取。
MQTT通讯模型
MQTT 的通信是通过发布/订阅的方式来实现的,消息的发布方和订阅方通过这种方式来进行解耦,它们没有直接地连接,它们需要一个中间方(Broker)。
- 发布方(Publisher)将消息发送到 Broker;
- Broker 接收到消息以后,检查下都有哪些订阅方订阅了此类消息,然后将消息发送到这些订阅方(subscriber);
- 订阅方(subscriber)从 Broker 获取该消息;
MQTT Client
任何终端,只要运行了 MQTT 的库或者代码,我们都可以将其称为 MQTT 的 Client,一个 Client 可以同时是 Publisher 和 Subscriber。
MQTT Broker
Broker 负责接收 Publisher 的消息,并发送给相应的 Subscriber,它是整个 MQTT 订阅/发布的核心,具有以下功能:
- 可以横向扩展,比如集群,来满足大量的 Client 接入;
- 可以扩展接入业务系统;
- 易于监控,满足高可用性。
MQTT协议数据包的固定包头
名称 | 值 | 方向 | 描述 |
---|---|---|---|
Reserved | 0 | 不可用 | 保留位 |
CONNECT | 1 | Client 到 Broker | Client 请求连接到 Broker |
CONNACK | 2 | Broker 到 Client | 连接确认 |
PUBLISH | 3 | 双向 | 发布消息 |
PUBACK | 4 | 双向 | 发布确认 |
PUBREC | 5 | 双向 | 发布收到 |
PUBREL | 6 | 双向 | 发布释放 |
PUBCOMP | 7 | 双向 | 发布完成 |
SUBSCRIBE | 8 | Client 到 Broker | Client 请求订阅 |
SUBACK | 9 | Broker 到 Client | 订阅确认 |
UNSUBSCRIBE | 10 | Client 到 Broker | Client 请求取消订阅 |
UNSUBACK | 11 | Broker 到 Client | 取消订阅确认 |
PINGREQ | 12 | Client 到 Broker | PING 请求 |
PINGRESP | 13 | Broker 到 Client | PING 应答 |
DISCONNECT | 14 | Client 到 Broker | Client 主动中断连接 |
Reserved | 15 | 不可用 | 保留位 |