MQTT,目前物联网的最主要的协议,基本所有收费的云平台都是基于MQTT协议,比如机智云,和所有的开放云平台比如中国移动的oneNet、百度的云平台也都支持MQTT的接入。虽然MQTT很火,但是目前对MQTT的很少,尤其是在如何移植到嵌入式上来。大部分的平台商的做法都是跟模块商合作把MQTT协议集成到WiFi模块跟GPRS模块里面,捆绑一销售,不让用户过多的了解物联网最核心的东西。

在还没有深入去了解MQTT协议之前,总以为是非常复杂的东西,毕竟之前一直想深入,但无奈在浩淼的网络里居然找不到太多实质的资料。随时自己对物联网的不断探索,越来越了解整个物联网的架构,对MQTT了解越来越深入。在这篇文章中将带大家先了解MQTT的协议,在后面的文章,再带大家怎么移植MQTT到STM32上,再到怎么搭建自己的MQTT服务器。

MQTT的基础知识这些大家通过百度知道都可以了解到,这里主要深入去剖析MQTT协议的整个通信流程。但是如果只是看文字话,大家很难理解。因此我们借助Windows下的MQTT客户端MQTT.fx跟网络抓包工具Wireshark来一步步分析MQTT。

名字 流向 描述
CONNECT 1 C->S 客户端请求与服务端建立连接
CONNACK 2 S->C 服务端确认连接建立
PUBLISH 3 CóS 发布消息
PUBACK 4 CóS 收到发布消息确认
PUBREC 5 CóS 发布消息收到
PUBREL 6 CóS 发布消息释放
PUBCOMP 7 CóS 发布消息完成
SUBSCRIBE 8 C->S 订阅请求
SUBACK 9 S->C 订阅确认
UNSUBSCRIBE 10 C->S 取消订阅
UNSUBACK 11 S->C 取消订阅确认
PING 12 C->S 客户端发送PING(连接保活)命令
PINGRSP 13 S->C PING命令回复
DISCONNECT 14 C->S 断开连接

上面是MQTT的主要的通信协议,MQTT是基于TCP长连接,首先是先跟MQTT服务器建立TCP连接,然后发送登录请求,要保持长连接,还要定时发心跳包跟服务保持连接。我们先用MQTT.fx来登录开源的MQTT服务看看。

安装好MQTT.fx(注意MQTT.fx是java开发的,电脑要安装JDK才能安装打开),一打开里面就默认有一个开源的MQTT服务M2M Eclipse。点开旁边的齿轮(设置按钮)可以看服务器的域名m2m.eclipse.org,端口号1833(MQTT的默认端口号),下面还有个Keep Alive Interval就是心跳的时间。再打开Wireshark,选择要捕获的网络接口,然后再过滤器输入tcp.port==1883后回车,只捕获1883这个端口号的数据包。再点下MQTT.fx的Connect连接服务器,就可以看到Wireshark捕到的数据

可以看到MQTT协议中本地给服务器发送了一个Connect登录请求,然后,服务器回应一个ACK,表示登录成功。再双击Connect Command这条数据包,我们可以看到详细的数据包数据

上面的解析出来的MQTT协议包的内部,下面是对应的二进制数据,这里我们可以对照附件上资料去了解协议的内容。看这里,大家想是不是如果自己用TCP,再封装发送下面的二进制数据就可以完成MQTT的登录了呢?拿出网络调试助手来,ping下m2m.eclipse.org得到IP地址,用端口号1883连接,然后发送Wireshark捕到的MQTT登录协议的二进制数据,可以看到到服务器回应了 20 02 00 00 表示登录成功。

再往下Wireshark捕到的数据包,可以看到每隔一定的时间,本地向服务器发送Ping Request心跳包,相应的服务器也会回应Ping Response。

接下来看MQTT最核心的传输协议 Subcribe(定阅)和Publish(推送)。简单来说就是客户端口(比如物联网硬件)Subcribe一个topic(主题)后,其它的客户端(比如手机)向服务器往这个topic 推送 Payload(有效数据),服务器就会把Payload转发给定阅这个topic的客户端(硬件)。

这样就实现了客户端(手机)通过服务器(MQTT)远程发送数据给客户端(物联网硬件)。一样用MQTT.fx来实验。先点Subscribe然后面下面输入led再点旁边的Subscribe按钮来定阅led这个topic。然后回到Publish,一样在输入框输入led这个topic,下面大框就是输入要推送的数据,输入on,再点Publish按钮,就把数据推送出去了。再回到Subcribe界面来可以看到右边已经收到有推送过来的数据。如果这是硬件收到这个指令,就可以去控制点亮LED,我们就实现远程控制LED灯。

想深入了解MQTT这一个过程的话,我们再回到Wireshark,来看看捕获到的数据

具体的就不详细的分析了,大家看附件的文档来对照就可以很容易了解到。

最后来了解下QoS(定阅等级),分0、1、2三个等级,简单来说是等级越高越可靠。QoS0,就是推送之后就完事了,至于对方有没有收到,收到是什么,数据有没有丢失,都不管。

QoS1的话就是你收到推送后,你还得返回一个puback给对方,告诉对方收到了,不然对方会以为你没收到,隔一段时间后重新给你推送,直到你给对方返回一个Puback为止。

深度剖析MQTT协议的整个通信流程相关推荐

  1. SIM7600CE模块MQTT协议的AT指令流程

    最近在做一个采用SIM7600模块,做一个MQTT协议传输数据到服务器,这里我先简单介绍一下关于AT指令的流程,后面有时间我会详细介绍自己移植的底层MQTT协议在单片机上面的实现(用于某些模块没有内置 ...

  2. 深度剖析http协议(一)

    1.http协议介绍: (1)http协议是建立在tcp/ip协议基础之上 (2)http协议全称: 超文本传输协议 (3)http协议和1.0和1.1两种,即短连接和长连接(所谓长短是指持续的时间, ...

  3. MQTT 协议快速体验

    全球物联网正在高速发展,专门针对低带宽和不稳定网络环境的物联网应用设计的 MQTT 协议也因此得到广泛应用. MQTT 是一种基于发布/订阅模式轻量级消息传输协议,具有简单易实现.支持 QoS.报文小 ...

  4. IoT:MQTT协议详解

    IoT -- (七)MQTT协议详解 转自:https://blog.csdn.net/anxianfeng55555/article/details/80908795 MQTT是什么? MQTT(M ...

  5. MQTT协议及安全详解

    1.MQTT概念 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协 ...

  6. IoT -- (七)MQTT协议详解

    MQTT是什么? MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协 ...

  7. OpenHarmony 3GPP协议开发深度剖析——一文读懂RIL

    (以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 本文转载自:https://harmonyos.51cto.com/posts/10608 夏德旺 软通动力信息技术( ...

  8. 嵌入式网络那些事LwIP协议深度剖析与实战演练pdf

    下载地址:网盘下载 <嵌入式网络那些事:LwIP协议深度剖析与实战演练>面向网络TCP/IP协议初学者以及大量嵌入式网络开发人员,从当下流行的嵌入式网络协议栈LwIP的源代码入手,详细讲解 ...

  9. 计算机网络 | IP协议相关技术与网络总结 :DNS、ICMP、DHCP、NAT/NAPT、通信流程

    IP协议相关技术与网络总结 DNS DNS与域名 域名服务器 域名的解析流程 ICMP ping NAT/NAPT NAT NAPT NAT的缺陷 代理服务 DHCP 通信流程 浏览器中输入url后, ...

  10. 原理简介_消息通信的利器MQTT协议简介及协议原理

    - 没用过但是必须得知道系列 - 前言: 相比于 XMPP, MQTT 的简单轻量受到了不少工程师的喜爱,从物联网到传统的消息服务,简单可依赖的 MQTT 到底为何让人如此着迷呢? MQTT 协议-M ...

最新文章

  1. blob转file对象_C++核心准则C.41:构造函数生成的对象应该被完全初始化
  2. 更改setting文件的mirror_setting.xml的mirror、mirrorOf和pom.xml的repositories、repository的关系关联*...
  3. 为什么手机网速太慢_为什么手机信号满格,网速却很慢?终于知道为啥了
  4. PHP通过文件存储来实现缓存
  5. 研究相机和IMU坐标系变换
  6. mysql提示太多连接_mysql数据库提示连接太多怎么办
  7. Papar Notes List
  8. 计算机图形学E7——裁剪-交互式Liang-Barskey矩形窗口裁剪直线
  9. c语言i=5.6a=(int)i,第一章C语言概述.ppt
  10. potplayer 多个进程_什么是进程
  11. JSP标签,jsp:include,jsp:forward用法介绍及示例
  12. android dff播放器,无损音乐解码播放器
  13. linux/unix系统下IOZONE/iozone磁盘性能测试工具方法
  14. 计算机专业考研410分,从一个中专生到考研410分的历程
  15. 经典!智能车牌识别称重系统解决方案
  16. 让制作APP变成搭积木
  17. 软文推广:真实有效提升软文排名与收录的三大方法!
  18. 手机病毒的剖析与防治
  19. 毕业设计《软件工程》教学网站的设计与实现ASP+SQL Sever2000
  20. 重学JavaSE 第11章 : 常用类API、String、日期API、比较器、BigDecimal、System等

热门文章

  1. MySQL 优化1
  2. HTML day02(html列表与菜单的制作)
  3. Spring中的两种AOP织入方式
  4. HDU-3072-IntelligenceSystem(tarjan,贪心)
  5. 移动端图片裁剪上传—jQuery.cropper.js
  6. 推荐系统在房产领域的实践
  7. js 正则表达式总结
  8. 抗压力就是一切!!!
  9. mooc-IDEA 应用快捷键自动创建测试类--010
  10. 探究CSS中border-top属性的使用