深度剖析MQTT协议的整个通讯流程

http://www.elecfans.com/d/587483.htmlhtml

 

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

在尚未深刻去了解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捕到的数据eclipse


 

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

上面的解析出来的MQTT协议包的内部,下面是对应的二进制数据,这里咱们能够对照附件上资料去了解协议的内容。看这里,你们想是否是若是本身用TCP,再封装发送下面的二进制数据就能够完成MQTT的登陆了呢?拿出网络调试助手来,ping下m2m.eclipse.org获得IP地址,用端口号1883链接,而后发送Wireshark捕到的MQTT登陆协议的二进制数据,能够看到到服务器回应了 20 02 00 00 表示登陆成功。工具

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

接下来看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、一、2三个等级,简单来讲是等级越高越可靠。QoS0,就是推送以后就完事了,至于对方有没有收到,收到是什么,数据有没有丢失,都无论。

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

相关文章
相关标签/搜索