首页 > 技术文章 > 1、MQTT简介

The-explosion 2020-08-12 11:44 原文

1、MQTT简介

  MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议。

  它工作在 TCP/IP协议族上,属于应用层协议,由IBM在1999年发布,如今已经成为OASIS规范。是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。

  MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽、低功耗占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

  MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其中,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

  MQTT 最初由 IBM 于上世纪 90 年代晚期发明和开发。它最初的用途是将石油管道上的传感器与卫星相链接。顾名思义,它是一种支持在各方之间异步通信的消息协议。异步消息协议在空间和时间上将消息发送者与接收者分离,因此可以在不可靠的网络环境中进行扩展。虽然叫做消息队列遥测传输,但它与消息队列毫无关系,而是使用了一个发布和订阅的模型。在 2014 年末,它正式成为了一种 OASIS 开放标准,而且在一些流行的编程语言中受到支持(通过使用多种开源实现)。

  MQTT在IoT、internet of things、物联网等方面应用较多。MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。本文旨在研究其在消息发布/订阅/接收场景下的应用.

  物联网 (IoT) 设备必须连接互联网,通过连接到互联网,设备就能相互协作,以及与后端服务协同工作。互联网的基础网络协议是 TCP/IP,MQTT(消息队列遥测传输) 是基于 TCP/IP 协议栈而构建的,它已经成为 IoT 通信的标准。

  物联网(Internet of Things,IoT)最近曝光率越来越高。虽然HTTP是网页的事实标准,不过机器之间(Machine-to-Machine,M2M)的大规模沟通需要不同的模式:之前的请求/回答(Request/Response)模式不再合适,取而代之的是发布/订阅(Publish/Subscribe)模式。这就是轻量级、可扩展的MQTT(Message Queuing Telemetry Transport)可以施展拳脚的舞台。

  MQTT协议是针对如下情况设计的:

  (1)M2M(Machine to Machine) communication,机器端到端通信,比如传感器之间的数据通讯

  (2)因为是Machine to Machine,需要考虑:

  • Machine,或者叫设备,比如温度传感器,硬件能力很弱,协议要考虑尽量小的资源消耗,比如计算能力和存储等
  • M2M可能是无线连接,网络不稳定,带宽也比较小

 

  该协议的可用性取决于该协议的使用环境。IBM公司在2013年就向结构化资讯标准促进组织提交了 MQTT 3.1 版规范,并附有相关章程,以确保只能对规范进行少量更改。MQTT-SN是针对非 TCP/IP 网络上的嵌入式设备主要协议的变种,与此类似的还有ZigBee协议。

  纵观行业的发展历程,“MQTT”中的“MQ” 是来自于IBM的MQ系列消息队列产品线。然而通常队列本身不需要作为标准功能来支持。

  可选协议包含了高级消息队列协议,面向文本的消息传递协议,互联网工程任务组约束应用协议,可扩展消息与存在协议,数据分发服务,OPC UA以及web 应用程序消息传递协议。

2、MQTT特点

  MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

  (1)使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
  (2)对负载内容屏蔽的消息传输;
  (3)使用 TCP/IP 提供网络连接;
  (4)有三种消息发布服务质量:
      “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就 收不到了。
      “至少一次”,确保消息到达,但消息重复可能会发生。
      “只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。
  (5)小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;这就是为什么在介绍里说它非常适合"在物联网领域,传感器与服务器的通信,信息的收集",要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了。
  (6)使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。
      Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。
      Testament:遗嘱机制,功能类似于Last Will。

  2.1、异步发布/订阅实现

  发布/订阅模式解耦了发布消息的客户(发布者)与订阅消息的客户(订阅者)之间的关系,这意味着发布者和订阅者之间并不需要直接建立联系。 

  这个模式有以下好处:

  • 发布者与订阅者只需要知道同一个消息代理即可;
  • 发布者和订阅者不需要直接交互;
  • 发布者和订阅者不需要同时在线。

  由于采用了发布/订阅实现,MQTT可以双向通信。也就是说MQTT支持服务端反向控制设备,设备可以订阅某个主题,然后发布者对该主题发布消息,设备收到消息后即可进行一系列操作。

  2.2、二进制格式实现

  MQTT基于二进制实现而不是字符串,比如HTTP和XMPP都是基于字符串实现。由于HTTP和XMPP拥有冗长的协议头部,而MQTT固定报文头仅有两字节,所以相比其他协议,发送一条消息最省流量。

3、设计规范

  由于物联网的环境是非常特别的,所以MQTT遵循以下设计原则:

  (1)精简,不添加可有可无的功能;
  (2)发布/订阅(Pub/Sub)模式,方便消息在传感器之间传递;
  (3)允许用户动态创建主题,零运维成本;
  (4)把传输量降到最低以提高传输效率;
  (5)把低带宽、高延迟、不稳定的网络等因素考虑在内;
  (6)支持连续的会话控制;
  (7)理解客户端计算能力可能很低;
  (8)提供服务质量管理;
  (9)假设数据不可知,不强求传输数据的类型与格式,保持灵活性。

转自:https://www.runoob.com/w3cnote/mqtt-intro.html    

推荐阅读