开发设备端本地定时功能

本地定时相对云端定时而言,是指当设备离线时,也能自动执行定时任务。本文提供了一个插座本地定时功能的开发示例,您可以根据本文实现任意设备的本地定时功能。

一、配置控制台参数

  1. 登录生活物联网控制台
  2. 创建一个项目。更多操作,请参见创建项目

  3. 创建产品并定义功能。更多操作,请参见创建产品并定义功能

  4. 在产品的人机交互 > 自动化和定时页面,勾选本地定时的功能,并在功能参数中设置本地定时的最大条数(与设备端的存储、性能有关,默认为13)。

    ds1

    说明

    在此处勾选本地定时后,会在产品功能定义页面中自动添加设备端上定时(DeviceTimer)属性。

  5. 单击保存结束配置。

二、开发设备端的本地定时功能

  1. 开发定时功能。

    在控制台上定义DeviceTimer的功能属性后,设备端可以接收从云端下来的property set消息,从而获取定时任务的具体信息。详细开发步骤如下。

    说明

    新版本设备端SDK默认打开DeviceTimer的宏开关,老版本设备端SDK需自行打开DeviceTimer的宏开关。

    1. 获取V1.3.0生活物联网平台SDK。更多操作,请参见获取SDK

      • 智能插座实例代码,位于Products/example/smart_outlet/smart_outlet_main.c

      • 定时功能的开关配置代码,位于Products/example/smart_outlet/smart_outlet.mk

    2. 基于设备端SDK开发定时功能。

      确认以下宏开关为打开状态。

      GLOBAL_CFLAGS += -DENABLE_LOCALTIMER  //老版本本地定时的宏,默认为关闭状态
    3. 更改build.sh中的默认变量参数(如下所示,更多介绍请参见README.md)。

      产品类型:default_type="example"
      应用名称:default_app="smart_outlet"
      模组型号:default_board="uno-91h"  //根据实际型号配置
      连云区域:default_region=MAINLAND  //连接国外为SINGAPORE
      连云环境:default_env=ONLINE
      Debug log:default_debug=1   //0:release   1:debug
      其他参数:default_args="" //可配置其他编译参数
    4. 执行./build.sh编译生成固件。

      编译成功后,即可获得烧录所需的固件。

    5. 烧录固件。

      各模组的烧录方式略有差异,请向模组厂商获取详细烧录方法。

  2. 调试设备。

    设备收到定时任务的属性时,在user_property_set_event_handler中查看日志。

    static int user_property_set_event_handler(const int devid, const char *request, const int request_len)
    {
        int res = 0;
        user_example_ctx_t *user_example_ctx = user_example_get_ctx();
        cJSON *root = NULL, *item = NULL;
    
        LOG_TRACE("Property Set Received, Devid: %d, Request: %s", devid, request);
        if ((root = cJSON_Parse(request)) == NULL) {
            LOG_TRACE("property set payload is not JSON format");
            return -1;
        }
    
        if ((item = cJSON_GetObjectItem(root, "PowerSwitch")) != NULL && cJSON_IsNumber(item)) {
            if (item->valueint == 1) {
                product_set_switch(ON);
            } else {
                product_set_switch(OFF);
            }
        } else {
    #ifdef AOS_TIMER_SERVICE
            timer_service_property_set(request);
    #endif
        }
        cJSON_Delete(root);
        res = IOT_Linkkit_Report(user_example_ctx->master_devid, ITM_MSG_POST_PROPERTY,
                                 (unsigned char *)request, request_len);
        LOG_TRACE("Post Property Message ID: %d", res);
    
        return 0;
    }

    设备端接收到的示例如下。

    {
      "LocalTimer": [
        {
          "PowerSwitch": 1,
          "Timer": "5 4 1,2,3",
          "TimezoneOffset": 43200,
          "Enable": 1,
          "Targets": "PowerSwitch",
          "IsValid": 1
        },
        {
          "PowerSwitch": 0,
          "Timer": "",
          "TimezoneOffset": 43200,
          "Enable": 0,
          "Targets": "",
          "IsValid": 0
        },
        {
          "PowerSwitch": 0,
          "Timer": "",
          "TimezoneOffset": 43200,
          "Enable": 0,
          "Targets": "",
          "IsValid": 0
        },
        {
          "PowerSwitch": 0,
          "Timer": "",
          "TimezoneOffset": 43200,
          "Enable": 0,
          "Targets": "",
          "IsValid": 0
        },
        {
          "PowerSwitch": 0,
          "Timer": "",
          "TimezoneOffset": 43200,
          "Enable": 0,
          "Targets": "",
          "IsValid": 0
        }
      ]
    }

    以上示例为JSON数组格式结构,LocalTimer中共有5条定时记录(在人机交互 > 自动化和定时页面的功能参数中设置的值)。每条数组中的每个JSON为一个定时任务,参数解释如下。

    标识符

    参数名称

    数值类型

    是否必选

    参数描述

    PowerSwitch

    电源开关

    布尔

    产品功能定义页面的标准功能

    Timer

    定时时间

    字符串

    用于表示定时时间,使用cron格式(参见开发App端的本地定时功能中的通用说明)

    Enable

    启用

    布尔

    定义该条定时任务是否启用

    IsValid

    可执行

    布尔

    定义该条定时任务是否有效,设备端会将所有数据传给App端,App端根据该字段判定是否给用户展示该条定时任务

    Targets

    定时动作

    字符串

    表示当次设置的定时任务的具体动作,添加Targets属性可以设置任意数量的动作,最大值为:2048

    TimezoneOffset

    时差

    整数

    表示本地事件与UTC时间的差值

    • 单位:秒

    • 取值范围为:-43200到50400

    • 步长:3600

三、开发App定时功能

生活物联网平台提供App基于Native开发定时功能(静态方式) 的开发方式。更多信息,请参见开发App端的本地定时功能