ESP32 OTA 无需向设备刷写代码

Posted

技术标签:

【中文标题】ESP32 OTA 无需向设备刷写代码【英文标题】:ESP32 OTA without flashing code to the device 【发布时间】:2021-07-08 19:25:47 【问题描述】:

所以我正在尝试实施一种 OTA 方式来同时更新 100 台设备。现在,我用谷歌搜索了很多区域,总是看到你有一个网络服务器正在运行,并在设备本身上上传一个 .bin 文件,然后将此文件刷写到设备上。

没关系,如果您只有 1 到 5 台设备,而不是当您拥有 100 台边缘设备时,您不需要物理访问这些设备和/或通过本地 IP 访问这些设备(因为它们遍布全国)。

他们确实可以访问所有互联网并通过 MQTT 与服务器通信,但我们也可以进行一些 API 调用。

我要实现的主要目标如下:

ESP 使用一些闪存的“引导加载程序”启动,该引导加载程序访问引导加载程序中预定义的服务器地址。 响应是边缘设备应该运行的二进制文件。 二进制文件被加载到设备的 RAM 中(或者如果需要,一个 SD 卡或某种其他闪存)。 当二进制文件被下载后,它会被执行NOT FLASHED ON TO THE DEVICE。当我拿到设备并想要对二进制文件进行逆向工程时,我想拥有我只能对引导加载程序进行逆向工程,而不是从服务器中提取的主要代码。

主要问题是这样的;

这甚至可能吗? (我正在制作一个定制板,因此如果需要可以在上面放置很多特殊组件) 我应该怎么做?我完全不知道这是怎么回事 我错过了什么吗?

谢谢!

【问题讨论】:

那么当设备断电时会发生什么?重启时会运行什么? 当设备断电时,从服务器拉取的所有代码都应该消失。当你给设备供电时,它需要重新下载它的二进制文件并执行 如果你想保护你的代码,那么你只需要加密闪存,esp32 已经有工具可用。否则你将不得不自己实现所有这些功能。 【参考方案1】:

ESP32 可以从其instruction RAM 执行代码 - 应该可以做任何你想做的事情,但你的应用程序代码最多可以使用 128 KiB(如果运行单核,则 +32 KiB)。请参阅this article 以获得对内存模型的程序员友好描述。然而,这对于具有简单功能的固件来说已经足够了,但是像 MQTT over TLS 这样的东西将 难以 适应 160 KiB 的代码。

另请注意,ESP IDF 不支持此类盛会,因此您将编写大量低级代码,从您自己的自定义链接器脚本和 C 运行时初始化开始。如果您为此做好了准备并做好了预算,那就继续吧——这将是一个有趣且具有挑战性的项目。

否则,我建议评估 Espressif 的解决方案,以保护闪存中的代码不被读出。您可以encrypt 使用 AES256 整个 Flash(一切都在运行中解密),结合Secure Boot V2 以确保只有经过批准的图像才能运行。这两种方法都存在漏洞,但这样您就可以更快地完成您的产品。

至于为 100 台设备执行 OTA - 只需几行服务器端代码,您就可以使用 MQTT 连接一次向所有设备发出更新触发命令。 OTA 的实现方式没有区别 - 他们都会很乐意下载新映像并并行更新自己。

【讨论】:

所以我认为:这不可能吗?我什至问自己是否可以读出闪到 esp 上的 .bin? 从 RAM 运行应用程序是可能的(如果你有它需要的话),但在大多数情况下并不实用。至于在Flash中读取.bin,这有两个方面。 SPI Flash 和微控制器是独立的芯片,它们之间的 SPI 总线对物理访问是开放的,这意味着您可以随时轻松读取 Flash 的内容。但是,如果您对 Flash 的内容进行加密,如果没有隐藏在微控制器内部的解密密钥,这将毫无用处。这非常难以破解(并非不可能,就像所有非强化保护机制一样,只是很难)。

以上是关于ESP32 OTA 无需向设备刷写代码的主要内容,如果未能解决你的问题,请参考以下文章

58 ESP32 OTA升级(双OTA分区无factory APP)

如何在 ESP32 中发布 OTA 的 bin 文件,而无需在 Web 服务器中托管的浏览器中手动打开页面

MQTT 订阅 / OTA 更新深度睡眠 / ESP32 / FreeRTOS

Arduino ESP32 通过 BLE 接收文件(用于 OTA 更新)

Arduino OTA 将固件从服务器上传到 ESP32

esp32 串口,蓝牙等其他方式OTA