本地定时功能开发实践

更新时间:2018-09-21 10:50:39

1. 概述

本文提供了一个插座本地定时功能的开发案例,开发者可以参考本文,实现任意设备的本地定时功能。
“本地定时”是相对”云端定时”而言的,是指当设备离线时,也能自动执行定时任务。要实现本地定时的效果,设备端和APP端可以按照本文推荐的方式进行实现。
设备端:按照平台标准数据格式,实现定时任务的增删改。
APP端:可以直接使用平台提供的“设备界面”插件,或“本地定时”APP插件,无需额外开发APP页面。

本地定时.png | center | 827x226

2. 准备工作

控制台中注册您的产品,详细参考 产品注册,本文以插座为例。在 功能定义 中,需要选择标准功能“本地定时”(LocalTimer),为JSON数组(JSON Array)格式,其中数组中的每个JSON都是一个定时任务,比如“每天6:00关闭空调”,并支持多个定时任务。
参数如下:
必选参数1:定时时间-Timer-(cron类型)字符串
必选参数2:启用-Enable-布尔
必选参数3:可执行-isValid-布尔

参数名称 标识符 参数类型 参数描述
标准参数 定时时间 Timer 字符串 必选,不可删除,用于表示定时时间,使用corn格式
标准参数 启用 Enable 布尔 必选,不可删除,表明是否启用
标准参数 可执行 isValid 布尔 必选,不可删除,表明这条定时任务是否需要展示给用户看(因为设备端会将所有定时的数据传给app端)
自定义参数 如插孔开关1 SocketSwitch_1 布尔 定时的功能,必须和功能定义中的功能保持一致,如针对开关进行定时,此处设为 插孔开关1 - SocketSwitch_1 - 布尔型。
自定义参数 如插孔开关2 SocketSwitch_2 布尔 每个定时任务中,支持多个功能
自定义参数 不限数量

3. 设备开发和调试

  • 在云端控制台上定义好了LocalTimer的属性之后,设备端可以接收从云端下来的property set消息,从而获取定时任务的具体信息。

  • 获取aos1.3.3版本sdk,demo位于aos/example/linkkit_sched/linkkit_example_sched.c

  • 设备收到定时任务的属性时,会进到thing_prop_changed中,如下图所示:

      /*
       * the handler of property changed
       * alink method: thing.service.property.set
       */
      static int thing_prop_changed(const void *thing_id, const char *property, void *ctx)
      {
          /*char property_buf[64] = {0};*/
          int response_id = -1;
    
          if (strstr(property, "LocalTimer") != 0) {
              int id = 0;
              char *timer = NULL;
              int enable = 0;
              uint64_t utc = 0;
    
              /* Get LocalTimer[0] */
              id = 0; timer = NULL; enable = 0;
              linkkit_get_value(linkkit_method_set_property_value, thing_id, "LocalTimer[0].ID", &id, NULL);
              EXAMPLE_TRACE("LocalTimer[0].ID: %d\n", id);
    
              linkkit_get_value(linkkit_method_set_property_value, thing_id, "LocalTimer[0].Timer", NULL, &timer);
              EXAMPLE_TRACE("LocalTimer[0].Timer: %s\n", (timer == NULL) ? ("NULL") : (timer));
              if (timer) {free(timer);timer = NULL;}
    
              linkkit_get_value(linkkit_method_set_property_value, thing_id, "LocalTimer[0].Enable", &enable, NULL);
              EXAMPLE_TRACE("LocalTimer[0].Enable: %d\n", enable);
    
              utc = HAL_UTC_Get();
              EXAMPLE_TRACE("Current UTC: %lld\n", utc);
          }
    
          /* post property
           * result is response_id; if response_id = -1, it is fail, else it is success.
           * response_id by be compare in post_property_cb.
           */
          response_id = linkkit_post_property(thing_id, property, post_property_cb);
    
          EXAMPLE_TRACE("post property(%s) response id: %d\n", property, response_id);
    
          return 0;
      }
    

    示例中有两个定时任务,定时任务的个数根据产品自身TSL定义做调整,Timer表示定时任务的执行时间,格式与linux crontab文件格式一致。此外,系统UTC时间可通过HAL_UTC_Get接口来获取,系统UTC时间在设备每次启动时会与云端进行同步。

4. 集成APP插件

本地定时插件的代码为:link://router/localTimer,可以将该代码复制到您的App代码中,调用该插件。
如何开通:
在living.aliyun.com网站里您的项目中,找到自有品牌APP模块,进入后,将会看到App界面这个导航。点进去后,在页面中可以看到目前所有的插件列表,点击每一个插件旁边的“生成代码”按钮,即可开通该插件在您的自有App中的调用权限。

results matching ""

    No results matching ""