1、MQTT来龙去脉

1.1 什么是MQTT

        MQTT(英文全称Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅(PUBLISH/SUBSCRIBE)模式的轻量级的物联网通信协议。从这个定义中我们可以总结出四个关键词:消息队列、遥测技术(telemetry)、发布/订阅、轻量级。下面将针对这四个关键词分别做出解释。

        消息队列(MQ)是一种非常常见的异步分发和处理模型,有着广泛的应用。其基本构成是生产-转存-消费[1],也就是生产者产生消息,然后在队列中进行缓存,再由消费者从队列中取消息,这是一种最简单的点对点的场景。还有一种点对多点的场景,即需要将一份消息分发给多个消费者(类似于网络通信中的组播),这就是我们的这里提到的发布/订阅模型。所谓的发布/订阅模型本质上也是由生产者负责发布消息,只不过这个消息增加了一个topic主题,并且缓存在队列中,这样就可以有多个消费者同时订阅这个主题。详细的过程如下图所示。

更改emqtt端口4370 mqtt emq_mqtt

        那什么是遥测技术?遥感勘测技术起初是应用在卫星,太空探索和移动机器人领域,用来无线传送和接收远程监控环境情况或设备参数的测量数据,此处被引入到物联网领域,是一种云端从远端的感知层采集数据的技术。至于说轻量级,后面对该协议报文头的解析可以看出只有两到三个字节,从这一点上就可以大大节省对网络和计算资源的消耗。详细解读了什么是MQTT以后,接下来就看一下这个协议的发展史,可以帮助我们更好地理解协议演进的方向,以及为何会发生这样的变化。

1.2 MQTT协议发展史

        MQTT协议是由IBM公司在1999年提出的,截至到目前一共有5个正式版本,其中最新的版本是v5。在这5个版本中有一个特殊的版本,即专门应用于传感器网络的MQTT-SN,该版本主要应用在传感器等资源受限的场景,很难在传感器上支持tcp协议,为了入网也会有特殊的设备和架构。两者的差异如下图所示。

       

更改emqtt端口4370 mqtt emq_消息队列_02

        主流MQTT协议各个版本的差异进行分析,如下表所示。各个版本基本上都是围绕上面的6个维度去变化的。安全性上来讲主要是引入一些新的鉴权机制,同时在信息来源上做到可以溯源,安全一直是物联网的一个痛点,作为物联网事实上的标准协议,MQTT后续也会在安全性方面有更多的考虑。可靠性方面主要是保证通信双方在发生异常时,能够得到反馈,是因为能力不支持还是网络异常导致的通信问题,从而进行相应地处理。物联网的资源特别是终端侧其实是非常受限的,即使是在网络层上随着接入终端的增多,其资源也是十分宝贵的,因此如何在保证可靠通信的前提下,更合理地分配网络和计算资源也是协议演进要重点考量的点。至于说可扩展性和兼容性则是每种网络协议在往前演进的过程中都需要考虑的,要能保证在不同的平台上,不同的应用场景下,都可以灵活地扩展和使用。

更改emqtt端口4370 mqtt emq_iot_03

1.3 MQTT协议特点

       从MQTT协议的应用场景来看,主要是应用在物联网场景,物联网通信的特点是海量客户端连接到服务器,这个数量级会在亿级以上,需要协议足够简单;由于客户端移动的特性,通常是通过无线接入的方式,通信的环境比较差,因此要求协议要具备良好地通信质量;另外客户端的设备都是比较小的智能终端,处理能力较差,这就要求协议报文必须足够短小和简单。

        鉴于以上物联网通信的特点和要求,MQTT协议在设计时很好地解决了这些问题,具有如下地特点:

1)报文头采用二进制方式,以位计算,极大地控制了报文长度,因此足够轻量级。

2)引入qos机制,保障通信的质量,同时引入心跳机制,使客户端和服务器端之间能够感知链路质量,当发生断链时,可以快速重连。

3)特性足够简单,基本上整个协议最核心的就是订阅和发布功能,无其他复杂功能。

4)具备了消息队列异步的通信方式,很好地解决了海量连接地问题。

未完待续

参考文献:

[1](71 条消息) 消息队列(mq)是什么?