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 固件檔頭。
生成 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”選項。