搜索
查看: 23823|回复: 20

[原创] 物联网核心之MQTT(一)

  [复制链接]

该用户从未签到

11

主题

20

帖子

0

蝴蝶豆

高级会员

最后登录
2021-10-16
发表于 2017-8-24 08:42:50 | 显示全部楼层 |阅读模式


       MQTT,目前物联网的最主要的协议,基本所有收费的云平台都是基于MQTT协议,比如机智云,和所有的开放云平台比如中国移动的oneNet、百度的云平台也都支持MQTT的接入。虽然MQTT很火,但是目前对MQTT的很少,尤其是在如何移植到嵌入式上来。大部分的平台商的做法都是跟模块商合作把MQTT协议集成到WiFi模块跟GPRS模块里面,捆绑一销售,不让用户过多的了解物联网最核心的东西。
    在还没有深入去了解MQTT协议之前,总以为是非常复杂的东西,毕竟之前一直想深入,但无奈在浩淼的网络里居然找不到太多实质的资料。随时自己对物联网的不断探索,越来越了解整个物联网的架构,对MQTT了解越来越深入。在这篇文章中将带大家先了解MQTT的协议,在后面的文章,再带大家怎么移植MQTTSTM32上,再到怎么搭建自己的MQTT服务器。
      MQTT的基础知识这些大家通过百度知道都可以了解到,这里主要深入去剖析MQTT协议的整个通信流程。整个MQTT的知识大家可以去附件里的《MQTT OneNET实现.docx》,这个文档已经写的非常详细,但是如果只是看文字话,大家很难理解。因此我们借助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.fxjava开发的,电脑要安装JDK才能安装打开),一打开里面就默认有一个开源的MQTT服务M2M Eclipse。点开旁边的齿轮(设置按钮)可以看服务器的域名m2m.eclipse.org,端口号1833MQTT的默认端口号),下面还有个Keep Alive Interval就是心跳的时间。再打开Wireshark,选择要捕获的网络接口,然后再过滤器输入tcp.port==1883后回车,只捕获1883这个端口号的数据包。再点下MQTT.fxConnect连接服务器,就可以看到Wireshark捕到的数据
    可以看到MQTT协议中本地给服务器发送了一个Connect登录请求,然后,服务器回应一个ACK,表示登录成功。再双击Connect Command这条数据包,我们可以看到详细的数据包数据
    上面的解析出来的MQTT协议包的内部,下面是对应的二进制数据,这里我们可以对照附件上资料去了解协议的内容。看这里,大家想是不是如果自己用TCP,再封装发送下面的二进制数据就可以完成MQTT的登录了呢?拿出网络调试助手来,pingm2m.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(定阅等级),分012三个等级,简单来说是等级越高越可靠。QoS0,就是推送之后就完事了,至于对方有没有收到,收到是什么,数据有没有丢失,都不管。QoS1的话就
是你收到推送后,你还得返回一个puback给对方,告诉对方收到了,不然对方会以为你没收到,隔一段时间后重新给你推送,直到你给对方返回一个Puback为止。
    好了,基本的就写到这,剩下的大家可以根据这个方法对照文档去消化MQTT。后面的文章再教大家移植MQTT到单片机上,大家就可以实现远程的控制了,期待吧。
MQTT OneNET实现.docx.zip (811.24 KB, 下载次数: 1011)

评分

参与人数 5ST金币 +24 收起 理由
hchan + 1 很给力!
andeyqi + 6 很给力!
stayor -1 赞一个!
chuan199 + 8 很给力!
zhangxu56726 + 10 很给力!

查看全部评分

回复

使用道具 举报

该用户从未签到

43

主题

296

帖子

38

蝴蝶豆

金牌会员

最后登录
2022-3-31
发表于 2017-8-26 23:35:54 | 显示全部楼层
帮顶,正在用MQTT,MCU上实现的还没有找到支持TLS加密传输,暂时明码使用。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

11

帖子

0

蝴蝶豆

初级会员

最后登录
2020-4-20
发表于 2018-1-24 10:20:58 | 显示全部楼层
赞一个,楼主怎么没有更新呀
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2020-10-21
发表于 2018-2-8 15:12:05 | 显示全部楼层
赞一个
回复

使用道具 举报

该用户从未签到

0

主题

8

帖子

0

蝴蝶豆

初级会员

最后登录
2021-3-18
发表于 2018-2-28 17:29:19 | 显示全部楼层
谢谢分享
回复

使用道具 举报

该用户从未签到

64

主题

1138

帖子

140

蝴蝶豆

论坛元老

最后登录
2020-12-3
发表于 2018-2-28 20:36:39 | 显示全部楼层
赞一个
回复

使用道具 举报

该用户从未签到

39

主题

975

帖子

45

蝴蝶豆

论坛元老

最后登录
2021-3-21
发表于 2018-4-10 09:45:28 | 显示全部楼层
顶一个,666
回复

使用道具 举报

该用户从未签到

12

主题

496

帖子

111

蝴蝶豆

金牌会员

最后登录
2020-6-12
发表于 2018-4-10 10:19:23 | 显示全部楼层
虽然没有接触物联网,但要给你赞一个
回复 支持 反对

使用道具 举报

该用户从未签到

37

主题

2167

帖子

32

蝴蝶豆

论坛元老

最后登录
2023-2-9
发表于 2018-4-10 10:23:09 | 显示全部楼层
顶一个
回复

使用道具 举报

该用户从未签到

40

主题

250

帖子

92

蝴蝶豆

金牌会员

最后登录
2024-4-19
发表于 2018-4-26 13:07:29 | 显示全部楼层
有新的吗
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-26 17:43 , Processed in 0.218955 second(s), 47 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表