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制定 ...
随机推荐
- php前后端分离项目跨域问题解决办法
由于之前一直没有做过前后端分离项目,导致走了不少弯路,而且还采用了一种及其不优雅的方法 (在第一次请求的时候把服务器返回的session id保存起来,后续请求的时候把该session id作为参数传 ...
- hexo搭建个人博客
本文讲述如何用`hexo`搭建个人博客,并托管到`github`.不需要租赁服务器,可完成网站博客的搭建. 安装Hexo安装hexo之前,要先下载安装Node.js和Git,百度搜索找到下载即可.[G ...
- linux shell学习一
本博客参考自: http://www.cnblogs.com/waitig/p/5523409.html <shell从入门到精通> 张春晓编著 Shell简介 Shell自身是一个用C ...
- Jquery 操作 Select 详解
jQuery是如何控制和操作select的.先看下面的代码 比如<select class="selector"></select> 1.设置value为p ...
- 816C. Karen and Game 贪心
LINK 题意:给出n*m的矩阵图,现有对行或对列上的数减1的操作,问最少几步使所有数变为0,无解输出-1 思路:贪心暴力即可.先操作行和先操作列结果可能不同注意比较. /** @Date : 201 ...
- JAVA多线程提高一:传统线程技术&传统定时器Timer
前面我们已经对多线程的基础知识有了一定的了解,那么接下来我们将要对多线程进一步深入的学习:但在学习之前我们还是要对传统的技术进行一次回顾,本章我们回顾的则是:传统线程技术和传统的定时器实现. 一.传统 ...
- Use of exceptionless, 作全局日志分布式记录处理
Download latest release of exceptionless on github and deploy on Window server, by default exception ...
- 登入时session的处理方式
暂时理解不够彻底 有空在详细介绍,先记录代码 1:创建一个工具类 存取当前登录用户 package com.liveyc.eloan.util; import javax.servlet.http ...
- 【leetcode 简单】 第五十三题 删除重复的电子邮箱
编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个. +----+------------------+ | Id | Email | +-- ...
- 郑轻校赛 2127 tmk射气球 (数学)
Description 有一天TMK在做一个飞艇环游世界,突然他发现有一个气球匀速沿直线飘过,tmk想起了他飞艇上有一把弓,他打算拿弓去射气球,为了提高射击的准确性,他首先在飞艇上找到一个离气球最近的 ...