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也一样~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

猜你喜欢

转载自www.cnblogs.com/skyraker/p/12617083.html