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,发布消息,那么按照发布消息的消息格式发送就可以。

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

时间: 2024-08-29 11:33:17

MQTT协议以及库函数说明的相关文章

物联网MQTT协议分析和开源Mosquitto部署验证

在<物联网核心协议—消息推送技术演进>一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信.Ajax轮询.Websocket.MQTT.CoAP等,其中MQTT协议为IBM制定并力推,其具有开放.简单.轻量级以及易于实现的特点使得其即便在资源受限的环境中也能得到很好的使用,比如运行在资源紧缺型的嵌入式系统中或网络带宽非常昂贵的环境中,除此之外,它也被广泛用于遥感勘测.智能家居.能源监测和医疗应用程序等各个领域,是物联网的重要组成部分,将来可能会成为物联网的事实标准. 本篇文章将帮助

MQTT协议简记

 一.定义 MQTT - MQ Telemetry Transport 轻量级的 machine-to-machine 通信协议. publish/subscribe模式. 基于TCP/IP. 支持QoS. 适合于低带宽.不可靠连接.嵌入式设备.CPU内存资源紧张. 是一种比较不错的Android消息推送方案. FacebookMessenger采用了MQTT. MQTT有可能成为物联网的重要协议. MQTT是轻量级基于代理的发布/订阅的消息传输协议,它可以通过很少的代码和带宽和远程设备连接.例

MQTT协议-----订阅

MQTT协议笔记之订阅      http://www.blogjava.net/yongboy/archive/2014/04/12/412351.html MQTT - chszs的专栏    http://blog.csdn.net/chszs/article/category/6262440 MQTT的学习研究(十一) IBM MQTT 简单发布订阅实例    http://blog.csdn.net/shayuye/article/details/17590497

物联网协议测评平台——吊兰使用指南-MQTT协议 Python Paho

在忙了一个周末之后,还是小有成果的.发布了一个简单的物联网平台: http://mqtt.phodal.com,简单地写一下使用指南. CoAP协议 使用Libcoap的话可以用 <code style="box-sizing: border-box; font-family: Consolas, Menlo, Monaco, 'Courier New', monospace; font-size: 1em; padding: 0px; color: inherit; border-top

Mqtt协议IOS端移植1

MQTTClient.h #import <Foundation/Foundation.h> @protocol MQTTDelegate <NSObject> /** * @brief 连接服务器 * * @param [in] N/A * @param [out] N/A * @return void * @note */ - (void) didConnect: (NSUInteger)code; /** * @brief 与服务器断开连接 * * @param [in] N

转:XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较

一.先看下相关国外的专业数据对四大协议的比较: Protocol                                    CoAP                         XMPP                                                  RESTful HTTP                                                                 MQTT Transport UDP TCP

IBM MQTT协议基本资料

原文链接:http://37iot.com/topic/5565a193d2dd2fc71da04f7c 初次听说MQTT还是在学习Android消息推送的时候,只是粗浅的了解,未曾深究.最近专注于IOT开发,在信息传递方面自然就想到了它. 相关资料: MQ 遥测传输 (MQTT) V3.1 协议规范:http://www.ibm.com/developerworks/cn/webservices/ws-mqtt/index.html 开源的mosquitto项目地址:http://mosqui

MQTT协议学习及实践(Linux服务端,Android客户端的例子)

前言 MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务.MQTT是专门针对物联网开发的轻量级传输协议.MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景.本文旨在研究其在消息发布/订阅/接收场景下的应用. MQTT协议中的几个重要概念 服务端 是发送消息的客户端和请求订阅的客户端之间的中介,又称

MQTT协议的使用

MQTT协议的使用: MQTT协议:是发布者,服务器(代理),客户(订阅者).之间通信的协议.客户通过MQTT协议,订阅自己的信息,订阅的内容给服务器.当需要有内容发布的时候,发布者将消息内容发送给服务器,服务器根据订阅了该消息的所有客户,将消息进行推送给所有订阅 该消息的客户(订阅者). MQTT协议在使用上,首先我们要将关于MQTT协议的代码弄到自己的工程中.这里只讲大致的使用过程,不确切的去讲. 首先要创建socket连接,这个和我们和网络通信的时候是一样的,首先都要去socket建立连接