**应用场景
**
智能设备已售卖,需要修复bug或者升级新功能,设备商固件开发出新的升级包,交给管理员上传至文件服务器。远程设备发现有更新版本,去固定的文件服务器地址下载更新,完成升级。
Work Flow
1 管理员上传升级包到AWS S3 指定bucket,标记tag——升级包的版本信息;
2 S3文件上传触发lambda函数,lambda读取版本信息,发送HTTP 请求,POST版本信息;
3 Central Control Server收到HTTP request,为所有IoT设备更新设备影子;AWS IoT Hub收到设备影子更新请求,更新影子并由于设备report的版本与desired不匹配,产生delta, publish主题为”$aws/things/thingName/shadow/update/delta”。
4 设备与IoT Hub建立长链接时会subcribe主题 ”$aws/things/thingName/shadow/update/delta”。若在线,便即时根据delta内容更新版本;若离线,设备上线时,report自身状态,得到IoT返回,解析delta,更新版本。
5 设备发送HTTP Get请求至指定URL,下载升级包。
模块组件
S3
配置公开访问权限,设置标签——key:verison,value:0.0.5
Lambda
添加新函数,上传处理代码(git),设置执行角色,内存,超时时间(修改默认的3秒,一般程序执行到中途)。左侧添加触发S3 指定bucket的Object Created。右侧添加函数具有访问资源的权限,CloudWatch创建值日志组,写日志。S3 Read Only权限。
函数执行的逻辑是获取触发Object的bucket,key并以此建立S3 client,访问其tag。获取版本信息,将其发送至Central Control Server。
Central Control Server
Rest API,接收lambda发送的request,并建立IoT client,列出所有IoT设备,逐个更新设备版本,发送updateThingShadow请求。
`String ver = version.getVersion();
`
String versionUpdate = sendUpdate.replace("xx", ver);
List<ThingAttribute> things = iotClient.listThings(type);
for (ThingAttribute thing : things) {
String thingName = thing.getThingName();
iotClient.updateThingShadow(thingName, versionUpdate);
}
Device
判断收到的设备影子中,delta部分version,若存在则到预设置的URL去下载,校验文件,进行更新,重启后report新版本信息到IoT Hub,更新成功,delta部分version字段消失。
权限管控
限制S3上传人员Policy,只有指定人员具有权限操作:只能上传Object,配置tag,公开访问,不能删除。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws-cn:iam::accountID:user/xx"
},
"Action": [
"s3:PutObject",
"s3:PutObjectVersionAcl",
"s3:PutObjectVersionTagging",
"s3:PutObjectTagging",
"s3:PutObjectAcl"
],
"Resource": "arn:aws-cn:s3:::bucket/*"
},
{
"Sid": "VisualEditor1",
"Effect": "Deny",
"Principal": {
"AWS": "arn:aws-cn:iam::accountID:user/xx"
},
"Action": [
"s3:DeleteObjectVersion",
"s3:DeleteObjectTagging",
"s3:DeleteObjectVersionTagging",
"s3:DeleteObject"
],
"Resource": "arn:aws-cn:s3:::bucket/*"
}
]
}
Lambda执行角色只授予S3 Read Only读取,CloudWatch写入。