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通讯软体