用料
示例
说明
在这个示例中,我们使用Web UI将固件上传到一个或多个BW21-CBV-Kit。
关于为BW21-CBV-Kit OTA设置Web UI的说明,请点击以下链接并按照README.md中的步骤操作。[https://github.com/Ameba-AioT/ameba-OTA-UI]
实现流程
如果您的电脑上成功设置了BW21-CBV-Kit OTA Web UI,您将在http://localhost:3000/看到网页,下图显示了没有连接设备的网页渲染:
- 首先请在Arduino IDE中打开OTA示例。“文件”->“示例”->“AmebaOTA”->“OTA”。
- 在编译和上传示例之前,请完成以下步骤:
- 设置从SD卡加载NN模型。“工具”->“NN模型加载”->“SD卡”
- 启用OTA模式。“工具”->“OTA模式”->“启用”
- 根据您的AP修改名称和密码。您的电脑和 BW21-CBV-Kit 应该连接到同一个局域网。
- 现在,编译并上传这个示例到您拥有的每个和所有板上。可以是一个板或多个板(在这个示例指南中我们将使用两个BW21-CBV-Kit)。
- 这个设置至少必须完成一次,以允许OTA线程API第一次被调用。对于后续的固件更新,只要包含了OTA.h并在setup函数中调用了start_ota_threads API,您就不需要手动重新上传代码。
- 上传后,按下重置按钮并在串行监视器上获取单个BW21-CBV-Kit的IP地址。
开发板1的IP地址:192.168.3.26
开发板2的IP地址:192.168.3.65
然后,转到BW21-CBV-Kit OTA Web UI http://localhost:3000/查看连接的设备。
- 如果您能在OTA网页上看到BW21-CBV-Kit的IP地址,这表明连接成功。
在下面的步骤中,您可以将BW21-CBV-Kit从电脑上断开并使用任何稳定的5V直流电源供电。本示例指南的整体连接图如下所示。
在这个教程中,我们将通过OTA上传一个NTPClient草图。
- 打开NTPClient示例。“文件”->“示例”->“NTPClient”->“基础”。
- 包含OTA.h头文件并在setup函数的末尾添加API start_OTA_threads,并根据您的HTTP服务器定义端口号和IP地址。同时根据您的AP修改名称和密码。
- 参考下图修改后的NTPClient草图。
在编译之前,记得设置从SD卡加载NN模型并启用OTA模式。
编译修改后的NTPClient草图,编译后不要上传。
优先级很重要:请注意,BW21-CBV-Kit将只会启动最新的编译固件。
编译完成后,在C:\Users<username>\AppData\Local\Arduino15\packages\realtek\tools\ameba_pro_tools\x.x.x中查找ota.bin文件。
将ota.bin(或重命名后的ota.bin)上传到网页UI进行OTA传输到BW21-CBV-Kit,如下图所示:
- 点击“开始OTA”开始OTA传输。当固件在板上更新时,您将看到OTA状态的变化,如下图所示。
- 下载进度完成后,板将自动使用OTA传输的固件(即本示例中的修改后的NTPClient)重新启动。
- 重启后,您将在串行监视器上看到生成的输出。
开发板1:
开发板 2:
代码参考
多线程:
在start_OTA_threads()中编写了两个线程,以确保OTA更新成功。
- 线程1:
为了检查连接,OTA状态从AMB82迷你板发送到服务器。一旦接收到,板上的OTA状态将显示在Web UI上。
thread1_id = os_thread_create_arduino(thread1_task, NULL, priority1, stack_size1);
// 第一个线程是为了保持连接检查(每5秒发送请求一次)
if (thread1_id) {
Serial.println("[OTA] Keep-alive connectivity thread created success-fully.");
}
else {
Serial.println("[OTA] Failed to create keep-alive connectivity thread.");
}
监听来自服务器的OTA开始信号,一旦收到start_ota信号,BW21-CBV-Kit 将请求通过OTA下载固件。
thread2_id = os_thread_create_arduino(thread2_task, NULL, priority1, stack_size2);
// 第二个线程是为了获取开始OTA过程的信号。
if (thread2_id) {
Serial.println("[OTA] Start OTA process thread created successfully.");
}
else
{
Serial.println("[OTA] Failed to create Start OTA process thread.");
}