切换到宽版
  • 5934阅读
  • 29回复

[ARM]基于STM32 ESP8266 AT指令的MQTT 移植 [复制链接]

上一主题 下一主题
离线sangarr
 

发帖
27
M币
44
专家
0
粉丝
6
基于STM32F103 ESP8266(AT 命令版本)的MQTT移植步骤
——仅以此文,向“浅雪云传感器全套安装包”的作者致敬!

1、移植背景
2、MQTT协议通信过程
2.1 客户端连接TCP
2.2 客户端连接MQTT服务器
2.3 客户端订阅
2.4 客户端发布
3、移植过程
3.1 下载MQTT C语言固件包
3.2 需要用户实现的函数
3.3 测试及优化
其实代码已经移植完毕了,用stm32f103vet6和esp8266实现的。由于工作关系,现在时间不是很宽裕,不能一次将移植过程写完,但是我一定会完善这个帖子,把整个移植的过程尽量详细的分享给大家,共同进步。
每天下班后,我会更新一些内容,争取尽早完成我在本社区的第一篇帖子。
下面是移植后的截图,先分享一下
MQTT接收到的数据


下面是软件模拟发送,客户端(单片机)收到的数据




今天先写到这里,明天继续。
[ 此帖被sangarr在2018-05-22 21:26重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共2条打赏M币+33
tempchar M币 +20 曾经我想用at指令实现mqtt,琢磨了字符串处理、状态机发现太tmd难写了!果断放弃,用nodemcu重写at固件 06-04
wenxueroom M币 +13 祝早日更新完 05-30
离线widjrerpfnvd

发帖
974
M币
1627
专家
5
粉丝
26
只看该作者 1楼 发表于: 05-21
写完,估计要上精华啦

内容来自Android手机客户端

离线zhuoyi45

发帖
2
M币
863
专家
0
粉丝
0
只看该作者 2楼 发表于: 05-22
8266直接就可以用,我感觉8266本身比32强大
离线sangarr

发帖
27
M币
44
专家
0
粉丝
6
只看该作者 3楼 发表于: 05-27
如果对本帖有任何疑问,请留言。我一定知无不言言无不尽。本次用到的所有资料,会放在云盘里,https://pan.baidu.com/s/1A0Gg9v1R5IF_ADxq7MvprQ
另外,会回答上期的问题。
关于为什么不用ESP8266直接移植MQTT,而要用单片机。这个正是我们这次工程的移植背景。
1、移植的背景——学习AT指令控制上网模块
随着近年来物联网的普及,尤其是NBIOT等低功耗上网模块的出现,都需要AT指令来驱动。所以,本文主要想学习一下AT命令,用AT命令的方式来实现和服务器的连接。有了这套AT指令系统,以后不管是GPRS、4G、还是NBIOT,都可以通用。
2、MQTT协议通信过程
2.1学习方法:
假如手里有一个MQTT的客户端,名字叫做FX(你可以理解成一个智能插座,或者一个空气盒子),功能和我们要实现的单片机(ESP8266)一样,能和服务器进行数据的收发,我们只要知道了FX的数据流向,然后再用我们的单片机+ESP8266,实现FX的数据流,那么,我们的移植就完成了。请记住,这是我们次移植的核心方法,就是仿照已经好用的MQTT客户端,克隆另外一个MQTT客户端。接着,我们就按照这个思路来一步一步的实现MQTT的移植。
2.2两个工具
2.2.1工具一:MQTT.fx
MQTT.fx-1.7.0,这个软件既可以模拟MQTT的客户端,也可以模拟MQTT的服务器端,作者才疏学浅,只会用这个软件来仿真客户端。还记得2.1的学习方法吗,这个软件就是咱们的FX,一个成熟稳定好用的客户端。接下来咱们就看看这个软件FX,是如何与服务器进行通信的。咱们还需要用到另外一个软件,能抓住数据的软件。
2.2.2工具二:Wireshark(2.6.0)
这是个网络抓包软件,也就是能抓取客户端和服务器通信往来的数据。
好了,到这里,请各位思考一下,有了这2个工具,也就是知道了客户端和服务器的数据流,我们能否克隆另外一个客户端设备了呢?严格来讲,是不能的。这是因为,即使我们知道了客户端和服务器的数据流,但是咱还不知道这个数据流是啥意思,对吧。所以,接下来想深入理解MQTT协议的朋友,你还需要花费一点点时间,来理解一下MQTT这个协议,倘若你之前已经看过这个协议了,那么请忽略2.2.3的内容。对于之前没接触过MQTT这个协议的人来说,我建议你最多花一个小时,来熟悉一下这个协议,因为接下来我们抓取的数据包,就要和协议里面的内容进行比对。为什么最多花一个小时呢,因为我觉得这个时间足够了,我这么笨的人,才看了一个多小时。中间还溜号了一段时间,又抽了好几根烟。因为,大部分人,对看协议这个事儿来说,还是觉得很枯燥的。
2.2.3MQTT协议
我下载了一份中文版本的MQTT-3.1.1-CN.pdf,我会放在云盘里,供大家下载。如果英文好的朋友,尽量去读原版的协议文档,英语,是每个工程师都绕不过去的坎,相信我。有时间一定多学学英语,学好英语,这会让你在以后的工作中,显得非常有竞争力。
2.2.4MQTT客户端连接服务器
到这里,我默认你已经对2.2.3的MQTT协议有了大概的了解了,如果不是很熟悉的,请返回2.2.3继续看协议。实在看不下去也不要紧,因为,接下来,我们就开始抓取数据进行分析了。
打开mqtt.fx软件,点击小齿轮,如下图


明天还得上班,今天先到这。另外我先学学如何上传图片,上传这个图用的是附件,不是图片,不知道你们能否看到。

本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
离线sangarr

发帖
27
M币
44
专家
0
粉丝
6
只看该作者 4楼 发表于: 05-28
接下来,设置服务器的域名或者IP地址和端口号。



设置用户名和密码



设置好后,点击OK,回到主界面,点击connect,如果连接成功的话,右侧有个指示灯,变成绿色


到这里,软件的基本操作就已经完成了。下面,就用Wireshark这个软件来抓取数据,看看咱们在点击“connect”的时候,这个软件都向服务器发送了哪些数据,使得服务器接纳了这个客户端。
Wireshark这个软件在使用之前,需要一步设置,就是只抓取1883这个端口的数据,否则,数据太多,不好分析。1883这个端口,就是上面我们设置的连接服务器的端口。


上图,第一个红框是客户端和服务器的三次握手,建立TCP连接,对应ESP8266的指令就是AT+CIPSTART=\"TCP\",\"iot.XXXXX.cn\",1883\r\n"
这里的域名、用户名、密码涉及敏感信息,我就隐藏了,或者用XXXXX代替。
下面分析MQTT connect命令数据




数据(16进制)10 2A 00 04 4D 51 54 54……,这里就得和协议去比对了
10---表示发送的Connect的请求(也就是二进制的00010000详细信息,请参考协议中的 MQTT14种消息类型(Command message) )** ,前4个的二进制位是0001,我们可以知道其标识的是一个MQTT CONNECT 消息类型,后面的4bit是保留位,默认为4个二进制位的0000),MQTT CONNECT的消息格式的第一个字节分析完成。
其余的数据,可以对照协议一一的进行分析,我在这里就不详细介绍了。
至此,我们已经学会了第一步,客户度发送什么样的数据,申请连接服务器。服务器在收到客户端的这包数据后,会给客户端发送20H 02H 00H 00H 表示客户端和服务器连接成功。这4byte数据,读者在MQTT协议中也能找到解释。



本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
离线wenxueroom

发帖
742
M币
3860
专家
8
粉丝
43
只看该作者 5楼 发表于: 05-30
祝早日更新完
离线sangarr

发帖
27
M币
44
专家
0
粉丝
6
只看该作者 6楼 发表于: 05-30
回 wenxueroom 的帖子
wenxueroom:祝早日更新完 (2018-05-30 17:07) 回 wenxueroom 的帖子

周末好好写一下,别急。虽然慢点,但绝对详细,不会烂尾。
离线robert63
发帖
1
M币
-500
专家
0
粉丝
0
只看该作者 7楼 发表于: 06-01
【我们的单片机+ESP8266】这个开发板在哪里有卖?
离线sangarr

发帖
27
M币
44
专家
0
粉丝
6
只看该作者 8楼 发表于: 06-01


这个是朋友自己设计的开发板,只需要用一根usb线和电脑相连,调试起来特别方便。
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
离线sangarr

发帖
27
M币
44
专家
0
粉丝
6
只看该作者 9楼 发表于: 06-01
回 sangarr 的帖子
sangarr:
[图片]
这个是朋友自己设计的开发板,只需要用一根usb线和电脑相连,调试起来特别方便。 回 sangarr 的帖子

[attachment=13602749]

这个是朋友自己设计的开发板,只需要用一根usb线和电脑相连,调试起来特别方便。
stm32f103vet6(usart2)esp8266
1、支持ESP8266单独开发
2、支持STM32F103VET6开发
3、支持STM+ESP8266开发,usart1输出log
4、板载JLINK,stm32c8t6 on board版本
5、usb2.0高速扩展芯片,连接jlink,cp2105(stm->usart1,esp8266->uart0)
6、spi flash 4M Byte
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个