随着项目的功能增多,按照以前编写STM32的习惯,不同功能组件会单列出来,方便项目的移植,同时也让主函数更美观简洁,方便阅读。ESP-IDF中按照项目定义可以分为几种components。按照优先级分别是
1.esp-idf自带的components 位于源代码根目录下;
- esp-idf/
-build
-components //为ESP-IDF自带的component
-docs
-examples
-make
-tools
-user_project //此为自定义项目的主目录
2.项目自带的components 位于项目目录根目录下;
- user_project/mqtt_tcp/
- CMakelists.txt
- Makefile
- sdkconfig
- components/ //此目录为项目components共有2个组件,SHT20和local_mqtt_protocols
- SHT20/ - component.mk
-CMakelists.txt
- Kconfig
- sht20.c
- local_mqtt_protocols/ - component.mk
- CMakelists.txt
- Kconfig
- local_mqtt_protocols.c
- include/ - local_mqtt_protocols.h
- main/ - app_main.c
- CMakelists.txt
- component.mk
- build/
3.主程序自定义的部分组件,其地址由项目根目录下的CMakelist.txt和Makefile 定义出来,本例程项目的两个文件分别如下
# The following four lines of boilerplate have to be in your project's CMakeLists
# in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.5)
# (Not part of the boilerplate)
# This example uses an extra component for common functions such as Wi-Fi and Ethernet connection.
set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(mqtt_tcp)
#
# This is a project Makefile. It is assumed the directory this Makefile resides in is a
# project subdirectory.
#
PROJECT_NAME := mqtt_tcp
EXTRA_COMPONENT_DIRS = $(IDF_PATH)/examples/common_components/protocol_examples_common
include $(IDF_PATH)/make/project.mk
EXTRA_COMPONENT_DIRS = $(IDF_PATH)/examples/common_components/protocol_examples_common
上面代码表示项目除了从系统、项目component引用代码以外,还从 $(IDF_PATH)/examples/common_components/protocol_examples_common这个地址引用了一个组件common_components。此为主程序自定义使用的组件。
在上述项目中,我就将local_mqtt_protocols作为一个项目的组件使用,但是其主要目的是将系统组件中的mqtt进行了一下二次包装,按照STM32的书写习惯,在头文件里引用一下就可以了,但是在ESP-IDF中编译却发生找不到头文件。因此需要按照make的方式进行编写。
ocal_mqtt_protocols中共引用了三个组件:两个系统组件,json和mqtt,一个自定义的组件SHT20。
=============================================================================
以下方法可能会随着对ESP-IDF和make编译方式的熟悉而发生变化,现在只是一个临时的解决方案!
=============================================================================
1.在local_mqtt_protocols.h文件中正常引用三个要使用到的组件的头文件
#ifndef _LOCAL_MQTT_PROTOCOLS_H_
#define _LOCAL_MQTT_PROTOCOLS_H_
#include
#include "cJSON.h" //要引用的三个头文件-1
#include "mqtt_client.h" //要引用的三个头文件-2
#include "sht20.h" //要引用的三个头文件-3
#ifdef __cplusplus
extern "C" {
#endif
void vlocal_mqtt_protocols_task(void *arg);
#ifdef __cplusplus
} // extern "C"
#endif
#endif //_LOCAL_MQTT_PROTOCOLS_H_
2.编写local_mqtt_protocols组件下的CMakelist.txt文件如下:
idf_component_register(SRCS "local_mqtt_protocols.c"
INCLUDE_DIRS "include"
PRIV_REQUIRES mqtt json SHT20)
其中要在PRIV_REQUIRES后面跟上要引用的三个组件的名字,这样才能引导编译系统找到需要引用的组件头文件。
3.编写local_mqtt_protocols组件下的component.mk文件如下:
#
# Component Makefile
#
# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.)
COMPONENT_ADD_INCLUDEDIRS:=include
4.完成以上三个步骤,就能将正常能够使用的自定义组件做出来了。
5.以上的理解来源于乐鑫官方的开发文档,连接如下:点我直达
附一个简单的示例,使用ESP32连接SHT20温度传感器,IIC管脚使用GPIO 18---SDA GPIO19---SCL 定时将MQTT消息上传到192.168.1.1(使用的是OPENWRT的路由器,安装mosquitto组件来实现智能家居的控制中心)
以上MQTT broker的地址和IIC管脚都可以在menuconfig中配置。
示例下载地址