生活物联网平台提供App基于Native开发定时功能(静态方式)的开发方式。
Native开发定时功能(静态方式)
静态方式开发即开发native的本地定时功能。该方式开发的App定时功能用户体验更好,但对技术要求较高,且无法动态更新,需要通过发布App版本来更新。
获取本地定时的属性字段。
//获取本地定时的个数,是否支持Targets、TimezoneoffsetNSUIntegersize=0;IMSThing*thing=[[IMSThingManagersharedManager]buildThing:iotId];IMSThingProfile*profile=[thinggetThingProfile];NSArray 获取设备TSL模型和定时属性。 创建com.aliyun.alink.linksdk.tmp.device.panel.PanelDevice对象。 {"items":{"LocalTimer"://以下为定时数据的示例[{"LightSwitch":1,"ColorTemperature":2000,"Timer":"541,2,3","TimezoneOffset":43200,"Brightness":0,"Enable":1,"Targets":"LightSwitch","WorkMode":0,"IsValid":1}]}}解析定时数据。 staticprivatevoidparseLocalTimer(JSONObjectdataObj,LocalTimerDatalocalTimerData){for(Stringkey:dataObj.keySet()){if(key.equals("LocalTimer")){JSONArrayvalue=dataObj.getJSONObject(key).getJSONArray("value");for(inti=0;i 单设备 使用PanelDevice#setProperties()方法更新设备属性。 panelDevice.setProperties(json,newIPanelCallback(){@OverridepublicvoidonComplete(finalbooleansucceed,finalObjectjson){}});入参JSON格式示例如下。 {"iotId":"","items":{"LocalTimer":[//以下为定时数据的示例{"LightSwitch":1,"ColorTemperature":2000,"Timer":"541,2,3","TimezoneOffset":43200,"Brightness":0,"Enable":1,"Targets":"LightSwitch","WorkMode":0,"IsValid":1}]}}组控设备 使用PanelGroup#setGroupProperties()方法更新设备属性。 PanelGroup的初始化方法与panelDevice的初始化类似,区别是要传入组控的groupId。 panelGroup.setGroupProperties(json,newIPanelCallback(){@OverridepublicvoidonComplete(finalbooleansucceed,finalObjectjson){}});入参JSON格式示例如下。 {"controlGroupId":"","items":{"LocalTimer":[//以下为定时数据的示例{"LightSwitch":1,"ColorTemperature":2000,"Timer":"541,2,3","TimezoneOffset":43200,"Brightness":0,"Enable":1,"Targets":"LightSwitch","WorkMode":0,"IsValid":1}]}}订阅本地定时属性值。 实时更新常用来处理多端同时设置设备属性的情况。 //接口:/app/down/thing/properties设备端上报属性panelDevice.subAllEvents(newIPanelEventCallback(){@OverridepublicvoidonNotify(Stringid,Stringpath,Objectjson){if(!id.equals(iotId)){return;}if(!"/app/down/thing/properties".equals(path)){return;}}},newIPanelCallback(){@OverridepublicvoidonComplete(booleanb,Objecto){}});返回数据中的JSON格式示例如下。 {"items":{"LocalTimer"://以下为定时数据的示例[{"LightSwitch":1,"ColorTemperature":2000,"Timer":"541,2,3","TimezoneOffset":43200,"Brightness":0,"Enable":1,"Targets":"LightSwitch","WorkMode":0,"IsValid":1}]}}通用说明corn表达式说明(即LocalTimer结构中的Timer字段) 定时属性中的CronTrigger配置完整格式为:[分][小时][日][月][周] *表示所有值。在分钟里表示每一分钟触发。如在小时、日期、月份里面表示每一小时、每一日、每一月。 -表示区间。小时设置为10-12表示10、11、12点均会触发。 ,表示多个值。周设置成2、3、4、5、6表示在周一至周五工作日会触发。 /表示递增触发。5/15表示从第5秒开始,每隔15秒触发。 L表示最后的意思。日上表示最后一天。星期上表示星期六或7。L前加数据,表示该数据的最后一个。星期上设置6L表示最后一个星期五(6表示星期五)。 W表示离指定日期最近的工作日触发。15W离该月15号最近的工作日触发。表示每月的第几个周几(6#3表示该月的第三个周五)。 时区说明(即LocalTimer结构中的TimeOffset字段) 由于Android中自带的Calendar对于DaylightSavingTime(DST)的处理有问题。在需要处理冬令时和夏令时的地区,请使用Java8提供的Instant类或者其他方法来计算时差。代码示例如下。 privateinttimezoneOffset(){try{Instantinstant=Instant.now();Calendarcalendar=newGregorianCalendar();TimeZonetimezone=calendar.getTimeZone();ZoneIdzone=ZoneId.of(timezone.getID());ZonedDateTimez=instant.atZone(zone);intoffset=z.getOffset().getTotalSeconds();ALog.d(TAG,"timezoneOffset():ZoneId:"+timezone.getID()+",getTotalSeconds:"+offset);returnoffset;}catch(Exceptionignored){return0;}}Targets字段说明 如果在LocalTimer里添加了多个动作,则必须在Target字段里面添加您本次修改的字段。否则,您必须完整设置所有的动作,本地定时才能正常保存。