【ESP8266个人学习笔记】六、MQTT协议与网络协议

要想了解MQTT就必须先了解TCP协议,要想了解TCP协议就要先了解网络七层协议:

【ESP8266个人学习笔记】六、MQTT协议与网络协议

解释和翻译一下就是:

应用层 用应用将文件打包
表示层 将文件加密或数据转换
会话层 开始、停止文件传输,可以确保传输秩序
传输层 传输文件到网络上
网络层 赋予文件一个网络地址
链路层 让网站识别这个地址
物理层 网站接受这个文件

我们听过的IP协议就在第三层,它负责为数据分配IP地址。TCP协议在第四层传输层,全名为Transmission Control Protocol。因为TCP协议需要经过完整的七个流程,所以它在数据传输时虽然慢一些,但是可靠,不会发生数据丢失。而UDP协议(User Datagram Protocol)因为省掉了会话层和链路层,尽管它快一些,但是不能确保数据的接受。TCP的使用需要两个支持TCP的设备,通常是一个客户端,一个服务端,这两个设备会经过“三次握手四次挥手”,这是什么意思呢?

“三次握手四次挥手”

三次握手:

  1. 发送端首先发送一个带有SYN(synchronize)标志地数据包给接收方。
  2. 接收方接收后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了。
  3. 最后,发送方再回传一个带有ACK标志的数据包,代表我知道了,表示’握手‘结束。

目的是确保双方都“在线”并完成传输过程。

四次挥手:

  •  第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  •  第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
  •  第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  •  第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手

意思是:

  1. 客户端:我已结束数据接受
  2. 服务端:收到你已结束接受,等我结束传送
  3. 服务端:我已结束数据传送
  4. 客户端:结束我们的通讯

目的是确认数据已传输完成并结束通讯。

MQTT:TCP的变种

为什么要用MQTT?

MQTT是基于TCP传输层的应用层协议,你可以简单理解为MQTT一个论坛,有发布者也有订阅者,几万台设备发布同一个信息也可以,几万台设备订阅同一条信息也可以。MQTT协议最初用来在石油管道上的传感器向卫星传输数据状态,其协议设计之初是为了适应比较恶劣的网络环境。MQTT的不同消息类型有不同消息头和不同荷载,相比于TCP和HTTP固定的报头更加轻量、传输字节少。更重要的是MQTT的”发布/订阅(Publish/Subscribe)“模式更适合物联网应用场景。

发布/订阅 模式

MQTT同样具有客户端和服务端,不过它改变了TCP协议的模式,上文提到在TCP端口中要进行”三握手四挥手“,我们来看看MQTT要经行怎样通讯。

1、客户端:一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以:

  • 发布其他客户端可能会订阅的信息;
  • 订阅其它客户端发布的消息;
  • 退订或删除应用程序的消息;
  • 断开与服务器连接。

2、服务端:MQTT服务器以称为"消息代理"(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它可以:

  • 接受来自客户的网络连接;
  • 接受客户发布的应用信息;
  • 处理来自客户端的订阅和退订请求;
  • 向订阅的客户转发应用程序消息。

简单过程为:

设备1先连接TCP服务器,然后规定个协议,告诉TCP服务器我订阅的主题是aaaaa,这样呢服务器就记住了,当出现消息前面的主题是aaaaa的消息的时候,他就把这个消息发给设备1。

然后设备2连接上TCP服务器以后呢,这样发送信息(假设发送的消息是123456):   aaaaa123456。

服务器一接收到客户端的消息,就取出来这个消息的标识是什么,取出来的是 aaaaa,然后呢,看下记录的谁需要消息标识是aaaaa的消息,然后找到了设备1,最后把这个消息发送给设备1这个客户端,然后手机1就接收到了1123456这个消息。

怎么连接上MQTT软件呢?

  1. 首先我们知道这就是个TCP服务器,所以呢,需要先用TCP连接上他们的服务器。
  2. 我们用Android ,C#,QT,网页等等连接MQTT服务器的时候有现成的封装好的库可以用,说白了就是调用函数而已。
  3. 对于单片机而言要想实现MQTT通信,那么就需要借助网络模块,大部分的网络模块都可以实现TCP通信,我们就需要在TCP的基础上按照MQTT协议封装下我们的数据。

 

此篇为简单介绍,关于MQTT,还有安装MQTT、连接MQTT、通过MQTT远程控制甚至搭建MQTT服务器等等要学。