• 智能生活 App SDK 开发入门教程【内附代码段 】


    涂鸦智能生活 App SDK 安卓版提供了即全面又灵活的 IoT App 开发模式。大家可以通过本教程在两小时内快速开发一款自己的 IoT App,并实现如下功能:

    •  使用手机号码注册并登录一个用户账号。
    •  在登录状态下创建一个家庭,并查看和修改家庭信息。
    •  使用热点模式为设备配网并连接设备。
    •  使用自己创建的 App 控制该设备。

    大家可以前往 App 开发平台查看本教程中的示例代码,本次教程按功能模块进行分类,方便大家可以快速找到对应的代码参考学习。

    效果展示

    学习完本教程,并且结合一定的面板开发后,大家可以创建出一个类似以下安卓 App 的 Demo。

    准备工作

    在您开始本教程前,请先确保您已经 :

    1. 涂鸦 IoT 平台注册账号并创建 App,获取 SDK 的 AppKey 和 AppSecret。

    2. 使用 Android Studio 将安卓版智能生活 App SDK 集成到项目中。

    第一步:注册用户账号

    本模块中,仅演示使用手机号注册登录。除此以外,涂鸦智能生活 App SDK 还提供了邮箱、第三方、匿名等多种注册登录方式,按需选择即可。

    注册用户账号时:

    • 需要提供 countryCode 参数来区分注册地区,用于就近选择涂鸦 IoT 平台的可用区。如中国大陆为 86,美国为 1

    • 之后将频繁地调用对象 User。它存储了当前用户的所有信息,通过 TuyaHomeSdk.getUserInstance() 获取到 ITuyaUser,它提供了相关的登录注册方法。

    查询验证码服务可用地区

    为了加强用户信息的数据安全,涂鸦优化验证码和添加了账号限制。只有验证码服务可用的地区,才可以发送验证码。大家需要先查询自己的开发者账号是否已经在涂鸦 IoT 平台开通验证码服务的可用地区列表。

    1. TuyaHomeSdk.getUserInstance().getWhiteListWhoCanSendMobileCodeSuccess(new IWhiteListCallback() {
    2. @Override
    3. public void onSuccess(WhiteList whiteList) {
    4. Toast.makeText(mContext, "Whitelist Success:" + whiteList.getCountryCodes(), Toast.LENGTH_SHORT).show();
    5. }
    6. @Override
    7. public void onError(String code, String error) {
    8. Toast.makeText(mContext, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show();
    9. }
    10. });

    返回值 whiteList 表示一个或多个国家或地区,以 , 隔开取值,例如 86 和 01。有关可用区编号列表。

    目前中国大陆默认已开通验证码服务。

    获取注册账号的验证码

    与大部分注册流程类似,用户必须先获取验证码。无论是手机或是邮箱,都可以使用统一的获取验证码接口在注册及后续密码修改,验证码登录,信息完善等操作中获取相应的验证码。

    TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName(String userName, String region, String countryCode, int type, IResultCallback callback);
    

    参数说明

    参数说明
    userName手机号码/邮箱账号
    region区域,默认填写:“” 即可
    countryCode手机区号:如 “86”
    callback回调
    type发送验证码类型:
    1:注册
    2:登录
    3:重置密码

    1. TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName("xxx6/7825***66@123.com", "", "86", 1/2/3, new IResultCallback() {
    2. @Override
    3. public void onError(String code, String error) {
    4. Toast.makeText(mContext, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show();
    5. }
    6. @Override
    7. public void onSuccess() {
    8. Toast.makeText(mContext, "Get code success:", Toast.LENGTH_SHORT).show();
    9. }
    10. });

    使用手机号码注册账号

    使用手机号码注册账号前,需要调用获取验证码接口,传入相应 type。然后调用号码注册接口,需要上传国家码、手机号码、密码以及获取到的验证码。

    1. TuyaHomeSdk.getUserInstance().registerAccountWithPhone("86","13666666666","123456","124332", new IRegisterCallback() {
    2. @Override
    3. public void onSuccess(User user) {
    4. Toast.makeText(mContext, "Register success", Toast.LENGTH_SHORT).show();
    5. }
    6. @Override
    7. public void onError(String code, String error) {
    8. Toast.makeText(mContext, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show();
    9. }
    10. });

    使用手机号码登录账号

    注册成功后,就可以使用国家码、手机号和密码登录账号。

    1. TuyaHomeSdk.getUserInstance().loginWithPhonePassword("86", "13666666666", "123456", new ILoginCallback() {
    2. @Override
    3. public void onSuccess(User user) {
    4. Toast.makeText(mContext, "Login success:" +TuyaHomeSdk.getUserInstance().getUser().getUsername(), Toast.LENGTH_SHORT).show();
    5. }
    6. @Override
    7. public void onError(String code, String error) {
    8. Toast.makeText(mContext, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show();
    9. }
    10. });

    第二步:创建和管理家庭

    家庭是智能生活 App SDK 开发下实际场景的最大单位。IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。可以在用户账号下创建任意多个家庭;在指定家庭下,还可以添加并管理多个房间和用户成员。

    操作家庭模块时,将频繁调用对象 ITuyaHomeManager 和 HomeBean

    对象说明
    HomeBean存放了家庭的基本信息,如 ID、名字、位置等。
    TuyaSmartHome存放了家庭相关的所有功能,如单个家庭信息管理,家庭下的家庭成员管理,房间管理等。ITuyaHomeManager 需要使用正确的 homeId 用 TuyaHomeSdk.getHomeManagerInstance() 进行初始化。

    创建家庭

    在登录状态下可以创建家庭。之后对于房间、成员、设备等对象的管理都基于家庭下。创建家庭需要通过 ITuyaHomeManager 调用创建家庭接口

    1. TuyaHomeSdk.getHomeManagerInstance().createHome(name, lon, lat, geoName, rooms, new ITuyaHomeResultCallback() {
    2. @Override
    3. public void onSuccess(HomeBean bean) {
    4. // do something
    5. }
    6. @Override
    7. public void onError(String errorCode, String errorMsg) {
    8. // do something
    9. }
    10. });

    查询家庭列表

    在登录状态下可以直接获取家庭列表。如果还没创建过家庭,将返回 空数组

    1. TuyaHomeSdk.getHomeManagerInstance().queryHomeList(new ITuyaGetHomeListCallback() {
    2. @Override
    3. public void onSuccess(List homeBeans) {
    4. // do something
    5. }
    6. @Override
    7. public void onError(String errorCode, String error) {
    8. // do something
    9. }
    10. });

    获取家庭详细信息

    在获取家庭列表或通过 HomeId 初始化得到的 ITuyaHomeManager 的 HomeBean 中 roomListdeviceListgroupListsharedDeviceListsharedGroupList 等属性均为空。需要调用家庭的详细信息接口获取上述属性的具体内容。

    1. TuyaHomeSdk.newHomeInstance(10000).getHomeDetail(new ITuyaHomeResultCallback() {
    2. @Override
    3. public void onSuccess(HomeBean bean) {
    4. // do something
    5. }
    6. @Override
    7. public void onError(String errorCode, String errorMsg) {
    8. // do something
    9. }
    10. });

    最佳实践

    在创建了家庭后,后续房间成员、用户配网等相关操作均需要基于某一特定家庭。因此建议将这一特定家庭作为 App 的全局变量存储。当然,也可以在本地随时切换当前家庭,平台并不会记录这一信息。在本教程和配套的 Sample 中,默认将列表的第一个家庭设为当前家庭。

    第三步:设备配网

    简单来说,配网就是将设备连接并注册到云端,使其拥有与云端远程通信的能力。涂鸦智能生活 App SDK 提供了丰富的配网方式以支持大部分智能设备。如 Wi-Fi 连接,蓝牙连接等。

    配网方式介绍

    本模块以 Wi-Fi 配网为例介绍如何使用 SDK 将设备配置到云端。Wi-Fi 配网方式包括 快连模式(EZ)、热点模式(AP)、扫 App 二维码三种方式。

    相比 EZ 模式,AP 模式成功率高、可靠性好,对手机和路由器的兼容性要求小。配网成功率高于 EZ 模式。因此,在之后的版本中,我们推荐使用 AP 模式 代替 EZ 模式

    获取配网 Token

    开始配网之前,SDK 需要在联网状态下从涂鸦云获取配网 Token,然后才可以开始热点模式配网。Token 的有效期为 10 分钟,且配置成功后就会失效,再次配网需要重新获取。获取 Token 需要上传当前的 homeId,因此您需要确保账号处于登录状态并至少创建了一个家庭。

    1. TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId,
    2. new ITuyaActivatorGetToken() {
    3. @Override
    4. public void onSuccess(String token) {
    5. }
    6. @Override
    7. public void onFailure(String s, String s1) {
    8. }
    9. });

    开始设备配网

    调用配网接口需要提供 builderbuilder 中需要路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。

    1. ActivatorBuilder builder = new ActivatorBuilder()
    2. .setSsid(ssid)
    3. .setContext(context)
    4. .setPassword(password)
    5. .setActivatorModel(ActivatorModelEnum.TY_EZ)
    6. .setTimeOut(timeout)
    7. .setToken(token)
    8. .setListener(new ITuyaSmartActivatorListener() {
    9. @Override
    10. public void onError(String errorCode, String errorMsg) {
    11. }
    12. @Override
    13. public void onActiveSuccess(DeviceBean devResp) {
    14. //多个设备同时配网,将多次回调
    15. }
    16. @Override
    17. public void onStep(String step, Object data) {
    18. }
    19. }
    20. ));
    1. ITuyaActivator mTuyaActivator = TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder);
    2. //开始配网
    3. mTuyaActivator.start();

    使用 AP模式 配网时,需要将 activatorModel 传入为 ActivatorModelEnum.TY_AP 以监听配网结果的回调。

    1. ActivatorBuilder builder = new ActivatorBuilder()
    2. .setContext(context)
    3. .setSsid(ssid)
    4. .setPassword(password)
    5. .setActivatorModel(ActivatorModelEnum.TY_AP)
    6. .setTimeOut(timeout)
    7. .setToken(token)
    8. .setListener(new ITuyaSmartActivatorListener() {
    9. @Override
    10. public void onError(String errorCode, String errorMsg) {
    11. }
    12. @Override
    13. public void onActiveSuccess(DeviceBean devResp) {
    14. }
    15. @Override
    16. public void onStep(String step, Object data) {
    17. }
    18. }
    19. ));

    (可选)停止配网

    开始配网操作后,App 会持续广播配网信息,直到配网成功或是超时才停止。如果需要中途取消操作或配网完成,需要调用停止配网接口。

    1. ITuyaActivator mTuyaActivator = TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder);
    2. //停止配网
    3. mTuyaActivator.stop();
    4. //退出页面销毁一些缓存和监听
    5. mTuyaActivator.onDestroy();

    第四步:控制设备

    本章节主要操作对象包含 ITuyaDevice 和 DeviceBean

    对象说明参考链接
    DeviceBean
    • 与 ITuyaHomeManager 和 HomeBean 类似,DeviceBean 存放了设备的基本信息,如 ID、名字、图标等。
    • DeviceBean 类的 dps 属性定义了当前设备的状态,称作数据点(DP,Data Point)或功能点。每个 DP 都存储了了一个设备的功能信息。如开关(布尔值),灯泡的亮度(数值型)等。对于设备的控制都通过获取和修改 DP 值实现。参考。
    设备功能点
    ITuyaDevice存放了设备相关的所有功能,如功能控制,设备固件管理等。您需要用正确的 deviceId 初始化一个 ITuyaDevice设备管理

    查询设备列表

    设备成功配网后,可以在对应的家庭下调用获取家庭详细信息接口,在 HomeBean 的 getDeviceList 中查看对应的设备列表。

    1. TuyaHomeSdk.newHomeInstance(10000).getHomeDetail(new ITuyaHomeResultCallback() {
    2. @Override
    3. public void onSuccess(HomeBean bean) {
    4. List<DeviceBean> deviceList = homeBean.getDeviceList();
    5. //下文中的deviceBean就是从这里获取
    6. }
    7. @Override
    8. public void onError(String errorCode, String errorMsg) {
    9. // do something
    10. }
    11. });

    查看设备信息

    设备的功能点信息存放在 dps 中。dps 存放了该设备的所有功能点信息,每个功能点被封装成一个键值对。

    1. List<DeviceBean> deviceList = homeBean.getDeviceList();
    2. Map<String, Object> dps = TuyaHomeSdk.getDataInstance().getDps(deviceBean.getDevId());

    控制设备

    控制设备需要初始化设备控制接口。接口向设备发送功能点,改变设备状态或功能,来达到设备控制的目的。

    同样以灯泡为例,假设开启一个灯具采用 101 设备功能点,则开灯的代码如下:

    1. mDevice.publishDps("{\"101\": true}", new IResultCallback() {
    2. @Override
    3. public void onError(String code, String error) {
    4. Toast.makeText(mContext, "开灯失败", Toast.LENGTH_SHORT).show();
    5. }
    6. @Override
    7. public void onSuccess() {
    8. Toast.makeText(mContext, "开灯成功", Toast.LENGTH_SHORT).show();
    9. }
    10. });

    如果需要监听设备状态的改变,如在线状态、移除通知、功能点状态改变等,需要注册 IDevListener 进行监听。

    1. mDevice.registerDevListener(new IDevListener() {
    2. /**
    3. * DP 数据更新
    4. * devId 设备 ID
    5. * dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true}
    6. */
    7. @Override
    8. public void onDpUpdate(String devId, String dpStr){
    9. };
    10. /**
    11. * 设备移除回调
    12. * devId 设备 ID
    13. */
    14. @Override
    15. public void onRemoved(String devId){
    16. };
    17. /**
    18. * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。
    19. * devId 设备 ID
    20. * online 是否在线,在线为 true
    21. */
    22. @Override
    23. public void onStatusChanged(String devId, boolean online){
    24. };
    25. /**
    26. * 网络状态发生变动时的回调
    27. * devId 设备 ID
    28. * status 网络状态是否可用,可用为 true
    29. */
    30. @Override
    31. public void onNetworkStatusChanged(String devId, boolean status){
    32. };
    33. /**
    34. * 设备信息更新回调
    35. * devId 设备 ID
    36. */
    37. @Override
    38. public void onDevInfoUpdate(String devId){
    39. };
    40. }

    (可选)移除设备

    调用 移除设备接口 将当前设备从对应家庭下移除。

    1. mDevice.removeDevice(new IResultCallback() {
    2. @Override
    3. public void onError(String errorCode, String errorMsg) {
    4. }
    5. @Override
    6. public void onSuccess() {
    7. }
    8. });

    (推荐)集成设备面板

    为了减少开发成本,涂鸦针对特定设备提供了一系列的设备控制面板。大家可以参考全品类控制面板 和 空调品类控制面板。

    实践结果

    好了,教程就到这里,相信大家已经可以创建一个自己的 App 了!感兴趣的快去试试吧 👉 涂鸦 IoT 开发平台

  • 相关阅读:
    Android笔记: 设置PopupMenu宽度
    FX3U PLC斜坡输出函数在液压比例流量阀上的应用
    【Django中运行scrapy框架,并将数据存入数据库】
    14、DQL(条件查询:where)
    C语言函数指针类型声明
    Eyeshot 2023.3 Released 建议更新Crack
    分析概览 文章管理 草稿管理 图片管理 站点管理 主站 关于 登出 手写操作系统项目----进程
    【uiautomation】获取微信好友名单,可指定标签 & 全部
    X86-64 汇编学习1
    MATLAB | 世界杯来用MATLAB画个足球玩叭~
  • 原文地址:https://blog.csdn.net/Ms_Smart/article/details/127426536