ESP32 从固件.bin提取嵌入二进制文件及aWOT路由引用方法咨询
步骤1:确认PlatformIO嵌入配置
首先确认platformio.ini中已正确配置需要嵌入的文件路径,多个文件可分行填写:
board_build.embed_txtfiles = src/file.html src/ota_firmware.bin
步骤2:声明嵌入文件的链接器符号
链接器会为每个嵌入的文件生成固定格式的内存地址符号,你需要在代码全局位置声明对应符号才能访问文件内容,符号规则为:
- 前缀固定为
_binary_ - 中间部分为文件路径,所有非字母数字的字符(/、.等)替换为下划线
- 后缀为
_start(文件起始地址)和_end(文件结束地址)
以嵌入的src/file.html为例,声明代码如下:
// 写在全局区域,不要放在函数内部 extern const uint8_t file_html_start[] asm("_binary_src_file_html_start"); extern const uint8_t file_html_end[] asm("_binary_src_file_html_end");
步骤3:编写aWOT路由处理函数
在handler中直接通过上述符号获取文件内容和长度,调用aWOT的响应接口返回即可:
void fileHtmlHandler(Request &req, Response &res) { // 计算嵌入文件的总大小 size_t fileSize = file_html_end - file_html_start; // 设置对应Content-Type,根据文件类型调整即可 res.set("Content-Type", "text/html"); // 直接发送内存中的文件内容,无需额外拷贝 res.send(200, "text/html", (const char*)file_html_start, fileSize); }
最后注册对应路由即可:
app.get("/file.html", &fileHtmlHandler);
注意事项
- 如果嵌入的是CSS、JS、OTA固件等其他类型文件,仅需修改
Content-Type对应值即可,比如二进制固件用application/octet-stream - 嵌入的文件存放在固件的只读段,不要尝试修改指针指向的内存内容
- 若用于OTA更新场景,可直接将
file_html_start指针和计算得到的文件长度传入ESP-IDF的OTA相关接口,无需额外内存拷贝,执行效率高于从SPIFFS读取固件的方案 - 嵌入文件的路径如果修改,需要同步修改声明的符号名,否则会报链接错误
内容的提问来源于stack exchange,提问作者strange_bakery
相关产品推荐
相关产品推荐

