亚马逊AWS官方博客

使用 AWS IoT OTA 部署工具实现大规模 OTA 任务

当我们需要对交付到用户手中的物联网设备进行维护、固件更新、安全更新或者批量修改设备上的配置文件时,我们都需要通过OTA(Over-The-Air)方式来实现。你需要部署并且监控这些固件更新任务,及时了解这些OTA任务过程中涉及到的设备的更新进度(例如:是否成功接受指令、最终是否更新成功)再根据结果采取相应行动。

无论您是管理数百、数千乃至数百万台物联网设备,都可以借助 AWS IoT Device Management 设备作业组件实现运行和监控软件更新,并且在作业部署到设备时收到关于作业状态的实时信息。

本篇博客中,我们重点介绍如何通过 AWS IoT OTA部署工具结合 AWS IoT Device Management服务来满足以下三个场景:

  1. 固件开发过程中需要频繁的OTA更新
  2. 进行OTA更新压力测试,确保固件更新的稳定性
  3. 部署大规模设备的OTA任务

接下来您将了解到:

  • 配置您的设备
  • 使用 AWS IoT OTA部署工具简化OTA任务部署
  • 使用CI/CD工具部署OTA任务
  • 监控OTA任务

 

1.配置您的设备

当您的设备完成网络连接后进行以下操作:

  1. 根据该指引完成创建 AWS IoT 事物、证书和私有密钥
  2. 根据 AWS IoT MQTT File Download Agent 操作步骤配置您的设备

AWS IoT MQTT File Download Agent 实现了共用 AWS IoT MQTT 连接下载OTA固件的功能,对于一些性能受限的物联网设备(无法使用HTTP/HTTPS方式下载更新固件)该代码库非常有用。

一旦您完成以上步骤,您的设备就已经能够连接上 AWS IoT Core ,并且实现了 AWS IoT Device Management 设备作业组件的设备端功能。

 

 

2.使用 AWS IoT OTA部署工具简化OTA任务部署

AWS IoT OTA 部署工具(AWS IoT OTA deployment tool)是由 AWS IoT 物联网实验室同事构建的,它对 AWS IoT Device Management 设备作业组件 相关SDK/API 进行封装,包含 debug日志输出、配置以及清理测试环境、部署状态监控与报警等功能。它通过提供Shell / Python 脚本来简化您在开发阶段需要频繁测试OTA更新以及大规模部署OTA任务等场景下的工作量,节省您的开发/部署时间。

2.1部署环境要求:

2.2准备您需要进行OTA更新的设备列表

您可以利用多种方式过滤出目标设备

当您过滤出目标设备,您的 thingList.txt 文件看起来应该是类似这样子:

arn:aws:iot:us-west-2:123456789000:thing/ota-device-01
arn:aws:iot:us-west-2:123456789000:thing/ota-device-02

注意应该把 thingList.txt 文件放入 src/ 目录底下。

2.3配置以及提交您的OTA任务

OTA 部署工具将完成,创建 AWS IoT 设备作业,上传 固件(bin文件)到指定的S3,解析 thingLists.txt 文件并且开始部署或者进行OTA更新测试。

在开始之前我们需要通过配置代码库中的 src/dev.ini 文件来定制我们的OTA任务,OTA部署工具可以满足多个场景,详细的配置项说明,请参见 dev.ini 配置说明,根据您的需求修改配置文件。

我们以下的配置示例,展示了如何实现一个OTA压力测试,通过OTA压力测试它能够帮您检测OTA更新的稳定性。

[DEFAULT]
thingList = thingsList.txt
binName = test.bin
roleArn = arn:aws:iam::123456789000:role/IoT-OTA
jobId = JobPython5566
rounds = 10
bucket = jim-iot-ota-upgrade
cleanUpCfg = True
debug = False
defaultDelay = 5
region = us-west-2

….

[DEFAULT]
roleArn: 用于OTA更新的服务角色,并且赋予对应的权限
bucket: 储存OTA更新包的S3储存桶名称,应该修改成为您对应的S3储存桶,并且注意在OTA更新的服务角色里应该授予该储存桶的读写权限。
rounds:如果您的应用场景是OTA固件更新,那么应该把它设置成 1,在我们这个场景下我们需要做OTA压力测试,可以设置成大于1的任意值(这里设置 10 次)。OTA部署工具将部署相同的OTA固件多次,以测试固件更新逻辑的稳定性。
cleanUpCfg:对于OTA压力测试场景,设置成 True 会自动清理测试环境
region:配置您服务所在的Region

运行 jobs_scheduler.py 开始提交 更新任务,并且进行多轮测试:

python3 jobs_scheduler.py

在您部署OTA任务的控制台上,最终您能看到成功完成OTA任务的次数:

设备端的输出,展示了一个收到 OTA更新指令,并且通过MQTT 连接分块获取OTA更新包的过程:

 

3.OTA部署工具(Python)与CI/CD工具结合

3.1环境部署要求

  • 确保您完成 “使用 AWS IoT OTA部署工具简化OTA任务部署”
  • 利用您自己的CI/CD工具,这里以Jenkins为例子
  • 确保您测试开发环境配置了AWS 命令行工具,并且IAM用户具有 DynamoDB 相应权限

3.2整体架构概览

 

上面的架构图中,展示了我们如何利用 OTA部署工具(Python)结合 Jenkins 来完成面向大规模设备的OTA更新任务

  • 用户可以使用应用程序调用或者直接运行 add_job_schedule.py 添加一个OTA任务
  • 新添加的OTA任务会DynamoDB中添加一个任务列队
  • Jenkins 将利用featch_job_schedule.py 遍历OTA 任务
  • jobs_scheduler.py 将部署对应的OTA任务
  • monitor.py 脚本可以被用来监控这些任务的状态

3.3 初始化DynamoDB

使用AWS CLI命令行工具运行以下命令,创建一个DynamoDB 表:

aws dynamodb create-table \
–table-name job_config_table \
–attribute-definitions AttributeName=jobStatus,AttributeType=S AttributeName=timestamp,AttributeType=S \
–key-schema AttributeName=jobStatus,KeyType=HASH AttributeName=timestamp,KeyType=RANGE \
–provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5

 

3.4 Jenkins 配置

设置 Jenkins 任务并且定期运行OTA部署工具中的python 脚本,以下内容展示如何配置Jenkins,您也可以直接导入 deploy/jenkins_config.xml 。

 

 

 

General

Source Code Management

Build Triggers

Build

 

Build 代码样例:

cd src
python3 fetch_job_schedule.py -r $region -tb $db_table_name
if ls thingListFile_* 1> /dev/null 2>&1; then
python3 jobs_scheduler.py
rm thingListFile_*
rm devFile_*
rm binFile_*
else
echo “File doesn’t exist, no new jobs”
fi

3.5 添加OTA任务

当前面的配置步骤完成后,我们就可以运行 add_job_schedule.py 按需的添加OTA任务,后续 Jenkins 定期会运行未完成的OTA任务。

python3 add_job_schedule.py -m submit -f test.bin -tb job_config_table -b iot-ota-upgrade-package-6241709 -r us-west-2 -d dev.ini -l thingsList.txt

4.总结与思考

在我们这篇博客中,我们介绍了 AWS IoT OTA部署工具基本的使用方法。AWS IoT OTA部署工具实现基于 AWS IoT Device Management 设备作业组件 相关SDK/API 进行封装,满足完善了在生产环境中的多个场景(例如:OTA压力测试、大规模设备OTA部署),另外它还有完善的监控与报警机制、丰富的定制参数满足更多的实际应用场景,构建者们可以前往GitHub项目上了解更多玩法。

如果您在实现此解决方案时遇到问题,请在 AWS IoT设备管理论坛 发布讨论主题。

 

本篇作者

高寅敬

AWS解决方案架构师,负责基于AWS云计算方案架构的咨询和设计,在国内推广AWS云平台技术和各种解决方案。在加入AWS之前就职于美国虚拟运营商,超过10年的互联网通信应用系统开发和架构经验。超过7年的AWS技术实践经验, 精通基于AWS全球分布式VoIP系统的开发、运营及部署,深度理解AWS核心的计算、网络、存储以及云计算的弹性伸缩,目前专注于移动互联网应用及物联网解决方案设计。

 

Daniel Hsieh

AWS Software Developer Engineer,  AWS IoT Lab Team Lead, 专注于物联网端到端解决方案构建, 帮助客户进行物联网产品落地。