写点什么

AWS IoT 物联网系列,第四篇:如何使用 AWS IoT 做 OTA 升级

  • 2019-10-23
  • 本文字数:5313 字

    阅读完需:约 17 分钟

AWS IoT 物联网系列,第四篇:如何使用 AWS IoT 做 OTA 升级

AWS IoT 物联网系列博客

当前物联网环境中,设备类型多种多样,连接方式不一而足。为了帮助读者更好的理解并运用 AWS IoT 相关服务,我们提供了一个完整的 IoT 起步指南,包含设备的注册及上线、设备管理、用户身份及权限管理以及成本控制,通过这一系列的起步指南,也可以快速了解到 AWS IoT 服务如何与 Amazon Alexa 语音助手进行集成。AWS IoT 物联网系列共 4 篇,本篇是该系列的第一篇,其他篇链接请在本文结尾处查看。



背景介绍

在实际的物联网设备生产中,一般会量产部署上百万设备。这些设备到达客户手上,或者部署到生产系统后,如何安全管理设备,例如远程升级设备这些常见操作,会成为一个难题。物联网设备往往没有屏幕,也没有工作人员在设备前进行手动管理。升级操作如何触发?升级失败后如何回滚,并上报升级状态?这种场景需要提前设计一套系统,自动化进行设备管理。


借助 AWS IoT 设备管理功能,可以很方便的为设备接入到物联网,远程监控和远程管理物联网设备。AWS IoT 设备管理中的任务管理允许用户对设备进行分组和跟踪,同时允许快速查找设备,排查设备功能故障,远程更新设备固件,以及远程重新启动、修复以及将设备恢复到出厂设置,并降低管理大型物联网设备部署的成本和工作量。本博客将介绍如何使用 AWS IoT 设备管理功能帮助您完成设备生命周期管理,简化开发和运维部署,进行远程任务下发。


AWS IoT 任务执行时序图

使用 AWS IoT 创建 OTA 任务时,根据终端设备设置的处理流程,AWS 会把任务分别发布到以下两个预留的 MQTT 主题:


  • $ aws / things / {thingName} / jobs / notify

  • $ aws / things / {thingName} / jobs / notify-next


这两个主题对应两种不同的设备处理流程:第一种是由设备判断任务优先度,选择一个需要执行的任务。第二种是完成一个任务之后,自动按顺序获取下一个任务。针对不同的设备处理流程,设备需要主动订阅这两个 MQTT 主题之一。下述会对两种方法的流程逐步进行介绍。

方法一:获取需要执行的任务:


  1. 设备连接到 AWS IoT 平台后,订阅 aws/things/ThingName/jobs/get 请求之前订阅 $aws/things/ThingName/jobs/notify 主题,否则在后续的第三步无法收到任务列表。)

  2. 当终端设备订阅 aws/things/ThingName/jobs/get 获取待执行的 job 列表。(可以根据需要自定义轮询时间,例如 10 分钟取一次,具体可以根据场景来设定。)

  3. 此时设备会收到 $aws/things/ThingName/jobs/notify 消息,内容包含有任务列表。如果列表中包含了一个或多个任务,设备可自行选择需优先执行的任务。

  4. 获取到任务列表后,我们可以根据 job 的优先级自行选择优先需要运行的 job,然后把消息发送到 aws/things/thingName/jobs/jobId/get/accepted,终端设备能够获取到指定任务文档和任务状态。

  5. 在任务执行过程中,设备向 $aws/things/thingName/jobs/jobId/update 持续发布消息以更新任务状态,使得 AWS IoT 平台获悉设备当前任务的执行状况。同时控制端设备,例如手机端,也可以获取设备当前的更新状态。(在执行 job 的时候,可以定期地把 job 运行的状况发布到 update 主题,以便 IoT 服务的提供者知悉 job 的运行状况。向 update 主题发布消息对终端设备的 Job 运行没有任何影响,它只是状态的上报。但如果需要及时知道设备任务状态,应该及时通过此主题进行更新。)最后,任务执行过程可以反复调用第[5]步,上报任务状态,直到任务完成后,更新状态为“SUCCEEDED”。

  6. 设备完成了一个任务之后,可以重复执行[2],获取待执行任务列表,并从任务列表中执行下一个任务。

方法二:自动获取下一个任务:


方法二的实现原理和方法一极其相似,但有微小的区别:


  1. 当设备在线时,订阅 $aws/things/ThingName/jobs/notify-next 主题以获取设备任务信息。

  2. 发布消息到 next。(注意:这里的 aws/things/thingName/jobs/aws/things/thingName/jobs/jobId/get/accepted 获得任务的返回值。)

  3. Job 被创建后通过 notify-next 主题下发 Job 文档。

  4. 在执行过程中设备通过发布消息到 $aws/things/thingName/jobs/jobId/update 持续更新任务状态。

  5. 任务执行过程可以反复调用第[4]步,上报任务状态,直到任务完成后,更新状态为 “SUCCEEDED”。

  6. 设备完成了一个任务后,通过重复执行[2],自动获取下一个任务并相应执行。


相比于方法一,方法二能够自动执行下一个 Job,操作更加简单。但方法二无法在终端设备自定义 Job 的执行顺序,它只能按照 Job 提交的顺序往下执行。因此如果 Job 需要按照优先级(而不是提交顺序)执行,方法一会更加灵活。方法一能够允许终端设备根据自身设定的代码逻辑,例如任务文档中设置的优先级字段,让设备执行优先度高的任务。

AWS IoT 任务执行时序图

在说完整体流程之后,我们通过实际操作,从创建升级任务到执行任务,一步步的完成整个流程。

1. 使用 AWS IoT 找出需要控制的设备

首先需要在 AWS IoT 从海量设备中找出需要执行 Job 的设备。AWS IoT 提供了设备状态索引服务,此服务可以帮助我们在 IoT 平台索引和搜索注册表和设备影子数据。打开 AWS IoT 控制台,点击左边设置,选择队列索引设置,打开索引:



同样地,也可以使用 AWSCLI 所示开启设备索引。命令如下


Json


aws iot update-indexing-configuration --thing-indexing-configuration thingIndexingMode=REGISTRY_AND_SHADOW
复制代码


开启索引之后,我们就可以使用索引查询我们的目标设备,假设设备当前已经注册到 AWS IoT 平台,并且通过 MQTT 把设备状态更新到设备影子上。下述展示如何在 AWS 控制台查询系统版本号为“bc78fd46f845”的设备。后续我们将向这些设备推送升级任务,升级到新的固件系统:



同样的,我们也可以使用 AWS Cli 去查询设备影子,以获得系统版本号为 bc78fd46f845 的设备:


Json


aws iot search-index  --query-string "shadow.reported.ver:( bc78fd46f845)"
复制代码


查询完毕之后我们把这些设备加入一个设备组里面,这里我们把这些设备都加入名为 “jobdemo” 组里面,稍后我们将向这个组里面的设备发送升级任务。


2. 在控制台创建任务

创建任务前我们需要定义一个任务文档,这个任务文档将使用 json 形式描述了设备需要执行的远程操作,任务文档可能还包括了需要下载的固件升级包地址,以下是一个示例任务文档,我把这个任务文档保存到 S3 存储桶上。


Json


[  {     "operation":"install",     "packageName":"uniquePackageName",     "autoStart":"true",    "workingDirectory":"./root/directory/for/files/and/launch/command/execution",     "launchCommand":"command to pass to child_process exec in order to launch executable package",     "files":[        {           "fileName":"destinationFileName",           "fileSource":{              "url":"https://s3-example-bucket-name.s3.amazonaws.com/exampleFileName"           }        }     ]  }]
复制代码


把任务文档上传到 S3 之后,就可以使用 AWS IoT 控制台点开左侧管理,选择任务,到下一屏之后选择创建新任务,在此我选择的是“创建自定义作业”:



您会看到需要输入任务 ID、描述等,这些自定义即可:



然后在“选择要更新的设备”在之前步骤创建的 jobdemo:



“添加任务文件”选择您存放上述 job 文件的 S3 存储桶位置:



创建完任务作业后,就可以向指定的设备下发任务指令。我们使用上述创建的任务文档,向 jobdemo 推送这个任务,其他配置默认即可。



同样地,也可以使用 AWSCLI 完成整个 Job 创建流程:


Json


aws iot create-job --job-id 020 --targets arn:aws:iot:us-west-2:123456789012:thinggroup/jobdemo --document-source https://s3-us-west-2.amazonaws.com/{iotjobsbuckets}/jobtest.json
复制代码

3. 设备订阅任务并执行

如概述所述,设备为了接收新的任务,需要主动订阅这两个 MQTT 主题,两个主题分别对应不同的执行方法。以下展示两个主题订阅和执行任务信息的差异。


在方法一中,订阅 $ aws / things / {thingName} / jobs / notify 将得到待执行的任务列表。注意:返回的任务列表中没有具体 Job 的任务文档。


Json


{  "timestamp": unixtime,  "jobs": {    "IN_PROGRESS": [      {        "jobId": "jobdemo",        "queuedAt": unixtime,        "lastUpdatedAt": unixtime,        "startedAt": unixtime,        "executionNumber": 1,        "versionNumber": 3      }    ],    "QUEUED": [      {        "jobId": "jobdemo",        "queuedAt": unixtime,        "lastUpdatedAt": unixtime,        "startedAt": unixtime,        "executionNumber": 1,        "versionNumber": 1      }    ]  }}
复制代码


在方法二中,设备只有在空闲时才会收到 $ aws / things / {thingName} / jobs / notify-next 通知。(也就是说,如果设备正在处理 Job,那么设备是不会同时收到其他 Job 的通知,直到设备完成当前 Job 任务)这个消息的内容中包含了任务文档:


Json


{  "timestamp": unixtime,  "execution": {    "jobId": "jobdemo",    "status": "QUEUED",    "queuedAt": unixtime,    "lastUpdatedAt": unixtime,    "versionNumber": 1,    "executionNumber": 1,    "jobDocument": {      "operation": "install",      "packageName": "uniquePackageName",      "autoStart": "true",  ……    }  }}
复制代码


注意:再次强调,在方法二中,任务总是以队列的形式存在设备执行队列里面,如果设备存在之前的任务还没有处理完, 则不会发出 notify-next。


设备可以在接受任务之后,可以向 AWS IoT 特定 MQTT 主题:$ aws / things / thingName / jobs / jobId /update,报告设备当前任务状态:


Json


{  "status": ["IN_PROGRESS", "FAILED", "SUCCEEDED", "REJECTED"],  "statusDetails": {    "progress": "0%"  },  "expectedVersion":"",  "clientToken":""}
复制代码


设备更新状态需要指定四种状态(”IN_PROGRESS”、”FAILED”、”SUCCEEDED”、”REJECTED”)的一种。如上所述,在方法二中,如果任务下发通知时存在 “IN_PROGRESS” 状态的目标设备,则不会发出 notify-next。直到任务变成 “SUCCEEDED” 状态,目标设备才会接收到 notify-next 主题的消息。这样设备在执行完一个任务之后就可以有序地执行下一个任务。


读者可以自由地描述 statusDetails 内容,这里以处理进度为例进行描述。当设备通知 AWS IoT 完成任务“jobdemo”后,AWS IoT 会通过 $ aws / things / {thingName} / jobs / notify-next 主题发布下一个任务通知。


至此,就完成一个任务的执行。

结束语

在实际生产中,我们会从方法一和方法二中选择一种设备处理任务方法,把其编码在硬件设备上。管理员通过 AWS IoT 平台就能够下发任务并自动化进行处理。


需要注意的是,当前仅有 AWS 的 JavaScript Device SDK 包含了对 job 处理的封装。python 等其他语言 SDK 包还没有实现,需要客户按照本文内容的逻辑实现对 job topic 的订阅。


作者介绍:


谢佰臻


亚马逊 AWS 解决方案架构师,负责基于 AWS 的云计算方案的架构设计,熟悉AWS IoT , Serverless 架构,同时致力于提供 AWS IoT 架构设计及优化。


### AWS IoT 物联网系列其他博客目录如下:
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-1/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-2/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-3/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-4/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-5/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-6/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-7/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-8/)
复制代码


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/aws-iot-series-4/


2019-10-23 08:001101

评论

发布
暂无评论
发现更多内容

Golang实现JAVA虚拟机-运行时数据区

EquatorCoco

Java 数据库 JVM 数据

“GPT驱动的新程序员时代 ,我们该如何编程”分论坛圆满举办

开放原子开源基金会

开源

HBase深度历险 | 京东物流技术团队

京东科技开发者

KubeWharf:推动云原生技术发展的未来之路

Miracle.

#云原生 #技术人的2023总结 KubeWharf

交易所开发:中心化加密货币交易所发展的关键考虑因素实现数字交易

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

MES系统怎么实现车间管理中的生产计划和排产计划

万界星空科技

工业互联网 生产管理系统 mes 万界星空科技 万界星空科技mes

实时数据获取:抖音API在电商中的应用与影响

Noah

IPQ6018 and IPQ6000 series: highlighting differences and superior advantages

wallysSK

测试开发 | 人工智能目标检测

测吧(北京)科技有限公司

测试

测试开发 | 探究人工智能的基石:强化学习的奇妙世界

测吧(北京)科技有限公司

测试

聊一聊 C# 线程切换后上下文都去了哪里

不在线第一只蜗牛

C# 前端 线程 window

深入云原生—基于KubeWharf深度剖析-以公司实际应用场景为例深度解读

申公豹

KubeWharf

云安全资源管理定义以及实现方法

行云管家

云计算 云服务 云安全 云资源

Visio Viewer for Mac(Visio文件查看工具)v3.1.0激活版

影影绰绰一往直前

深入理解云原生基础:Docker和Kubernetes的核心概念与应用

Miracle.

#云原生 #技术人的2023总结

数据库的下一场革命:S3 延迟已降至原先的 10%,云数据库架构该进化了

小猿姐

数据库 云计算 Kubernetes

测试开发 | 深度解析人工智能特征提取

测吧(北京)科技有限公司

测试

松柏之志,下聚百川-松下中国阿里云大数据实践

阿里云大数据AI技术

iZotope RX 10 for mac(音频修复和增强软件) 10.4.2完整激活版

mac

苹果mac Windows软件 iZotope RX 10 音频修复软件

多功能项目流程管理软件:OmniPlan Pro 4密钥中文版

mac大玩家j

项目管理软件 Mac软件 Mac项目流程管理

制造业数字化转型的核心不止是技术

万界星空科技

数字化转型 工业互联网 mes 万界星空科技mes

测试开发 | 探索人工智能图像生成的奇妙世界

测吧(北京)科技有限公司

测试

云图说丨初识华为云边缘安全——为加速域名保驾护航

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 华为云云图说

FPGA与DSP在通信算法实现中的应用与区别

计算机 DSP FPGA

教你几个部署多个nginx-ingress的注意事项

华为云开发者联盟

容器 开发 华为云 华为云开发者联盟

专业强大的扫描仪软件:VueScan Pro中文激活版

胖墩儿不胖y

Mac软件 扫描工具 扫描仪

揭秘抖音视频详情API:电商行业的制胜法宝与实时数据获取的奥秘

Noah

万德高科携手航天科技AIRIOT打造智慧能碳管理平台, 助力碳达峰碳中和

AIRIOT

数字化转型 智慧系统 能碳管理

如何鉴别LED电子显示屏好坏

Dylan

质量 评估 电子 LED显示屏

测试开发 | 人工智能的决策智慧:马尔可夫决策过程(MDP)

测吧(北京)科技有限公司

测试

QA团队基于DataLeap开放平台能力的数据测试实践

字节跳动数据平台

大数据 测试 QA 数据研发 数据管控

AWS IoT 物联网系列,第四篇:如何使用 AWS IoT 做 OTA 升级_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章