创建一个自有App,并完成SDK下载。详细操作请参见创建自有App。
获取本地定时的属性字段。
本地定时是属于TSL的一个属性,定时就是操作TSL的LocalTimer。根据设备模型SDK获取对应设备的TSL,并从中获取本地定时的个数、Targets、Timezoneoffset属性字段。
// 获取本地定时的个数,是否支持 Targets、Timezoneoffset
NSUInteger size = 0;
IMSThing *thing = [[IMSThingManager sharedManager] buildThing:iotId];
IMSThingProfile *profile = [thing getThingProfile];
NSArray *proList = [profile allPropertiesOfModel];
__block BOOL hasTargets = NO;
__block BOOL hasTimezoneOffset = NO;
for (NSUInteger i = 0; i
IMSThingTslProperty * _Nonnull obj = proList[i];
NSLog(@"%lul", (unsigned long)i);
if ([obj.identifier isEqualToString:@"LocalTimer"]) {
NSString *sizeTmp = obj.dataType[@"specs"][@"size"];
size = sizeTmp.integerValue;
NSArray *itemList = obj.dataType[@"specs"][@"item"][@"specs"];
[itemList enumerateObjectsUsingBlock:^(id _Nonnull item, NSUInteger idx, BOOL * _Nonnull stop) {
if ([item[@"identifier"] isEqualToString:@"Targets"]) {
hasTargets = YES;
} else if ([item[@"identifier"] isEqualToString:@"TimezoneOffset"]){
hasTimezoneOffset = YES;
}
}];
}
}
获取设备端的定时器列表数据。
// 本地定时model数据结构
@interface IMSLocalTimerModel : NSObject
@property (nonatomic, copy) NSString *timer;
@property (nonatomic, assign) BOOL enable;
@property (nonatomic, assign) BOOL isValid;
@property (nonatomic, strong) NSMutableDictionary *propertyValueDic;
@property (nonatomic, strong) NSString *iotId;
@property (nonatomic, strong, nullable) NSString *targets;
@property (nonatomic, assign) NSInteger timezoneOffset;
@end
// 获取本地定时列表数据
id thingObj = [thing getThingActions];
NSMutableArray *list = [NSMutableArray array];
[thingObj getPropertiesFull:^(IMSThingActionsResponse * _Nullable response) {
// 回调不在主线程,请注意
NSDictionary *dic = (NSDictionary *)response.dataObject;
NSDictionary *data = dic[@"data"];
for (NSString *key in data){
if ([key isEqualToString:@"LocalTimer"]){
NSDictionary *localTimer = data[key];
NSArray *value = localTimer[@"value"];
for (NSDictionary *item in value) {
IMSLocalTimerModel *timer = [IMSLocalTimerModel new];
timer.isValid = NO;
timer.propertyValueDic = [NSMutableDictionary dictionary];
for (NSString *a in item) {
if ([a isEqualToString:@"IsValid"]) {
NSNumber *isValid = item[a];
timer.isValid = isValid.boolValue;
} else if ([a isEqualToString:@"Enable"]) {
NSNumber *enable = item[a];
timer.enable = enable.boolValue;
} else if ([a isEqualToString:@"Timer"]) {
timer.timer = item[a];
} else if ([a isEqualToString:@"Targets"]){
timer.targets = item[a];
} else if ([a isEqualToString:@"TimezoneOffset"]){
NSNumber *timezoneOffset = item[a];
timer.timezoneOffset = timezoneOffset.integerValue;
} else {
timer.propertyValueDic[a] = item[a];
}
}
if (!timer.isValid) {
timer.propertyValueDic = [NSMutableDictionary dictionary];
timer.timer = @"";
timer.targets = @"";
timer.timezoneOffset = 0;
}
timer.hasTargets = hasTargets;
timer.hasTimezoneOffset = hasTimezoneOffset;
[list addObject:timer];
}
break;
}
}
// 如果get到的属性值的timer个数没有达到tsl要求的定时器数,需要补齐,因为set的时候,tsl要求返回的个数和tsl要求的一样
for (NSInteger i = list.count; i < size; i++) {
IMSLocalTimerModel *timer = [IMSLocalTimerModel new];
timer.isValid = NO;
timer.timer = @"";
timer.iotId = iotId;
timer.hasTargets = hasTargets;
timer.hasTimezoneOffset = hasTimezoneOffset;
timer.propertyValueDic = [NSMutableDictionary dictionary];
timer.modelList = list;
[list addObject:timer];
}
}
设置(编辑/创建/删除等)一个定时器。
@implementation IMSLocalTimerModel
// 单个定时转换为json接口,供参考
- (NSMutableDictionary *)toJson{
NSMutableDictionary *json = [NSMutableDictionary dictionary];
[json addEntriesFromDictionary:self.propertyValueDic];
[json addEntriesFromDictionary:@{@"Enable":@(self.enable?1:0),@"IsValid":@(self.isValid?1:0), @"Timer":self.timer?:@""}];
if (self.hasTargets) {
[json addEntriesFromDictionary:@{@"Targets":self.targets?:@""}];
}
if (self.hasTimezoneOffset) {
[json addEntriesFromDictionary:@{@"TimezoneOffset":@(self.timezoneOffset)}];
}
return json;
}
/* 如果 TimezoneOffset 字段存在 这个字段是为了让设备端能获取到app端设置定时时所处时区*/
propertyValues[@"TimezoneOffset"] = @([NSTimeZone localTimeZone].secondsFromGMT);
/*
假设当前设备有3个属性可以通过本地定时进行控制,这3个属性的identifier分别为id1、id2、id3
如果本地定时存在Targets字段,则允许1个定时只控制3个属性中部分属性,假设这个定时是控制属性id1和属性id2,
则 Targets = @"id1, id2"
如果本地定时不存在Targets字段,则要求改定时创建或者编辑的时候,必须对3个属性都设置属性值(定时时间到的是属性需要生效的值)
*/
// list 是属性的 identifier 的列表
- (NSString *)setTargetList:(NSArray *)list{
if (list.count == 0) {
return @"";
}
NSString *targets = list.firstObject;
for (NSUInteger i = 1; i < list.count; i++) {
targets = [targets stringByAppendingString:@","];
targets = [targets stringByAppendingString:list[i]];
}
return targets;
}
propertyValues[@"TimezoneOffset"] = [obj setTargetList:@[id1, id2]];
/* 假设tsl中获取到设备可以设置3个本地定时,则timerList=@[[timer1 toJson], [timer2 toJson], [timer3 toJson]] :
每个定时器的json生成参考 [IMSLocalTimerModel toJson]
[
1. 同时控制属性1和属性2的定时
{"id1":1,"id2":2,"id3":1,"Timer":"0 8 * * *","Enable":1,"IsValid":1, "Targets":"id1, id2", "TimezoneOffset":""},
2. 只控制属性1的定时
{"id1":1,"id2":2,"id3":1,"Timer":"2 6 * * 3","Enable":1,"IsValid":1, "Targets":"id1", "TimezoneOffset":""},
3. 设置一个定时的IsValid为0,则就是删除该定时器,但是这里建议把IsValid 也设置为0,因为设备端的实现可能只认IsValid字段
{"id1":1,"id2":2,"id3":1,"Timer":"2 6 * * 3","Enable":0,"IsValid":0, "Targets":"", "TimezoneOffset":""}
]
*/
[thingActions setProperties:@{@"LocalTimer":timerList} responseHandler:^(IMSThingActionsResponse * _Nullable response) {
}
订阅本地定时属性值。
以监听定时的Enable状态为例,设定定时的有效性是一次,当定时超时后,App端会收到定时的Enable属性变为0的通知,并进行界面刷新等相关操作。相应示例代码如下。
// 代码供参考
a.注册订阅
IMSThing *thing = [[IMSThingManager sharedManager] buildThing:controller.iotId];
[thing registerThingObserver:(id)obj];
b.订阅通知处理
- (void)onPropertyChange:(NSString *)iotId params:(NSDictionary *)params{
IMSDeviceLogDebug(@"onPropertyChange %@ %@", iotId, params);
NSArray *list = params[@"items"][@"LocalTimer"][@"value"];
for (NSInteger i = 0; i < list.count; i++) {
NSDictionary *timer = list[i];
if (i >= self.list.count) {
[self.list addObject:[IMSLocalTimerModel new]];
}
IMSLocalTimerModel *model = self.list[i];
model.timezoneOffset = NO;
model.hasTargets = NO;
model.propertyValueDic = [NSMutableDictionary dictionary];
[timer enumerateKeysAndObjectsUsingBlock:^(NSString *_Nonnull key, NSNumber* _Nonnull obj, BOOL * _Nonnull stop) {
if ([key isEqualToString:@"Enable"]) {
model.enable = obj.boolValue;
} else if ([key isEqualToString:@"IsValid"]){
model.isValid = obj.boolValue;
} else if ([key isEqualToString:@"Targets"]){
model.targets = (NSString *)obj;
model.hasTargets = YES;
} else if ([key isEqualToString:@"Timer"]){
model.timer = (NSString *)obj;
} else if ([key isEqualToString:@"TimezoneOffset"]){
model.timezoneOffset = obj.integerValue;
model.hasTimezoneOffset = YES;
} else {
model.propertyValueDic[key] = obj;
}
}];
}
// 刷新界面等
}
c.注销订阅
IMSThing *thing = [[IMSThingManager sharedManager] buildThing:self.iotId];
[thing unregisterThingObserver:self];