OTA - 通過 OTA 將固件更新到 Ameba

材料準備

• AmebaD [ AMB23 / AMB21 / AMB22 / BW16] x 1

範例說明

OTA(Over-The-Air)指的是通過網路來更新的機制。Arduino IDE本身也提供 OTA 的功能,它的概念如下圖:

  1. Arduino IDE 建立了 mDNS(multicast Domain Name Services)並組播它的 IP 地址。 此 IP 地址將用於 OTA 服務器綁定局域網路 (LAN) 的 TCP socket。
  2. 由於 mDNS 服務運行在 Ameba 上,Ameba 回應 mDNS 並打開特定的 TCP 端口進行連接
  3. Ameba 充當 OTA 客戶端並建立 TCP 連接,等待來自 OTA 服務器的 TCP socket 連接。
  4. 一旦在 Arduino IDE 中找到之前建立的網絡端口。 通過點擊 Arduino IDE 中的 “Upload” 按鈕,使用者準備的 OTA image 將通過OTA服務器發送到指定的 IP 和網絡端口。 上傳程序完成後,Ameba 將自動使用此 OTA image 開機。

整個流程裡,包含了三個部份:mDNS, TCP, 與 OTA image 的處理。mDNS 範例中描述了與 mDNS 相關的詳細資訊:[MDNS – 在 Arduino IDE 上設置 mDNS 客戶端]。 TCP socket 編程透過OTA服務器工具和 OTA API 來用於 image 傳輸。

在下一節中,我們將討論如何處理 OTA image,並介紹 Ameba 快閃記憶體 layout 和啟動流程的一些基本知識。

Ameba Flash Memory Layout

AmebaD 的預設快閃記憶體大小為 2MB,範圍從 0x0800_0000 到 0x0820_0000 -1。 如下圖所示,Ameba的程式主要佔據3個區塊:

  • Boot Image (KM0 Boot and KM4 Boot): 即 bootloader。 當 Ameba 開機後,會將 Boot Image 放置到 Memory 執行。它的工作主要是做一些初始化,其中一項工作就是決定當 Bootloader 執行完之後,要從哪裡執行, Bootloader查看 OTA 地址並確定之後將執行哪個 image。 在 bootloader 結束時,它將 image 放入 memory 並繼續執行它。
  • Backup: Backup Flash區域從0x0800_2000 – 0x0800_3000-1開始,保留給系統使用。 在編程系統參數時,該區域將作為備份區使用。
  • System Data: 系統參數區域從 0x0800_3000 – 0x0800_4000-1 開始,使用者需要仔細編程這個區域。
  • Default Image 2 (KM0 IMG2 and KM4 IMG2): 這部份主要是使用者開發的程式碼; 地址從 0x0800_6000 或 0x0810_6000 開始。 前 16 bytes 用於 Image 檔頭,其中包含用於快閃記憶體校準的 bootloader Signature。 Signature 用於驗證 image 是否有效。
  • OTA Image (OTA1 and OTA2): 這部分的數據也是開發者程式碼。 預設情況下,這部分地址從0x0800_0000開始。 OTA image 和 Default Image 2 之間的主要區別是 OTA image 包含特殊的 32 Bytes 固件檔頭。

生成 Cloud OTA Image

Cloud OTA Image 生成步驟如下:
1) 編譯使用者 sketch。 “km0_km4_image2.bin”將在以下文件路徑中完成 Arduino 的sketch驗證(編譯)過程後生成:
C:\Users\USERNAME\AppData\Local\Arduino15\packages\realtek\tools\ameba_d_tools\x.x.x. 該文件將用作稍後轉換為 OTA 二進製文件的source。
2) 從 GitHub ambd_sdk 中獲取“ImageTool.exe”:https://github.com/ambiot/ambd_sdk/tree/dev/tools/AmebaD/Image_Tool,雙擊打開它。
3) 選擇“OTA_All”作為生成目標類型(紅色)。
4) 輸入Image版本,默認值為 “0xFFFFFFFF”。
5) 點選Browse按鈕選擇要轉換為 OTA 二進製文件的目標images。 地址可以忽略。 Memory Layout將顯示兩個images的相對位置。 如果重疊,則重疊區域以紅色警告。
6) 點選Generate按鈕以指定輸出文件的名稱和路徑。 操作完成後,cloud image(OTA_All.bin)將生成在您指定的目錄中。
我們建議將它放在 Arduino Ameba 的預設文件目錄中:
a. Windows
C:\Users\username\AppData\Local\Arduino15\packages\realtek\tools\ameba_d_tools\x.x.x\
b. Linux
/home/username/.arduino15/packages/Realtek/tools/ameba_d_tools/x.x.x/
c. MacOS
/Users/username/Library/Arduino15/packages/Realtek/tools/ameba_d_tools/x.x.x/

在作業系統上的指定目錄中,創建一個名為“misc”的新資料夾,並將 OTA image (OTA_All.bin) 放入其中。

打開範例:“File”-> “Examples”-> “AmebaOTA”-> “OTA_Basic”:
在網絡連接範例程式碼中填寫Wi-Fi SSID和密碼,建立mDNS服務。

有一些與 OTA 相關的參數:
• OTA_PORT:Arduino IDE 將通過 mDNS 找到 Ameba。 Ameba 會告訴 Arduino IDE 打開的 TCP 端口 8020 等待 OTA image。 此端口號也與 OTA 服務器的端口號匹配。

然後我們使用USB上傳程序到Ameba。 點擊“Tools”-> “Ports”勾選要使用的 Serial:

打開 Serial Monitor 並按下“Reset”按鈕後,Ameba 連接到 AP 並獲得通過 DHCP 分配的 IP 地址:“192.168.xxx.xxx”,如下所示。

mDNS服務建立成功後,該IP地址將被組播並出現在Arduino IDE“Tools”-> “Port”-> “Network Ports:My Ameba at 192.168.xxx.xxx”。

如果你的Arduino IDE沒有找到Ameba的network port,請確認
– 你的電腦與Ameba是否在同個區域網路裡?
– 重開Arduino IDE試試看
– 檢查在Serial Monitor的log裡Ameba是否成功連上AP並且成功啟用mDNS

目前,Ameba 板用作 OTA 服務器,監聽來自任何潛在 OTA 客戶端的 TCP socket 連接。
可以從三個作業系統(Windows、Linux 和 macOS)建立 OTA 客戶端。選擇“Tools”-> “Port”-> “Network Ports:My Ameba at 192.168.xxx.xxx”,然後點擊“Upload”。
OTA 客戶端會與 Ameba 的網絡 IP 和端口8020建立 TCP 連接,然後傳輸 OTA 固件。 當 Arduino IDE 中顯示 “Client Disconnected” 且沒有任何錯誤消息時完成OTA。

一旦 OTA 傳輸完成並且您在serial monitor中看到日誌消息“[beginOTA] Update task exit”,開發板將自動執行重置並從flash中的 OTA image重新啟動。

根據OTA開機流程圖,當OTA2有有效 images 時,AmebaD默認從OTA2開機。

因此,如果您希望通過 Serial Port上傳新 images,請在 Arduino IDE 中啟用“Erase Flash”選項。

請先確認已安裝QQ通訊軟體