**应用场景

**

智能设备已售卖,需要修复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写入。

results matching ""

    No results matching ""