物联网通信之初识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协议_第1张图片

三、MQTT协议数据表示

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


四、MQTT协议控制报文格式

1.MQTT协议通过交换预定义的MQTT控制报文来进行通信。
物联网通信之初识MQTT协议_第2张图片
注:PUBREC、PUBREL、PUBCOMP都只有在QoS等于2的时候才会使用。
2.MQTT控制报文的结构
第一部分:固定报头,所有控制报文都含有这个固定报文。
第二部分:可变报头,部分控制报文才含有这个可变报文。
第三部分:有效载荷,部分控制报文才含有这个有效载荷。
3.固定报头
物联网通信之初识MQTT协议_第3张图片
MQTT控制报文的第一个字节的高四位用来表示控制报文的类型,也就是表格2-1中的值,低四位用来指定控制报文类型的标志位,如下图表格2.2,出发布消息publish之后,其他每个控制报文的四个bit都是固定的。第二个字节开始就是剩余长度,表示当前报文剩余部分的字节数,包括可变报头和有效载荷的数据。
也就是说只有知道剩余长度是多少,才能知道MQTT控制报文到哪里才能结束。剩余报文不包括剩余长度字段本身的字节数。剩余长度字符使用一个变长度编码方案,只有低7位有效位用于编码数据,最高位有效位用于指示是否有更多的字节。最多有四个剩余字节。
物联网通信之初识MQTT协议_第4张图片
4.可变报头
有些MQTT控制报文包含一个可变报文部分,可变报文子在固定报头和有效载荷之间。
报文标识符
重发消息所用到的报文标识符,如果客户端要重发控制报文,重发的报文必须和之前的报文使用相同的标识符。当客户端处理完报文对应的确认后,这个报文标识符就可释放重用。
包含报文标识符的控制报文有:PUBLISH(QoS > 0时), PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE, SUBACK,UNSUBSCIBE,UNSUBACK。
在这里插入图片描述
注:客户端和服务端彼此独立地分配报文标识符,所以客户端服务端组合使用相同的报文标识符可以实现并发的消息交换。
5.有效载荷
对publsh报文来说,有效载荷就是应用消息。


五、服务质量等级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的值。


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

你可能感兴趣的:(物联网通信,物联网,socket)