esp32官方有个阿里云的连接组件,不过说明文档里介绍是用linux进行编译,这里说一下怎么在windows下使用VSCode编译esp-aliyun组件
esp-aliyun组件下载地址:github.com/espressif/esp-aliyun
不要下载release v2.0,这个版本有些旧了,我直接下载了master分支,记录一下时间2022-1-14,因为估计以后下载新的master分支这个方法不一定能用
VSCode配置esp-idf编译环境这里不做说明,默认认为已经配置好了环境
VSCode是使用cmake编译的,所以之后的配置基本都是修改CMakeLists.txt文件
下载esp-aliyun-master.zip后,解压到当前目录,这里需要修改解压后的文件夹名称,esp-aliyun-master修改为esp-aliyun,这个步骤很重要,因为自带例子里使用的component名称为esp-aliyun
实际下载的esp-aliyun-master.zip就是一个component,如果不是下载zip,使用git下载,那么使用时文件名称也要修改为esp-aliyun,当然也可以去修改例子里依赖的组件名称
直接使用例子说明:
使用VSCode打开esp-aliyun\examples\solutions\smart_light例子
什么都不修改编译报错如下:
终端进程“C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command cmake -G Ninja -DPYTHON_DEPS_CHECKED=1 -DESP_PLATFORM=1 ..”已终止,退出代码: 1。
esp-aliyun-master\examples\solutions\smart_light\CMakeLists.txt修改如下
# (Automatically converted from project Makefile by convert_to_cmake.py.)
# The following 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)
# 手动修改选择的配置文件
set (SDKCONFIG_DEFAULTS "sdkconfig_esp32.defaults")
# 额外组件目录为:esp-aliyun
set (EXTRA_COMPONENT_DIRS "../../..")
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(smart_light)
这里需要手动指定默认配置文件,我使用的是esp32所以指定文件为sdkconfig_esp32.defaults
只需要以上修改就可以编译成功
注意:修改完后直接再次编译可能会报如下错误:
> Executing task: cmake --build . <
ninja: error: loading 'build.ninja': 系统找不到指定的文件。
手动删除build文件夹或者
执行full clean命令
SDKCONFIG_DEFAULTS官方说明:
构建系统(CMake 版) - ESP32 - — ESP-IDF 编程指南 latest 文档
自定义 sdkconfig 的默认值
对于示例工程或者其他您不想指定完整 sdkconfig 配置的项目,但是您确实希望覆盖 ESP-IDF 默认值中的某些键值,则可以在项目中创建
sdkconfig.defaults
文件。重新创建新配置时将会用到此文件,另外在sdkconfig
没有设置新配置值时,上述文件也会被用到。如若需要覆盖此文件的名称或指定多个文件,请设置
SDKCONFIG_DEFAULTS
环境变量或在顶层 CMakeLists.txt 文件中设置SDKCONFIG_DEFAULTS
。在指定多个文件时,使用分号作为分隔符。未指定完整路径的文件名将以当前项目的相对路径来解析。一些 IDF 示例中包含了
sdkconfig.ci
文件。该文件是 CI(持续集成)测试框架的一部分,在正常构建过程中会被忽略。依赖于硬件目标的
可能的错误:
Failed to resolve component 'esp-aliyun'.
检查目录名称是否为esp-aliyun
顺便说一下:
1. 修改依赖组件名称方法如下,以smart_light为例子,修改文件esp-aliyun\examples\solutions\smart_light\components\linkkit_handle\CMakeLists.txt的COMPONENT_REQUIRES值中的esp-aliyun,factory_restore中的也需要修改
2. 官方文件有介绍如何烧录三元组信息,链接如下:github.com/espressif/esp-aliyun/blob/master/config/mass_mfg/README.md
不过调试时我更喜欢直接代码里直接写入
esp-aliyun\examples\solutions\smart_light\main\app_main.c修改如下,代码中直接将设备产品Key写到对应的flash中,我也直接设置了wifi账号,方便快速调试
// 产品设备信息设置函数声明
int HAL_SetProductKey(char *product_key);
int HAL_SetProductSecret(char *product_secret);
int HAL_SetDeviceName(char *device_name);
int HAL_SetDeviceSecret(char *device_secret);
void app_main()
{
{// 代码中配置产品设备信息,用于调试
HAL_SetProductKey("*********");
HAL_SetProductSecret("************");
HAL_SetDeviceName("**************");
HAL_SetDeviceSecret("*****************************");
}
factory_restore_init();
lightbulb_init();
conn_mgr_init();
conn_mgr_register_wifi_event(wifi_event_handle);
{ // 设置wifi账号密码
const char *ssid = "*************";
const char *password = "*****************";
conn_mgr_set_wifi_config_ext((const uint8_t *)ssid, strlen(ssid), (const uint8_t *)password, strlen(password));
}
IOT_SetLogLevel(IOT_LOG_INFO);
#ifdef CONFIG_USE_SOFTAP_CONFIG
conn_mgr_set_sc_mode(CONN_SOFTAP_MODE);
#else
conn_mgr_set_sc_mode(CONN_SC_ZERO_MODE);
#endif
xTaskCreate((void (*)(void *))start_conn_mgr, "conn_mgr", 3072, NULL, 5, NULL);
}
3. smart-light例子指定额外组件目录为esp-aliyun,在 esp-aliyun-master\examples\solutions\smart_light\CMakeLists.txt文件使用set (EXTRA_COMPONENT_DIRS "../../..")指定,实际使用应该将esp-aliyun直接复制到项目的components目录中,并且注释掉EXTRA_COMPONENT_DIRS语句,这里以smart-light项目为例子,最后如图:
4. 如果项目中使用esp-aliyun组件同时也使用adf音频,并且esp-aliyun没有放在项目的components目录中,是一个外部目录,也需要特别注意,CMakelists.txt部分配置如下
# ADF音频库,$ENV{ADF_PATH}/CMakeLists.txt文件内包含了set(EXTRA_COMPONENT_DIRS $ENV{ADF_PATH}/components)
include($ENV{ADF_PATH}/CMakeLists.txt)
# 其他外部的组件,需要在原来的值再次增加否则上面语句增加的音频组件库路径会被清掉
set (EXTRA_COMPONENT_DIRS ${EXTRA_COMPONENT_DIRS} "../esp-components")
# 导入 CMake 的其余功能来完成配置项目、检索组件等任务。
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
# 项目名称
project(esp32Test)
5. 在CMakelists.txt定义宏,方便代码中使用,定义方法如下
# 宏定义
add_compile_options("-D宏名称")
add_definitions(-D宏名称)
ADD_DEFINITIONS(-D宏名称=宏的值)
# 以上语句定义的宏在CMakelists.txt中是无法使用的,只能在代码中使用
option(变量名称1 "说明" ON)
option(变量名称2 "说明" OFF)
if(变量名称1)
add_compile_options("-D我的宏")
endif()
# 此处定义的变量名称在代码中无法使用,可以在CMakelists.txt中使用
# 宏定义还可以通过sdkconfig进行