查看原文
其他

对 MQTT 进行探究

2016-11-15 OSC 协作翻译 开源中国

#长按上图识别二维码,参与OSC源创会年终盛典#


 是一种机器对机器(M2M)的协议,它被广泛地用于 IoT (物联网:Internet of Things)。它是一种面向消息的协议。也是因为这个原因,它是非常轻量级的,被 IoT 生态系统广泛采用。 几乎所有的  都支持通过 MQTT 与几种不同实现的 IoT 智能设备(例如 Arduino,Raspberry Pi 等) 发送接收数据。

当然,还有其他的 IoT 协议,但是 MQTT 是最有效的。


MQTT 概览


MQTT 是在 1999 年左右被开发出来的,它主要目的是要创建一个带宽受限的协议。此外,它的能耗非常低,这对于 IoT 来说很有吸引力。

这个协议使用了发布——订阅范式,这与面向 HTTP 的请求/响应范式形成对照。它使用二进制消息来交换消息,这是非常低开销的。它在实现上更简单,更优秀,并且是开放的。另一个有趣的方面是 MQTT 使用 TCP 作为传输的底层。所有的这些因素都是为了能更适应 IoT。


MQTT 消息模式


上文提到,MQTT实现了发布者-订阅者模式。发布者-订阅者模式将发布消息的客户端(发布者)与接收消息的客户端(订阅者)解耦开来。此外,与主要是同步协议的HTTP相比,MQTT是个异步协议,它不会在等待消息时阻塞客户端。另外,MQTT协议也不要求订阅者和发布者是相互连接的。


MQTT 发布者-订阅者模式


如上所述,MQTT是基于消息、实现了发布者-订阅者模式的协议。MQTT其中的关键组件是MQTT代理(broker)。MQTT代理的主要任务是将消息派发给订阅者。即,它从发布者接收消息,然后把消息转发给订阅者。转发消息时,MQTT代理使用话题(topic)来过滤客户端。话题是个字符串,可以通过创建话题级别来组合话题。

话题就像一个虚拟通道,把发布者与它的订阅者连接起来。话题由MQTT代理管理。通过这个虚拟通道,发布者与订阅者解耦,客户端(发布者或订阅者)不必相互知道。由于消息生产者(发布者)和消息消费者(订阅者)间没有直接依赖,所以这个协议是高度可扩展的。

下面这张图描述了MQTT架构:


MQTT 使用方法


现在我们有了大概了解,接下来我们通过实际例子来应用一下。MQTT有很多实现,我们使用Eclipse开发的。第一步,安装MQTT代理,根据我们的目的,我们把它安装到树莓派(Raspberry PI)上。要安装Mosquitto,需要添加它所在的仓库,这样我们才能下载。添加仓库之前,有必要添加key验证下载的安装包是否合法。我们可以通过SSH或者来连接树莓派。现在,在终端,敲入以下命令:


然后,导入key:


最后,添加.list文件:


这样,MQTT服务器就安装到树莓派上了。这个服务器就是我们的MQTT代理。现在我们需要安装客户端(发布者和订阅者)。本例中,我们把客户端和服务器安装在同一个树莓派,你也可以安装到不同的PC/服务器或者物联网(IoT)主板上。


如何发送一个MQTT消息

假设我们已经成功安装并配置了客户端和服务器,现在我们可以注册一个用户到一个特定的主题,接下来就是等待发布者传入消息。我们可以使用下面的命令来注册一个用户:

如上所示,用户正在等待消息。在这个例子中,我们使用的主题叫swa_news。现在,我们使用MQTT发布者发送主题为swa_news的消息。

这个例子中,MQTT发布者发送了消息“Hello Protocol”,在用户端,我们得到了如下的消息:

如何在Android设备上使用MQTT

最后,我们将使用一个Android MQTT客户端来接收我们发送的消息。下面的视频向我们展示了如何配置一个Android MQTT客户端。

本文希望你通过此文学习到了什么是MQTT协议以及如何使用MQTT向客户端发送消息。



推荐阅读
DB-Engines 发布 10 月份全球数据库排名,三甲内硝烟四起
从零开始学做微信小程序,看这些就够了!
ELK日志分析平台la建全过程
12 月北京源创会来听专家分析 AI 浪潮下的数据工程

点击“阅读原文”获取更多精彩内容

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存