mqtt通信协议

基本概念

mqtt是一种基于发布/订阅的,底层协议为TCP/IP协议的“轻量级”通信协议。

组成部分

由于mqtt是基于发布/订阅的通信协议,所以需要存在发布者和订阅者,又因为mqtt可以使发布信息的客户端和订阅消息的客户端不需要知道彼此,也就是它们之间不需要直接的联系,所以还存在一个代理,也就是服务器。
1.客户端
(1)发送应用消息;
(2)订阅以请求相应的应用消息;
(3)取消订阅以移除相应的应用消息;
(4)与服务端断开连接。
2.服务端
(1)接收来自客户端的连接请求;
(2)接收来自客户端发送的应用消息;
(3)处理来自客户端订阅和取消订阅的请求;
(4)发送相应的应用消息给已订阅客户端。
3.主题
mqtt协议是基于主题进行消息路由的,它可以看成一个消息的标签,消息的推送就是根据这个主题进行的。
4.发布者
发布者是将消息发送到主题上的客户端,一个发布者一次只能在一个主题上发送数据。
5.订阅者
订阅者是通过订阅主题被推送消息的客户端,一个订阅者可以订阅多个主题。
6.代理
代理是接收发布者在主题上发布的消息以及处理订阅者订阅和取消订阅请求,并且将订阅者订阅的主题的相关消息全部推送给订阅者的服务端。

服务质量Qos

服务质量Qos存在三种,Qos0,Qos1,Qos2。
(1)Qos 0,表示至多只发一次,客户端发送消息给服务端,不管发没发送成功,也就是要么消息只发送一次,要么就是消息发送失败,都不会重发。
(2)Qos 1,表示至少只发一次,当客户端发送消息给服务端,服务端没有接收到消息在时间段内没有接收到消息时,就视为客户端发送消息失败,这个时候会重发报文头带有DUP重发标志的消息。
(3)Qos 2,表示只发送一次,这是最高级别的服务质量,可以保证消息发送成功且不会丢失和重发。一般用于计费系统中,如果发送多次的话,可能会导致计数或者扣除结果不准。
扩展:
在Qos 1中,客户端发送消息的时候携带了重复分发标志DUP,虽然重发的时候,DUP会变成1,但是不能够保证代理服务端就已经接收到了消息,存在两种情况:
(1)客户端发送消息给代理服务端,但未投递成功,这个时候客户端并未接收到代理服务端的响应,会重发消息,并且头部的DUP设置为1,代理服务端接收到该消息之后,判断出它是重发的消息,发送响应给客户端,这个时候消息是成功发送的;
(2)客户端发送消息给代理服务端,并且投递成功,但是代理服务端的响应并没有被客户端接收到,这个时候消息ID被释放,客户端又采用了同一个消息ID去发送同样的消息给代理服务端,但是没有响应成功,那么客户端还是使用该消息ID去发送给给代理服务端,这个时候虽然消息ID一样,但是对代理服务端来说它就是一个全新的消息,这个时候就会导致同个消息被接收了不止一次。
Qos 2就是在Qos 1的基础上去解决重复接收的问题。Qos 2对比Qos 1来说,增加了步骤,也就是当客户端发送消息给代理服务端成功之后,代理服务端并不会直接去释放消息ID,而是发送响应给客户端,客户端接收之后,发送pubrec和pubrel给代理服务器,这个时候代理服务器再进行释放,然后发送pubcomp给客户端,在pubrec之前都可以进行重发操作。

mqtt消息保留和遗嘱消息

1.消息保留
当保留标志位设置为1的时候,需要在有效载荷中携带保留的消息内容。
(1)客户端发布特殊的保留消息,代理服务端需要将其保留在指定的主题上;
(2)当订阅者订阅该主题的时候,代理服务端会把该保留消息发送给订阅者;
(3)发布者发布的保留消息如果在代理服务器的主题中已经存在消息,那么就会删除旧的消息并且保留新的消息;
(4)保留消息对于设备状态、配置信息或静态数据的传递非常有用。
2.遗嘱消息
(1)遗嘱消息是客户端异常连接断开时发送的预定义消息
(2)客户端发送connect连接请求携带了遗嘱消息的主题、负载和Qos级别;
(3)当客户端发送异常断开时,代理服务端会自动发布遗嘱消息到对应的主题上;
(4)遗嘱消息能够告知订阅者其离线状态或者其他重要信息;
(5)当订阅者订阅了该主题时,代理服务器会推送该遗嘱消息。

mqtt的保活机制

由于可能存在一种情况,就是客户端或者代理服务端有一方发生断开,但是另外一方不知情的情况下,那么另外一方就会不断给对方发消息,但是因为断开,所以对方并不能接收到消息,这种情况也就是半连接。为了解决这种情况的发生,引入了keep alive保持连接机制。keep alive的值在0-65535之间,这是客户端发送两次mqtt包的最大间隔时间,需要注意的是当keep alive设置为非零值时,才算开启keep alive机制,该值存放在客户端发送connect连接请求包含的数据包中。后面又引入了server keep alive,也就是代理服务端发送的,当connack连接请求响应的数据包中存在server keep alive的值时,那么就以该时间间隔为准,并且客户端的keep alive被该值覆盖替换。
1.客户端
(1)客户端在连接建立之后,发送的mqtt协议包的间隔在最大时间间隔内,如果客户端处于空闲状态,没有内容可以发送,那么就发送pingreq协议包(心跳消息、心跳报文等);
(2)客户端在发送了pingreq协议包之后,代理服务端应该发送pingresp协议包进行响应,如果客户端在keep alive的时间间隔内并未接收到该响应,那么就判断broker离线或者异常断开,那么客户端需要关闭连接。
2.服务端
(1)当连接建立后,代理服务端在1.5倍的keep alive时间间隔内接收到客户端的任何包,那么就判断broker处于半连接,这个时候broker会主动断开和客户端的连接;
(2)如果broker接收到来自客户端的pingreq协议包,必须发送pingresp协议包响应客户端。

客户端接管机制

当broker处于半连接状态时,客户端重连或者开启新的连接,那么broker就会开启客户端接管机制,断开旧的连接,开始一个新的连接,这个操作可以避免客户端因为broker处于半连接状态而无法连接问题。

mqtt数据包

mqtt数据包包含三部分:固定头部、可变头部、有效负载。
1.固定头部
固定头部包含消息类型、重复分发标志DUP、Qos级别和保留标志位retain。
2.可变头部
可变头部的长度是可变的,根据消息类型和保留标志的不同而不同,可能包含消息ID等。
3.有效负载
根据消息类型和保留标志的不同而不同,可能包含消息的内容等。
拓展:
connect消息数据包:
(1)固定头部:包括connect消息类型(连接请求、发布消息、订阅主题、取消订阅主题等);
(2)可变头部:包括协议类型、协议版本、连接标志和保持连接时间等参数;
(3)有效载荷:包括客户端标识、账号、密码等相关连接信息。
publish消息数据包:
(1)固定头部:包括publish的消息类型,Qos级别和保留标志位;
(2)可变头部:包含主题名称;
(3)有效载荷:包含要发布的消息数据。
subscribe消息数据包:
(1)固定头部:包含subscribe的消息类型,Qos级别和保留标志位;
(2)可变头部:包含消息ID;
(3)有效载荷:包含要订阅的主题列表和Qos级别。
unsubscribe消息数据包:
(1)固定头部:包含unsubscribe的消息类型、Qos级别和保留标志位;
(2)可变头部:包含消息ID;
(3)有效载荷:包含取消订阅的主题列表和Qos级别列表。
puback、pubrec、pubrel和pubcomp消息数据包:
(1)这些消息用于Qos 1和Qos 2级别的消息传递机制,保证了消息传递的可靠性;
(2)固定头部和可变头部包含了消息类型和消息ID;
(3)无有效载荷。

mqtt通信十四种不同的控制帧

1.客户端发送connect连接请求;
2.代理服务端发送connack连接请求响应;
3.客户端发送publish发布请求;
4.代理服务端发送puback发布请求响应;
5.客户端发送pubrec发布收到(保证交付第一步);
6.客户端发送pubrel发布释放(保证交付第二步);
7.服务端发送pubcomp发布完成(保证交付第三步);
8.客户端发送subscribe订阅请求;
9.代理服务端发送suback订阅请求响应;
10.客户端发送unsubscribe取消订阅请求;
11.代理服务端发送unsuback取消订阅请求响应;
12.客户端发送ping保活命令,确保与代理服务端是相互连接,而不是半连接;
13.客户端发送disconnect断开连接请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值