共计 11758 个字符,预计需要花费 30 分钟才能阅读完成。
一、背景及纲要介绍
在现在物联网 DCM(Device、Connect、Manage)的大框架下,有一个应用层来剖析和解决数据,是必备技能。然而,对于一个公司来说,因为研发能力或者研发工夫的起因,可能很难短期内齐全本人开发出一个实用的 App 来。写代码、封装通用性能、还要思考其余多种性能,通通都是很消耗工夫的事件。当初很多物联网平台公司,为了帮忙开发者解决此类问题,也想出了相应的解决办法,提供相应的 SDK 就是其中一种。
明天抽空 以基于 App SDK 实现智能家居 App 的开发 为例。通过这一篇文章,你就能通过创立 App SDK、集成 SDK、创立家庭、设施配网和设施管制等步骤,残缺地实现一款智能家居 App 的开发。
先列一下开发纲要:
- 创立 App SDK
- 集成 SDK
- 注册和登录
- 创立家庭
- 设施配网
- 设施管制
咱们再来简略介绍一下 Tuya App SDK:
涂鸦智能 App SDK 专为 IoT 挪动 App 开发打造,提供丰盛组件和示例代码,开发者能够疾速实现挪动 App 对智能设施的连贯、管制以及丰盛的智能场景利用。
产品的劣势在于:
- 低门槛疾速集成:疾速集成 SDK,提供示例代码、Demo App、接入案例等,低门槛轻松上手;
- 开发组件丰盛:组件化开发,提供垂直品类 SDK、UI 业务包等性能组件,开发者依据需要灵便组合;
- 智能性能全面:全面笼罩用户、设施、智能场景等多种功能模块,开发者只需简略实现 UI 层代码;
- 支流通信协议兼容:同一 App 中反对增加和应用支流通信协议产品,轻松实现 All In One – App;
- 寰球数据安全保障:双通道平安加密,五重安全策略,寰球数据安全合规认证,全面保障用户数据隐衷平安;
- 寰球服务稳固:全球化智能云部署,让每一个 App 都轻松领有亿级海量设施和千万级用户并发解决能力。
Home SDK的技术架构如下:
二、如何基于 App SDK 开发一个 App
准备就绪,咱们来开始开发!
(一)创立 App SDK
- 注册开发者账号
返回 涂鸦智能开发平台 注册开发者账号、创立产品、创立性能点等,具体流程请参考接入流程
- 创立 SDK 利用
在涂鸦 IoT 平台中“App 工作台 ”中点击“App SDK”,点击“ 创立 App”。
-
填写 App 相干信息,点击确认。
- 利用名称:填写您的 App 名称。
- iOS 利用包名:填写您的 iOS App 包名(倡议格局:com.xxxxx.xxxxx)。
- 安卓利用包名:填写您的安卓 App 包名(两者能够保持一致,也能够不统一)。
- 渠道标识符:不是必填项,如果不填写,零碎会依据包名主动生成。
您能够依据理论需要抉择须要的抉择计划,反对多选,而后依据 Podfile 和 Gradle 进行 SDK 的集成。
点击 获取明码,获取 SDK 的 AppKey,AppSecret,平安图片等信息。
(二)集成 SDK
1. 应用 CocoaPods 疾速集成
请留神:SDK 最低支持系统版本 9.0
在 Podfile 文件中增加以下内容:
platform :ios, '9.0'
target 'Your_Project_Name' do
pod "TuyaSmartHomeKit"
end
而后在我的项目根目录下执行 pod update
命令进行集成。
2. 初始化 SDK
1)关上我的项目设置,Target => General,批改 Bundle Identifier 为涂鸦开发者平台对应的 iOS 包名
2)导入平安图片到工程根目录,重命名为 t_s.bmp,并退出「我的项目设置 => Target => Build Phases => Copy Bundle Resources」中。
3)在我的项目的 PrefixHeader.pch 文件增加以下内容:
#import <TuyaSmartHomeKit/TuyaSmartKit.h>
4)关上 AppDelegate.m 文件,在 [AppDelegate application:didFinishLaunchingWithOptions:] 办法中初始化 SDK。
接口阐明
初始化 SDK
- (void)startWithAppKey:(NSString *)appKey secretKey:(NSString *)secretKey;
参数阐明
实例代码
[[TuyaSmartSDK sharedInstance] startWithAppKey:<#your_app_key#> secretKey:<#your_secret_key#>];
3. 关上 Debug 模式
在开发的过程中能够开启 Debug 模式,打印一些日志用于剖析问题,开发完结上线后倡议敞开。
#ifdef DEBUG
[[TuyaSmartSDK sharedInstance] setDebugMode:YES];
#else
#endif
(三)注册和登录
涂鸦云反对多种用户体系:手机、邮箱、UID。其中手机反对验证码登录和明码登录两种形式,UID 登录次要用于曾经有本人账号体系的场景。咱们这里采纳手机验证码注册登录。
在注册登录办法中,须要提供 countryCode 参数(国家区号),用于就近抉择涂鸦云的可用区。各个可用区的数据是互相独立的,因而在 中国大陆(86)注册的账号,在 美国(1) 无奈应用(用户不存在)。
1. 手机明码注册
手机号明码注册流程分为以下两步:获取手机验证码 – 注册账号
// 发送验证码
[[TuyaSmartUser sharedInstance] sendVerifyCode:@"86" phoneNumber:@"1300****" type:1 success:^{[TPDemoProgressUtils showSuccess:@"Verification code sent successfully" toView:nil];
} failure:^(NSError *error) {[TPDemoProgressUtils showError:error.localizedDescription];
}];
// 通过验证码注册账号
[[TuyaSmartUser sharedInstance] registerByPhone:@"86" phoneNumber:@"1300****" password:@"***" code:@"code" success:^{
// 注册胜利,跳转到首页
[[TYDemoApplicationImpl sharedInstance] resetRootViewController:[TYDemoTabBarViewController class]];
} failure:^(NSError *error) {[TPDemoProgressUtils showError:error.localizedDescription];
}];
2. 判断是否曾经登录
在程序启动后,如果登录过了就不须要反复登录,session 的有效期是 45 天,间接到设施列表页面。如果没有登录过,就先到登录页进行登录,登录胜利后再跳转到设施列表页。
// 判断是否曾经登录
if ([TuyaSmartUser sharedInstance].isLogin) {
// 首页
[self resetRootViewController:[TYDemoTabBarViewController class]];
} else {
// 登录页
[[TYDemoRouteManager sharedInstance] openRoute:kTYDemoPopLoginVC withParams:nil];
}
3. Session 生效解决
长期未登录或者明码批改后的账号,在拜访服务端接口的时候会返回 Session 过期的谬误,须要监听 TuyaSmartUserNotificationUserSessionInvalid 告诉,跳转至登录页面从新登录。
- (void)loadNotification {[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sessionInvalid) name:TuyaSmartUserNotificationUserSessionInvalid object:nil];
}
- (void)sessionInvalid {NSLog(@"sessionInvalid");
// 跳转至登录页面
MyLoginViewController *vc = [[MyLoginViewController alloc] init];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
}
(四)创立家庭
用户登录胜利后须要通过 TuyaSmartHomeManager 去获取整个家庭列表的信息,而后初始化其中的一个家庭 TuyaSmartHome,获取家庭详情信息,就能够对家庭中的设施进行操作控制。
1. 家庭列表获取
在设施列表页面,咱们先获取用户下的家庭列表,如果没有家庭,咱们创立一个默认家庭。因为设施激活的时候,须要把设施增加到家庭外面。
获取到家庭列表之后,咱们就能够初始化一个家庭,而后从云端获取家庭的详情,刷新首页的设施列表。
- (void)initData {_homeManager = [[TuyaSmartHomeManager alloc] init];
_homeManager.delegate = self;
// 获取本地的以后家庭
NSString *homeId = [[NSUserDefaults standardUserDefaults] objectForKey:kDefaultCurrentHomeId];
if ([homeId longLongValue] > 0) {self.home = [TuyaSmartHome homeWithHomeId:[homeId longLongValue]];
if (self.home) {
self.home.delegate = self;
self.topBarView.leftItem.title = [NSString stringWithFormat:@"%@ ∨", self.home.homeModel.name];
[TYDemoSmartHomeManager sharedInstance].currentHomeModel = self.home.homeModel;
// 刷新设施列表数据
[self reloadDataFromCloud];
} else {
// 如果没有,获取第一个家庭
[self loadFirstHomeData];
}
} else {
// 如果没有,获取第一个家庭
[self loadFirstHomeData];
}
}
- (void)reloadDataFromCloud {
WEAKSELF_AT
[self.refreshControl beginRefreshing];
// 获取以后家庭的详情,并刷新列表
[self.home getHomeDetailWithSuccess:^(TuyaSmartHomeModel *homeModel) {[weakSelf_AT reloadData];
} failure:^(NSError *error) {if ([error.localizedFailureReason isEqualToString:@"PERMISSION_DENIED"]) {[weakSelf_AT loadFirstHomeData];
}
[weakSelf_AT.refreshControl endRefreshing];
}];
}
2. 新增一个家庭
// add home
- (void)rightBtnAction {NSString *homeName = [NSString stringWithFormat:@"Home_%@", @(self.homeManager.homes.count)];
WEAKSELF_AT
[self.homeManager addHomeWithName:homeName geoName:@"hangzhou" rooms:@[@"room1"] latitude:0 longitude:0 success:^(long long homeId) {[TPDemoProgressUtils showSuccess:@"Add Success" toView:nil];
// 切换到新增家庭
TuyaSmartHome *home = [TuyaSmartHome homeWithHomeId:homeId];
[weakSelf_AT swithCurrentHomeIdWithHomeModel:home.homeModel];
} failure:^(NSError *error) {[TPDemoProgressUtils showError:error.localizedDescription];
}];
}
3. 家庭列表信息变动回调
实现 TuyaSmartHomeManagerDelegate 代理协定后,能够在家庭列表更变的回调中进行解决。
#pragma mark - TuyaSmartHomeManagerDelegate
// 增加一个家庭
- (void)homeManager:(TuyaSmartHomeManager *)manager didAddHome:(TuyaSmartHomeModel *)home {NSLog(@"Add a home %@", home.name);
}
// 删除一个家庭
- (void)homeManager:(TuyaSmartHomeManager *)manager didRemoveHome:(long long)homeId {
// 如果删除的家庭是以后家庭,以后家庭切换到另外一个
if ([TYDemoSmartHomeManager sharedInstance].currentHomeModel.homeId == homeId) {[self loadFirstHomeData];
}
}
// MQTT 连贯胜利
- (void)serviceConnectedSuccess {
// 去云端获取以后家庭的详情,而后去刷新 UI
[self reloadDataFromCloud];
}
4. 单个家庭信息变动的回调
实现 TuyaSmartHomeDelegate 代理协定后,能够在单个家庭信息更变的回调中进行解决。
#pragma mark - TuyaSmartHomeDelegate
// 家庭的信息更新,例如 name
- (void)homeDidUpdateInfo:(TuyaSmartHome *)home {[self.tableView reloadData];
}
// 增加一个房间
- (void)home:(TuyaSmartHome *)home didAddRoom:(TuyaSmartRoomModel *)room {[self.tableView reloadData];
}
// 删除一个房间
- (void)home:(TuyaSmartHome *)home didRemoveRoom:(long long)roomId {[self.tableView reloadData];
}
// 我收到的共享设施列表变动
- (void)homeDidUpdateSharedInfo:(TuyaSmartHome *)home {[self.tableView reloadData];
}
// 房间信息变更,例如 name
- (void)home:(TuyaSmartHome *)home roomInfoUpdate:(TuyaSmartRoomModel *)room {[self.tableView reloadData];
}
// 房间与设施,群组的关系变动
- (void)home:(TuyaSmartHome *)home roomRelationUpdate:(TuyaSmartRoomModel *)room {[self.tableView reloadData];
}
// 增加设施
- (void)home:(TuyaSmartHome *)home didAddDeivice:(TuyaSmartDeviceModel *)device {[self.tableView reloadData];
}
// 删除设施
- (void)home:(TuyaSmartHome *)home didRemoveDeivice:(NSString *)devId {[self.tableView reloadData];
}
// 设施信息更新,例如 name
- (void)home:(TuyaSmartHome *)home deviceInfoUpdate:(TuyaSmartDeviceModel *)device {[self.tableView reloadData];
}
// 设施 dp 数据更新
- (void)home:(TuyaSmartHome *)home device:(TuyaSmartDeviceModel *)device dpsUpdate:(NSDictionary *)dps {[self.tableView reloadData];
}
// 增加群组
- (void)home:(TuyaSmartHome *)home didAddGroup:(TuyaSmartGroupModel *)group {[self.tableView reloadData];
}
// 群组 dp 数据更新
- (void)home:(TuyaSmartHome *)home group:(TuyaSmartGroupModel *)group dpsUpdate:(NSDictionary *)dps {[self.tableView reloadData];
}
// 删除群组
- (void)home:(TuyaSmartHome *)home didRemoveGroup:(NSString *)groupId {[self.tableView reloadData];
}
// 群组信息更新,例如 name
- (void)home:(TuyaSmartHome *)home groupInfoUpdate:(TuyaSmartGroupModel *)group {[self.tableView reloadData];
}
(五)设施配网
设施配网是指设施在云端进行激活注册。
1. 相干类
2. EZ 配网
这里次要介绍下 EZ 模式开发,又称快连模式(SmartConfig)。
- (void)addDeviceWithEZMode {
// 获取 token
WEAKSELF_AT
id<TYDemoDeviceListModuleProtocol> impl = [[TYDemoConfiguration sharedInstance] serviceOfProtocol:@protocol(TYDemoDeviceListModuleProtocol)];
long long homeId = [impl currentHomeId];
[[TuyaSmartActivator sharedInstance] getTokenWithHomeId:homeId success:^(NSString *token) {
// 开始配网
[weakSelf_AT commitEZModeActionWithToken:token];
} failure:^(NSError *error) {info = [NSString stringWithFormat:@"%@: token fetch failed, error message is %@",NSStringFromSelector(_cmd),error.localizedDescription];
[weakSelf_AT appendConsoleLog:info];
}];
}
// 开始配网
- (void)commitEZModeActionWithToken:(NSString *)token {[TuyaSmartActivator sharedInstance].delegate = self;
[[TuyaSmartActivator sharedInstance] startConfigWiFi:TYActivatorModeEZ ssid:self.ssidField.text password:self.passwordField.text token:token timeout:timeout];
}
#pragma mark - TuyaSmartActivatorDelegate
- (void)activator:(TuyaSmartActivator *)activator didReceiveDevice:(TuyaSmartDeviceModel *)deviceModel error:(NSError *)error {[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(countDown) object:nil];
timeout = timeLeft;
[self hideProgressView];
NSString *info = [NSString stringWithFormat:@"%@: Finished!", NSStringFromSelector(_cmd)];
[self appendConsoleLog:info];
if (error) {
// 配网失败
info = [NSString stringWithFormat:@"%@: Error-%@!", NSStringFromSelector(_cmd), error.localizedDescription];
[self appendConsoleLog:info];
} else {
// 配网胜利
info = [NSString stringWithFormat:@"%@: Success-You've added device %@ successfully!", NSStringFromSelector(_cmd), deviceModel.name];
[self appendConsoleLog:info];
}
}
智能设施配网胜利后就有了联网能力,就能够进行近程管制了。
(六)设施管制
设施激活后,就能够进行智能设施的管制,而后监听设施管制变动的回调。
1. 相干类
在进行设施管制之前,咱们先理解下设施性能点的概念。
2. 设施性能点
性能点是对产品性能的形象示意,是具体智能设施性能的形象,用于形容产品性能及其参数。
• 性能点 ID:性能点的编码。设施与云端的性能数据通过性能点 ID 进行传输。
• 性能点名称:自定义的性能名称。
• 标识名:性能点 Code 值,用于 App 显示性能名称的多语言治理。反对字母、数字和下划线,以字母结尾。
• 数据类型:
• 数据传输类型:
|- 可下发可上报:指令数据能够发送给设施,设施数据能够传输给云端。
|- 只上报:数据只反对从设施传输给云端。
|- 只下发:数据只反对从云端发送给设施。
TuyaSmartDeviceModel 类的 dps 属性(NSDictionary 类型)定义了以后设施的状态,称作数据点(DP 点)或性能点
dps 字典里的每个 key 对应一个性能点的 dpId,value 对应一个性能点的 dpValue,dpValue 为该性能点的值
产品性能点定义参见涂鸦开发者平台的产品性能,如下图所示:
发送控制指令依照以下格局:
{“<dpId>”:”<dpValue>”}
依据后盾该产品的性能点定义,如下:
示例代码
- (void)publishDps {// self.device = [TuyaSmartDevice deviceWithDeviceId:@"your_device_id"];
// self.device.delegate = self;
NSDictionary *dps;
// 设置 dpId 为 1 的布尔型性能点示例 作用: 开关关上
dps = @{@"1": @(YES)};
// 设置 dpId 为 4 的字符串型性能点示例 作用: 设置 RGB 色彩为 ff5500
dps = @{@"4": @"ff5500"};
// 设置 dpId 为 5 的枚举型性能点示例 作用: 设置档位为 2 档
dps = @{@"5": @"2"};
// 设置 dpId 为 6 的数值型性能点示例 作用: 设置温度为 20°
dps = @{@"6": @(20)};
// 设置 dpId 为 15 的透传型 (byte 数组) 性能点示例 作用: 透传红外数据为 1122
dps = @{@"15": @"1122"};
// 多个性能合并发送
dps = @{@"1": @(YES), @"4": @(ff5500)};
[self.device publishDps:dps success:^{NSLog(@"publishDps success");
// 下发胜利,状态上报通过 deviceDpsUpdate 办法 回调
} failure:^(NSError *error) {NSLog(@"publishDps failure: %@", error);
}];
}
注意事项
• 管制命令的发送须要特地留神数据类型
比方性能点的数据类型是数值型(value),那管制命令发送的应该是 @{@”2″: @(25)} 而不是 @{@”2″: @”25″}
• 透传类型传输的 byte 数组是字符串格局(16 进制字符串)、字母需小写并且必须是偶数位
比方正确的格局是: @{@”1″: @”011f”} 而不是 @{@”1″: @”11f”}
性能点更多概念参见疾速入门 - 性能点相干概念
3. 设施初始化和设施变动代理监听
须要通过 TuyaSmartHome 初始化一个 home 实例,而后调用接口 getHomeDetailWithSuccess:failure: 获取家庭的详情,同步过家庭的详情后,初始化设施能力胜利。谬误的设施 id 可能会导致初始化失败,此时设施的实例返回 nil。
- (void)publishDps {self.device = [TuyaSmartDevice deviceWithDeviceId:@"your_device_id"];
self.device.delegate = self;
[self.device publishDps:@{@"1" : @{YES}} success:^{NSLog(@"publishDps success");
// 下发胜利,状态上报通过 deviceDpsUpdate 办法 回调
} failure:^(NSError *error) {NSLog(@"publishDps failure: %@", error);
}];
}
#pragma mark - TuyaSmartDeviceDelegate
/// dp 数据更新
- (void)device:(TuyaSmartDevice *)device dpsUpdate:(NSDictionary *)dps {[self.tableView reloadData];
}
/// 设施信息更新
- (void)deviceInfoUpdate:(TuyaSmartDevice *)device { }
/// 设施被移除
- (void)deviceRemoved:(TuyaSmartDevice *)device {}
三、总结
咱们曾经实现了一个 IoT App 对智能硬件设施的激活入网,设施管制等次要环节,通过上述的流程阐明,置信你曾经能够基于 App SDK 实现一个智能家居 App 的开发,感兴趣就去试试吧,有问题能够评论或者私聊!
四、参考
IoT App SDK 简介
Tuya Home SDK
Demo 链接