本地定时功能开发实践
更新时间:2018-09-21 10:50:39
1. 概述
本文提供了一个插座本地定时功能的开发案例,开发者可以参考本文,实现任意设备的本地定时功能。
“本地定时”是相对”云端定时”而言的,是指当设备离线时,也能自动执行定时任务。要实现本地定时的效果,设备端和APP端可以按照本文推荐的方式进行实现。
设备端:按照平台标准数据格式,实现定时任务的增删改。
APP端:可以直接使用平台提供的“设备界面”插件,或“本地定时”APP插件,无需额外开发APP页面。
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中的调用权限。