MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。
http://mqtt.org/documentation
https://github.com/mqtt/mqtt.github.io/wiki/software?id=software
物联网接入的挑战
物联网中的数据传输会面临很多问题,比如在网络不稳定的情况下,如果保证数据的传输没有问题,如何保证数据不被重复发送,连接断开后如何进行重连。总体来说,物联网的接入会面临以下几个方面的挑战:
设备、传感器。物联网接入对终端采集和控制设备要求高,且终端的改造以及网络费用成本也比较高。另外,其对终端的能耗要求也比较高。
网络。现有的网络传输贷宽参差不齐,传输网络不稳定。
服务器。高并发情况下,多客户端的接入能力以及消息处理能力。
MQTT是一个客户端服务器的发布/订阅消息传输协议。IBM提出的用于M2M的标准协议。
它重量轻,开放,简单,设计,易于实施。
这些特点使得它非常适合在许多情况下使用,包括约束环境
如在机器到机器(M2M)和物联网(物联网)中,这些环境要求小的代码尺寸和网络带宽受限。
该协议运行在TCP / IP,或其他网络协议,提供有序的,无损的,双向连接。其特点包括:使用发布/订阅消息模式提供了一对多的消息分发和应用程序解耦。与有效载荷的内容无关的消息传递传输。
提供三个等级的服务:
“至多一次”,根据操作环境的最大努力传递消息。消息丢失可以发生。这个级别可以使用,例如,与环境传感器的数据,它并不重要,如果一个人的阅读是丢失的下一个将很快公布后。
至少有一次“,消息被保证到达,但重复可能发生。
”确切的一次“,保证消息被准确地到达一次。这个级别可以使用,例如,与计费系统,重复或丢失的消息可能会导致不正确的费用被应用。
一个小的传输开销和协议交换最小化,以减少网络流量。网络发生异常断开时通知感兴趣方的机制。
This specification is split into seven chapters:
Chapter 1 - Introduction
Chapter 2 - MQTT Control Packet format //控制包格式
Chapter 3 - MQTT Control Packets //控制报文
Chapter 4 - Operational behavior //操作规则
Chapter 5 - Security //安全
Chapter 6 - Using WebSocket as a network transport //websocket作为网络传输层
Chapter 7 - Conformance Targets //符合性目标
客户:
一个程序或设备使用MQTT。
客户端总是建立与服务器的网络连接。它可以发布其他客户可能感兴趣的应用程序消息。
它可以订阅应用程序消息。退订删除应用程序消息的请求。断开服务器。
服务器:它作为客户端和应用程序之间的中介。服务器转发匹配客户端订阅的应用程序消息。
订阅:订阅包括主题筛选器和最大服务质量。订阅与单个会话相关联。会话可以包含多个订阅。会话中的每个订阅具有不同的主题筛选器。
会话:客户端和服务器之间的有状态交互。有些会话只持续网络连接(短连接),其他可以跨越客户端和服务器之间的多个连续的网络连接。
MQTT控制分组:分组信息,通过网络连接发送。MQTT规范定义了十四种不同类型的控制数据包,其中一个(发布包)是用来传递消息的应用程序。
控制包中的文本字段描述编码为UTF-8字符串。UTF8[rfc3629]是一种有效的UTF-8编码的Unicode字符进行编码的ASCII字符在基于文本的通信支持。
这些字符串的前缀是一个二字节的长度字段,给出了在一个UTF-8编码的字符串本身的字节数。MSB在前(big-endian mode)。
在一个UTF-8字符数据编码的字符串必须是格式良好的UTF-8的Unicode规范[UNICDOE]定义和重述的RFC 3629中的[ rfc3629 ]。特别是这个数据不包括U + D800和U+ DFFF间编码点的编码。如果一个服务器或客户端接收到包含恶意UTF-8必须关闭网络连接控制包。
拿130来说,第一个字节存10000011,第二个字节存000000001,也就是0x83,0x01,把两个字节连起来看,第二个字节权重从2的7次方开始,表示为130=127+3。这挺有意思的,伸缩性强。
Structure of an MQTT Control Packet 228
Fixed header, present in all MQTT Control Packets //固定头
Variable header, present in some MQTT Control Packets //可变头
Payload, present in some MQTT Control Packets //净荷
固定头(Fixed Header):
控制包类型:
Reserved | 0 | Forbidden | Reserved | ||||||||
CONNECT | 1 | Client to Server | Client request to connect to Server | ||||||||
CONNACK | 2 | Server to Client | Connect acknowledgment | ||||||||
PUBLISH | 3 | Client to Server or | Publish message | ||||||||
| |||||||||||
PUBACK | 4 | Client to Server or Server to Client | Publish acknowledgment | ||||||||
PUBREC | 5 | Client to Server or Server to Client | Publish received (assured delivery part 1) | ||||||||
PUBREL | 6 | Client to Server or Server to Client | Publish release (assured delivery part 2) | ||||||||
PUBCOMP | 7 | Client to Server or Server to Client | Publish complete (assured delivery part 3) | ||||||||
SUBSCRIBE | 8 | Client to Server | Client subscribe request | ||||||||
SUBACK | 9 | Server to Client | Subscribe acknowledgment | ||||||||
UNSUBSCRIBE | 10 | Client to Server | Unsubscribe request | ||||||||
UNSUBACK | 11 | Server to Client | Unsubscribe acknowledgment | ||||||||
PINGREQ | 12 | Client to Server | PING request | ||||||||
PINGRESP | 13 | Server to Client | PING response | ||||||||
DISCONNECT | 14 | Client to Server | Client is disconnecting | ||||||||
Reserved | 15 | Forbidden | Reserved |
剩余长度是当前数据包中剩余的字节数,包括变量报头中的数据和有效载荷。剩余长度不包括自身的1个字节。
每个字节编码128个值和一个“延续位”。符合UTF-8规范。
可变头(Varible Header)
MQTT的控制包类型包含一个可变头组件。它驻留在固定标头和有效载荷之间。变量标头的内容取决于包类型。可变报头的数据包标识符字段在多个数据包类型中是常见的。
The variable header for the CONNECT Packet consists of four fields in the following order: Protocol Name, Protocol Level, Connect Flags, and Keep Alive.
QoS表,这是MQTT协议的亮点:
QoS0:最多一次传递。允许丢。
根据底层网络的功能传递消息。接收者不必回复。发送者不管对方是否收到。因为还有下一次消息。
QoS 1: At least once delivery 至少一次,允许重复。
This quality of service ensures that the message arrives at the receiver at least once.
这是一个确保服务,一定要保证接收到。
QoS2:一次交付
这是最高质量的服务,不丢失,也不重复的消息。消息开销会增加。