MQTT是一种轻量级的发布/订阅消息传递协议,设计用于低带宽环境中的M2M(机器对机器)遥测。
它是由Andy Stanford-Clark(IBM)和Arlen Nipper在1999年设计的,用于通过卫星连接石油管道遥测系统。
尽管它最初是专有协议,但在2010年免费发布,并在2014年成为OASIS标准。
MQTT代表MQ遥测传输,但以前称为消息队列遥测传输(Message Queuing Telemetry Transport)。
MQTT迅速成为IOT(物联网)部署的主要协议之一。
MQTT是一种消息传递协议,即它旨在用于传递消息,并使用发布和订阅模型。
此模型使得可以将消息发送到 0, 1或多个客户端。
MQTT 客户端:运行MQTT协议,向MQTT Broker 发布/订阅消息的程序
MQTT Boker or Server: 最初的术语是broker,但现在已标准化为server
MQTT-SN which was specified in around 2013, and designed to work over UDP, ZigBee and other transports.
网络连接 Network Connection
MQTT使用的底层传输协议基础设施。
应用消息 Application Message MQTT协议通过网络传输应用数据。应用消息通过MQTT传输时,它们有关联的服务质量(QoS)和主题(Topic)。
客户端 Client
使用MQTT的程序或设备。客户端总是通过网络连接到服务端。它可以
服务端 Server
一个程序或设备,作为发送消息的客户端和请求订阅的客户端之间的中介。服务端
订阅 Subscription
订阅包含一个主题过滤器(Topic Filter)和一个最大的服务质量(QoS)等级。订阅与单个会话(Session)关联。会话可以包含多于一个的订阅。会话的每个订阅都有一个不同的主题过滤器。
主题名 Topic Name
附加在应用消息上的一个标签,服务端已知且与订阅匹配。服务端发送应用消息的一个副本给每一个匹配的客户端订阅。
主题过滤器 Topic Filter
订阅中包含的一个表达式,用于表示相关的一个或多个主题。主题过滤器可以使用通配符。
会话 Session
客户端和服务端之间的状态交互。一些会话持续时长与网络连接一样,另一些可以在客户端和服务端的多个连续网络连接间扩展。
控制报文 MQTT Control Packet
通过网络连接发送的信息数据包。MQTT规范定义了十四种不同类型的控制报文,其中一个(PUBLISH报文)用于传输应用消息。
电视或广播是一个有用的类比。
电视广播者使用特定频道广播电视节目,并且观众收看该频道以观看广播。
广播公司和观众之间没有直接连接。
在MQTT中,发布者发布有关主题的消息,而订阅者必须订阅该主题才能查看消息。
MQTT要求使用中央服务器,如下图所示:
关键点解释:
MQTT 客户端必须首先和MQTT服务器(MQTT Broker)建立连接后,才能发布和订阅消息。
MQTT客户端会定期(通常为60秒)发布一个保持活动消息(keepalive message),该消息告诉服务器(broker)该客户端仍处于连接状态。
所有客户端都必须具有客户端名称或ID。
MQTT 服务器(Broker)使用客户端名称来跟踪订阅等操作。
客户名称必须是唯一的。
如果尝试使用与现有客户端相同的名称连接到MQTT服务器,则现有已连接的客户端将被丢弃。
因为大多数MQTT客户端将在断开连接后尝试重新连接,所以这可能导致断开连接和连接之间循环。
下面的截屏显示了当我尝试使用与现有连接的客户端相同的客户端ID将客户端连接到服务器(broker)时发生的情况。
默认情况下,MQTT客户端与代理建立干净的会话。
干净会话是指服务器在断开连接时不会记住有关客户端的任何信息。
使用非干净会话时,代理将记住客户端订阅,并可能为客户端保留未传递的消息。
但是,这取决于订阅主题时使用的服务质量(Qos)以及发布到这些主题时使用的服务质量。
最后遗嘱消息的想法是通知订阅者, 发布者由于网络中断而无法使用。
最后遗嘱消息是由发布客户端设置的,并且是按主题设置的,这意味着每个主题都可以有自己的最终意愿消息。
这意味着每个主题都可以有自己的与之相关的最后遗愿消息。
如果与发布者的连接失败,该消息将存储在服务器中,并发送到任何订阅该主题的客户端。
如果发布者正常断开连接,则不会发送最后的遗嘱消息。
最后遗嘱消息包含在连接请求消息中。