一、背景及纲要介绍

在现在物联网DCM(Device、Connect、Manage)的大框架下,有一个应用层来剖析和解决数据,是必备技能。然而,对于一个公司来说,因为研发能力或者研发工夫的起因,可能很难短期内齐全本人开发出一个实用的App来。写代码、封装通用性能、还要思考其余多种性能,通通都是很消耗工夫的事件。当初很多物联网平台公司,为了帮忙开发者解决此类问题,也想出了相应的解决办法,提供相应的SDK就是其中一种。

明天抽空以基于App SDK实现智能家居App的开发为例。通过这一篇文章,你就能通过创立App SDK、集成SDK、创立家庭、设施配网和设施管制等步骤,残缺地实现一款智能家居App的开发。

先列一下开发纲要:

  1. 创立App SDK
  2. 集成SDK
  3. 注册和登录
  4. 创立家庭
  5. 设施配网
  6. 设施管制

咱们再来简略介绍一下Tuya App SDK:

涂鸦智能 App SDK 专为 IoT 挪动 App 开发打造,提供丰盛组件和示例代码,开发者能够疾速实现挪动 App 对智能设施的连贯、管制以及丰盛的智能场景利用。

产品的劣势在于:

  1. 低门槛疾速集成:疾速集成 SDK,提供示例代码、Demo App、接入案例等,低门槛轻松上手;
  2. 开发组件丰盛:组件化开发,提供垂直品类 SDK、UI 业务包等性能组件,开发者依据需要灵便组合;
  3. 智能性能全面:全面笼罩用户、设施、智能场景等多种功能模块,开发者只需简略实现 UI 层代码;
  4. 支流通信协议兼容:同一 App 中反对增加和应用支流通信协议产品,轻松实现 All In One – App;
  5. 寰球数据安全保障:双通道平安加密,五重安全策略,寰球数据安全合规认证,全面保障用户数据隐衷平安;
  6. 寰球服务稳固:全球化智能云部署,让每一个 App 都轻松领有亿级海量设施和千万级用户并发解决能力。

Home SDK的技术架构如下:

二、如何基于 App SDK 开发一个 App

准备就绪,咱们来开始开发!

(一)创立App SDK

  1. 注册开发者账号

返回 涂鸦智能开发平台 注册开发者账号、创立产品、创立性能点等,具体流程请参考接入流程

  1. 创立SDK利用

在涂鸦 IoT 平台中 “App 工作台” 中点击 “App SDK”,点击“创立 App”。

  1. 填写 App 相干信息,点击确认。

    1. 利用名称:填写您的 App 名称。
    2. iOS 利用包名:填写您的 iOS App 包名(倡议格局:com.xxxxx.xxxxx)。
    3. 安卓利用包名:填写您的安卓 App 包名(两者能够保持一致,也能够不统一)。
    4. 渠道标识符:不是必填项,如果不填写,零碎会依据包名主动生成。

您能够依据理论需要抉择须要的抉择计划,反对多选,而后依据 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 链接