一、什么是MQTT?
-
概念:MQTT (Message Queue Telemetry Transport),消息队列遥测传输协议,其主要提供了订阅/发布两种消息模式,更为简约、轻量,易于使用,特别适合于受限环境(带宽低、网络延迟高、网络通信不稳定)的消息分发,属于物联网(Internet of Thing)的一个标准传输协议。
-
特点:
- 特别适合于网络代价昂贵,带宽低、不可靠的环境。
- 能在处理器和内存资源有限的嵌入式设备中运行。
- 使用发布/订阅消息模式,提供一对多的消息发布,从而解除应用程序耦合(http协议是一对一的)。
- 使用 TCP/IP 提供网络连接,主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了(使用UDP协议框架的也有一个是COAP协议,同样也是主要应用于物联网为受限的环境设计的)。
- 提供Last Will(即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。) 和 Testament(遗嘱机制,功能类似于Last Will。) 特性通知有关各方客户端异常中断的机制。
- 对负载内容屏蔽的消息传输。
二、MQTT能做什么?
主要使用在物联网方面的,包括机器与机器(M2M)通信和物联网(IoT)。
三、MQTT协议介绍
-
MQTT协议的基本结构
a. 固定头(Fixed Header):主要是记录消息的Qos、消息类型、是否重复发送(DUP)等。结构如下:
b. 可变头(Variable header):主要记录协议名、协议的版本(一个字节表示)、用户名、密码、主题名(最多支持32,767个字符)、返回值等。
c. 负载(Payload): 包含消息的唯一标识符、在发布中的有效负载就包含发布的内容。在订阅中的有效负载就包括订阅的列表以及订阅主题的QoS值。 -
服务质量(QoS)
QoS服务质量:
a. “至多一次”(QoS==0),消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
b. “至少一次”(QoS==1),确保消息到达,但消息重复可能会发生。
c. “只有一次”(QoS==2),确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。
Topic主题
a. 主题层级分隔符 “/”: 表示层级关系,比如a/a,a/b/c等。
b. 单层通配符 “+”: 订阅消息时使用,匹配一层主题如 a/+ 匹配诸如 a/b a/c 但是不能匹配 a/b/c,特别的单独的+可以匹配所有单层主题
c. 多层通配符”#”:订阅消息时使用,匹配零或层主题如 a/# 匹配诸如 a/b a/b/c a ,特别的#单独使用匹配所有。
注:使用通配符时需要保证创建的policy里有相应规则的topic,比如a/+(设为只订阅),如果没有是无法在连接时通过订阅a/+匹配到该policy里其他相关的诸如a/b a/c等主题。