【ESP8266个人学习笔记】六、MQTT协议与网络协议
要想了解MQTT就必须先了解TCP协议,要想了解TCP协议就要先了解网络七层协议:
解释和翻译一下就是:
应用层 | 用应用将文件打包 |
表示层 | 将文件加密或数据转换 |
会话层 | 开始、停止文件传输,可以确保传输秩序 |
传输层 | 传输文件到网络上 |
网络层 | 赋予文件一个网络地址 |
链路层 | 让网站识别这个地址 |
物理层 | 网站接受这个文件 |
我们听过的IP协议就在第三层,它负责为数据分配IP地址。TCP协议在第四层传输层,全名为Transmission Control Protocol。因为TCP协议需要经过完整的七个流程,所以它在数据传输时虽然慢一些,但是可靠,不会发生数据丢失。而UDP协议(User Datagram Protocol)因为省掉了会话层和链路层,尽管它快一些,但是不能确保数据的接受。TCP的使用需要两个支持TCP的设备,通常是一个客户端,一个服务端,这两个设备会经过“三次握手四次挥手”,这是什么意思呢?
“三次握手四次挥手”
三次握手:
- 发送端首先发送一个带有SYN(synchronize)标志地数据包给接收方。
- 接收方接收后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了。
- 最后,发送方再回传一个带有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状态,完成四次挥手
意思是:
- 客户端:我已结束数据接受
- 服务端:收到你已结束接受,等我结束传送
- 服务端:我已结束数据传送
- 客户端:结束我们的通讯
目的是确认数据已传输完成并结束通讯。
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软件呢?
- 首先我们知道这就是个TCP服务器,所以呢,需要先用TCP连接上他们的服务器。
- 我们用Android ,C#,QT,网页等等连接MQTT服务器的时候有现成的封装好的库可以用,说白了就是调用函数而已。
- 对于单片机而言要想实现MQTT通信,那么就需要借助网络模块,大部分的网络模块都可以实现TCP通信,我们就需要在TCP的基础上按照MQTT协议封装下我们的数据。
此篇为简单介绍,关于MQTT,还有安装MQTT、连接MQTT、通过MQTT远程控制甚至搭建MQTT服务器等等要学。