我是靠谱客的博主 心灵美钢笔,最近开发中收集的这篇文章主要介绍stm32搭建mqtt_201-STM32+BC26基本控制篇-移植使用-移植单片机MQTT底层包到自己的工程项目...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

说明

这节详细说明一下如何把我工程里面的MQTT包移植到用户自己的工程.

注意:首先确定自己已经实现了使用TCP连接服务器!

该底层包适用于所有的单片机,和所有的网络模块.

该教程以STM32工程为例子说明移植过程.

文件夹说明

1.移植使用的是下面两个文件夹里面的文件

我准备了一个空模板程序,然后在这个模板上演示移植过程.

6e500ab34380b829f00f8566c17ba182.png

2.MQTT文件夹

56b4bdea2733f7967c50fb3d2b52e8c5.png

mqtt_msg 文件作为最底层的最直接的MQTT协议处理文件.

mqtt.c 文件 是我在mqtt_msg的基础上又封装了一层

这一层增加了数据缓存管理,缓存管理采用环形队列实现,所有的数据都储存在缓存里面

另一方面还有处理消息等级1,2的消息,心跳包自动发送等.

有了这一层的封装,用户只需简单的配置即可实现稳定可靠的MQTT通信.

3.mem文件夹

53cad750028b9aa86a0fac1da948c6a2.png

mem文件夹里面是我写的缓存管理程序

开始移植

1.把文件添加到工程,设置下.h路径

81f6b1427eee1969073f369ea92c6603.png

2.编译一下工程,打开这个错误

8d53456ebf194582bf0fb21b0d313479.png

3.替换自己的TCP发送函数

6dfd78d3fdbc96f4aec962ea701dd2c2.png

4.把 mqtt_time_data(&mymqtt); 放到1ms定时器中断中.

5e1a8b63822a1bf5f353b9ef65e93bbc.png

a79b998c3a2c8c2086c32dfe0815acdf.png

5.初始化和注册MQTT几个函数,订阅,发布等函数

db84f95a10863db729d3c07f2934647d.png

6.连接TCP服务器,发送连接MQTT协议

0b7b6645478a51fa9bb2ca38bfd97115.png

把上面的协议发给MQTT服务器以后,MQTT服务器会返回数据

需要把返回的数据交给 int  mqtt_connect_ack(unsigned char *buff) 函数处理

如果该函数返回 0 说明连接上了MQTT服务器,然后调用 mymqtt.connectCb();执行连接回调函数

9b948b467dfb1710f27e50205f967660.png

d44fc7ea3df26aae618fa09b2167c034.png

7.加上需要不停轮训的函数和处理MQTT消息的函数

d285f7f4ed603e9764bd1eb48295655c.png

8.按照上面的步骤已经移植完成(述说下执行流程)

1.首先控制模块以TCP方式连接服务器,连接上以后发送MQTT连接协议

9b76763ac116fbf4ec53df1f5f22e7eb.png

2.判断服务器返回的数据,如果连接上MQTT服务器,调用连接成功回调函数

并在连接成功回调函数中订阅主题.

941ecdfe92d739bfe488f6a4735da137.png

c75899938587ca7f7482ee6e7a5069cb.png

3.订阅主题的协议都打包进了缓存,从缓存提取并发送出去.

注:后面发布消息,发送心跳包数据也是全部打包进了缓存!

aa4d4a420db64c2408face1665f68d5f.png

5c91a638d32ec7d89da41156f8126993.png

4.MQTT服务器返回数据以后,解析处理MQTT返回的数据

9af1d16ed5d76202b9841c7d5ad56e3f.png

39681339c02dc6e50da0cb1964ffd1aa.png

1117ac2f7f40bcd0e7adc12da1c58cbf.png

5.如果接收到普通的通信消息,将会调用接收数据回调函数

d4c0ae51cd2c4601aba65403f6bab065.png

6.发布消息

只要判断成功连接了MQTT,发送消息的函数可以写到任意地方 .

866575a6f2491130521cb6b58b1b466b.png

4786a8b5a7e1283ce13e8539145a3945.png

注意事项

1.在mqtt.h里面 有一个 mqtt_send_buff_len 500

该变量控制着发送协议的最大长度,用户需要根据自己的情况修改该值.

为防止提取缓存时导致内存溢出,我编写底层的时候设置了默认超过该值的打包协议将被丢弃.

4a0ca860e59677fac3a1f5409d03ec5c.png

65be75e58b23186988a721c6dba5ab19.png

2.发布消息成功函数只有在消息等级1和消息等级2的时候才会进入

消息等级1和消息等级2服务器只要应答便会进入此函数.说明服务器确实接收到了数据.

828386603033f9decbdef6fc248d1264.png

3.假设自己的网络模块并非透传模式

假设使用的串口2和模块进行的通信

1.发送数据,假设发送66个数据

1.1 首先发送 AT+CIPSEND=66rn    66:为要发送的数据个数

1.2 等待模块返回 >

1.3 发送要发送的数据给模块

1.4 模块返回 Recv 66 bytes

1.5 模块发送完成返回 SEND OK

2.接收数据

2.1 接收数据格式: +IPD,XXXX:真实数据    XXXX 为接收的数据个数

修改 mqtt_send_function里面的发送过程

4508a95b1dad49dc7be00b04b8a24b6c.png

如果接收到 > 清零接收超时

如果 接收到 SEND OK 清零发送超时

280240448eb0a371d0381901dda9ef5f.png

接收的数据直接提取有效数据,然后交于 mqtt_read_function函数处理

3b57690cbcb3f4098f812c8381b58839.png

4.如果内存允许,建议采用下面的方式处理接收数据

4e594f5c0f2535718e39e7a43d3a95b2.png

5.如果客户发现自己当前的版本和细节介绍的有出入

请用户直接把此节的文件移植替换当前使用的文件

随着时间的推移,我可能会发现并修改完善许多细节

我会尽量做到版本兼容!

如若有不兼容的地方,我将在文件说明中做详细说明.

最后

以上就是心灵美钢笔为你收集整理的stm32搭建mqtt_201-STM32+BC26基本控制篇-移植使用-移植单片机MQTT底层包到自己的工程项目...的全部内容,希望文章能够帮你解决stm32搭建mqtt_201-STM32+BC26基本控制篇-移植使用-移植单片机MQTT底层包到自己的工程项目...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(88)

评论列表共有 0 条评论

立即
投稿
返回
顶部