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,发布消息,那么按照发布消息的消息格式发送就可以。
客户端想要接收服务器的消息,就是接收消息了,这个需要在连接成功后就发送给服务器。意思就是:我们使用的微信,上面有很多的公众号。但是你怎么样才能受到这些公众号的消息呢,你得先关注这些公众号。同理,这里的服务器有很多的消息,你想要接收那部分的,就需要向服务器发送那部分消息的公众号才可以接收。
MQTT协议以及库函数说明的更多相关文章
- 海鑫智圣:物联网漫谈之MQTT协议
什么是MQTT协议 MQTT(消息队列遥测传输协议)是IBM在1999年专门针对物联网等应用场景来制订的轻量级双向消息传输协议,它主要是为了解决物联网上使用到的设备的互相通信的问题,以及这些设备与后端 ...
- 基于MQTT协议进行应用开发
官方协议有句如下的话来形容MQTT的设计思想: "It is designed for connections with remote locations where a "sma ...
- 云巴:基于MQTT协议的实时通信编程模型
概要 有人常问,云巴实时通信系统到底提供了一种怎样的服务,与其他提供推送或 IM 服务的厂商有何本质区别.其实,从技术角度分析,云巴与其它同类厂商都是面向开发者的通信服务,宏观的编程模型都是大同小异, ...
- MQTT协议(一)
MQTT(Message Queue Telemetry Transport),遥测传输协议,提供订阅/发布模式,更为简约.轻量,易于使用,针对受限环境(带宽低.网络延迟高.网络通信不稳定),可以简单 ...
- MQTT协议的简单介绍和服务器的安装
最近公司做的项目中有用到消息推送,经过多方面的筛选之后确定了使用MQTT协议,相对于XMPP,MQTT更加轻量级,并且占用用户很少的带宽. MQTT是IBM推出的一种针对移动终端设备的基于TCP/IP ...
- MQTT协议学习笔记
1.前沿 万物联网的时代即将到来,物联网也由当初的概念开始进一步落实.随着无线网络技术飞速发展,各种设备都可以连接网络,实现远程控制.例如智能家居最近非常火爆,智能插座.智能LED灯.智能摄像头等.在 ...
- 【转载】MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用
http://blog.csdn.net/xukai871105/article/details/39252653 0 前言 MQTT是IBM开发的一个即时通讯协议.MQTT是面向M2M和物联 ...
- 转:XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较
一.先看下相关国外的专业数据对四大协议的比较: Protocol CoAP XMP ...
- 物联网MQTT协议分析和开源Mosquitto部署验证
在<物联网核心协议—消息推送技术演进>一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信.Ajax轮询.Websocket.MQTT.CoAP等,其中MQTT协议为IBM制定 ...
随机推荐
- NYOJ--703
原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=703 分析:先考虑不受限制的情况,此时共可以修n*(n-1)/2条隧道:所有的place组 ...
- jre,jdk,jvm的关系
今天在用maven搭建项目工程的时候出错的原因竟然是因为使用了jre,而非jdk导致报错,这里就搜集了有关这方面的信息: JDK(Java Development Kit)是针对Java开发员的产 ...
- [LeetCode] 27. Remove Element ☆
Given an array and a value, remove all instances of that value in place and return the new length. D ...
- Laravel是怎么实现autoload的?
用了一阵Laravel后发现很少有include和require,觉得有点奇怪,思考Laravel是怎么完成文件导入的. 其实Laravel依旧还是用include或者require的,只是都写在一个 ...
- 部署维护docker环境
其实前面已经用salt,安装部署了docker应用环境了,过程中还是遇到了不少问题,所以这里再相对仔细的记录一下,docker手机安装过程应注意的事情 安装过程部分参考了刘天斯大师文档部署 1,安装环 ...
- MagicB.0—怎样设置电脑自动关机?
天太晚了,该睡觉了,可是你的东西也许正在下载,软件正在更新,总之电脑还有一些工作没有完成,又不需要你人为的守着,随他去吧!可是电脑已经工作了一天了,它也要休息一下,再者也不能浪费电力资源呀,那么就来使 ...
- 使用Forms Authentication
using System; using System.Web; using System.Web.Security; namespace AuthTest { public class Aut ...
- 阿里云 配置FTP 无法连接问题,2017年7月后
被阿里云坑飞,2017年7月上线的安全组,我压根不知道 新服务器 配置防火墙后怎么也不起作用,也暂时关不了防火墙 iptables stop #无效 搞了半天 才知道TM 不需要在linx服务器上自 ...
- javaScript 中的一些日常用法总结
从今天开始把开发中常用到的js语法 一一记录下来 方便以后复习回顾用: 1:对字符串进行替换 replace 以及 replaceAll replace : var begin_date =begin ...
- Sublime之插件的安装(三)
今天在写js的时候,突然想到一个问题就是能不能快速的对齐的插件,当当当~~~sublime这么神器当然有,那就是:Alignment插件 如果你写的代码是这样的: var a = , b =, ccc ...