OTA - 通過 OTA 將固件更新到 Ameba
材料準備
• AmebaD [ AMB23 / AMB21 / AMB22 / BW16] x 1
範例說明
OTA(Over-The-Air)指的是通過網路來更新的機制。Arduino IDE本身也提供 OTA 的功能,它的概念如下圖:
- Arduino IDE 建立了 mDNS(multicast Domain Name Services)並組播它的 IP 地址。 此 IP 地址將用於 OTA 服務器綁定局域網路 (LAN) 的 TCP socket。
- 由於 mDNS 服務運行在 Ameba 上,Ameba 回應 mDNS 並打開特定的 TCP 端口進行連接
- Ameba 充當 OTA 客戶端並建立 TCP 連接,等待來自 OTA 服務器的 TCP socket 連接。
- 一旦在 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 固件檔頭。
打開範例:“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 客戶端。 將您要上傳的 OTA 二進製文件重命名為“OTA_All.bin”,並根據您使用的作業系統將其放置在“\Desktop\OTA_All.bin”下。
選擇“Tools”-> “Port”-> “Network Ports:My Ameba at 192.168.xxx.xxx”,然後點擊“Upload”。 OTA 客戶端會與 Ameba 的網絡 IP 和端口建立 TCP 連接,然後傳輸 OTA 固件。 當 Arduino IDE 中顯示 “Client Disconnected” 且沒有任何錯誤消息時完成OTA。
另一方面,一旦 OTA 傳輸開始,Ameba 板將打印以下資訊。 等 OTA 傳輸結束則出現“[beginOTA] Update task exit”。 Ameba 板在 OTA 的 TCP 連接斷開後會立即以 OTA image 重啟。
根據OTA開機流程圖,當OTA2有有效 images 時,AmebaD默認從OTA2開機。
因此,如果您希望通過 Serial Port上傳新 images,請在 Arduino IDE 中啟用“Erase Flash”選項。