MQTT源码移植到STM32F103

目录

1、合并源码

2、添加进keil工程

3、解决编译错误问题

3.1 第一个错误

3.2 第二个错误

3.3 第三个错误

3.4 第四个错误

3.5 第五个错误

3.6 第六个错误

3.7 第七个错误

3.8 第八个错误

附录


1、合并源码

  • 创建一个运行FreeRTOS的工程这里是先找到任意一个能运行FreeRTOS的工程,其中包含文件如下:

  • 添加MQTTClient文件夹并将MQTT相关文件添加进该文件夹

    找到MQTT源码文件夹,将下面红框内MQTT编程所需相关文件添加进MQTTclient(MQTT相关文件为MQTT源码压缩包里的相关文件,压缩包放在最后的目录,有需要自取)

2、添加进keil工程

打开FreeRTOS文件的MDK-ARM中的keil工程进行如下操作:

common

添加进MQTTClient总共有5个文件,步骤与上类似,下面直接展示添加的主要.c文件:

mqtt

mqttclient

network

platform

3、解决编译错误问题

合并源码编译常见错误问题:头文件未被找到;数据类型错误;语法错误。

3.1 第一个错误

提示未能找到platform_timer.h,则需要将该文件的路径添加进去即可:

  • 找到文件所在路径(这里为自己指定的文件夹)
  • 打开keil的C/C++并将路径添加进去

 头文件存放位置见如下:

  • <      > 类头文件一般存在于keil的系统目录或者自己指定的文件中
  • "        "类头文件一般存在于当前目录、keil的系统目录或者自己指定的文件中

如何查看是否存在于当前目录(用上述例子做演示):

可见当前目录并不存在该头文件(若存在与keil系统目录则应该不会报错),则需要到某些指定文件寻找并添加路径即可。

3.2 第二个错误

提示未能找到networrk.h,则需要将该文件的路径添加进去即可:

  • 先看当前目录是否存在可见并不存在Network.h
  • 找到文件所在路径(这里为自己指定的文件夹)
  • 打开keil的C/C++并将路径添加进去
3.3 第三个错误

提示未能找到头文件中的mqtt_config.h,则需要将该文件的路径添加进去即可:

  • 并未能找到该文件
  • 直接将该文件注释掉即可
  • 注释掉后发现mbedtls/config.h文件未能找到,索性直接注释掉即可
3.4 第四个错误

提示未加括号,属于语法错误,则需要修改对应代码:

  • 找到定义的对应位置
  • 判断出可能是TickType_t未进行定义,于是做以下修改:
    #define configTICK_RATE_HZ                       1000//((TickType_t)1000)
  • 也可以找到TickType_t定义位置,添加相关代码找到该类型定义的位置,确定为需要添加红框内的.h文件,同时需要添加该.h文件的路径
3.5 第五个错误

提示找不到mqtt_errot.h,则需要将该文件的路径添加进去即可:

  • 找到文件所在路径(这里为自己指定的文件夹)
  •  打开keil的C/C++并将路径添加进去
3.6 第六个错误

提示找不到MQTTPacket.h,则需要将该文件的路径添加进去即可:

  • 找到文件所在路径(这里为自己指定的文件夹)
  •  打开keil的C/C++并将路径添加进去
3.7 第七个错误

提示找不到lwip/opt.h,由于在这里可以不使用这些头文件中的功能,所以可以将其注释掉:

#if 0
#include "lwip/opt.h"
#include "lwip/sys.h"
#include "lwip/api.h"
#include <lwip/sockets.h>
#include "lwip/netdb.h"
#endif

注释完后出现size_t未定义现象,于是通过分析可知nettype_tcp.h中的platform_net_socket.h使用到size_t,而size_t在mqtt_log.h中的stdio.h中被定义,所以应该在nettype_tcp.c中修改两个头文件位置即可:

接下来发现其他文件也调用到platform_net_socket.c也调用到size_t,于是在platform_net_socket.c包含mqtt_log.h即可(注意是在platform_net_socket.h上面):

最后发现socklen_t未被定义,通过查看发现所有函数只是调用socklen_t,并没有进行定义,于是我们在platform_socket.h直接进行定义即可,同时将socklen_t存在位置的代码删掉(为了先编译通过):

全部return 0即可,后续函数的实现我们会进行添加代码。

3.8 第八个错误

提示未能找到plooc_class.h,则需要将该文件的路径添加进去即可:

  • 找到文件所在路径(这里为自己指定的文件夹)
  •  打开keil的C/C++并将路径添加进去
  • 添加完毕提示匿名结构体不支持GNU模式,这属于语法问题(语法不支持):
  • 此结构体中存在匿名结构体,keil默认的ARMCC编译工具链不支持匿名结构体,GNU编译工具链支持匿名结构体。
    //此结构体中存在匿名结构体,ARMCC不支持,逐步分析:
    def_class(mqtt_connack_data_t,
        private_member(
        uint8_t rc;
        uint8_t session_present;
        )
    )
    
    //def_class宏定义如下:
    #define def_class(__name, ...)          __def_class(__name, __VA_ARGS__)
    
    //private_member宏定义如下:
    #   define private_member(__member)         __member
    
    //private_member宏定义如下:
    #define private_member(...)              PLOOC_VISIBLE(__VA_ARGS__)      
    
    //使用增加错误语法编译,查看编译报错方法来看,PLOOC_VISIBLE走的是下面的分支,其中存在一个没有名字的结构体即匿名结构体,AMRCC报错
    #   if defined(PLOOC_CFG_REMOVE_MEMORY_LAYOUT_BOUNDARY___USE_WITH_CAUTION___)//第一个分支
    #       define PLOOC_VISIBLE(...)           __VA_ARGS__
    #   else//第二个分支
    #       define PLOOC_VISIBLE(...)                                               \
            struct  {                                                               \
                __VA_ARGS__                                                         \
            }PLOOC_ALIGN(PLOOC_ALIGNOF_STRUCT(__VA_ARGS__));
    #   endif      
    
  • 解决方法一:在keil编译器中增加--gnu,解决编译报错问题
  • 解决方法二:在上述结构体展开文件plooc_class.h中定义PLOOC_CFG_REMOVE_MEMORY_LAYOUT_BOUNDARY___USE_WITH_CAUTION___即可解决编译报错问题

附录

MQTT源码链接:https://github.com/jiejieTop/mqttclient

  • 29
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103是意法半导体推出的一款32位ARM Cortex-M3内核的微控制器,其具有丰富的外设资源和强大的性能。而MQTT(Message Queuing Telemetry Transport)是一种轻量级的物联网通信协议,适用于远程设备和传感器之间的通信。在STM32F103上实现MQTT功能可以实现设备与云端服务器之间的可靠通信,十分重要。 针对此需求,可以采用现成的MQTT标准库工程源码,首先在STM32F103开发板上搭建相应的开发环境,包括搭建ARM开发环境和安装相关工具。然后可以下载MQTT标准库工程源码,将其加入到工程中,并根据具体的硬件平台和需求进行相关配置。 接下来,需要对MQTT标准库进行修改和调试,以适配STM32F103的硬件资源和外设。这包括对串口、网络模块等进行配置,以实现MQTT协议的基本功能。 在完成硬件适配后,需要进行软件调试和测试。可以通过建立连接、发布主题、订阅主题等操作,验证MQTT标准库在STM32F103上的可靠性和稳定性。 最后,还需要进行性能优化和系统稳定性的验证,以确保MQTT标准库在STM32F103上运行良好。这需要对内存占用、通信速度、错误处理等方面进行细致的分析和优化,保证系统的稳定性和可靠性。 综上所述,实现STM32F103MQTT标准库工程源码需要充分的开发环境、硬件适配、软件调试和性能优化,以确保系统稳定可靠地运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值