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

8次阅读

共计 11758 个字符,预计需要花费 30 分钟才能阅读完成。

一、背景及纲要介绍

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

正文完
 0