MQTT学习笔记

栏目: 后端 · 发布时间: 5年前

内容简介:因为工作需要,了解了一下MQTT。顺便记下来,现在还不会用。MQTT(Message Queuing Telemetyr Transport  消息队列遥测传输协议):基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议之上。MQTT运行于TCP之上,属于应用层协议。

因为工作需要,了解了一下MQTT。顺便记下来,现在还不会用。

一、概述

MQTT(Message Queuing Telemetyr Transport  消息队列遥测传输协议):基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议之上。

MQTT运行于TCP之上,属于应用层协议。

二、MQTT消息格式

每条MQTT命令消息的消息头都包含一个固定的报头,有些消息会携带一个可变报文头和一个负荷。消息格式如下:

固定报文头|可变报文头|负荷

1、  固定报文头(Fixed Header)

最少有两个字节,第一个字节包含消息的类型(Message Type)和QoS级别等标志位。第二个字节开始是剩余长度字节,该长度是后面的可变报文头加消息负载的总长度,该字段最多允许四个字节。

剩余长度字段单个字节的最大值为0x7F. 也就是127个字节。MQTT协议规定,单个字节的最高位如果是1,表示后续还有字节存在,第八位起延续位的作用。

由于MQTT协议最多使用四个字节表示剩余长度,并且最后一个字节的最大值只能是0x7F,而不是0xFF。所以能发送的最大消息长度是256MB,而不是512MB。

MQTT学习笔记

2、  可变报文头(Variable Header)

主要包含协议名,协议版本,连接标志,心跳间隔时间,连接返回码,主题名等。

3、  有效负荷

实际上可以理解为消息的主体。当MQTT发送的消息类型是CONNECT(连接)、PUBLISH(发布)、SUBSCRIBE(订阅)、SUBACK(订阅确认)、UBSUNSCRIBE(取消订阅)时会带有负荷。

三、MQTT的主要特性

1、MQTT的消息类型

固定报文头中的第一个字节包含连接标志,连接标志用来区分MQTT的消息类型。MQTT协议拥有14中不同的消息类型。如下图:

可简单分为连接及终止、发布和订阅、Qos2消息的机制以及各种确认ACK。

MQTT学习笔记

2、消息质量(QoS)

MQTT消息质量有三个等级,QoS 0、Qos 1、Qos 2。

Qos 0:最多分发一次,消息的传递完全依赖底层的TCP/IP网络,协议里没有定义应答和重试。消息只会到达服务端一次,要么就没到达。

Qos 1:至少分发一次、服务器的消息接收由PUBACK消息进行确认,如果通信链路或设备异常,或指定时间内没有收到确认消息,发送端会重发这条在消息头中设置了Dup位的消息。

Qos 2:只分发一次。最高级别的消息传递,消息丢失和重复都是不可接受的,使用这个服务质量等级会有额外的开销。

3、遗愿标志(Will Flag)

在可变报文头的连接标志位字段(Connect Flags)里面有三个will标志位:Will Flag  Will Qos和Retain Flag。这些will字段用于监控客户端与服务器之间的连接状况。

遗愿消息:服务器与客户端通信时,当遇到异常或客户端心跳超时的情况,MQTT服务器会替客户端发布一个will消息。当然如果服务器收到来自客户端的DISCONNECT消息则不会触发wiwll消息的发送。因此will字段可以应用于设备掉线后通知用户的场景

4、  连接保活心跳机制(keep Alive Timer)

MQTT客户端可以设置一个心跳间隔时间(keep Alive Timer),表示在每个心跳检测时间内发送一条消息。如果在这个时间周期内,没有业务数据相关的消息,客户端会发送一个PINGREQ消息,相应的,服务器会返回一个PINGRESP消息进行确认。

如果服务器在一个半(1.5)个心跳间隔时间周期内没有收到来自客户端的消息,就会断开与客户端的连接。心跳间隔时间最大值可以设置为18个小时,8表示客户端不会断开。

四、MQTT其他特点

1、异步发布/订阅实现

发布/订阅模式解耦了发布消息的客户(发布者)和订阅消息的客户(订阅者)之间的关系。发布者与订阅者并不需要直接建立联系。

这个模式的好处有:

1)  发布者与订阅者只需要知道同一个消息代理即可。

2)  发布者与订阅者不需要直接交互,不需要同时在线。

2、二进制格式实现

MQTT基于二进制而不是字符串。固定报文头仅有两个字节,相比于其他协议(HTTPS 和XMPP都是基于字符串实现,有冗长的头部),发送一条消息更省流量

3、MQTT的安全

由于MQTT运行于TCP层之上并且以明文传输,可以使用Wireshark看到MQTT发送的所有消息,消息指令一览无遗。这会带来一定的风险:

1)  设备可能会被盗用

2)  客户端和服务端的静态数据可能是可访问的(可能会被修改)

3)  协议行为可能有副作用(如计时器攻击)

4)  拒绝服务攻击

5)  通信可能会被拦截 修改 重定向或者泄露

6)  虚假控制报文注入

作为传输协议,MQTT只关注消息传输,提供安全功能是开发者的责任。

4、认证

支持两种层次的认证

1)  应用层:MQTT支持客户标识,用户名和密码认证

客户标识:MQTT客户端可以发送最多65535个字符作为客户标识,一般来说可以使用嵌入式芯片的MAC地址或芯片序列号。

用户名和密码:支持通过CONNECT消息的USERNAME和password字段发送用户名和密码。但是由于是用的明文传输,抓包 工具 很容易就获取。

2)  传输层:传输层可以使用TLS,除了加密通讯,还可以使用X509证书来认证设备。

在传输层认证是这样的:MQTT代理在TLS握手成功之后可以继续发送客户端的X509证书来认证设备,如果设备不合法就中断连接。

5、  选择用户数据格式

MQTT协议只实现了传送消息的格式,并没有限制用户协议需要按照特定风格。因此在MQTT协议之上,我们需要定义一套自己的通信协议。就可以有下面几种选择了、

1)  十六进制/二进制:

失去了可读性,可以将流量控制的比较小。单片开发可能会比较喜欢用这个。

2)  字符串:

这个会方便阅读。对于高级语言开发者来说,字符串依旧不是最佳选择。键值对(Key-value)才是最优形式。

3)  JSON:

在这门语言中,一切都是对象。因此任何支持的类型都可以通过JSON来表示。例如字符串、数字、对象、数组等、

语法规则是:对象表示键值对、数据用逗号分开、花括号保存对象、方括号保存数组。

JSON层次结构简洁清晰,便于阅读和编写,易于机器解析和生成,有效提升网络传输效率。

4)  XML:

综上,MQTT+JSON是最优解。

五、总结

MQTT基于异步发布/订阅的实现解耦了消息发布者和订阅者,基于二进制的实现节省了存储空间及流量,同时拥有更好的消息处理机制。

MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议

以上 参考 https://blog.csdn.net/anxianfeng55555/article/details/80908795

参考: https://www.cnblogs.com/zhangyu1024/p/6141818.html


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

创新者的窘境(全新修订版)

创新者的窘境(全新修订版)

克莱顿•克里斯坦森 / 胡建桥 / 中信出版社 / 2014-1-1 / 48.00元

全球商业领域中,许多企业曾叱咤风云,但面对市场变化及新技术的挑战,最终惨遭淘汰。究其原因,竟然是因为它们精于管理,信奉客户至上等传统商业观念。这就是所有企业如今都正面临的“创新者的窘境”。 在《创新者的窘境》中,管理大师克里斯坦森指出,一些看似很完美的商业动作——对主流客户所需、赢利能力最强的产品进行精准投资和技术研发——最终却很可能毁掉一家优秀的企业。他分析了计算机、汽车、钢铁等多个行业的......一起来看看 《创新者的窘境(全新修订版)》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具