你的位置:首页 > 操作系统

[操作系统]MQTT协议以及库函数说明


内容简介:之前我们写了一篇ESP8266AT指令的说明文档,在客户端连接上服务器之后,接下来便是网络通信。为此我们又写了这一片MQTT协议的说明文档,更加深层次的讲述了通信的原理。此文档只是我们在调试过程中的一些小结和经验,所以并不是规范的设计手册。如果想要使用了解MQTT协议,一定是要仔细看到他的手册的。如果发现文中有写错的地方也希望指出,我们会改正,并且在我们的公众号“眼湖云”中更新。

图片没法贴上来,所以需要结合手册来看。

 

我们的网络通信通过三部分,网关(ESP8266),MQTT协议,服务器。

在通过ESP8266连接上服务器之后,下面就要通过MQTT进行通信。MQTT协议最新的版本是MQTT-3.1.1-CN,这个可以上网去下载,不过我们建议将MQTT-3.1protocol-Specific中文版也下载下来,两份一起看,比较详细。还有MQTT的源码,网上也有的下载。

简单点来说,MQTT协议就是将你要发送的内容按照它的规定组成一串字符串,然后发送出去,至于服务器接收到了怎么解析就不是我们玩嵌入式的人管的了。

MQTT协议一共有14个消息类型:

1.客户端请求连接到服务器; 2.连接确认; 3.发布消息;4.发布确认;5.发布信息收到;6.发布信息分发;7.发布完成 ;8.客户端订阅请求;9.订阅确认;10.客户端取消订阅请求;
11.取消订阅确认;12.ping请求;13.ping响应;14.客户端正在断开连接;

而他们的发送格式都是一样的,一共有三部分组成:

固定报头,可变报头,有效载体

具体的每一种的意思可以查看手册,我们这里只用到其中的三种,分别是1,3,8。接下来我们讲讲这三种消息类型。

一、客户端请求连接服务器。

客户端连接到服务器之后,客户端发送给服务器的第一个报文(第一个字符串,也就是消息类型)必须是第一个消息类型,也就是上面列出来的第一个消息类型,客户端请求连接到服务器(connect)。

那么我们该送什么样的字符串呢,其实手册上已经列了出来怎么发送,它的格式都是定死的。

我们给出一个字符串,也就是经过MQTT协议后将要发出去的字符串:

0x10  0x2d  0x00  0x04  ‘M’  ‘Q’  ‘T’  ‘T’  0x04  0xc2  0x0b  0xb8  0x00  0x10  

‘4’  ‘0’  ‘F’  ‘’0  ‘6’  ‘0’  ‘0’  ‘0’  ‘5’  ‘0’  ‘8’  ‘0’  ‘4’  ‘0’  ‘5’  ‘0’  0X00  0X05

‘a’  ‘d’  ‘m’  ‘i’  ‘n’   0x00   0x08  ‘p’   ‘a’   ‘s’   ‘s’   ‘w’   ‘o’   ‘r’   ‘d’ 

   一共是47个字符。

 

1.开头的两个字符。0x10  0x2d   这两个字节就是固定报头。固定报头只有两个字节,每个字节八位。每一位都有它代表的意思。

0x10 (0001 0000):  低四位是保留位,默认都是0。

                             高四位则是代表这个字符串是第一种消息类型,括号里的1就是它的号码代,手册里有详细的表格。

0x2d (0010 1011):  这个字节是剩余长度,也就是这个字节之后,多有字节的个数(可变报 头+有效载体),我们这里一共47个字符,减去这两个,就是45个,十 六进制就是0x2d

 

2.接下来是可变报头,可变报头由四个部分组成:协议名,协议级别,连接标志和保持连接

 

协议名有六个字节,也就是接下来的0x00  0x04  ‘M’  ‘Q’  ‘T’  ‘T’  

    0x00  0x04 这是一组,代表后面的协议名的长度,我们这里协议名便是MQTT,长度4

协议级别一个字节 0x04 。这个在手册中给出了这个固定的数据,也就是这个协议的版本的代表。

连接标志一个字节:0xc2   (1100 0010)

每一位的意思手册上有。

Clean Session:服务器在断开连接后,是不是要保存客户端的信息,我们保存,设为0。

也就是如果我们的ESP8266在发消息时突然断开了,接着又连了上来,那么服   务器接着断开时的状态接续发送。

Willflag:这里我们不用这一位,这一位不设置,后面的will QOS 和 will retain都不用设置。

Username 和 password 就是进入你的服务器的账号和密码了。我们这里用到了,所以这两位都是1.

 

最后是保持连接,两个字节,0x0b  0xb8。 这个讲起来比较多,我们这里简单解释一下,详细的需要自己看手册,专门有讲解。保持连接也就是心跳,即多长时间检查一下是否还发消息和是否保持着连接,我们这两个字节就是设置的这个时间。

 

3.接下来就是有效载体,包括客户端标识符,遗嘱主题,遗嘱消息,用户名,密码

客户端标识符:0x00 0x10 40F0600050804050    前面两个字节就是代表标识符的长度,后面的40F......就是客户端标识符,代表着哪一个客户端,这个自己根据自己的设计来决定。

遗嘱主题,遗嘱消息我们都没有。

接下来的就是用户名和密码。

0X00  0X05  admin   0x00   0x08   password  

这个的意思不讲也应该知道了,不再说了。

 

二、第一步的connect完成后,就是请求连接成功了。

接下来就是发布消息和接收消息,这两个不再详细展开,他们的格式都是和上面的第一步一样的,设置值根据手册中的数据设置就可以。

简单解释一下,客户端向服务器传消息,就是publish,发布消息,那么按照发布消息的消息格式发送就可以。

客户端想要接收服务器的消息,就是接收消息了,这个需要在连接成功后就发送给服务器。意思就是:我们使用的微信,上面有很多的公众号。但是你怎么样才能受到这些公众号的消息呢,你得先关注这些公众号。同理,这里的服务器有很多的消息,你想要接收那部分的,就需要向服务器发送那部分消息的公众号才可以接收。