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”选项。