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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM