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

一、配置控制台参数

  1. 登录生活物联网控制台
  2. 创建一个项目。更多操作,请参见创建项目
  3. 创建产品,并定义本地定时(LocalTimer)产品功能。更多操作,请参见创建产品并定义功能
    ds1
  4. 在产品的人机交互 > 自动化和定时页面,勾选本地定时的功能,并在功能参数中设置本地定时的最大条数(与设备端的存储、性能有关,默认为5)。
    ds1

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

  1. 开发定时功能。
    在控制台上定义LocalTimer的功能属性后,设备端可以接收从云端下来的property set消息,从而获取定时任务的具体信息。详细开发步骤如下。
    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的定时功能的开发方式。更多信息,请参见开发App端的本地定时功能