MQTT基础——Part 1. 认识MQTT
MQTT基础——Part 1. 认识MQTT
作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs
本文是《MQTT基础》系列文章的第一部分,这个系列会详述MQTT协议的方方面面,包括MQTT协议的核心功能和概念,以及协议的一些基本信息和背景。
我不仅会探讨MQTT协议本身,还会介绍MQTT的安全或客户端库。因此,如果你对MQTT感兴趣,那么请订阅我的博客。
MQTT是一个开放协议,我会介绍MQTT的基本概念(发布/订阅、客户端/经纪人)和基本功能(连接、发布/订阅)。随后,你需要逐一了解MQTT的特性,比如服务质量QoS、消息的保存、持续的会话、最后遗嘱以及SYS主题。MQTT安全没有放入《MQTT基础》这个系列,因为它非常重要,所以单独阐述。
使用 Last Will 和 Testament 特性通知有关各个客户端异常中断的机制。
一、介绍MQTT
MQTT是一个支持客户端-服务器的发布/订阅消息传输的标准通信协议。MQTT是轻量级的、开放的、简单的、在设计上是易于实现的。这些特性使得MQTT非常适合于许多场景,包括受限的环境,比如M2M的通信和物联网IoT通信,只需一点点计算资源和一点网络带宽就可以实现。
引用官方MQTT3.1.1规范的描述:
MQTT规范中的摘要说的很好,描述了MQTT是怎么一回事。它是轻量级的、二进制的通信协议,在传输数据方面优于HTTP协议,因为它有最小的数据包开销。另一个重要的方面是,MQTT极其容易在客户端实现。这完全满足资源受限的设备的需求。事实上,这也是MQTT发明的目标之一。
二、MQTT的历史
MQTT是IBM公司的安迪·斯坦福·克拉克和Arcom公司的阿伦·尼珀于1999年创建的协议,其目标是创建一个支持低电量、低带宽消耗的通信协议,主要用于通过卫星通信连接石油管道。他们指定了以下的目标:
1)简单、易实现
2)提供了数据交付QoS
3)轻量级、高效的带宽利用
4)数据不可知
5)连续的会话感知
这些目标到目前仍然是MQTT的核心,但是MQTT的焦点已经从专有的嵌入式系统转移到了物联网IoT。另一个比较困惑的是MQTT术语的缩写,原先是Message Queuing Telemetry Transport,消息队列遥测传输,现在则没有缩写的说法,MQTT就是MQTT。其次,MQTT不是消息队列相关的协议,也不是消息队列的解决方案,尽管它在某些场景下也需要消息队列,但一定要认清这一点。IBM在内部使用MQTT很久,在2010年终于对外免费开放,任何人都可以实现它、使用它。
三、OASIS标准和MQTT当前版本
MQTT大约发布3年后,IBM宣布MQTT应该被OASIS标准化,就像AMQP、SAML、DocBook标准化那样。整个标准化历时约1年,在2014年10月29日MQTT正式成为OASIS的官方标准,发布了最新的MQTT协议标准3.1.1版。MQTT从3.1版到3.1.1版只是小版本的迭代,变化极小。总的来说,MQTT 3.1.1是对3.1规范进行了改善,澄清了模糊之处,并尽可能使之向后兼容。而且一些最需要的新功能也包含进这个版本,所以3.1.1版不仅是维护版本。
四、MQTT 3.1和3.1.1版的区别
在3.1.1版中,主要的改变有6个:
1)Session Present Flag
如果客户端使用持久会话进行连接(这意味着客户端不使用干净的会话),那么在CONNACK消息会引入一个额外的标志,以指示该Broker代理已经有了与客户端早先的会话信息(比如客户端订阅信息、队列消息活其他信息)。这是一个重要的新功能,它可以实现更高效的通信。现在,客户端得到反馈,如果Broker经纪人已经有了客户端的订阅,如果标志设置为false,那么客户端只需订阅新主题。
2)失败订阅的附加错误码
在MQTT 3.1.1之前,客户端要查询自己的订阅是否被Broker经纪人批准,这是不可能的。这种情况在采用细粒度权限的MQTT主题管理时就可能出现。在3.1.1版新规范中,在MQTT SUBACK消息中新增了一个错误码0x80,让客户端知道自己的订阅是否被禁止。
3)匿名MQTT客户端
如果使用场景需要临时的或匿名的MQTT客户端,在3.1.1版得到支持,可以设置MQTT客户端标识符为零字节长度。那么MQTT的Broker会自动分配给客户端一个临时的随机标识符。这一个特性非常有用,尤其是当客户端只需做发布、不需要订阅的情况,此时客户端无需做基于客户端ID的授权。
4)即时发布或不等待响应的突发MQTT消息
3.1.1版为MQTT客户端设计了一个非常有趣的新功能,那就是客户端可以直接发送MQTT PUBLISH消息而无需等待Broker的CONNACK响应。这非常适用于微型、受限的MQTT客户端做连接CONNECT、发布PUBLISH、断开DISCONNECT,而不需要处理来自Broker的响应的情况。这也适用于只关心尽可能发送数据而不维持长时间TCP连接的处于突发模式的客户端。当然,成熟的Broker在检查客户端是否被允许发布到这些主题之前,是不会发布消息的。
5)客户端ID可以很长
在MQTT 3.1版,每个客户ID不能超过23字节,这一点非常不方便,并能导致许多麻烦,例如客户端标识符要使用UUID的场景。在3.1.1版,Broker可以使用65535字节的客户端ID。
6)其他低级别的更改
- 在CONNECT的Header报头中,协议名从MQIsdp改为MQTT。这节省了两字节的开销,并使得协议名称更易读。
- 所有的字符串编码现在统一为UTF-8。
- 协议级字节从3字节增加到4字节。
- 在WebSockets上的MQTT通信(MQTT over WebSockets)现在终于确定。在IANA的标识符是mqtt。
注:IANA(The Internet Assigned Numbers Authority,互联网数字分配机构)是负责协调一些使Internet正常运作的机构。由于Internet已经成为一个全球范围的不受集权控制的网络,为了使网络在全球范围内协调一致,有对互联网一些关键的部分达成技术共识的需要,这就是IANA的任务。
推荐使用MQTT 3.1.1。
写在最后
我新建了一个微信个人公众号,博客的信息也会在公众号同步更新。关注随意。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
扫盲贴:认识MQTT通信协议
1、概述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。 MQTT协议技术文档:点此进入,当然也有PDF版的,百度一下,不过个人感觉不是官网上的字体和排版最舒服。 MQTT是轻量级基于代理的发布/订阅的消息传输协议,它可以通过很少的代码和带宽和远程设备连接。例如通过卫星和代理连接,通过拨号和医疗保健提供者连接,以及在一些自动化或小型设备上,而且由于小巧,省电,协议开销小和能高效的向一和多个接收者传递信息,故同样适用于称动应用设备上。 相信在想深入学习这个协议必是奔着解决某个问题而来的,上面给出了适用的场景,我之所以想深入的学习和了解这个协议,理由如下: [1] 可以实现手机消息推送(PUSH); [2] 协议简单,最小的头部只需2个字节,特别适合于嵌入式设备场景中; [3] 这是个了解什么是协议绝好的例子。相比于其它复杂的协议例如tcp、ht...
-
下一篇
史上最全的物联网资料
在网络技术飞速发展的今天,物联网(InternetofThings,IoT)概念再次备受关注,更成为引爆IT变革的新导火索。物联网是新一代信息网络技术的高度集成和综合运用,是新一轮产业革命的重要方向和推动力量,将是下一个推动世界高速发展的“重要生产力”,是继通信网之后的另一个万亿级市场。物联网不仅仅提供了传感器的连接,其本身也具有智能处理的能力,能够对物体实施智能控制。物联网将传感器和智能处理相结合,利用云计算、模式识别等各种智能技术,扩充其应用领域。从传感器获得的海量信息中分析、加工和处理出有意义的数据,以适应不同用户的不同需求,发现新的应用领域和应用模式。 为了让开发者进一步的了解、熟悉物联网,了解物联网的最新知识;掌握物联网的最新技术,真正地实现万物互联。云栖社区特意组织翻译了《GitHub Awesome IoT》资源,其中不仅涵盖物联网开发测试中软硬件资源,还包括相关的协议和标准,以及与物联网相关的书籍、论文等资源。 目录列表 硬件 软件 操作系统 编程语言 框架 中间件 库和工具 其他 协议和网络 技术 标准和联盟 资源 书籍 文章 论文 硬件 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Dcoker安装(在线仓库),最新的服务器搭配容器使用