关于物联网:如何基于App-SDK快速地开发一个IoT-App

一、背景及纲要介绍

在现在物联网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 链接

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理