当前位置:网站首页>移植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 directory
mqtt_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数据类型的,所以我们需要做下面的调整。
socklen_t这个数据类型确实没有发现定义,所以我们自己添加代码定义就行。语法错误
..\MQTTClient\platform\FreeRTOS\platform_timer.c(15): error: #18: expected a ")" #if (configTICK_RATE_HZ == 1000)
这条语句实在是搞不定为什么报这个错误,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指令把各个函数移植。
边栏推荐
- To promote energy conservation institute 】 【 the opinions of the agricultural water price reform
- 线上问题排查常用命令,总结太全了,建议收藏!!
- 虚拟机的IP地址自动变为127.0.0.1
- tiup mirror genkey
- 密码学的基础:X.690和对应的BER CER DER编码
- 【Dart】dart构造函数学习记录(含dart单例模式写法)
- 【无标题】
- Digital twin Beijing the imperial palace, yuan universe is the process of tourism
- 织梦发布文章提示body has not allow words错误
- Godaddy域名解析速度慢问题以及如何使用DNSPod解析解决
猜你喜欢
StringTable Detailed String Pool Performance Tuning String Concatenation
写给刚进互联网圈子的人,不管你是开发,测试,产品,运维都适用
微信小程序云开发|个人博客小程序
idea插件generateAllSetMethod一键生成set/get方法以及bean对象转换
【Kaggle】Classify Leaves
StringTable详解 串池 性能调优 字符串拼接
Pytorch框架学习记录9——非线性激活
WeChat applet cloud development | personal blog applet
Telnet弱口令渗透测试
【Dart】dart之mixin探究
随机推荐
Simple test of the use of iptables
"No title"
Nacos 配置中心
C语言之字符串函数二
win10版本1803无法升级1903系统如何解决
Determine a binary tree given inorder traversal and another traversal method
Kubernetes 如何实现组件高可用
R语言 数据的关系探索
Use WeChat official account to send information to designated WeChat users
Zheng Xiangling, Chairman of Tide Pharmaceuticals, won the "2022 Outstanding Influential Entrepreneur Award" Tide Pharmaceuticals won the "Corporate Social Responsibility Model Award"
Fork/Join线程池
通俗解释:什么是临床预测模型
虚拟机的IP地址自动变为127.0.0.1
Get started quickly with MongoDB
STAHL触摸屏维修一体机显示屏ET-316-TX-TFT常见故障
线程池处理异常的方法
MySQL Syntax Basics
漏洞分析丨HEVD-0x6.UninitializedStackVariable[win7x86]
数据库内核面试中我不会的问题(1)
Interview Blitz 70: What are sticky packs and half packs?How to deal with it?