1 MQTT介绍
- 基于C-S架构。
MQTT 协议定义了两种网络实体:消息代理(message broker)
与客户端(client)
。其中,消息代理用于接收来自客户端的消息并转发至目标客户端。MQTT 客户端可以是任何运行有 MQTT 库并通过网络连接至消息代理的设备。 - 基于主题的订阅/发布模式。
发布者有需要分发的数据时,其向连接的消息代理发送携带有数据的控制消息。代理会向订阅此主题的客户端分发此数据。(发布者不需要知道订阅者的数量和具体位置;同样,订阅者不需要配置发布者的相关信息。) - 基于TCP协议。
MQTT 默认端口为 1883。加密的端口为 8883。
2 MQTT属性
(1)保活机制(keep alive)
- 服务端用于判断一个客户端是否依然保持连接。
客户端在心跳间隔内,若有消息发布,则直接发布消息而不发布心跳请求;
客户端在心跳间隔内,若没有消息发布,则发布一个心跳请求给服务端,表明自己仍在线;(客户端发送PINGREQ包,broker回复PINGRESP包)
若服务端在1.5倍心跳间隔内收到消息,则认为该客户端已经掉线。(最大保活间隔:18小时12分钟15秒) - broker具有Client Take-Over功能。
在客户重连broker,但broker认为与客户的TCP连接还存在时(称为Half-Open),能删除原有连接,接收重连请求。
(2) 遗嘱机制(will)
- 为可能出现意外断线的设备提供的将遗嘱消息发送给第三方的能力。
遗嘱消息会在设备与服务端连接时,通过 CONNECT 报文指定,然后在设备意外断线时由服务端将该遗嘱消息发布到所有订阅了遗嘱主题的客户端上。 - 意外断线的情况。
客户端关闭了网络连接,但没有发送DISCONNECT报文;
在keep alive周期后,客户端没有与broker通信;(既没有发送消息,也没有发送心跳包)
检测到网络失败或IO错误;
设备尝试进行不被允许的操作而被服务端关闭连接,例如订阅自身权限以外的主题等。
(3)服务质量等级(QoS)
- 对消息的重要性进行分类并在分发时进行相应的处理。
QoS 0:最多发一次,发送端只负责传送,发送过后就不管数据的传送情况。(不重要数据)
QoS 1:至少发一次,发送端发送完成后,会等待接收端发送来的PUBACK,若收不到则再次发送。握手2次(重要数据)
QoS 2:保证只收一次,发送端发送完成后,会等待接收端发送确认信息PUBREC;然后发送端会再次发送PUBREL,等待接收端再次发送确认信息PUBCOMP。握手4次(精确数据)
(3)持久会话(Persistent Session)
- 客户端创建与broker的connection时,参数clean session设置为真则创建非持久会话,否则创建持久会话。
持久会话:当会话与broker断连时,broker会保存已经订阅的QoS为1或2的主题的消息,以便重新连接后把这些消息发给会话。(当设置的QoS>0时,接收端连接服务端时,cleansession要设置为false)
非持久会话:broker不存储这种会话的任何未分发的订阅主题的消息。(适合于只发布消息,不订阅消息的会话。)
3 MQTT常见实现
- EMQX – 用作broker;
- Paho MQTT – 用作客户端;
- mosquitto – 用作broker和客户端;
MQTT遗嘱消息的使用MQTT维基百科