亚马逊AWS官方博客
Step-by-Step 快速上手 AWS IoT OTA 固件升级
为了保证物联网设备能够保持在功能上随时更新,并且在出现问题的时候及时得到修复。小到智能手环,空气净化器,大到家用汽车,设备厂商无不是通过提供 OTA(Over-The-Air)功能来提高用户满意度。而利用 AWS IoT Device Management 中的 Jobs 组件,可以帮助客户非常快速的开发出物联网设备的 OTA 功能。本文旨在帮助读者一步步的快速上手并理解 OTA 升级流程,其中会使用到 AWS IoT Core,IoT Device Management,EC2 以及 S3 的相关功能。关于在开发过程中的具体流程可以配合参考 AWS IoT Device SDK 文档。
准备工作
- 用具有 admin 权限的用户登陆 AWS Console。
- 本文中的 AWS IoT 设备会使用一台 Amazon Linux EC2 实例模拟,Amazon Linux EC2 实例上默认安装了 AWS 命令行工具 AWSCLI,接下来的所有操作都是以 AWS us-east-1 区为示例。启动一台 Amazon Linux EC2 实例作为模拟的 IoT 设备,由于后面安装要安装的 rpm 包有依赖关系,这里要确保使用的是 Amazon Linux 2023 AMI (HVM)。
- 为了保证网络畅通,在实验环节 Security Group 建议开放全部的 IP 和端口。如在第四步最后遇到 Connect Closed,可在用于测试的 EC2 Instance 所关联的 Security Groups 的 Inbound rules 中添加一条新的规则,允许所有 IP 地址 (0.0.0.0/0) 访问所有端口 (0-65535)。
- 在 AWS Console 上赋予这台 EC2 实例一个具有足够权限的 Role,测试中可以直接用 admin 权限。
- 在 IAM 服务中,生成 Access Key 和 Secret Access Key 并记录下来。
- 登陆到 EC2 实例上使用 aws configure 命令配置好上一步生成的 Access Key 和 Secret Access Key 并将 Region 设置为 us-east-1。
操作流程
- 环境准备
- 在 AWS 上创建 IoT Thing
- 编写 AWS IoT Jobs 文档
- 运行 IoT 设备端程序
- 创建 AWS IoT Jobs 进行固件升级
- 验证固件升级是否成功
第一步 – 环境准备
- 登陆 EC2 实例,安装 git
- 安装 node.js
- 安装 AWS IoT Device SDK – Javascript
- 下载两个不同版本的 telnet 程序包,后续模拟固件升级时使用
- 安装旧版本 telnet 程序,后续我们会通过 OTA 完成这个程序从 telnet-0.17-76.el8.x86_64 版本到 telnet-0.17-85.el9.x86_64 版本的升级
- 创建一个 S3 bucket 作为新固件的存储位置,并上传新版本的 telnet 程序
第二步 – 在 AWS 上创建 IOT thing
- 创建 IoT thing,记录下输出中的 thingArn
- 下载 AWS IoT 根证书,创建 IoT 设备证书和密钥,记录下生成的 certificateArn
- 从上一步的命令输出中记录下自己的 certificateArn,后面的命令中会用到,例如
- 创建一个 IoT Policy,挂载给证书并激活证书
- 编写一个 policy 文档,复制以下 JSON 格式的策略并保存为 iot-policy.json 文件
- 创建 iot policy
- 挂载 policy 到之前创建的 IoT 设备证书上,注意这里的 –target 替换成自己的证书 Arn
- 激活证书,注意 –certificate-id 替换成自己证书的 id
- Attach thing 到证书,其中 –principal 是自己证书的 Arn
第三步 – 编写 AWS IoT Jobs 文档
- 编写一个 IoT Jobs 文档。关于文档编写的格式,请参考 https://github.com/aws/aws-iot-device-sdk-js#jobsAgent。当 IoT 设备请求 IoT Jobs 文档时,AWS IoT 会生成预签名 URL 并使用预签名 URL 替换占位符 URL。然后将 IoT Jobs 文档发送到设备,设备会通过这个预签名 URL 取得访问 S3 bucket 中固件的权限
- 编写一个 jobs 文档,复制以下 JSON 格式文档并保存为 jobs-document.json 文件。其中 url 地址可以从 S3 bucket 控制台界面直接 Copy URL
- 上传 IoT Jobs 文档到 S3 bucket,桶名称 example-bucket-202401 替换成自己的桶名称
- 在创建使用预签名 Amazon S3 URL 的 Job 时,您必须提供一个 IAM 角色,该角色可授予 AWS IoT 服务从 Amazon S3 存储桶中下载文件的权限。该角色还必须向 AWS IoT 授予 assumeRole 的权限,也就是让 AWS IoT 具有代表设备去 S3 上面下载固件的权限
- 编写一个 assumeRole 的 policy 文档,复制以下 JSON 格式的策略并保存为 trust-policy.json 文件
- 创建 IAM Role,记录下 Arn
- 编写一个从 S3 存储桶下载文件的 policy 文档,复制以下 JSON 格式的策略并保存为 s3-policy.json 文件,Arn 中替换成自己的 bucket name
- 创建 policy,记录下 Arn
- 挂载 policy iot-access-s3 到 role iot-access-s3,替换 arn 为上一步的 arn
第四步 – 运行 IoT 设备端程序
- 查看自己的 AWS IoT Endpoint
- 运行客户端程序 jobs-agent.js,并等待 jobs 的提交,注意将 endpoint 改为上一步获取的自己的 endpoint 地址
第五步 – 创建 AWS IoT Jobs 进行固件升级
- 新开一个命令行窗口到 EC2 实例,查看当前固件版本
- 创建 AWS IoT Jobs,#注意这里的 –targets,example-bucket-123 和 roleArn 要替换成自己的
第六步 – 验证固件升级是否成功
- 查看之前 IoT 设备端程序输出
- 查看 IoT Job 状态
- 查看固件版本号
- 程序版本已由 telnet-0.17-76.el8.x86_64 升级到 telnet-0.17-85.el9.x86_64
到此为止,通过以上几步简单的动手环节,您已成功地完成了 OTA 升级。