设备影子

 小结:

1、

应用场景

在以下场景中,您可选择使用设备影子功能,获取设备上报数据和应用程序期望数据。

  • 应用程序请求获取设备状态。

    场景描述:

    • 设备网络不稳定,设备频繁上下线,无法正常响应应用程序的请求。
    • 设备网络稳定,同时响应多个应用程序的请求,即使响应的结果一样,设备本身处理能力有限,也会无法负载多次请求。

    使用设备影子机制,设备状态变更,只需同步状态给设备影子一次,应用程序请求获取设备状态,不论应用程序请求数量,和设备是否联网在线,都可从设备影子中获取设备当前状态,实现应用程序与设备解耦。

2、

version
用户主动更新版本号时,设备影子会检查请求中的version值是否大于当前版本号。
如果大于当前版本号,则更新设备影子,并将version值更新到请求的版本中,反之则会拒绝更新设备影子。
该参数更新后,版本号会递增,用于确保正在更新的文档为最新版本。
version参数为long型。为防止参数溢出,您可以手动传入-1将版本号重置为0。
 

设备影子概览 https://help.aliyun.com/document_detail/53930.html

设备影子概览

更新时间:2022-08-05 10:40

物联网平台提供设备影子功能,用于缓存设备上报的状态数据和应用程序下发的指令信息。设备在线时,可以直接获取物联网平台指令;设备离线后,再次上线可以主动拉取物联网平台指令。本文主要介绍设备影子的应用场景和使用方法。

什么是设备影子

设备影子是一个JSON文档,用于存储设备上报状态数据和应用程序期望状态信息。JSON数据格式的详细说明,请参见设备影子JSON详解

每个设备有且只有一个设备影子,设备可以通过MQTT获取和设置设备影子来同步状态,该同步可以是影子同步给设备,也可以是设备同步给影子。

应用场景

在以下场景中,您可选择使用设备影子功能,获取设备上报数据和应用程序期望数据。

  • 应用程序请求获取设备状态。

    场景描述:

    • 设备网络不稳定,设备频繁上下线,无法正常响应应用程序的请求。
    • 设备网络稳定,同时响应多个应用程序的请求,即使响应的结果一样,设备本身处理能力有限,也会无法负载多次请求。

    使用设备影子机制,设备状态变更,只需同步状态给设备影子一次,应用程序请求获取设备状态,不论应用程序请求数量,和设备是否联网在线,都可从设备影子中获取设备当前状态,实现应用程序与设备解耦。

    应用程序获取设备影子中状态的流程图如下,其中数据流转过程,请参见设备主动上报状态

    设备网络不稳定
  • 应用程序下发指令给设备,变更设备状态。

    场景描述:设备处于下线状态,或设备网络不稳定,设备频繁上下线,应用程序发送控制指令给设备,设备不在线,指令就会发送失败。

    使用设备影子机制,可以将应用程序下发的指令,携带时间戳存储到设备影子中。设备再上线时,获取设备影子中指令,并根据时间戳确定是否执行。

    应用程序更新设备状态的流程图如下,其中数据流转过程,请参见应用程序改变设备状态设备主动获取影子内容设备主动删除影子属性

    应用程序下发指令

查看与更新设备影子

您需在设备端完成设备影子功能开发,具体内容,请参见设备影子

完成设备开发和接入后,您可以在物联网平台控制台,查看设备影子信息,更新设备影子状态。

  1. 登录物联网平台控制台
  2. 实例概览页面,找到对应的实例,单击实例进入实例详情页面。
     
    注意 目前华东2(上海)、华北2(北京)、华南1(深圳)地域开通了企业版实例服务。其他地域,请跳过此步骤。
    实例概览
  3. 在左侧导航栏,选择设备管理 > 设备。
  4. 单击对应设备的查看按钮,进入设备详情页面。
  5. 单击设备影子,页面显示设备上报的影子状态。
    设备影子
  6. 单击更新影子,在“desired”部分,填入期望设备状态。

    设备影子文档格式,请参见设备影子JSON详解

    设备在线时,设备影子保存期望状态,设备通过订阅Topic直接获得期望状态。

    设备离线时,设备影子缓存期望状态,设备上线后,主动从物联网平台拉取最新期望状态。

相关API

GetDeviceShadow:获取设备影子。

UpdateDeviceShadow:更新设备影子。

 

设备影子JSON详解

更新时间:2022-02-07 15:27

本文档介绍设备影子的JSON格式表达方法。

设备影子JSON文档示例:

 
{
    "state": {
        "desired": {
            "color": "RED", 
            "sequence": [
                "RED", 
                "GREEN", 
                "BLUE"
            ]
        }, 
        "reported": {
            "color": "GREEN"
        }
    }, 
    "metadata": {
        "desired": {
            "color": {
                "timestamp": 1469564492
            }, 
            "sequence": {
                "timestamp": 1469564492
            }
        }, 
        "reported": {
            "color": {
                "timestamp": 1469564492
            }
        }
    }, 
    "timestamp": 1469564492, 
    "version": 1
}

JSON属性描述,如下表表 1所示。

表 1. JSON属性说明
属性描述
desired 设备的预期状态。仅当设备影子文档具有预期状态时,才包含desired部分。

应用程序向desired部分写入数据,更新事物的状态,而无需直接连接到该设备。

reported 设备的报告状态。设备可以在reported部分写入数据,报告其最新状态。

应用程序可以通过读取该参数值,获取设备的状态。

JSON文档中也可以不包含reported部分,没有reported部分的文档同样为有效影子JSON文档。

metadata 当用户更新设备状态文档后,设备影子服务会自动更新metadata的值。

设备状态的元数据的信息包含以 Epoch 时间表示的每个属性的时间戳,用来获取准确的更新时间。

timestamp 影子文档的最新更新时间。
version 用户主动更新版本号时,设备影子会检查请求中的version值是否大于当前版本号。

如果大于当前版本号,则更新设备影子,并将version值更新到请求的版本中,反之则会拒绝更新设备影子。

该参数更新后,版本号会递增,用于确保正在更新的文档为最新版本。

version参数为long型。为防止参数溢出,您可以手动传入-1将版本号重置为0

 
说明

设备影子支持数组。更新数组时必须全量更新,不能只更新数组的某一部分。

更新数组数据示例:

  • 初始状态:
     
    {
        "reported" : { 
            "colors" : [
                "RED", 
                "GREEN",
                "BLUE" 
            ]
        }
    }
  • 更新:
     
    {
        "reported" : {
            "colors" : [
                "RED"
            ] 
        }
    }
  • 最终状态:
     
    {
        "reported" : {
            "colors" : [
                "RED"
            ] 
        }
    
  •  

 

物联网通信 设备影子详情-开发者手册-文档中心-腾讯云 https://cloud.tencent.com/document/product/634/11918

设备影子文档是服务器端为设备缓存的一份状态和配置数据。它以 JSON 文本形式存储,由以下部分组成:
thing_shadow

state

reported
设备自身上报的状态。设备可以向本文档部分写入数据,以报告其新状态。应用程序可以读取本文档部分,以获取设备的状态。

desired
设备预期的状态。应用程序通过 HTTP RESTful API 向本文档写入数据更新设备状态,设备 SDK 通过注册相关属性和回调,设备影子服务同步影子数据到设备。

metadata

设备影子的元数据信息,包括 state 部分每个属性项的最后更新时间等。

version

设备影子文档的版本号,每次设备影子文档更新之后,版本号都会递增。版本号由腾讯云后台维护,这可以确保设备的数据与设备影子的数据保持一致。

timestamp

设备影子文档的最后一次更新时间。设备影子文档示例如下:

 
{
"state": {
 "reported": {
  "attr_name1": "value1"
 },
 "desired": {
  "attr_name2": "value2"
 }
},
"metadata": {
 "reported": {
  "attr_name1": {
   "timestamp": 123456789
  }
 },
 "desired": {
  "attr_name2": {
   "timestamp": 123456789
  }
 }
},
"version": 1,
"timestamp": 123456789
}

空白部分

当设备影子文档为空时,此时获取到设备影子文档示例如下:

 
{
"state":{},
"metadata":{},
"version":0
}

当设备影子文档具有预期状态时,才会有 desired 部分,reported 部分可以为空,例如:

 
{
"state": {
 "desired": {
  "attr_name2": "value2"
 }
},
"metadata": {
 "desired": {
  "attr_name2": {
   "timestamp": 123456789
  }
 }
},
"version": 1,
"timestamp": 123456789
}

当设备更新状态成功之后,需要上报最新的状态,并将 desired 部分从文档中删除。要想将 desired 部分从文档中删除,需要将 desired 部分置为 null,例如:

 
{
"state": {
"reported": {
 "attr_name1": "new_value1",
 "attr_name2": "new_value2"
},
"desired": null
},
"version": 1
}

数组

设备影子文档支持数组,不支持针对数组某个元素进行更新,只能更新整个数组,并且数组元素不能有空值。

 

IoT场景中「设备影子」是做什么的? https://mp.weixin.qq.com/s/-qygfHUYtk-W2xguO0mm5w

IoT场景中「设备影子」是做什么的?

图片随着各大云平台IoT物联网技术的宣传,IoT开发者之间常常会提到设备影子。物联网平台提供的设备影子功能,在云端保存为一个JSON文档,用于存储设备上报状态、应用程序期望状态信息。设备在线时,可以直接获取云端指令;设备离线后,再次上线可以主动拉取云端指令。

各大云平台对比

图片

应用场景

设备影子是一个JSON文档,用于存储设备上报状态、应用程序期望状态信息。

 

每个设备有且只有一个设备影子,设备可以通过MQTT获取和设置设备影子来同步状态,该同步可以是影子同步给设备,也可以是设备同步给影子。

 

场景1:网络不稳定,设备频繁上下线

 

由于网络不稳定,设备频繁上下线。应用程序发出需要获取当前的设备状态请求时,设备掉线,无法获取设备状态,但下一秒设备又连接成功,应用程序无法正确发起请求。

 

使用设备影子机制存储设备最新状态,一旦设备状态产生变化,设备会将状态同步到设备影子。应用程序在请求设备当前状态时,只需要获取影子中的状态即可,不需要关心设备是否在线。

 

场景2:多程序同时请求获取设备状态

 

如果设备网络稳定,很多应用程序请求获取设备状态,设备需要根据请求响应多次,即使响应的结果是一样的,设备本身处理能力有限,无法负载被请求多次的情况。

 

使用设备影子机制,设备只需要主动同步状态给设备影子一次,多个应用程序请求设备影子获取设备状态,即可获取设备最新状态,做到应用程序和设备的解耦。

 

场景3:设备掉线,控制指令下发

 

设备网络不稳定,导致设备频繁上下线,应用程序发送控制指令给设备时,设备掉线,指令无法下达到设备。

 

  • 使用设备影子机制,应用程序发送控制指令,指令携带时间戳保存在设备影子中。当设备掉线重连时,获取指令并根据时间戳确定是否执行。

 

  • 设备真实掉线,指令发送失败。设备再上线时,设备影子功能通过指令加时间戳的模式,保证设备不会执行过期指令。

 

 

 

posted @ 2022-09-16 22:06  papering  阅读(305)  评论(0编辑  收藏  举报