远程配置

阿里云物联网平台提供的远程配置功能,支持将指定产品的设备配置文件上传到物联网平台,设备上线后将配置文件下载到设备进行解析与处理。本文介绍通过配置C Link SDK,帮助设备实现远程配置功能。

前提条件

背景信息

远程配置功能是从产品维度修改设备配置,即从物联网平台上传的配置文件对所有设备生效,不可指定对单个设备生效。更多信息,请参见远程配置

使用流程

远程配置功能是从产品维度修改设备配置,即从物联网平台上传的配置文件对所有设备生效,不可指定对单个设备生效。

如下功能时序图,以设备的应用程序demos/remote_config_basic_demo.c为例,介绍远程配置的使用流程。

image..png

步骤一:设备初始化

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

    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;
    }
  2. 设置远程配置回调函数。

    /* 设置远程配置回调函数 */
    aiot_device_rc_set_callback(device, demo_rc_callback, &config_task);

    参数说明

    参数

    说明

    device

    设备句柄。

    demo_rc_callback

    远程配置模块的回调函数。

    &config_task

    回调的上下文。

步骤二:获取远程配置请求

  1. 发送获取远程配置请求。

    /* 主动请求远程配置文件 */
    aiot_device_rc_request(device);
  2. 云端有回复,会调用以下回调demo_rc_callback

    /* 远程配置回调处理 */
    static void demo_rc_callback(void *device, const aiot_rc_msg_t *rc_msg, void *userdata)
    {
        demo_config_task_t *task = (demo_config_task_t *)userdata;
        int32_t res = STATE_SUCCESS;
        pthread_t config_process_thread;
        if(device == NULL || rc_msg == NULL) {
            return;
        }
    
        printf("file size %d, url :%s\r\n", rc_msg->config_size, rc_msg->url);
    
        /* 正在执行配置任务的话,直接退出 */
        if(task->url != NULL) {
            return;
        }
    
        ....
    }

步骤三:云端推送远程配置

  1. 发起远程配置推送。

    您需在物联网平台控制台,开启远程配置,编辑配置信息。具体操作,请参见场景一:物联网平台推送配置信息给设备端

  2. 设备端接收处理。

    物联网平台控制台中,开启远程配置,编辑配置信息。具体操作,请参见场景二:设备主动请求配置信息

步骤四:下载远程配置文件

  1. 创建文件下载线程。

    文件下载的过程可能比较久,回调函数中不能长时间阻塞,所以创建新的线程下载文件。

    /* 远程配置回调处理 */
    static void demo_rc_callback(void *device, const aiot_rc_msg_t *rc_msg, void *userdata)
    {
        demo_config_task_t *task = (demo_config_task_t *)userdata;
    
        ....
    	....
        res = pthread_create(&config_process_thread, NULL, demo_remote_config_process_thread, task);
        if (res < 0) {
            free(task->url);
            free(task->sign);
            printf("pthread_create demo_rc_callback failed: %d\n", res);
            return;
        } else {
            /* 设置线程为detach状态,用于自动资源回收 */
            pthread_detach(config_process_thread);
        }
    }
  2. 下载远程配置文件。

    /* 下载远程配置文件,并更新设置 */
    static void *demo_remote_config_process_thread(void *args)
    {
        demo_config_task_t *task = (demo_config_task_t *)args;
        int32_t res = STATE_SUCCESS;
        http_download_params_t params = HTTP_DOWNLOAD_PARAMS_DEFAULT();
    
        /* 下载文件 */
        res = core_http_download_request(task->url, params, task->filename, save_file, NULL);
        if(res != STATE_SUCCESS) {
            printf("core_http_download_request failed\r\n");
            return NULL;
        }
        printf("remote config file %s download success\r\n", task->filename);
    
        /* 资源回收退出 */
        free(task->url);
        free(task->sign);
        return NULL;
    }

    core_http_download_request参数说明

    参数

    说明

    task->url

    需要下载文件的URL。

    params

    下载的参数配置。

    task->filename

    需要保存的文件名。

    save_file

    写文件的回调函数。

    NULL

    回调函数的上下文。

步骤五:设备端完成配置

文件下载完成后,请您在自己设备端完成相关配置。

步骤六:设备反初始化

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