当前位置:网站首页>移植MQTT源码到STM32F407开发板上
移植MQTT源码到STM32F407开发板上
2022-08-01 20:58:00 【luobeihai】
1. 准备工作
注意:文章还没介绍移植mqttclient和硬件设备网络相关部分的代码,所以这篇文章移植完后,还不能通过网络去连接的。主要介绍是先把mqttclient除网络之外其他部分的所有代码移植到FreeRTOS项目中,并且可以编译通过。
1.1 获取 mqttclient 源码
我们的设备端只是作为MQTT的客户端运行,所以我们只需要移植MQTT客户端源码即可。
mqttclient 源码这里使用国内一位大佬写的开源代码,可以到他下面的开源仓库地址获取。

1.2 可以运行FreeRTOS系统的MDK工程模板
这里我使用STM32CubeMX生成一个可以运行FreeRTOS系统的工程模板。可以参考下面这篇博文自己生成一个FreeRTOS系统模板。
2. 合并mqttclient源码到FreeRTOS
2.1 复制源码到FreeRTOS工程
首先把mqttclient源码解压出来,里面包含下面一些源码目录:
主要源码目录介绍:
- common:通用的源码文件,比如链表的处理,错误代码处理等。
- mqtt:paho mqtt库文件
- mqttclient:实现mqttclient功能的主要文件
- network:网络抽象层
- platform:平台抽象层。这个目录主要是运行的系统平台,以及一些相关的平台硬件初始化代码,和我们移植过程中关联最大。目前的这篇文章的移植暂时先不实现平台网络相关的代码。
我们要移植的就是5个目录的源码文件而已(test测试例程目录文件,我们暂时还用不到,所以先不移植)。
我们在自己创建的FreeRTOS工程目录下,新建MQTTClient目录,然后把这上面5个目录文件复制到这个MQTTClient目录。
2.2 添加相关代码到MDK中
在Keil分组下面,创建和MQTT源码同样的目录分组。
我们先把各个源码目录下的,一级子目录的c文件添加进分组里面,然后里面的子文件夹的文件暂时先不添加,后续需要用到再回来添加就行。

至于平台目录下面的代码,我们添加FreeRTOS文件夹里面的代码。其他平台相关的代码不需要添加。
3. 编译源码解决错误
一般编译错误大概就下面这几类:
- 找不到头文件,这个非常常见
- 有些数据类型说没有定义(可能别人写的库会依赖某些其他文件定义的数据类型,而你正好没加进来)
- 单纯就语法错误
- 链接错误,比如你用了某个函数,但是你没有定义它
下面我记录下自己编译过程中,解决的部分错误(不会把所有错误都记录)。
找不到头文件
..\MQTTClient\mqttclient\mqttclient.h(16): error: #5: cannot open source input file "mqtt_list.h": No such file or directory这里报错mqtt_list.h这个头文件找不到,该文件其实在common目录下(可以把源码使用source insight建立工程,然后到里面查找该头文件在哪个目录)。我们在keil里面添加这个头文件目录的查找路径就行。

mqtt_config.h头文件确实没有
..\MQTTClient\mqttclient\mqtt_defconfig.h(12): error: #5: cannot open source input file "mqtt_config.h": No such file or directorymqtt_config.h文件其实在源码目录的test目录下,但是我们暂时不需要添加test目录下相关的文件,所以把包含这个头文件的代码屏蔽了。

屏蔽掉网络传输安全相关的代码
..\MQTTClient\mqttclient\mqtt_defconfig.h(77): error: #5: cannot open source input file "mbedtls/config.h": No such file or directory报错找不到
mbedtls/config.h这个头文件,这个是和安全传输相关的代码,我们先移植最简单的代码,定义一个宏屏蔽即可。
屏蔽lwip相关代码
..\MQTTClient\platform\FreeRTOS\platform_net_socket.h(15): error: #5: cannot open source input file "lwip/opt.h": No such file or directory因为后面会使用ESP8266WIFI模块进行网络连接实验,这个模块是使用AT指令就可以操作连接了,不需要使用lwip相关代码,所以直接屏蔽掉lwip相关头文件代码。

把platform_net_socket.c文件里面和平台网络相关的代码全部删除,只返回0即可

到时候会使用AT目录实现网络操作的,这里为了编译通过,先把函数都返回0.
socklen_t、size_t数据类型没有定义
size_t数据类型追踪代码发现,在mqtt_log.h头文件中,包含了另外一个头文件是定义了size_t数据类型的,所以我们需要做下面的调整。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M4lyLjzU-1659238247407)(../picture/image-20220731003537762.png)]](/img/dd/cd0ae5803b77650ec3a836ae575c90.png)
socklen_t这个数据类型确实没有发现定义,所以我们自己添加代码定义就行。![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qh3GOMDQ-1659238247407)(../picture/image-20220731003834348.png)]](/img/c4/ed08cc6f78244f895f2137bd6347d9.png)
语法错误
..\MQTTClient\platform\FreeRTOS\platform_timer.c(15): error: #18: expected a ")" #if (configTICK_RATE_HZ == 1000)![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oid4iw8B-1659238247407)(../picture/image-20220731102251091.png)]](/img/7f/1c498a036aa07b5b138e872cfa02d2.png)
这条语句实在是搞不定为什么报这个错误,configTICK_RATE_HZ 这个宏是FreeRTOS配置文件中的定义的心跳频率。最终搞不定为什么,然后就把FreeRTOSConfig.h文件中定义的这个宏,不使用强制类型转换就行了,暂时先这样改。#define configTICK_RATE_HZ 1000 //((TickType_t)1000)匿名结构体语法不支持
..\MQTTClient\mqttclient\mqttclient.h(79): error: #3093: anonymous structs are only supported in --gnu mode, or when enabled with #pragma anon_unions这个报错说,这个匿名结构体的语法是gun才支持的。
方法1:可以把keil的 gun 扩展语法添加上去。
方法2:修改源码。追踪代码发现,错误的地方会进入某一个宏定义的分支,我们想办法让他进入另一个分支即可。
在plooc_class.h头文件前面添加下面这个宏定义即可:
# define PLOOC_CFG_REMOVE_MEMORY_LAYOUT_BOUNDARY___USE_WITH_CAUTION___ // lbh add
解决完编译错误之后,至于编译通过了(警告先不解决)。
编译通过之后,这个MQTT程序还不能用,因为把网络相关的代码都写为空函数了,接下来把 platform_net_socket.c 这个c文件里面的网络函数使用ESP8266模块,使用AT指令把各个函数移植。
边栏推荐
- Interpretation of the meaning of each dimension of two-dimensional, three-dimensional, and four-dimensional matrices
- 职场如象棋,测试/开发程序员如何突破成长瓶颈期?
- 自定义指令,获取焦点
- [Energy Conservation Institute] Comparative analysis of smart small busbar and column head cabinet solutions in data room
- 使用百度EasyDL实现厂区工人抽烟行为识别
- Custom command to get focus
- 360借条安全专家:陌生微信好友不要轻易加贷款推广多是诈骗
- Where should I prepare for the PMP exam in September?
- 基于FPGA的任意字节数(单字节、多字节)的串口(UART)发送(含源码工程)
- 【Dart】dart之mixin探究
猜你喜欢
随机推荐
【Kaggle】Classify Leaves
Get started quickly with MongoDB
StringTable详解 串池 性能调优 字符串拼接
tiup mirror grant
乐观锁批量跟新 纯SQL
MySQL 中出现的字符编码错误 Incorrect string value: ‘\x\x\x\x‘ for column ‘x‘
有点奇怪!访问目的网址,主机能容器却不行
】 【 nn. The Parameter () to generate and why do you want to initialize
"No title"
Remove 360's detection and modification of the default browser
2022年秋招,软件测试开发最全面试攻略,吃透16个技术栈
织梦通过数据库查询调用当前文章的留言
微服务负载均衡器Ribbon
Goroutine Leaks - The Forgotten Sender
WhatsApp group sending actual combat sharing - WhatsApp Business API account
织梦发布文章提示body has not allow words错误
[Energy Conservation Institute] Ankerui Food and Beverage Fume Monitoring Cloud Platform Helps Fight Air Pollution
[Personal work] Wireless network image transmission module
Goroutine Leaks - The Forgotten Sender
Godaddy domain name resolution is slow and how to use DNSPod resolution to solve it









