You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 10:48:02