24小時聯系電話:18217114652、13661815404
中文
行業資訊
如何通過無線 (OTA) 更新嵌入式固件
如何通過無線 (OTA) 更新嵌入式固件
物聯網設備通過互聯網傳輸和接收數據,目前大多數物聯網設備都是無線連接的。
在設計您的下一個物聯網設備時,必須考慮的一個非常重要的方面是更新物聯網設備固件的過程。
我們熟悉這樣的想法,即固件只需編寫一次即可與硬件接口,并且很少更改。這部分是由于大多數設備并非設計用于連接到互聯網的想法。
然而,隨著當前物聯網開發和設備部署的興起,固件的定義將需要重新審視。
讓我們從探索物聯網設備固件的不同組件開始。在典型設備中,您會遇到以下固件組件:
無線連接 (WiFi/BLE) – 高度依賴于所使用的無線連接協議。大多數無線微控制器都帶有開箱即用的受支持協議,以及易于使用的 API,例如 ESP32 微控制器。
外部傳感器驅動程序——可能由物聯網設備的開發人員編寫,用于與微控制器一起使用的任何外部傳感器。例如,如果您想收集房間內的溫度,則必須使用溫度傳感器并編寫驅動程序以從傳感器中采樣數據。
應用程序特定程序- 您非常特定應用程序的主程序。這是固件的所有不同組件將被捆綁在一起以形成良好流程的地方。
配置——每個物聯網設備都帶有默認設置,需要更改為其用戶特定設置。例如,WiFi 路由器的接入點 (AP) 配置,其中 SSID 和密碼傳遞給微控制器以用于連接到互聯網。
OTA 固件更新——這是一個重要的組件,應該包含在您的開發周期中,因為它可以讓您的物聯網設備通過互聯網進行更新,而無需與設備進行物理接口。
云連接——最有可能由云服務提供商提供用于與云交互的 API 和 SDK。一個示例是連接到 IoT MQTT 代理、接收命令等。
Crypto Utilities——由于微控制器必須連接到安全的云,控制器必須能夠通過簽名和解密來自云的消息來驗證自己。大多數支持物聯網的微控制器都有自己的庫和支持,例如 AES、SHA、RSA、隨機數生成器 (RNG)、內存加密和解密等。
這些組件是每個物聯網設備的基礎,盡管可能或多或少取決于您的特定應用程序。
在本文中,我將假設您已經建立了連接并設置了主要應用程序和傳感器驅動程序。接下來,我將重點介紹如何添加一項允許您的設備通過無線方式進行更新的功能。
OTA固件升級流程
對任何微控制器設備進行編程都是從主機上的簡單 C/C++ 程序開始,然后使用編譯器構建可執行二進制文件 (.bin)。
然后使用微控制器特定工具鏈通過 USB 將固件二進制文件上傳到控制器。
這種方法對于調試和開發很有用,但是在構建和部署設備之后更新固件二進制文件可能會更加困難。
對于需要不斷改進并且需要用戶反饋的最小可行產品 (MVP) 尤其如此。這就是為什么 OTA 固件升級是一項重要功能,將極大地有利于迭代開發周期。
幸運的是,大多數物聯網設備模塊都提供了有關如何進行 OTA 固件升級的庫和示例代碼。
通常,固件升級過程如下所示:
步驟1:將二進制文件上傳到服務器并獲取指向二進制文件的URL。
第 2 步:向 IoT 設備發送一條通知,告知新固件可供下載,并提供固件的 URL。
第 3 步:物聯網設備將使用 HTTP 下載固件文件。固件文件應保存在不同的分區中(稍后會詳細介紹)。
第 4 步:物聯網設備將檢查二進制文件的真實性,并開始加載新下載的固件。
在第 3 步和第 4 步之后應建立回退機制。如果固件文件在下載過程中損壞,物聯網設備不應加載新固件或釋放已使用的資源。
讓我們看一個使用 ESP32 演示無線固件升級的示例。
請記住,此處討論的任何內容都將普遍適用于大多數物聯網模塊,并且應該是開發您自己的物聯網解決方案的良好起點。
OTA 更新也應該在設備的正常運行條件之外進行。
例如,如果物聯網設備正在操作一個重要的執行器來打開和關閉氣門,那么更新應該在后臺進行,同時主要任務正在運行而不被中斷。
這就是建議使用實時操作系統 (RTOS) 的原因,其中多線程可用于部署獨立運行的多個任務。
OTA 數據分區
ESP32 允許我們根據可用空間將設備的閃存分區為多個分區。
當您在同一臺 PC 上運行兩個操作系統時,這與計算機硬盤驅動器分區非常相似。例如,一個分區可能運行 Windows 操作系統,而另一個分區可能運行 Linux。
在 ESP32 模塊中,我們必須提供一個 CSV 文件,其中包含分區的偏移量及其名稱。下面是一個 CSV 文件示例,其中概述了 ESP32 使用 OTA 功能所需的分區表:
如您所見,共有三種“應用程序”類型,每種類型包含 1 MB 的數據大小。
“工廠”應用程序是永遠不會更改且無法更新的主要固件。這是經過驗證的應用程序代碼,如果兩個 OTA 分區中的任何一個分區出現任何問題,設備將回退到該代碼。
ESP32 上的引導加載程序將讀取“otadata”分區中存儲的數據,以查看三個分區中的哪一個最適合應用程序加載。
如果“otadata”分區是空的,那么它將啟動到工廠應用程序分區。這就是為什么有必要確保工廠應用程序包含檢查新固件升級的邏輯。
安防措施
物聯網設備升級過程中可能會發生攻擊,因此應對生產級產品采取廣泛的安全措施。
在此示例中,我不會詳細說明許多可用的安全功能。但是,我們將討論安全 OTA 流程的關鍵要素:
使用安全的云服務為所有部署的設備啟用新固件升級的可信通知。
使用 HTTPS (TLS) 連接后,IoT 設備應從云端安全下載固件映像。
物聯網設備應該對新固件文件進行身份驗證,以確保它是由受信任的來源制作的。使用代碼簽名技術,一旦編寫并上傳代碼,文件就會被簽名。
然后,如果所有密鑰都匹配,IoT 設備將下載并確認簽名文件,然后加載新固件。設備的引導加載程序還應該執行額外的步驟,以確保正在加載的映像得到適當的簽名,以防發生注入攻擊。