设计支持 FoTA 的嵌入式系统

Designing an Embedded System with FoTA Support

我正在设计一个支持触摸屏并与电机控制器通信的嵌入式系统。但是,该设备需要通过 Wi-Fi 模块支持固件更新。

以下是我的具体问题: 使用 ESP266 可以有效地将数据发送到我的服务器(带有 MySQL 数据库的 Apache)但是这个模块可以用来下载固件更新吗? (我很难找到任何关于这个的东西。) 如果不是,什么会更有效 module/approach?

用于分发固件更新的典型服务器设置是什么样的?它会使用 TCP/IP 还是 FTP?我不认为会有超过 10,000 个这样的设备被分发并且固件本身可能 >=50MB。

就刷新固件而言,我正在考虑拥有一个专用于存储更新固件的内存位置,并让引导加载程序检查那里是否有新固件。如果有,它将开始刷新新固件。确保这是原子的好方法是什么?引导加载程序是执行此操作的最佳位置还是其他更合适的位置?

关于固件更新协议:

  • 不要使用不安全的协议,比如普通 FTP。
  • 使用基于 TLS 的东西,并检查服务器证书是否正确。
  • 可能的协议是 HTTPS,即基于 TLS 的简单 HTTP GET。

关于可扩展性:

  • 如果设备下载固件更新,则长时间分发来自不同设备的请求,例如time = 1am + (serialNumber MOD 240) 以分钟为单位。

为更新分发固件的理想方式是对用户而言最不痛苦的方式。

话虽如此,您希望安全性能够避免他人干扰您的硬件。 它是 FTP、HTTP 还是 SSL/TLS 加密变体取决于偏好。

安全认证固件更新的要求是数字签名套件。如果您的系统能够 运行 IP 堆栈,它可能有足够的资源来进行签名验证。为嵌入式系统优化的商业解决方案适合 4.5kB 的 ROM 并完全从堆栈运行(要验证数字,请转到此处:https://www.segger.com/emlib-emsecure.html)。

这不能保护您的固件不被读取,但不能在目标系统不注意的情况下修改它。基本上引导加载程序会验证签名并确定固件是否来自原始来源且未被篡改。

如果你想保护你的固件在传输过程中不被读取,你可以用 TLS/SSL 解决方案替换签名软件。这会增加内存使用量。

如果我寻找同一家公司提供的解决方案,据说 TLS 堆栈的资源使用量在 RAM 中为 7k(请参阅 https://www.segger.com/pr-emssl-v2.html)。他们还没有公布 ROM 的使用情况,但如果我没记错的话,它在 20 到 30 kByte 之间。

如果您使用 TLS,请创建您自己的证书!不要依赖认证服务器,因为它们可能会被感染。无论如何,这将是点 2 点连接,没有其他人参与,因此您知道要使用哪个证书,并且可以拒绝所有其他证书。