MQTT 协议入门

什么是MQTT

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 版本

  • MQTT v3.1.0 –
  • MQTT v3.1.1 – In Common Use
  • MQTT v5 – Currently Limited use
  • MQTT-SN – See notes later

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 协议入门_第1张图片

关键点解释:

  1. 客户端没有类似电子邮件系统中的地址,并且消息不会直接发送给客户端。
  2. 有关主题的消息已发布到服务器(broker)。
  3. MQTT服务器(broker)的工作是根据主题过滤消息,然后将其分发给订阅者(client)。
  4. 客户端可以通过在同一服务器上订阅该主题来接收这些消息。
  5. 发布者(client)和订阅者(client)之间没有直接连接。
  6. 所有客户端(client)都可以发布(广播)和订阅(接收)。
  7. MQTT服务器(broker)通常不存储消息。

 

MQTT Client-Broker 连接

MQTT 客户端必须首先和MQTT服务器(MQTT Broker)建立连接后,才能发布和订阅消息。

MQTT 协议入门_第2张图片

MQTT客户端会定期(通常为60秒)发布一个保持活动消息(keepalive message),该消息告诉服务器(broker)该客户端仍处于连接状态。

 

客户名称或客户ID(The Client Name or Client ID)


所有客户端都必须具有客户端名称或ID。

MQTT 服务器(Broker)使用客户端名称来跟踪订阅等操作。

客户名称必须是唯一的。

如果尝试使用与现有客户端相同的名称连接到MQTT服务器,则现有已连接的客户端将被丢弃。

因为大多数MQTT客户端将在断开连接后尝试重新连接,所以这可能导致断开连接和连接之间循环。

下面的截屏显示了当我尝试使用与现有连接的客户端相同的客户端ID将客户端连接到服务器(broker)时发生的情况。

MQTT 协议入门_第3张图片

 

干净会话(Clean Sessions)

默认情况下,MQTT客户端与代理建立干净的会话。

干净会话是指服务器在断开连接时不会记住有关客户端的任何信息。

使用非干净会话时,代理将记住客户端订阅,并可能为客户端保留未传递的消息。

但是,这取决于订阅主题时使用的服务质量(Qos)以及发布到这些主题时使用的服务质量。

 

最后遗嘱消息(Last Will Messages)

最后遗嘱消息的想法是通知订阅者, 发布者由于网络中断而无法使用。

最后遗嘱消息是由发布客户端设置的,并且是按主题设置的,这意味着每个主题都可以有自己的最终意愿消息。

这意味着每个主题都可以有自己的与之相关的最后遗愿消息。

如果与发布者的连接失败,该消息将存储在服务器中,并发送到任何订阅该主题的客户端。

如果发布者正常断开连接,则不会发送最后的遗嘱消息。

最后遗嘱消息包含在连接请求消息中。

你可能感兴趣的:(网络,网络协议)