MQTT
MQTT(英语全称,Message Queue Telemetry Transport),中文翻译过来就是遥测传输协议:其主要提供订阅/发布模式,更为简约、轻量,易于使用,针对受限环境(带宽低、网络延迟高、网络通信不稳定),属于物联网(Internet of Thing)的一个传输协议。设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。例如,但不仅限于此:
[if !supportLists]· [endif]
特别适合于网络代价昂贵,带宽低、不可靠的环境。
能在处理器和内存资源有限的嵌入式设备中运行。
使用发布/订阅消息模式,提供一对多的消息发布,从而解除应用程序耦合。
使用TCP/IP提供网络连接。
提供Last Will和 Testament 特性通知有关各方客户端异常中断的机制。
对消息中间件,估计大家不得不关心的就是消息的可靠性,也就是消息的发布服务质量,可喜的是,
MQTT支持三种消息发布服务质量(QoS):
“至多一次”(QoS==0),消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
“至少一次”(QoS==1),确保消息到达,但消息重复可能会发生。
“只有一次”(QoS==2),确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。
MQTT的协议最新的三个版本是:
3.1.1,3.1.0和5.0的协议。
3.1.0的规范如下
http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html
3.1.1的规范如下
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718029
5.0的规范如下
http://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html
其中5.0还只是一个提案(2017年7月13日发布的一个草稿版的提案),所以本篇文章暂时不涉及MQTT 5.0的协议,考虑到目前主流和成熟的MQTT协议的应用都是MQTT 3.1.1的协议,所以笔者还是以MQTT 3.1.1的协议为基准,给大家分享,只要这个会了,其他的自然不在话下。需要注意的是,MQTT 3.1.0和3.1.1 规范,还是有小部分的区别的。比如可变头部中,在3.1.0的规范中,其关键字是,“MQISdP”。
目前有很多的MQTT消息中间件服务器,如下,都是MQTT协议的服务器端的实现。
IBM Websphere
MQ Telemetry
IBM MessageSight
Mosquitto
Eclipse Paho
emqttd Xively
m2m.io
webMethods
Nirvana Messaging
RabbitMQ
Apache ActiveMQ
Apache Apollo
Moquette
HiveMQ
Mosca
Litmus Automation Loop
JoramMQ
ThingMQ
VerneMQ
MQTT协议,支持一对多的基于消息主题(Topic)的消息订阅,也就是一个MQTT的客户端,发送一条特定主题的消息,
能同时支持多个订阅者同时订阅。
如下图所示意,笔记本和手机都订阅了消息主题为temperature的消息,当温度传感器发布了temperature的消息(当前温度为21 C), 笔记本和手机都会受到温度传感器发布的温度。
目前市面上的主流语言都支持。
Java
Javascript
C/C++
Python
Ruby
Objective-C
CoAP
CoAP是受约束设备的专用Internet应用程序协议
协议特点
基于消息模型
请求/响应模型
双向通信
轻量、低功耗
支持可靠传输
支持IP多播
非长连接通信,支持受限设备
支持观察模式
支持异步通信
工作模式
CoAP参考了很多HTTP的设计思路,同时也根据受限资源限制设备的具体情况改良了诸多的设计细节,增加了很多实用的功能。
消息类型
CON:需要被确认的请求,如果CON请求被发送,那么对方必须做出响应。
NON:不需要被确认的请求,如果NON请求被发送,那么对方不必做出回应。
ACK:应答消息,接受到CON消息的响应。
RST:复位消息,当接收者接收到的消息包含一个错误,接收者解析消息或者不再关心发送者发送的内容,那么复位消息将会被发送。
HTTP、CoAP、MQTT
CoAP协议的设计参考了HTTP,CoAP和MQTT都是行之有效的物联网协议,一下为它们之间的异同。
HTTP和CoAP
[if !supportLists]· [endif]HTTP代表超文本传输协议,CoAP代表约束应用协议;
[if !supportLists]· [endif]HTTP协议的传输层采用了TCP,CoAP协议的传输层使用UDP;
[if !supportLists]· [endif]CoAP协议是HTTP协议的简化版;
[if !supportLists]· [endif]CoAP协议和HTTP协议一样使用请求/响应模型,拥有相同的方法;
[if !supportLists]· [endif]CoAP开销更低,并支持多播;
[if !supportLists]· [endif]CoAP专为资源构成应用而设计,如:IoT/WSN/M2M等...
CoAP和MQTT
[if !supportLists]· [endif]MQTT协议使用发布/订阅模型,CoAP协议使用请求/响应模型;
[if !supportLists]· [endif]MQTT是长连接,CoAP协议是无连接;
[if !supportLists]· [endif]MQTT通过中间代理传递消息的多对多协议,CoAP协议是Server和Client之间消息传递的单对单协议;
[if !supportLists]· [endif]MQTT不支持带有类型或者其它帮助Clients理解的标签消息,CoAP内置内容协商和发现支持,允许设备彼此窥测以找到交换数据的方式。
EMQ与CoAP
EMQ的开源版提供了一个Generic CoAP的实现,读者如果有兴趣的话可以试用一下。在EMQ的商业版中,包含了对CoAP的完整支持。