返回列表 发新帖我要提问本帖赏金: 30.00元(功能说明)

[应用方案] APM32实现MQTT通信(一)_移植MQTTClient源码到APM32F407上运行

[复制链接]
 楼主| luobeihai 发表于 2024-12-11 22:58 | 显示全部楼层 |阅读模式
本帖最后由 luobeihai 于 2024-12-11 23:07 编辑

#申请原创# @21小跑堂

0. 前言

前面我们已经实现了AT模块的命令解析器,接下来我们基于此AT命令解析器的代码,与ESP8266模块通信,通过MQTTClient协议,实现MQTT通信。

不过本文章还没实现mqttclient和硬件设备网络相关部分的代码,所以这篇文章移植完后,还不能通过网络去连接的。

本篇主要是先介绍把mqttclient除网络之外其他部分的所有代码移植到AT命令解析器的工程项目中,并且可以编译通过。然后接下来我会继续完善该代码,直至可以实现MQTT通信。

1. 移植前准备

1.1 获取 mqttclient 源码

我们的设备端只是作为MQTT的客户端运行,所以我们只需要移植MQTT客户端源码即可。

mqttclient 源码这里使用国内一位大佬写的开源代码,可以到他下面的开源仓库地址获取。

https://github.com/jiejieTop/mqttclient

image-20241211224259180.png

1.2 可以运行FreeRTOS系统的MDK工程模板

前面我们已经编写了AT模块的命令解析器源码,我们就基于这个工程源码的基础上进行移植即可。

2. 移植MQTTClient源码过程

2.1 复制MQTTClient源码到MDK工程

首先把mqttclient源码解压出来,里面包含下面的源码目录:

image-20220729223358584.png

主要源码目录介绍:

  • common:通用的源码文件,比如链表的处理,错误代码处理等。
  • mqtt:paho mqtt库文件
  • mqttclient:实现mqttclient功能的主要文件
  • network:网络抽象层
  • platform:平台抽象层。这个目录主要是运行的系统平台,以及一些相关的平台硬件初始化代码,和我们移植过程中关联最大。目前的这篇文章的移植暂时先不实现平台网络相关的代码。

我们要移植的就是5个目录的源码文件而已(test测试例程目录文件,我们暂时还用不到,所以先不移植)。

把MQTTCLient源码复制到工程目录下备用,自己随便放哪都行,根据个人习惯。

image-20241211223000431.png

2.2 添加相关代码到MDK中

在Keil分组下面,创建和MQTT源码同样的目录分组。

image-20241211223401327.png

我们先把各个源码目录下的,一级子目录的c文件添加进分组里面,然后里面的子文件夹的文件暂时先不添加,后续需要用到再回来添加就行。

image-20220730230722208.png

至于平台目录下面的代码,我们添加FreeRTOS文件夹里面的代码。其他平台相关的代码不需要添加。

3. 编译MQTT源码遇到的问题与解决方法

一般编译错误大概就下面这几类:

  • 找不到头文件,这个非常常见
  • 有些数据类型说没有定义(可能别人写的库会依赖某些其他文件定义的数据类型,而你正好没加进来)
  • 单纯就语法错误
  • 链接错误,比如你用了某个函数,但是你没有定义它

下面我记录下自己在编译MQTTClient源码过程中,遇到的问题记录下,以及如何解决这些问题。(我只是把上面这几类主要的问题记录了,没有把所有错误都记录)。

1、找不到头文件

  1. ..\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里面添加这个头文件目录的查找路径就行。

image-20241211225112809.png

2、mqtt_config.h头文件确实没有

  1. ..\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目录下相关的文件,所以把包含这个头文件的代码屏蔽了。

image-20220731000555670.png

3、屏蔽掉网络传输安全相关的代码

  1. ..\MQTTClient\mqttclient\mqtt_defconfig.h(77): error:  #5: cannot open source input file "mbedtls/config.h": No such file or directory

报错找不到 mbedtls/config.h 这个头文件,这个是和安全传输相关的代码,我们先移植最简单的代码,定义一个宏屏蔽即可。

image-20220731001550550.png

4、屏蔽lwip相关代码

  1. ..\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相关头文件代码。

image-20220731002041561.png

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

image-20220731002426997.png

到时候会使用AT目录实现网络操作的,这里为了编译通过,先把函数都返回0.

6、socklen_t、size_t数据类型没有定义

size_t数据类型追踪代码发现,在mqtt_log.h头文件中,包含了另外一个头文件是定义了size_t数据类型的,所以我们需要做下面的调整。

image-20220731003537762.png

socklen_t这个数据类型确实没有发现定义,所以我们自己添加代码定义就行。

image-20220731003834348.png

7、语法类错误

  1. ..\MQTTClient\platform\FreeRTOS\platform_timer.c(15): error:  #18: expected a ")"
  2.   #if (configTICK_RATE_HZ == 1000)

image-20220731102251091.png

这条语句实在是搞不定为什么报这个错误,configTICK_RATE_HZ 这个宏是FreeRTOS配置文件中的定义的心跳频率。最终搞不定为什么,然后就把FreeRTOSConfig.h文件中定义的这个宏,不使用强制类型转换就行了,暂时先这样改。

  1. #define configTICK_RATE_HZ                       1000  //((TickType_t)1000)

8、匿名结构体语法不支持

  1. ..\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头文件前面添加下面这个宏定义即可:

  1. #   define PLOOC_CFG_REMOVE_MEMORY_LAYOUT_BOUNDARY___USE_WITH_CAUTION___  // lbh add

解决完编译错误之后,最终编译通过了,但是还有几个警告,我们先不去解决,因为这是MQTT源码本身的问题。

image-20220731112614745.png

编译通过之后,这个MQTT程序还不能用,因为把网络相关的代码都写为空函数了,接下来把 platform_net_socket.c 这个c文件里面的网络函数使用ESP8266模块,使用AT指令把各个函数移植。






打赏榜单

21小跑堂 打赏了 30.00 元 2024-12-16
理由:恭喜通过原创审核!期待您更多的原创作品~~

呐咯密密 发表于 2024-12-12 09:18 | 显示全部楼层
都没移植完成啊,一次写完就好了
Chad1989 发表于 2024-12-12 11:54 | 显示全部楼层
坑都没踩完,踩完在github上上传下源码再分享
 楼主| luobeihai 发表于 2024-12-12 20:46 | 显示全部楼层
呐咯密密 发表于 2024-12-12 09:18
都没移植完成啊,一次写完就好了

哈哈 别急啦!我会写完的,最终可以实现链接MQTT服务器,实现远程通信。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

101

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部