恭祝各位猪年大吉,今天是大年初一,放假回家四五天了,讲真的搁家比上班还累。。。今夜得闲觉得不能把时间浪费掉,得活跃活跃脑袋瓜,这几天在家喝酒喝的感觉都变笨了。
闲话少说,还是进入正题吧,对于MQTT可以这么说吧,但凡你对物联网有所了解相信你肯定没有没听过MQTT这几个字,但是未必有过深入的了解,那么我们在本片文章中一起来回顾一下。
不知道各位去学习新知识的时候是怎么开始的,我个人是比较喜好先去官方了解一下,如果没有官网我会尝试先看一下百科,然后再就是博客园中大神写的文章,个人感觉官网是最官方的,因为百科词条跟博文可能不会跟官网的信息实时同步,所以我们先去官网看一下,戳卡片,官网并没有太多内容,但已经把我们想要了解的都写出来了,大家可以先看一下:
MQTT stands for MQ Telemetry Transport. It is a publish/subscribe, extremely simple and lightweight messaging protocol, designed for constrained devices and low-bandwidth, high-latency or unreliable networks. The design principles are to minimise network bandwidth and device resource requirements whilst also attempting to ensure reliability and some degree of assurance of delivery. These principles also turn out to make the protocol ideal of the emerging “machine-to-machine” (M2M) or “Internet of Things” world of connected devices, and for mobile applications where bandwidth and battery power are at a premium.
上面这段英文就是对MQTT最好的介绍,如果还觉得长,那我们可以从这简短的文字中提取出有用的关键字:
- protocol
- machine-to-machine(M2M)
- Internet of Things(IoT)
可以看出这是一个通讯协议,主要应用M2M和IoT领域,所以如果你从事物联网相关的行业,对这个协议就要有所了解了,这是目前个人感觉智能设备(手机、智能音响)与智能终端设备(灯、加湿器、窗帘等)之间交互比较好用的协议,是对硬件和网络都要求不高的通讯协议,就目前而言这也是业内大多数大厂也在使用的通讯协议,所以对其了解与熟练使用也是很有必要的。
MQTT最早由IBM发布,目前作为一个Eclipse Paho开源项目,由Eclipse团队维护,最新版本是5.0,我们先看一下几个版本的各种语言支持情况:
这里只列举了三个版本,主要原因是3.1.1是MQTT的第一个OASIS标准版本,3.1版本应该是目前使用最广泛的版本,5.0版本是最新版本:
特性:
MQTT是客户端服务器发布/订阅消息传输协议。它重量轻,开放,简单,易于实现。这些特性使其非常适合在许多情况下使用,包括受限制的环境,例如机器到机器(M2M)和物联网(IoT)环境中的通信,其中需要小的代码占用空间和/或网络带宽非常宝贵。
- 该协议通过TCP / IP或其他提供有序,无损,双向连接的网络协议运行。
- 使用发布/订阅消息模式,该模式提供一对多消息分发和应用程序的分离。
- 与有效负载内容无关的消息传输。
消息传递的三种服务质量:
- “最多一次”,根据操作环境的最佳努力传递消息。可能会发生消息丢失。例如,该水平可以用于环境传感器数据,其中如果某个读数丢失无关紧要,因为下一个读数将很快发布。
- “至少一次”,确保消息到达但可能发生重复。
- “完全一次”,确保消息准确到达一次。例如,此级别可用于计费系统,其中重复或丢失的消息可能导致应用不正确的费用。
网络开销小和断线机制:
- 最小化传输开销和协议交换,以减少网络流量。
- 发生异常断线时通知相关方的机制。
更多相关内容可以戳下面卡片:
关于MQTT的一些基础知识我们就先了解到这里,可能没有接触过的同学对这个协议还是有一点迷茫,对两个设备之间如果建立起通信是有点比较好奇的,我简单一说可能你就懂了,在这个通信协议中必不可少的一个环节就是有一台消息服务器,前面特性当中也有说:MQTT是客户端服务器发布/订阅消息传输协议。其实两台设备之间的消息都是经由消息服务器转发的,前面特性中也说过:该协议通过TCP / IP或其他提供有序,无损,双向连接的网络协议运行。所以MQTT是在TCP/IP协议之上的,所以两个设备如果没在一个局域网中是很难建立起TCP连接的,所以消息服务器就显得很重要了,整个通讯架构简图如下:
设备1想跟设备2打个招呼:hi,这条消息是需要经由消息服务器转发的,因为从整个网络来看,消息服务器是可以部署在公网当中的,也就是有唯一的IP地址,但是两个设备基本是不太可能有固定IP的,但是MQTT是在TCP协议之上的,这也就意味着我们必须要有某一个固定的IP去监听消息,所以这条消息就在消息服务器监听到后会转发给设备2,那么到这里你可能又会想问,消息服务器为什么会知道要转发给设备2呢?其实,这里说转发给某一个设备是不对的,因为MQTT采用的是主题机制,这里我们可以先将主题理解成为每一条消息所跟的一个属性,这个属性会决定到哪些设备可以接收到,哪些设备接收不到消息,比如下图:
其中设备1以主题:/topic1,发送了一条消息:hi,由于这个主题只被设备2订阅了,所以只有设备2接收到了该消息,但是设备2以主题:/topic2,发送了一条消息:hello world,由于这个主题被设备1和设备3同时订阅了,所以,这条消息会被设备1跟设备3都接收到,这就是主题在这里面起的作用,后面我们会在代码中更加具体的了解什么是主题,这里只是以一种比较抽象的说法让大家先了解一下。
关于MQTT的一些基础知识先写到这,主要是先对其有一定了解,后面预计还会有两篇,一篇是如何在电脑(ubuntu)上搭建环境本机测试,另一篇是如何在ESP8266上利用MQTT,实现手机点灯?
QQ交流群:592587184