MQTT

Summary: Author: 张亚飞 | 阅读时间: 2 minute read | Published: 2015-09-22
Filed under Categories: LinuxTags: Note,

关于 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协议后将要发出去的字符串:

0x100x2d0x000x04'M''Q''T''T'0x040xc20x0b0xb80x000x10
'4''0''F'''0'6''0''0''0''5''0''8''0''4''0''5''0'0X000X05
'a''d''m''i''n'0x000x08'p''a''s''s''w''o''r''d'

一共是47个字符.

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

0x10(00010000):低四位是保留位,默认都是0.

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

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

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

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

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

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

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

每一位的意思手册上有.

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

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

Willflag:这里我们不用这一位,这一位不设置,后面的willQOS和willretain都不用设置.

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

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

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

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

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

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

0X000X05admin0x000x08password

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

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

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

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


MQTT 物联网相关

Comments

Cor-Ethan, the beverage → www.iirii.com