- 1. 简介
- 特点
- 3个角色
- 2. 四个主题
- 2.1 Message Broker
- 实现
- 2.2 Publish/Subscribe
- 2.3 Topic
- 2.4 Qualtity of Service
- 3. 协议
- 官方文档
- 通信过程
- 4. 参考资料
MQTT官网:https://mqtt.org/
MQTT, Message Queuing Telemetry Transport,消息队列遥测传输,是基于C/S架构,发布/订阅(public/subscribe)范式的轻量级消息协议。
它工作在TCP/IP协议族上的应用层,是为硬件性能低下的远程设备,或者网络状况糟糕(没有基站)的场景而设计的,尤其适合需要实时控制的场景。
重点需要理解的是3个角色,4个主题。
特点- 高并发,支持上万客户端接入;
- 长连接,建立在TCP基础上,需要心跳包,所以不省电,不适合低功耗场景;
- 实时性;
- 单词数据量小,但不能出错;
- 能够在网络环境差的情况下工作;
- 根据数据的优先级,设置不同服务质量;
- 数据无关(不关心 Payload 数据格式);
- …
- 代理Broker
- 发布者Publisher
- 订阅者Subscriber
这种结构代替了创痛C/S模型,可以实现以下解耦:
- 空间解耦,订阅者不需要知道发布者的ip等信息;
- 时间解耦,支持离线消息;
- 同步解耦,异步通讯。
- 消息代理,Message Broker;
- 发布/订阅模式,Publish/Subscribe;
- 主题,Topic;
- 服务质量,Qualtity of Service.
Broker代理可以运行在各大平台,如windows,linux,树莓派,docker,云等。
MQTT协议的中心就是broker代理,即mqtt服务器。
实现- mosquitto, 属于玩具型,但作者是mqtt协议设计者之一:
- https://mosquitto.org/
- https://github.com/eclipse/mosquitto
- HiveMQ
- Apache Apollo
- Apache ActiveMQ
- …
以下为官网关于温度计的图例:
官网文档:
- https://www.hivemq.com/blog/mqtt-essentials-part2-publish-subscribe/
- https://www.hivemq.com/blog/mqtt-essentials-part-4-mqtt-publish-subscribe-unsubscribe/
Mqtt通过主题对纤细进行分类。
主题本质上是一个UTF-8字符串,用反斜杠/
表示层级。
订阅时,可以使用+ *
通配符。
4.3 Quality of Service levels and protocol flows
文档对QoS的解释还是很严谨的。
服务质量有几个等级:
- QoS 0, 最多发布一次,完全依赖TCP/IP网络,可能丢包;
- QoS 1, 至少发布一次,通过收到一次确认,确保消息代理能收到消息,PUBACK包里有PUBLISH请求的Packet Identifier ;收不到ack则可以一直发送请求;
- QoS 2, 确保消息只到达一次,可用于计费系统,有4种消息,如下
截至2022.4, 最新版为5.0,已代替3.1.1.
MQTT Control Packet format
文档第1章是简介。
文档第2章则是报文格式,这里记录一下。
| Fixed Header, present in all MQTT Control Packets |
| Variable Header, present in some MQTT Control Packets |
| Payload, present in some MQTT Control Packets |
固定头部Fixed Header影响后面可变部分的格式。官网文档有对3个头部字段进行解释:
- MQTT Control Packet type, 控制报文,4 bits;
- Flags specific to each MQTT Control Packet type , 4 bits;
- Remaining Length, 1-4 byte(s),Variable Header + Payload。
需要熟悉15种(截至v5)控制报文:
Name | Value | Direction of flow | Description |
---|---|---|---|
Reserved | 0 | Forbidden | Reserved |
CONNECT | 1 | Client to Server | Connection request |
CONNACK | 2 | Server to Client | Connect acknowledgment |
PUBLISH | 3 | Client to Server orServer to Client | Publish message |
PUBACK | 4 | Client to Server orServer to Client | Publish acknowledgment (QoS 1) |
PUBREC | 5 | Client to Server orServer to Client | Publish received (QoS 2 delivery part 1) |
PUBREL | 6 | Client to Server orServer to Client | Publish release (QoS 2 delivery part 2) |
PUBCOMP | 7 | Client to Server orServer to Client | Publish complete (QoS 2 delivery part 3) |
SUBSCRIBE | 8 | Client to Server | Subscribe request |
SUBACK | 9 | Server to Client | Subscribe acknowledgment |
UNSUBSCRIBE | 10 | Client to Server | Unsubscribe request |
UNSUBACK | 11 | Server to Client | Unsubscribe acknowledgment |
PINGREQ | 12 | Client to Server | PING request |
PINGRESP | 13 | Server to Client | PING response |
DISCONNECT | 14 | Client to Server orServer to Client | Disconnect notification |
AUTH | 15 | Client to Server or Server to Client | Authentication exchange |
文档第3章,是对各种控制报文的解释。
文档第4章,是一些详细介绍,比如3种QoS、消息、订阅、请求响应、重定向、错误处理等。
文档第5章,安全相关。
通信过程参考[Qualtity of Service](# Qualtity of Service)部分即可。
4. 参考资料MQTT官网
MQTT Version 3.1.1 文档
HiveMQ
物联网的基石-mqtt 协议初识
OASIS Open - OASIS Open (oasis-open.org)
Index of /mqtt/ (oasis-open.org)
MQTT 5.0翻译
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)