24小(xiǎo)时联系電(diàn)话:18217114652、13661815404
中文(wén)
- 您当前的位置:
- 首页>
- 電(diàn)子资讯>
- 行业资讯>
- 如何通过无線(xiàn) (OTA) ...
行业资讯
如何通过无線(xiàn) (OTA) 更新(xīn)嵌入式固件
如何通过无線(xiàn) (OTA) 更新(xīn)嵌入式固件
物(wù)联网设备通过互联网传输和接收数据,目前大多(duō)数物(wù)联网设备都是无線(xiàn)连接的。
在设计您的下一个物(wù)联网设备时,必须考虑的一个非常重要的方面是更新(xīn)物(wù)联网设备固件的过程。
我们熟悉这样的想法,即固件只需编写一次即可(kě)与硬件接口,并且很(hěn)少更改。这部分(fēn)是由于大多(duō)数设备并非设计用(yòng)于连接到互联网的想法。
然而,随着当前物(wù)联网开发和设备部署的兴起,固件的定义将需要重新(xīn)审视。
让我们从探索物(wù)联网设备固件的不同组件开始。在典型设备中,您会遇到以下固件组件:
无線(xiàn)连接 (WiFi/BLE) – 高度依赖于所使用(yòng)的无線(xiàn)连接协议。大多(duō)数无線(xiàn)微控制器都带有(yǒu)开箱即用(yòng)的受支持协议,以及易于使用(yòng)的 API,例如 ESP32 微控制器。
外部传感器驱动程序——可(kě)能(néng)由物(wù)联网设备的开发人员编写,用(yòng)于与微控制器一起使用(yòng)的任何外部传感器。例如,如果您想收集房间内的温度,则必须使用(yòng)温度传感器并编写驱动程序以从传感器中采样数据。
应用(yòng)程序特定程序- 您非常特定应用(yòng)程序的主程序。这是固件的所有(yǒu)不同组件将被捆绑在一起以形成良好流程的地方。
配置——每个物(wù)联网设备都带有(yǒu)默认设置,需要更改為(wèi)其用(yòng)户特定设置。例如,WiFi 路由器的接入点 (AP) 配置,其中 SSID 和密码传递给微控制器以用(yòng)于连接到互联网。
OTA 固件更新(xīn)——这是一个重要的组件,应该包含在您的开发周期中,因為(wèi)它可(kě)以让您的物(wù)联网设备通过互联网进行更新(xīn),而无需与设备进行物(wù)理(lǐ)接口。
云连接——最有(yǒu)可(kě)能(néng)由云服務(wù)提供商(shāng)提供用(yòng)于与云交互的 API 和 SDK。一个示例是连接到 IoT MQTT 代理(lǐ)、接收命令等。
Crypto Utilities——由于微控制器必须连接到安全的云,控制器必须能(néng)够通过签名和解密来自云的消息来验证自己。大多(duō)数支持物(wù)联网的微控制器都有(yǒu)自己的库和支持,例如 AES、SHA、RSA、随机数生成器 (RNG)、内存加密和解密等。
这些组件是每个物(wù)联网设备的基础,尽管可(kě)能(néng)或多(duō)或少取决于您的特定应用(yòng)程序。
在本文(wén)中,我将假设您已经建立了连接并设置了主要应用(yòng)程序和传感器驱动程序。接下来,我将重点介绍如何添加一项允许您的设备通过无線(xiàn)方式进行更新(xīn)的功能(néng)。
OTA固件升级流程
对任何微控制器设备进行编程都是从主机上的简单 C/C++ 程序开始,然后使用(yòng)编译器构建可(kě)执行二进制文(wén)件 (.bin)。
然后使用(yòng)微控制器特定工具链通过 USB 将固件二进制文(wén)件上传到控制器。
这种方法对于调试和开发很(hěn)有(yǒu)用(yòng),但是在构建和部署设备之后更新(xīn)固件二进制文(wén)件可(kě)能(néng)会更加困难。
对于需要不断改进并且需要用(yòng)户反馈的最小(xiǎo)可(kě)行产品 (MVP) 尤其如此。这就是為(wèi)什么 OTA 固件升级是一项重要功能(néng),将极大地有(yǒu)利于迭代开发周期。
幸运的是,大多(duō)数物(wù)联网设备模块都提供了有(yǒu)关如何进行 OTA 固件升级的库和示例代码。
通常,固件升级过程如下所示:
步骤1:将二进制文(wén)件上传到服務(wù)器并获取指向二进制文(wén)件的URL。
第 2 步:向 IoT 设备发送一条通知,告知新(xīn)固件可(kě)供下载,并提供固件的 URL。
第 3 步:物(wù)联网设备将使用(yòng) HTTP 下载固件文(wén)件。固件文(wén)件应保存在不同的分(fēn)區(qū)中(稍后会详细介绍)。
第 4 步:物(wù)联网设备将检查二进制文(wén)件的真实性,并开始加载新(xīn)下载的固件。
在第 3 步和第 4 步之后应建立回退机制。如果固件文(wén)件在下载过程中损坏,物(wù)联网设备不应加载新(xīn)固件或释放已使用(yòng)的资源。
让我们看一个使用(yòng) ESP32 演示无線(xiàn)固件升级的示例。
请记住,此处讨论的任何内容都将普遍适用(yòng)于大多(duō)数物(wù)联网模块,并且应该是开发您自己的物(wù)联网解决方案的良好起点。
OTA 更新(xīn)也应该在设备的正常运行条件之外进行。
例如,如果物(wù)联网设备正在操作一个重要的执行器来打开和关闭气门,那么更新(xīn)应该在后台进行,同时主要任務(wù)正在运行而不被中断。
这就是建议使用(yòng)实时操作系统 (RTOS) 的原因,其中多(duō)線(xiàn)程可(kě)用(yòng)于部署独立运行的多(duō)个任務(wù)。
OTA 数据分(fēn)區(qū)
ESP32 允许我们根据可(kě)用(yòng)空间将设备的闪存分(fēn)區(qū)為(wèi)多(duō)个分(fēn)區(qū)。
当您在同一台 PC 上运行两个操作系统时,这与计算机硬盘驱动器分(fēn)區(qū)非常相似。例如,一个分(fēn)區(qū)可(kě)能(néng)运行 Windows 操作系统,而另一个分(fēn)區(qū)可(kě)能(néng)运行 Linux。
在 ESP32 模块中,我们必须提供一个 CSV 文(wén)件,其中包含分(fēn)區(qū)的偏移量及其名称。下面是一个 CSV 文(wén)件示例,其中概述了 ESP32 使用(yòng) OTA 功能(néng)所需的分(fēn)區(qū)表:
如您所见,共有(yǒu)三种“应用(yòng)程序”类型,每种类型包含 1 MB 的数据大小(xiǎo)。
“工厂”应用(yòng)程序是永遠(yuǎn)不会更改且无法更新(xīn)的主要固件。这是经过验证的应用(yòng)程序代码,如果两个 OTA 分(fēn)區(qū)中的任何一个分(fēn)區(qū)出现任何问题,设备将回退到该代码。
ESP32 上的引导加载程序将读取“otadata”分(fēn)區(qū)中存储的数据,以查看三个分(fēn)區(qū)中的哪一个最适合应用(yòng)程序加载。
如果“otadata”分(fēn)區(qū)是空的,那么它将启动到工厂应用(yòng)程序分(fēn)區(qū)。这就是為(wèi)什么有(yǒu)必要确保工厂应用(yòng)程序包含检查新(xīn)固件升级的逻辑。
安防措施
物(wù)联网设备升级过程中可(kě)能(néng)会发生攻击,因此应对生产级产品采取广泛的安全措施。
在此示例中,我不会详细说明许多(duō)可(kě)用(yòng)的安全功能(néng)。但是,我们将讨论安全 OTA 流程的关键要素:
使用(yòng)安全的云服務(wù)為(wèi)所有(yǒu)部署的设备启用(yòng)新(xīn)固件升级的可(kě)信通知。
使用(yòng) HTTPS (TLS) 连接后,IoT 设备应从云端安全下载固件映像。
物(wù)联网设备应该对新(xīn)固件文(wén)件进行身份验证,以确保它是由受信任的来源制作的。使用(yòng)代码签名技术,一旦编写并上传代码,文(wén)件就会被签名。
然后,如果所有(yǒu)密钥都匹配,IoT 设备将下载并确认签名文(wén)件,然后加载新(xīn)固件。设备的引导加载程序还应该执行额外的步骤,以确保正在加载的映像得到适当的签名,以防发生注入攻击。