大家好,我是明说网络的小明同学。今天我们来聊一聊物联网通协议MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)。

故事的开头,我们从MQ(Message Queue)说起。

什么是MQ

MQ,Message queue,消息队列,就是指保存消息的一个容器。

消息队列最原始的模型:生产者先将消息投递一个叫做「队列」的容器中,然后再从这个容器中取出消息,最后再转发给消费者。如下图所示:

mqtt协议的组成(订阅发布你的消息)(1)

那么问题来了,那么为什么生产者不直接将消息发送给消费者呢?好处在哪里呢?

消息队列有什么优势呢?

如下图所示,本身串行的订单,会员,消息,推荐系统在MQ的加持下,变成了并行,系统和系统之间只依赖于MQ,而不依赖于各类系统。

mqtt协议的组成(订阅发布你的消息)(2)

参考:https://www.zhihu.com/question/54152397

其实,MQ在其中起到了以缓冲的作用。

MQ 解决的最核心的问题:系统解耦(系统之间不相互依赖)和异步(流程不再串行):

从MQ的角度去理解MQTT

而MQTT是专门针对物联网设计的消息队列!实际上使用的是MQ其中的发布/订阅模式

mqtt协议的组成(订阅发布你的消息)(3)

订阅什么意思呢?举个例子,订报纸。设想一个场景:你从报亭A订阅了“人民日报”,那么一旦报亭有了"人民日报”,就会给你发一份。其实,这个“人民日报”在MQTT中就是topic的角色。

如果熟悉设计模式的同学,一定会联想到观察者模式,简直是异曲同工之妙啊。观察者模式:当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。观察者模式 | 菜鸟教程

MQ与MQTT的区别

名称

解释

mqtt

一种通信协议,类似人类交谈中的汉语、英语、俄语中的一种语言规范

MQ

一种通信通道,也叫消息队列,类似人类交谈中的用电话、email、微信的一种通信方式


以上为MQ的背景,下面进入正题。

MQTT简介

随着 5G 时代的来临,万物互联的伟大构想正在成为现实。海量的设备接入和设备管理对网络带宽、通信协议以及平台服务架构都带来了很大挑战。尤其对于物联网设备来说,电量消耗,资源控制等都尤为重要。在此背景下MQTT应运而生。

mqtt协议的组成(订阅发布你的消息)(4)

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布(由 IBM 的 Andy Stanford-Clark 和 Arcom 的 Arlen Nipper 为了一个通过卫星网络连接输油管道的项目开发,之后 IBM 一直将 MQTT 作为一个内部协议在其产品中使用,直到 2010 年,IBM 公开发布了 MQTT 3.1 版本。在 2014 年,MQTT 协议正式成为了 OASIS(结构化信息标准促进组织)的标准协议,来源)。

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

为什么选择MQTT

它的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT)。

mqtt协议的组成(订阅发布你的消息)(5)

MQTT的应用场景

MQTT 协议广泛应用于物联网、移动互联网、智能硬件、车联网、电力、能源等领域。

mqtt协议的组成(订阅发布你的消息)(6)

相关参考资料https://www.emqx.cn/mqtthttps://www.runoob.com/w3cnote/mqtt-intro.htmlhttps://www.jianshu.com/p/ecde412d2eebMQTT协议中文版,https://mcxiaoke.gitbooks.io/mqtt-cn/content/https://zhuanlan.zhihu.com/p/158145940

MQTT通信模型

有别于传统的客户端/服务器通讯协议,MQTT协议并不是端到端的,消息传递通过代理,包括会话(session)也不是建立在发布者和订阅者之间,而是建立在端和代理之间。代理解除了发布者和订阅者之间的耦合。这对理解MQTT很重要

通过下面两个图理解MQTT(不愧是MQ)

mqtt协议的组成(订阅发布你的消息)(7)

mqtt协议的组成(订阅发布你的消息)(8)

MQTT中的角色

在MQTT中,有三个主要的角色:

角色

解释

类比

发布者(Publish)

可以是一个应用程序或一台设备

类似于报纸发布者

代理(broker)(服务器)

MQTT服务器以称为"消息代理"(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间

类似于以前的报刊亭,会有很多人向报亭发布报纸,报停会更具不同的订阅分发报纸。

订阅者(Subscribe)

可以是一个应用程序或一台设备

类似于报纸订阅者

需要注意的是,这里的发布者和订阅者并不是绝对的。发布者可以变成订阅者,订阅者也可以变成发布者,甚至是同一台设备既可以是发布者也可以是订阅者,甚至是broker。

这是与现实中报亭的例子有些区别的地方,人们可以订报纸,同时还能发报纸,甚至是自己给自己卖报纸!

消息

这三个角色之间通过消息进行通信:MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:

  • Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)
  • 连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。一个主题可以有多个级别,级别之间用斜杠字符分隔。例如,/world和 emq/emqtt/emqx 是有效的主题。订阅者的Topic name支持通配符#和 :
    • # 支持一个主题内任意级别话题
    • 只匹配一个主题级别的通配符
  • payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
    • Payload`消息体`CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息 有消息体:
      • CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码
      • SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS。
      • SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
      • UNSUBSCRIBE,消息体内容是要订阅的主题。

mosquitto使用

Mosquitto是一个实现了MQTT3.1协议的代理服务器,由MQTT协议创始人之一的Andy Stanford-Clark开发

学习网址:libmosquitto编程:https://blog.csdn.net/dancer__sky/article/details/77855249MQTT的学习之Mosquitto安装&使用MQTT服务端软件使用:https://zhuanlan.zhihu.com/p/56727359

安全

MQTT安全篇:为何以及如何运用MQTT提供的安全特性来保证物联网项目的顺利实施 https://zhuanlan.zhihu.com/p/21421094

,