物联网通信之初识MQTT协议

前言

不论使用哪种互联网接入方式,只要我们的设备可以通过UDP/TCP通信访问互联网上对应的IP地址的主机,那么理论上,当设备与云服务器建立UDP/TCP通信后,只要按照云服务 器所规定的通信协议(数据格式)发送/接受消息,我们的设备就能够接入云平台,实现物联网。
学习物联网的话mqtt协议就必须要熟悉,否则就像迷路的孩子,找不到回家的方向。
MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议,在实际物联网项目中有着举足轻重的地位。

一、关于MQTT术语

1.应用消息(message):MQTT协议通过网络传输应用数据,这个数据就称为消息。
2.客户端 (client),使用MQTT的程序或者设备,客户端总是通过网络连接到服务端。

  • 发布消息给其他客户端。
  • 订阅已请求接受的消息。
  • 取消订阅已移除接受消息的请求(取消订阅)。
  • 和服务端断开连接。
    注:一般情况下,云下设备就是客户端。
    3.服务端(server),一个程序或设备,作为发送消息的客户端和请求订阅的客户端之间的中介。
  • 接受来自客户端的网络连接。
  • 接受客户端发布的应用消息。
  • 处理客户端的订阅和取消订阅请求。
  • 转发应用消息个给符合条件的已订阅客户端。
    注:一般情况下,云平台就是服务端,服务端不是数据的终点,他只是数据的中转站。
    4.订阅(subscription),订阅包含一个主题过滤器(Topic Filter)和一个最大的服务质量(QoS)等级。订阅与单个会话关联。会话可以包含多于一个的订阅。会话的每个订阅都会有一个不同的主题过滤器。
    5.主题名(topic name),附加在应用消息上的一个标签,服务端已知且与订阅匹配。服务端发送给应用消息的一个副本,给每一个匹配的客户端订阅。
    6.主题过滤器(Topic filter),订阅中包含的一个表达式,用于表示的一个或多个主题。主题过滤器可以使用通配符。
    7.会话(session),客户端和服务端之间的状态交互。一些会话持续时长与网络连接一样,另一些可以在客户端和服务端的多个连续网络连接间扩展。
    8.控制报文(MQTT control packet),通过网络连接发送的信息数据包。MQTT规范定义了14种不同类型的控制报文,其中publish报文用于传输应用消息。
    小注:在实际开发过程中,这些概念要理解才能应用。

二、MQTT协议特点

  • "轻量级"通信协议:实现MQTT协议的开销比较小,不需要太多的额外数据。
  • 基于TCP/IP协议:建立TCP连接后,云下设备和云平台按照MQTT协议规定的数据格式(一般是JSON)来通信(属于应用层)。
  • 基于客户端-服务端模式:云下设备=客户端,云平台=服务端。
  • 基于消息发布(publish)和消息订阅(subscribe)模式。
    http->请求/回答模式:类似与打电话,只有你打电话给朋友,需要等待朋友接电话才可以交流。
    mqtt->发布/订阅模式:类似邮件的发送,你可以向你的朋友发送邮件,发送后你就不用管了,服务器会将邮件发送给你的朋友,朋友收到邮件后,随时可以查看邮件。
    发布/订阅模式解耦了发布者和订阅着之间的联系,这就意味着发布者和订阅者之间并不需要直接建立联系。(实际上通过MQTT服务器建立联系的)
    举个栗子:
    如下图:在上图中,假如客户端C和客户端B订阅了MQTT服务端的主题topic,客户端A向MQTT服务端发布了一个topic主题参数的消息,那么这个MQTT服务端就会将消息分发给客户端B和客户端C,因为客户端B和客户端C都向MQTT服务器订阅了这个主题topic。当然客户端A也可以订阅MQTT服务端的主题,客户端B和客户端C也可以向MQTT服务器发布消息。虽然在逻辑上三个客户端之间通信,但是在网络连接方面,客户端A只和MQTT服务端建立网络连接,同理其他两个客户端也是只和MQTT服务端建立网络连接。
    在这里插入图片描述

三、MQTT协议数据表示

MQTT协议中控制报文的文本字段的编码为UTF-8格式的字符串。
MQTT协议规定,每一个字符串都有以两字节的长度字段作为前缀,两字节的前缀给出这个字符串utf-8编码的字节数。


四、MQTT协议控制报文格式

1.MQTT协议通过交换预定义的MQTT控制报文来进行通信。
在这里插入图片描述
注:PUBREC、PUBREL、PUBCOMP都只有在QoS等于2的时候才会使用。
2.MQTT控制报文的结构
第一部分:固定报头,所有控制报文都含有这个固定报文。
第二部分:可变报头,部分控制报文才含有这个可变报文。
第三部分:有效载荷,部分控制报文才含有这个有效载荷。
3.固定报头
在这里插入图片描述
MQTT控制报文的第一个字节的高四位用来表示控制报文的类型,也就是表格2-1中的值,低四位用来指定控制报文类型的标志位,如下图表格2.2,出发布消息publish之后,其他每个控制报文的四个bit都是固定的。第二个字节开始就是剩余长度,表示当前报文剩余部分的字节数,包括可变报头和有效载荷的数据。
也就是说只有知道剩余长度是多少,才能知道MQTT控制报文到哪里才能结束。剩余报文不包括剩余长度字段本身的字节数。剩余长度字符使用一个变长度编码方案,只有低7位有效位用于编码数据,最高位有效位用于指示是否有更多的字节。最多有四个剩余字节。
在这里插入图片描述


五、服务质量等级QoS

QoS表示MQTT客户端向MQTT服务端发布消息或者MQTT服务端向MQTT客户端分发消息的服务质量等级。QoS只能由三种取值(0,1,2)。
1.QoS=0表示消息最多发送一次。
也就是发送方发送消息,接受方不会发送响应,发送者也不会重试(因为最多只发送一次,发送方就把这一次的机会占用了,所以接受方是不会发送消息的)。所以消息可能送达一次也可能根本没有送达。
2.QoS=1表示消息至少发送一次。
发送方发送消息,需要等待接受方的应答,如果接受方没有发送应答,发送方会尝试再次发送消息,所以消息最少被发送一次。
3.QoS=2表示消息仅仅发送一次。
使用控制报文中PUBREC、PUBREL、PUBCOMP类型实现仅仅发送一次。
注:百度云、腾讯云、阿里云支持QoS为0和1的服务质量,不支持QoS为2的服务质量,所以只是了解QoS为2即可。
4.提醒
发布消息和订阅主题的QoS服务质量是不相关的,也就是发布消息和订阅主题有着自己的服务质量等级QoS.
发布消息QoS:客户端发布消息到服务端的服务质量等级。
订阅主题QoS:服务端分发消息到客户端时消息的服务质量等级。

注:使用QoS服务质量等级,根据消息是否需要应答来决定QoS的值。


**逆水行舟不进则退,有问题在下方评论或者私聊我一直在,一起进步!**

猜你喜欢

转载自blog.csdn.net/JIANGYINGH/article/details/106795838