【MQTT】1、初识MQTT——物联网通信的“世界语”
你好欢迎来到 MQTT 系列博客的第一篇。在开始搭建服务、编写代码之前我们先用一篇文章的时间好好认识一下 MQTT 这位主角。它既不是什么新技术也不是什么大厂专有的闭源协议而是一个已经默默服务了二十多年的“轻量级”通信协议。1、它从哪里来一段关于“管道”的故事要理解一个技术最好的方式之一是回到它诞生的那个时刻看看它要解决什么问题。MQTT 的全称是 Message Queuing Telemetry Transport消息队列遥测传输协议 。它诞生于 1999 年由 IBM 的 Andy Stanford-Clark 和 Arcom现为 Cirrus Link的 Arlen Nipper 共同发明。当时他们面临一个非常具体且棘手的挑战如何通过卫星以极低的带宽和不可靠的网络将数千公里外的石油管道数据传回控制中心要知道那是 1999 年网络带宽昂贵且不稳定远程设备传感器的电池电量和计算能力都极其有限。HTTP 协议对他们来说太重了头信息庞大一来一回的请求/响应模式在这种场景下显得笨拙而低效。于是他们设计了一个极简、轻量、带宽友好的协议。这个协议从诞生之初就刻下了这样的基因实现简单提供服务质量QoS数据传输轻巧且带宽高效数据格式无关支持持续的会话意识你看这些要求恰恰就是今天物联网IoT、M2M 通信领域最核心的痛点。所以MQTT 天生就是为物联网而生的“世界语”。2、它解决了什么——理解“发布/订阅”模式MQTT 与传统 HTTP 最核心的区别在于它的通信模型。不是我们在浏览器里常用的“请求-响应”而是 “发布/订阅”Publish/Subscribe 。我们用一个类比来理解“发布/订阅”模式——电台广播系统。在传统的 HTTP “请求/响应”模式里就好比你给朋友打电话你拨号发起请求。朋友接听建立连接。你问一个问题他给你一个回答响应。通话结束连接断开。如果你想再次询问必须重新拨号。这种方式是同步的、点对点的并且高度依赖双方都在线。如果朋友没开机你就联系不上他。而MQTT的“发布/订阅”模式则更像一个广播电台Broker即服务端/代理订阅者Subscriber你打开收音机调到北京交通广播主题/Topic。发布者Publisher电台发布者不断通过广播信号发送节目消息。只要你的收音机调在这个频率上你就能收到节目。这个模式带来了巨大的好处——解耦。发布者和订阅者完全不需要知道彼此的存在空间解耦发布者不需要知道订阅者的 IP 地址和端口它只需要把消息发给“代理Broker”就行了。时间解耦发布者发消息时订阅者不需要在线。消息可以被 Broker 暂存等订阅者上线后再发送给它。这就是“持续的会话意识”。简单来说在 MQTT 的世界里有三个核心角色Broker代理/服务端就是那个“广播塔”负责接收所有消息并根据“主题”分发给订阅者。它是整个通信的中枢。Publisher发布者发送消息的客户端它只负责把消息发到 Broker 上某个指定的“主题”不管谁会来收。Subscriber订阅者接收消息的客户端它向 Broker 表达自己对哪些“主题”感兴趣然后静静地等消息到来就行。3、它厉害在哪——轻量、QoS与更多特性MQTT能在物联网领域占据主导地位靠的可不只是模式新颖。它有几个硬核的特性是专为“艰难”环境设计的极致轻量开销极小这是MQTT最引以为傲的特点。它的固定报文头Fixed Header只有 2 个字节这意味着哪怕是最小的一条消息也能被高效地传输。相比之下一个普通的 HTTP 请求头动辄几百字节在按流量计费的卫星网络或低频窄带网络里成本天差地别。三种消息服务质量QoS网络不可靠是常态。MQTT 为此定义了三种服务质量等级Quality of Service让你能根据业务需求在可靠性和网络开销之间做权衡等级名称含义适用场景0至多一次消息只发送一次不等待确认。可能会丢也可能收到重复。环境传感器数据上报丢一两个读数影响不大。1至少一次确保消息到达但可能会收到重复的消息。需要确保对方收到但允许偶尔重复的场景。2恰好一次通过四次握手确保消息既不丢失也不重复精确到达一次。计费系统、关键的指令下发不能出任何差错。需要注意的是消息的发布 QoS 和订阅 QoS 是独立的。最终客户端收到的消息服务质量是发布 QoS 和订阅 QoS 中较低的那个。主题Topic与通配符MQTT 通过“主题”来对消息进行分类。主题是一个用斜杠 / 分隔的字符串比如myhome/livingroom/temperature可以像文件系统一样组织成层级结构。它最强大的地方在于支持通配符订阅让你可以一次性订阅一大批相关的主题单层通配符匹配它所在的那一层任意字符。比如订阅 myhome//temperature可以匹配 myhome/livingroom/temperature 和 myhome/bedroom/temperature但不会匹配 myhome/kitchen/oven/temperature。#多层通配符匹配它之后的所有层级必须放在最后。比如订阅 myhome/#就能收到 myhome/ 下所有子主题的消息。保留消息Retained Message——解决“新设备上线”的问题如果某个主题的最新消息被标记为“保留”那么当新的订阅者连接并订阅这个主题时Broker 会立刻把这条“保留消息”推送过去。这样一个新接入的温控器能立刻知道当前的温度而不是傻等到下一次温度更新。遗嘱消息Last Will——解决“设备异常下线”的问题客户端在连接 Broker 时可以预设一条“遗嘱消息”和一个主题。如果这个客户端异常断开比如断电、网络中断Broker 会主动向那个主题发布这条遗嘱。其他订阅了该主题的设备就能知道“某个设备掉线了”从而做出相应的处理。4、它能用在哪儿MQTT 的应用范围已经远远超出了最初的石油管道监测成为物联网、移动互联网的事实标准物联网IoT与 M2M 通信智能家居灯具、插座、传感器、智慧农业、工业自动化数据采集。即时消息推送早期的 Facebook Messenger 等 App就大量使用了 MQTT 作为消息推送协议。车联网车辆与云端、车辆与车辆之间的低延迟通信。医疗健康可穿戴设备与医疗平台的数据同步。通过第一篇文章我们已经认识了 MQTT它的历史使命、核心的“发布/订阅”模式以及那些为物联网而生的精巧特性。如您在阅读中发现不足欢迎留言