设备影子

物联网平台提供的设备影子功能,用于缓存设备上报的状态和下发的指令。设备在线时,可以直接获取物联网平台指令;设备离线后,再次上线可以主动获取物联网平台的指令。本文介绍通过配置C Link SDK,设备实现影子功能。

前提条件

背景信息

  • 设备影子是保存在物联网平台上的JSON文档,用于缓存设备上报属性(reported)数据和云上应用期望属性(desired)数据。

    更多信息,请参见设备影子概览

  • 设备影子的JSON格式表达方法,请参见设备影子JSON详解
  • 设备影子的数据流转过程,请参见设备影子数据流

使用流程

如下功能时序图,以设备的应用程序demos/shadow_basic_demo.c为例,介绍设备影子的使用流程。

image..png

步骤一:设备初始化

创建设备句柄,完成设备建连。

static void* demo_device_init(char *product_key, char *device_name, char *device_secret, char *host, uint16_t port)
{
    int32_t res = STATE_SUCCESS;
    /* 创建设备 */
    void *device = aiot_device_create(product_key, device_name);
	....
    ....
        
    res = aiot_device_connect(device);
    
	....
    ....
    return device;
}

步骤二:设置设备影子模块回调函数

    /* 设置设备影子模块回调函数 */
    aiot_device_shadow_set_callback(device, demo_shadow_recv_callback, NULL);

步骤三:上报状态到设备影子

使用如下示例代码上报状态到影子。

 /* 更新设备影子中的reported值, 同时将version重置为0 */
 aiot_device_shadow_update(device, "{\"LightSwitch\":1}", 0);

参数说明

参数

说明

device

设备句柄。

"{\"LightSwitch\":1}"

上报的影子属性状态。

0

设备影子的目标版本,版本号会随着更新影子增加。

步骤四:应用程序更新期望状态

  • 接收应用状态。

     /* 当设备在线时, 若用户应用程序调用云端API主动更新设备影子, 设备便会收到此消息 */
     case AIOT_SHADOWRECV_CONTROL: {
     const aiot_shadow_recv_control_t *control = &recv->data.control;
    
     printf("payload = \"%.*s\", version = %ld\r\n",
     control->payload_len,
     control->payload,
     (unsigned long)control->version);
     }
     break;
  • 上报最新状态。

    /* 更新设备影子中的reported值, 同时将version重置为0 */ 
    aiot_device_shadow_update(device, "{\"LightSwitch\":1}", 0);
  • 设备清除期望属性。

        /* 清除设备影子中的desired值, 同时将version设置为1 */
        aiot_device_shadow_clean_desired(device, 1);

步骤五:获取设备影子属性

 /* 发送请求拉取设备影子, 设备影子将在demo_shadow_recv_callback回调函数中返回 */
 aiot_device_shadow_get(device);

步骤六:删除设备影子属性

 /* 删除设备影子中特定的reported值, 同时将version设置为2 */
 aiot_device_shadow_delete_reported(device, "{\"LightSwitch\":\"null\"}", 2);

步骤七:设备反初始化

 /* 断开设备连接,并回收设备资源 */
 demo_device_deinit(device);