ESP8266 基ESP8266_RTOS_SDK (ESP-IDF )中嵌入网页文件

Posted skyraker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP8266 基ESP8266_RTOS_SDK (ESP-IDF )中嵌入网页文件相关的知识,希望对你有一定的参考价值。

场景:

在写ESP8266 web服务的时候,免不了要将自己设计的网页html和css等文件放入到固件中。在arduino中有fs可以进行上传文件,然后通过文件系统读出。那在ESP-IDF中该怎么办呢。有几个思路

1. 通过flash_download_tools 直接向固定地址写入文件。然后在代码中读出来

2.通过串口或者tcp等通信方式传给8266然后再写到flash 中。

3.直接转成C字符串嵌入到代码中

上述是我之前想到的,比较麻烦,看到了官方文档提供了一种更简单的方法。

链接:https://docs.espressif.com/projects/esp-idf/zh_CN/v4.1-beta1/api-guides/build-system-legacy.html

这里我就直接贴官方说明了,稍微改了下例子,方便举一反三:

 

有时您的组件希望使用一个二进制文件或者文本文件,但是您又不希望将它重新格式化为 C 源文件。

这时,您可以在 component.mk 文件中设置变量 COMPONENT_EMBED_FILES,以这种方式指定要嵌入的文件的名称:

COMPONENT_EMBED_FILES := server_root_cert.der

或者,如果文件是字符串,则可以使用变量 COMPONENT_EMBED_TXTFILES,这将把文本文件的内容当成以 null 结尾的字符串嵌入:

COMPONENT_EMBED_TXTFILES := web_page/index.css
COMPONENT_EMBED_TXTFILES += web_page/index.html

技术图片

 

 

文件的内容会被编译进 flash 中的 .rodata 段,并通过符号名称来访问,如下所示:

extern const uint8_t web_file_index_html_start[] asm("_binary_index_html_start");
extern const uint8_t web_file_index_html_end[] asm("_binary_index_html_end");

符号名称是根据文件的全名生成的,如 COMPONENT_EMBED_FILES 中的所示,字符 / , . , 等都将会被下划线替代。符号名称中的 _binary 前缀由 objcopy 添加,对于文本和二进制文件都是相同的。

这样一看就能直接当数组引用了。

extern const uint8_t web_file_index_html_start[] asm("_binary_index_html_start");
extern const uint8_t web_file_index_html_end[] asm("_binary_index_html_end")
char *str =web_file_index_html_start;
unsigned
int str_len =web_file_index_html_end-web_file_index_html_start; httpd_resp_send(req, str,str_len );

 

  ESP32也一样~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

以上是关于ESP8266 基ESP8266_RTOS_SDK (ESP-IDF )中嵌入网页文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在Windows平台下编译esp8266 SOC源码

ESP8266 TCP传输AT指令顺序

ESP8266学习——ESP8266程序编译

在Arduino IDE中安装固件ESP32,ESP8266板

ESP8266编译时错误

Arduino ESP8266当中的yield 函数