如何使用STM32U5和AWS进行OTA更新?
本文演示了如何集成模块化AWS FreeRTOS™ 具有硬件强制安全性的软件,以帮助保护可更新的云连接应用程序。该项目预配置为在STM32U585物联网发现套件上运行,并连接到AWS。。。
STM32U5物联网发现套件配备了Wi-Fi和蓝牙模块、麦克风、温度和湿度传感器、磁力计、加速度计、陀螺仪、压力传感器,以及飞行时间(ToF)和手势检测传感器。
该板还配有512 Mbit八进制SPI闪存、64 Mbit八进位SPI PSRAM、256 Kbit I²C EEPROM、ARDUINO Uno V3、STMOD+和Pmod扩展连接器,以及用于相机模块的扩展连接器和STLink-V3E 嵌入式调试器。
以下项目文件夹由非TrustZone版本(b_u585i_iot02_ntz)以及启用TF-M的版本(b_u585i_iot02a_tfm)项目的一部分。以下文章包含关于启动该项目的非安全(b_u585i_iot02_ntz)版本并在AWS中执行OTA的说明。要使其在Mac/Linux中运行,请参阅以下内容-https://github.com/FreeRTOS/iot-reference-stm32u5/blob/main/Getting_Started_Guide.md.
它连接到AWS Core并发布数据。它包含有关如何执行OTA更新的说明。它显示了将STM32U585物联网发现套件连接到AWS物联网核心并使用FreeRTOS的步骤™ OTA更新服务。该演示使用WiFi模块连接到AWS物联网。然后,它使用coreMQTT代理库使多个并发任务能够共享单个MQTT连接。这些任务发布传感器数据,并演示设备阴影和设备卫士AWS物联网服务的使用。
本文假设您已经完成了带您完成设置以获得演示的文章(https://github.com/FreeRTOS/iot-reference-stm32u5)启动并运行。
文章第1部分:STM32U5物联网发现套件和AWS入门
执行空中传送(OTA)固件更新
该项目展示了如何集成FreeRTOS的物联网参考实施™ STM32U5平台上的库,使用非TrustZone®硬件功能。演示运行FreeRTOS™ OTA代理作为后台RTOS任务之一,等待来自云的OTA更新。该演示的非信任区版本利用了内部闪存的双组。总共2MB的内部闪存分为两组,每组1MB。主固件在一个银行上运行,同时将新的固件映像下载到另一个银行。因此,固件映像的总大小不应超过1MB。
提供代码签名凭据
设备使用数字签名来验证通过空中传送的固件更新的真实性。图像由创建图像的授权来源签名,设备可以使用来源的相应公钥验证图像的签名。以下步骤显示了如何设置和提供代码签名凭据,以便使云能够对映像进行数字签名,并使设备能够在启动前验证映像签名。
- 在工作目录中,使用以下文本创建一个名为证书配置.txt代替test_signer@amazon.com使用您的电子邮件地址:
[请求]提示=无区别名称=my_dn[my_dn]通用名称=test_signer@amazon.com[my_exts]keyUsage=digitalSignature extendedKeyUsage=codeSigning
- 创建ECDSA代码签名私钥:
openssl genpkey-算法EC-pkeyopt EC_paramgen_curve:P-256-pkeyoption EC_param _enc:named_curve-输出PEM-输出ecdsaigner-priva-key.PEM
3.创建要上传到AWS ACM服务的ECDSA代码签名证书:
openssl req-new-x509-config cert_config.txt-extensions my_exts-nodes-days 365-key ecdsaigner-priva-key.pem-out ecdsaiigner.crt
- 将代码签名证书和私钥导入AWS证书管理器:
注意:此命令显示证书的ARN。稍后创建OTA更新作业时,您需要此ARN。
aws-acm导入证书--证书fileb://ecdsasigner.crt--私钥fileb://ecdsasigner-priv-key.pem
- 通过串行端口将设备连接到终端。在命令行提示符上键入以下命令为设备提供公钥:
>pki导入密钥ota_signer_pub
按
然后粘贴PEM公钥文件的内容进来
进入终端。按电子签名-公共密钥.pem
再一次设备应成功提供用于验证数字签名的公钥。进来
是用于在固件更新验证期间引用代码签名密钥的标签。ota_签名_发布
- 在AWS中创建一个签名配置文件来对固件映像进行签名。
aws签名者放置签名配置文件--配置文件名称<您的配置文件名称>--签名材料certificateArn=<步骤4中创建的证书arn>--平台AmazonFreeRTOS默认--签名参数certname=ota_signer_pub
在AWS中设置OTA S3存储桶、服务角色和策略
S3存储桶用于存储要更新的新固件映像。要创建新的S3存储桶,请按照以下步骤操作:https://docs.aws.amazon.com/freertos/latest/userguide/dg-ota-bucket.html
创建一个服务角色,授予OTA服务访问固件映像的权限:https://docs.aws.amazon.com/freertos/latest/userguide/create-service-role.html
使用此处的文档创建OTA更新策略:https://docs.aws.amazon.com/freertos/latest/userguide/create-ota-user-policy.html
为AWS IoT添加访问代码签名配置文件的策略:https://docs.aws.amazon.com/freertos/latest/userguide/code-sign-policy.html
创建代码签名的固件更新作业
增加要更新的新固件映像的版本。在演示项目中,打开File Common/config/ota_config.h,并将APP_VERSION_MAJOR设置为比当前版本高1。使用STM32CubeIDE构建固件映像。
将新图像上传到上一节中创建的s3 bucket中。
aws s3 cp<图像二进制路径>s3://<图像的s3桶>/
通过执行以下命令获取二进制映像的最新s3文件版本。该命令返回一个json结构数组,其中包含所有版本的详细信息。若要获取最新版本ID,请查找版本Idjson结构中的字段,其中is最新字段为真实的。
aws s3api列出对象版本--bucket<s3 bucket for image>--prefix<image binary name>
- 在文件系统中创建一个新的OTA更新作业配置json文件(例如:OTA更新作业config.json),如下所示。将参数替换为从上述步骤获得的输出。
{“otaUpdateId”:“<OTA作业的唯一作业ID>”,“targets”:[“arn:aws:iot:<region>:<account-ID>:thing/<thing-name>”],“targetSelection”:“SNAPSHOT”,“files”:[{”fileName“:”<image binary name>“,“fileType”:0,“fileVersion”:“1”,“fileLocation”:{”s3Location“:{图像>“}},“codeSigning”:{“startSigningJobParameter”:{
从配置文件创建新的OTA更新作业:
aws-iot创建ota更新--cli输入json文件://<文件系统中的ota作业配置文件路径>
成功时的命令将OTA更新标识符和作业状态返回为
。要获取OTA作业的相应作业ID,请执行以下命令并查找创建_结束
返回json文档中的字段。awsIotJobId
aws iot获取ota更新-ota更新id=<上面创建的ota更新id>
记下作业ID,以便稍后检查作业的状态。
固件更新的监控和验证
一旦在终端日志上创建了作业,您就会看到OTA作业被接受,设备开始下载图像。
从配置文件创建新的OTA更新作业:
aws-iot创建ota更新--cli输入json文件://<文件系统中的ota作业配置文件路径>
成功时的命令将OTA更新标识符和作业状态返回为创建_结束。要获取OTA作业的相应作业ID,请执行以下命令并查找awsIotJobId返回json文档中的字段。
aws iot获取ota更新-ota更新id=<上面创建的ota更新id>
记下作业ID,以便稍后检查作业的状态。
固件更新的监控和验证
- 一旦在终端日志上创建了作业,您将看到OTA作业被接受,设备开始下载图像。
<INF>16351[OTAAgent]当前状态=[WaitingForFileBlock],事件=[RequestFileBlock],新状态=[WaitingForFileBlock](ota.c:2834=[文件路径:b_u585i_iot02_ntz.bin](ota.c:1642)<INF>17784[OTAAgent]当前状态=[等待文件块],事件=[请求文件块],新状态=[WaitingForFileBlock](ota.c:2834)<INF>15297[OTAAgent]提取的参数:[key:value]=[fileid:0](ota.c:1683 ed参数:[key:value]=[fileType:0](ota.c:1683)<INF>15301[OTAAgent]作业文档已被接受。正在尝试开始更新。(ota.c:2199)<INF>16533[OTAAgent]剩余块数:306(ota.c:2683)<INF>15450[OTAAgent]设置ota数据接口。(ota.c:938)<INF>15450[OTAAgent]当前状态=[正在创建
- 一旦下载了完整的图像,OTA库就会验证图像签名,并激活未使用的闪存库中的新图像。
<INF>67405[OTAAgent]收到更新的最后一块。(ota.c:2633)<INF>67405[OTAAgent]使用数字签名验证ota图像的完整性。(ota_pal.c:681)<INF>69643[OTAAgent]收到完整更新并验证签名。(ota.c:2654)
- 新映像启动并执行自检,在这里它检查版本是否高于以前的版本。如果是,则将新图像设置为有效。
<INF>15487〔OTAAgent〕处于自检模式。(ota.c:2102)<INF>15487[OTAAgent]新映像的版本号高于当前映像:新映像版本=1.9.0,以前的映像版本=0.9.0(ota.c:11932)
- 检查作业状态时,应将作业显示为成功:
aws-iot描述作业执行--作业id=<上面创建的作业id>--事物名称=<事物名称>
故障排除
1.。有关如何在Mac/Linux中运行它的更多信息,请参阅https://github.com/FreeRTOS/iot-reference-stm32u5/blob/main/README.md