MQTT协议

MQTT是一个基于客户端和服务端发布/订阅模式的消息传输协议。它轻量、开放、简洁、优雅以便于可以被快速实现。这些特质使其可以应用在多种场景,例如机器到机器通信(M2M),要求低流量如按流量计费的物联网IoT环境。

要求描述MQTT协议的核心功能和概念
描述MQTT控制报文格式
描述MQTT异常中断的机制

特点:
使用发布/订阅消息模式,提供了一对多的消息分发和应用之间的解耦。
消息传输不需要知道负载内容。
提供三种等级的服务质量。QOS
很小的传输消耗和协议数据交换,最大限度减少网络流量。
异常连接断开发生时,能通知到相关各方 遗嘱

发布订阅模式
客户端连接到代理,它可以订阅代理中的任何消息 主题
客户端通过将消息和主题发送给代理,发布某个主体范围内的消息
代理然后将消息转发给所有订阅该主题的客户端
发布订阅解耦了消息的发布者和接收者

客户端
包括发布者或订阅者,两者都是MQTT客户端,分别负责发布或订阅
可以是从微控制器到一个完全成熟的服务器,在设备上运行着MQTT库并且可以通过任何网络连接到MQTT代理服务器

代理服务器
是任何发布订阅协议的核心,可处理多大成千上万的MQTT客户的并发连接
代理服务器主要负责接收所有消息,将消息发送给所有订阅的客户端
一个职责是保持内所有持续连接的客户端的会话,包括订阅和丢失的消息
另一个职责是对客户端的认证和授权

心跳时间(Keep Alive timer)
以秒为单位,定义服务器端从客户端接收消息的最大时间间隔。一般应用服务会在业务层次检测客户端网络是否连接,不是TCP/IP协议层面的心跳机制(比如开启SOCKET的SO_KEEPALIVE选项)。 一般来讲,在一个心跳间隔内,客户端发送一个PINGREQ消息到服务器,服务器返回PINGRESP消息,完成一次心跳交互,继而等待下一轮。若客户端没有收到心跳反馈,会关闭掉TCP/IP端口连接,离线。 16位两个字节,可看做一个无符号的short类型值。最大值,2^16-1 = 65535秒 = 18小时。最小值可以为0,表示客户端不断开。一般设为几分钟,比如微信心跳周期为300秒。

MQTT的发布与订阅
发布
当MQTT客户端和代理建立连接后,就可以发布消息了
每个消息必须包含一个主题,代理根据主题将消息转发给感兴趣的客户端。每个消息通常拥有payload,其中包含了以字节格式传输的实际数据。
订阅
订阅包含一个主题过滤器和一个最大的服务质量等级QOS
订阅与单个会话关联,会话可以包含多于一个的订阅,绘画的每个订阅都有一个不同的主题过滤器

主题
主题通配符
单级: +
多级: #

服务质量
0:最多分发一次
1:至少分发一次
2: 仅分发一次 最高等级的服务质量,消息丢失和重复都是不可接受的,使用这个服务质量等级会有额外开销

MQTT控制报文
结构
在协议中,一个MQTT数据包由:固定头,可变头,消息体(payload)三部分构成

MQTT连接
该协议是基于tcp/ip之上的,客户端和代理服务器都需要tcp/ip栈
MQTT连接是咋客户端和代理服务器之间,连接是通过客户端向代理发送连接消息发起的。代理会响应一个CONNACK消息和状态码,一旦连接建立,只要客户端不发送断开连接的命令或失去联系,代理将使连接保持。

CONNECT消息
clientID 是每个连接到MQTT代理服务器的MQTT客户端的编号
clean session
该标志位向代理服务器表明客户端是否要建立持续的会话
其设置为false是代理将存储所有服务质量QOS为1或2的客户端的订阅信息以及所有错过的消息
其设置为true是代理将不会存储客户端的任何信息,并将清除之前持续会话的所有信息

用户名/密码
MQTT允许发送用户名和密码以便验证你客户端的身份和进行授权

遗嘱消息 will message
当某个客户端恶意断开连接时,遗嘱消息将通知其他客户端
一个连接着的客户端将在CONNECT消息中以MQTT消息和主题的形式提供其遗嘱
如果客户端恶意断开了连接,代理将发送此消息来代表客户端

心跳 keep alive

MQTT保留消息
保留消息是一条将保留标志置为true的普通MQTT消息。broker会针对主题依照qos级别保留最后一条保留消息,保留消息的存在意义是为了订阅者能立即收到消息而无需等待发布者发布下一条消息
一个主题的保留消息是最新的可知的有效数据,它不必是最新的数据,但它一定是将保留标志置为true的最新消息。

MQTT遗嘱LWT
MQTT使用遗嘱功能通知其他客户端某个客户端意外断开连接了。每个客户端都可以在连接broker时指定其最新的遗嘱(一个具备主题,保留标志,qos的普通MQTT消息)
broker将会在以下情况分发遗嘱消息
服务器发现一个I/O错误或网络错误;
客户端没有按时发送心跳包,客户端没有在断开连接前发送DISCONNECT包
服务器因为协议错误而断开连接。

MQTT协议除支持TCP传输层以外,还支持websocket作为传输层。通过websocket 浏览器可以智联MQTT消息服务器,发布订阅模式与其他MQTT客户端通信

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值