首页
社区
课程
招聘
[原创]物联网的基石-mqtt 协议初识
发表于: 2020-7-1 15:22 8382

[原创]物联网的基石-mqtt 协议初识

2020-7-1 15:22
8382

随着 5G 时代的来临,万物互联的伟大构想正在成为现实。联网的 物联网设备 在 2018 年已经达到了 70 亿[^1],在未来两年,仅智能水电气表就将超过10亿[^2]。

1

海量的设备接入和设备管理对网络带宽、通信协议以及平台服务架构都带来了很大挑战。对于 物联网协议 来说,必须针对性地解决物联网设备通信的几个关键问题:其网络环境复杂而不可靠、其内存和闪存容量小、其处理器能力有限。

MQTT 协议 是基于发布/订阅模式的物联网通信协议,凭借简单易实现、支持 QoS、报文小等特点,占据了物联网协议的半壁江山:

2

MQTT was created by Andy Stanford-Clark of IBM, and Arlen Nipper (then of Arcom Systems, later CTO of Eurotech).^3

据 Arlen Nipper 在一 IBM Podcast 上的自述,MQTT 原名是 MQ TT, 注意 MQTT之间的空格,其全称为: MQ Telemetry Transport,是九十年代早期,他在参与 Conoco Phillips 公司的一个原油管道数据采集监控系统(pipeline SCADA system)时,开发的一个实时数据传输协议。它的目的在于让传感器通过带宽有限的 VSAT ,与 IBM 的 MQ Integrator 通信。由于 Nipper 是遥感和数据采集监控专业出身,所以按业内惯例给了个 MQ TT 的名字。

按照 Nipper 的介绍,MQTT 必须简单容易实现,必须支持 QoS(设备网络环境复杂),必须轻量且省带宽(因为那时候带宽很贵),必须数据无关(不关心 Payload 数据格式),必须有持续地会话感知能力(时刻知道设备是否在线)。下面将介绍 MQTT (3.1.1 版本) 的几个核心特色,分别对应了这几个设计原则的实现。

发布订阅模式是传统 Client/Server 模式的一种解耦方案。发布者通过 Broker 与消费者之间通信,Broker 的作用是将收到的消息通过某种过滤规则,正确地发送给消费者。发布/订阅模式 相对于 客户端/服务器模式 的好处在于:

在 MQTT 协议里,上面提到的 过滤规则Topic。比如:所有发布到 news 这个 Topic 的消息,都会被 Broker 转发给已经订阅了 news 的订阅者:

3

上图中订阅者预先订阅了 news,然后发布者向 Broker 发布了一条消息 "some msg" 并指定发布到 news 主题,Broker 通过 Topic 匹配,决定将这条消息转发给订阅者。

MQTT 的 Topic 有层级结构,并且支持通配符 +#:

MQTT 的主题是不要预先创建的,发布者发送消息到某个主题、或者订阅者订阅某个主题的时候,Broker 就会自动创建这个主题。

MQTT 协议将协议本身占用的额外消耗最小化,消息头部最小只需要占用 2 个字节。

MQTT 的消息格式分三部分:

MQTT 的主要消息类型有:

其中 PINGREQ / PINGRESP 和 DISCONNECT 报文是不需要可变头部的,也没有 Payload,也就是说它们的报文大小仅仅消耗 2 个字节。

在 CONNECT 报文的可变长度头部里,有个 Protocol Version 的字段。为了节省空间,只有一个字节。所以版本号不是按照字符串 "3.1.1" 存放的,而是使用数字 4 来表示 3.1.1 版本。

为适应设备不同的网络环境,MQTT 设计了 3 个 QoS 等级,0, 1, 2:

QoS 0 是一种 "fire and forget" 的消息发送模式:Sender (可能是 Publisher 或者 Broker) 发送一条消息之后,就不再关心它有没有发送到对方,也不设置任何重发机制。

QoS 1 包含了简单的重发机制,Sender 发送消息之后等待接收者的 ACK,如果没收到 ACK 则重新发送消息。这种模式能保证消息至少能到达一次,但无法保证消息重复。

QoS 2 设计了略微复杂的重发和重复消息发现机制,保证消息到达对方并且严格值到达一次。

MQTT 没有假设设备或 Broker 使用了 TCP 的保活机制^4,而是设计了协议层的保活机制:在 CONNECT 报文里可设置 Keepalive 字段,来设置保活心跳包 PINGREQ/PINGRESP 的发送时间间隔。当长时间无法收到设备的 PINGREQ 的时候,Broker 就会认为设备已经下线。

总的来说,Keepalive 有两个作用:

对于那些想要在重新上线后,重新收到离线期间错过的消息的设备,MQTT 设计了持久化连接:在 CONNECT 报文里可设置 CleanSession 字段为 False,则 Broker 会为终端存储:

MQTT 设计了遗愿(Last Will) 消息,让 Broker 在发现设备异常下线的情况下,帮助设备发布一条遗愿消息到指定的主题。

实际上在某些 MQTT 服务器的实现里 (比如 EMQ X),设备上线或下线的时候 Broker 会通过某些系统主题发布设备状态更新,更符合实际应用场景。

到目前为止,比较流行的开源 MQTT 服务器有几个:

Eclipse Mosquitto

使用 C 语言实现的 MQTT 服务器。Eclipse 组织还还包含了大量的 MQTT 客户端项目:a25K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2W2j5$3I4A6M7s2y4W2i4K6u0W2L8%4u0Y4i4K6u0r3M7r3q4Z5L8#2)9J5c8W2)9J5x3H3`.`.

EMQ X

使用 Erlang 语言开发的 MQTT 服务器,内置强大的规则引擎,支持许多其他 IoT 协议比如 MQTT-SN、 CoAP、LwM2M 等。

Mosca

使用 Node.JS 开发的 MQTT 服务器,简单易用。

VerneMQ

同样使用 Erlang 开发的 MQTT 服务器.

从支持 MQTT 5.0、稳定性、扩展性、集群能力等方面考虑,EMQ X 的表现应该是最好的:

EMQ X MQTT 物联网云服务 提供了一个在线的公共 MQTT 5.0 服务器,不需要任何安装您就可以快速开始 MQTT 协议的学习、测试或原型制作。

该 MQTT 服务器的详细接入信息请见 EMQ 官网页面:免费的在线 MQTT 服务器

EMQ 也提供了支持浏览器访问的 MQTT 在线客户端工具,该工具支持通过普通或者加密的 WebSocket 端口连接至 MQTT 服务器,同时也支持缓存连接方便下次访问使用。

[^1]: The number of connected devices that are in use worldwide now exceeds 17 billion, with the number of IoT devices at 7 billion... 4daK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6A6L8%4c8Q4x3X3c8S2L8X3q4D9P5i4c8A6j5%4y4Q4x3X3g2U0L8$3#2Q4x3V1k6K6N6r3q4@1k6g2)9J5k6r3!0X3i4K6u0V1N6r3S2W2i4K6u0V1K9h3!0@1i4K6u0V1N6i4m8V1j5i4c8W2i4K6u0V1M7e0q4Q4x3X3c8I4x3W2)9J5k6o6t1H3x3e0S2Q4x3X3c8F1N6h3#2T1k6i4u0Q4x3X3c8G2k6W2)9J5k6r3W2G2N6q4)9J5k6r3c8W2N6X3W2U0k6i4y4Q4x3X3c8F1L8%4N6Q4x3X3b7%4j5W2)9J5c8R3`.`.
[^2]: The estimated installed base of smart meters (electricity, gas and water) is expected to surpass the 1 billion mark within the next 2 years. f6bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6A6L8%4c8Q4x3X3c8S2L8X3q4D9P5i4c8A6j5%4y4Q4x3X3g2U0L8$3#2Q4x3V1k6K6L8h3q4J5N6q4)9J5k6r3#2W2N6r3g2J5i4K6u0V1L8h3q4J5K9$3g2@1i4K6u0V1x3U0l9I4z5g2)9J5k6r3N6D9L8$3u0S2L8q4)9J5k6s2m8W2L8X3g2@1M7X3q4@1K9h3!0F1i4K6u0V1M7X3g2S2j5$3S2W2k6q4)9J5k6o6p5@1i4K6u0V1M7r3g2J5j5$3g2F1N6q4)9J5c8R3`.`.

 
 
 
 
 
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回