更新时间:2023-06-21 05:33:28下载pdf
涂鸦cube App SDK 安卓版提供了即全面又灵活的 IoT App 开发模式。您可以通过本教程在两小时内快速开发一款自己的 IoT App,并实现如下功能:
您可以点击下方按钮下载 Sample 查看本教程中的示例代码。本次教程按功能模块进行分类,您可以快速找到对应的代码参考学习。
前往 App 开发平台 点击查看 GitHub Sample
学习完本教程,并且结合一定的面板开发后,您可以创建一个类似以下安卓 App 的 Demo。
在您开始本教程前,请先确保您已经 :
在涂鸦 IoT 平台注册账号并创建 App,获取 SDK 的 AppKey 和 AppSecret。详情请参考 准备工作。
使用 Android Studio 将安卓版cube App SDK 集成到您的项目中。详情请参考 快速集成。
本教程在 macOS 上使用 Android Studio v4.1.2 集成cube App SDK。注意项目 build.gradle 中配置的 minSdkVersion 最低为 21,否则会报错。
本模块中,仅演示使用手机号注册登录。除此以外,涂鸦cube App SDK 还提供了邮箱、第三方、匿名等多种注册登录方式。详情请参考 用户账户系统。
注册用户账号时:
您需要提供 countryCode 参数来区分注册地区,用于就近选择涂鸦 IoT 平台的可用区。如中国大陆为 86,美国为 1。有关可用区相关概念,请参考 涂鸦云平台介绍。
各个可用区的数据是相互独立的,因此在 中国大陆(86) 注册的账号,在 美国(1) 地区无法使用(提示用户不存在)。
您将频繁地调用对象 User。它存储了当前用户的所有信息,通过 ThingHomeSdk.getUserInstance() 获取到 IThingUser,它提供了相关的登录注册方法。详情请参考 User。
为了加强用户信息的数据安全,涂鸦优化验证码和添加了账号限制。只有验证码服务可用的地区,才可以发送验证码。您需要先查询您的开发者账号是否已经在从涂鸦 IoT 平台开通验证码服务的可用地区列表。
ThingHomeSdk.getUserInstance().getWhiteListWhoCanSendMobileCodeSuccess(new IWhiteListCallback() {
@Override
public void onSuccess(WhiteList whiteList) {
Toast.makeText(mContext, "Whitelist Success:" + whiteList.getCountryCodes(), Toast.LENGTH_SHORT).show();
}
@Override
public void onError(String code, String error) {
Toast.makeText(mContext, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show();
}
});
返回值 whiteList 表示一个或多个国家或地区,以 , 隔开取值,例如 86 和 01。有关可用区编号列表,请参考 涂鸦云平台介绍。
目前中国大陆默认已开通验证码服务。若您希望自己的应用发布在其他国家或地区,则必须验证开通地区,并联系您的涂鸦客户经理或 提交工单 开通该服务。
与大部分注册流程类似,用户必须先获取验证码。无论是手机或是邮箱,您都可以使用统一的获取验证码接口在注册及后续密码修改,验证码登录,信息完善等操作中获取相应的验证码。
ThingHomeSdk.getUserInstance().sendVerifyCodeWithUserName(String userName, String region, String countryCode, int type, IResultCallback callback);
参数说明
| 参数 | 说明 |
|---|---|
| userName | 手机号码/邮箱账号 |
| region | 区域,默认填写:“” 即可 |
| countryCode | 手机区号:如 “86” |
| callback | 回调 |
| type | 发送验证码类型: 1:注册 2:登录 3:重置密码 |
请确保所传参数 type 为1,否则将无法正常注册。
ThingHomeSdk.getUserInstance().sendVerifyCodeWithUserName("xxx6/7825***66@123.com", "", "86", 1/2/3, new IResultCallback() {
@Override
public void onError(String code, String error) {
Toast.makeText(mContext, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show();
}
@Override
public void onSuccess() {
Toast.makeText(mContext, "Get code success:", Toast.LENGTH_SHORT).show();
}
});
使用手机号码注册账号前,您需要调用获取验证码接口,传入相应 type。然后调用号码注册接口,需要上传国家码、手机号码、密码以及获取到的验证码。更多详情,请参考 使用手机账号注册和登录安卓用户账号。
ThingHomeSdk.getUserInstance().registerAccountWithPhone("86","13666666666","123456","124332", new IRegisterCallback() {
@Override
public void onSuccess(User user) {
Toast.makeText(mContext, "Register success", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(String code, String error) {
Toast.makeText(mContext, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show();
}
});
在注册成功后,您就可以使用国家码、手机号和密码登录账号。
ThingHomeSdk.getUserInstance().loginWithPhonePassword("86", "13666666666", "123456", new ILoginCallback() {
@Override
public void onSuccess(User user) {
Toast.makeText(mContext, "Login success:" +ThingHomeSdk.getUserInstance().getUser().getUsername(), Toast.LENGTH_SHORT).show();
}
@Override
public void onError(String code, String error) {
Toast.makeText(mContext, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show();
}
});
家庭是cube App SDK 开发下实际场景的最大单位。IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。您可以在用户账号下创建任意多个家庭。在指定家庭下,您还可以添加并管理多个房间和用户成员。
操作家庭模块时,您将频繁调用对象 IThingHomeManager 和 HomeBean。
| 对象 | 说明 |
|---|---|
| HomeBean | 存放了家庭的基本信息,如 ID、名字、位置等。 |
| ThingSmartHome | 存放了家庭相关的所有功能,如单个家庭信息管理,家庭下的家庭成员管理,房间管理等。IThingHomeManager 需要使用正确的 homeId 用 ThingHomeSdk.getHomeManagerInstance() 进行初始化。 |
在登录状态下您可以创建家庭。之后对于房间,成员,设备等对象的管理都基于家庭下。创建家庭需要通过 IThingHomeManager 调用 创建家庭 接口。
ThingHomeSdk.getHomeManagerInstance().createHome(name, lon, lat, geoName, rooms, new IThingHomeResultCallback() {
@Override
public void onSuccess(HomeBean bean) {
// do something
}
@Override
public void onError(String errorCode, String errorMsg) {
// do something
}
});
在登录状态下您可以直接获取家庭列表。如果您还没创建过家庭,将返回 空数组。
ThingHomeSdk.getHomeManagerInstance().queryHomeList(new IThingGetHomeListCallback() {
@Override
public void onSuccess(List<HomeBean> homeBeans) {
// do something
}
@Override
public void onError(String errorCode, String error) {
// do something
}
});
在获取家庭列表或通过 HomeId 初始化得到的 IThingHomeManager 的 HomeBean 中 roomList、deviceList、groupList、sharedDeviceList、sharedGroupList 等属性均为空。您需要调用 家庭的详细信息 接口获取上述属性的具体内容。
ThingHomeSdk.newHomeInstance(10000).getHomeDetail(new IThingHomeResultCallback() {
@Override
public void onSuccess(HomeBean bean) {
// do something
}
@Override
public void onError(String errorCode, String errorMsg) {
// do something
}
});
在创建了家庭后,后续房间成员、用户配网等相关操作均需要基于某一特定家庭。因此建议您将这一特定家庭作为 App 的全局变量存储。当然,您也可以在本地随时切换当前家庭,涂鸦 IoT 平台并不会记录这一信息。在本教程和配套的 Sample 中,默认将列表的第一个家庭设为当前家庭。
简单来说,配网就是将设备连接并注册到云端,使其拥有与云端远程通信的能力。涂鸦cube App SDK 提供了丰富的配网方式以支持大部分智能设备。如 Wi-Fi 连接,蓝牙连接等。详情请参考 设备配网 和 蓝牙体系。
本模块以 Wi-Fi 配网为例介绍如何使用 SDK 将设备配置到云端。Wi-Fi 配网方式包括 快连模式(EZ)、热点模式(AP)、扫 App 二维码三种方式。
相比 EZ 模式,AP 模式成功率高、可靠性好,对手机和路由器有兼容性要求小。配网成功率高于 EZ 模式。因此,在之后的版本中,我们推荐使用 AP 模式 代替 EZ 模式。
开始配网之前,SDK 需要在联网状态下从涂鸦云获取配网 Token,然后才可以开始热点模式配网。Token 的有效期为 10 分钟,且配置成功后就会失效,再次配网需要重新获取。获取 Token 需要上传当前的 homeId,因此您需要确保账号处于登录状态并至少创建了一个家庭。
ThingHomeSdk.getActivatorInstance().getActivatorToken(homeId,
new IThingActivatorGetToken() {
@Override
public void onSuccess(String token) {
}
@Override
public void onFailure(String s, String s1) {
}
});
调用 配网接口 需要提供 builder,builder 中需要路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。
ActivatorBuilder builder = new ActivatorBuilder()
.setSsid(ssid)
.setContext(context)
.setPassword(password)
.setActivatorModel(ActivatorModelEnum.TY_EZ)
.setTimeOut(timeout)
.setToken(token)
.setListener(new ITuyaSmartActivatorListener() {
@Override
public void onError(String errorCode, String errorMsg) {
}
@Override
public void onActiveSuccess(DeviceBean devResp) {
//多个设备同时配网,将多次回调
}
@Override
public void onStep(String step, Object data) {
}
}
));
IThingActivator mTuyaActivator = ThingHomeSdk.getActivatorInstance().newMultiActivator(builder);
//开始配网
mThingActivator.start();
timeout 单位为秒,默认为 100,您可以设置为任意值。但不建议将此值设置得过小,否则将影响配网结果。
使用 AP 模式 配网时,您需要将 activatorModel 传入为 ActivatorModelEnum.TY_AP 以监听配网结果的回调。
ActivatorBuilder builder = new ActivatorBuilder()
.setContext(context)
.setSsid(ssid)
.setPassword(password)
.setActivatorModel(ActivatorModelEnum.TY_AP)
.setTimeOut(timeout)
.setToken(token)
.setListener(new IThingSmartActivatorListener() {
@Override
public void onError(String errorCode, String errorMsg) {
}
@Override
public void onActiveSuccess(DeviceBean devResp) {
}
@Override
public void onStep(String step, Object data) {
}
}
));
开始配网操作后,App 会持续广播配网信息,直到配网成功或是超时才停止。如果需要中途取消操作或配网完成,需要调用停止配网接口。
IThingActivator mThingActivator = ThingHomeSdk.getActivatorInstance().newMultiActivator(builder);
//停止配网
mThingActivator.stop();
//退出页面销毁一些缓存和监听
mThingActivator.onDestroy();
本章节主要操作对象包含 IThingDevice 和 DeviceBean。
| 对象 | 说明 | 参考链接 |
|---|---|---|
| DeviceBean |
|
设备功能点 |
| IThingDevice | 存放了设备相关的所有功能,如功能控制,设备固件管理等。您需要用正确的 deviceId 初始化一个 ITuyaDevice。 |
设备管理 |
设备成功配网后,您可以在对应的家庭下调用 获取家庭详细信息 接口,在 HomeBean 的 getDeviceList 中查看对应的设备列表。
ThingHomeSdk.newHomeInstance(10000).getHomeDetail(new IThingHomeResultCallback() {
@Override
public void onSuccess(HomeBean bean) {
List<DeviceBean> deviceList = homeBean.getDeviceList();
//下文中的deviceBean就是从这里获取
}
@Override
public void onError(String errorCode, String errorMsg) {
// do something
}
});
设备的功能点信息存放在 dps 中。dps 存放了该设备的所有功能点信息,每个功能点被封装成一个键值对。
List<DeviceBean> deviceList = homeBean.getDeviceList();
Map<String, Object> dps = ThingHomeSdk.getDataInstance().getDps(deviceBean.getDevId());
控制设备需要 初始化设备控制 接口。接口向设备发送功能点,改变设备状态或功能,来达到设备控制的目的。
参数 dps 中可以包含多个功能点,您可以一次同时改变设备的多个状态。
同样以灯泡为例,假设开启一个灯具采用 101 设备功能点,则开灯的代码如下:
mDevice.publishDps("{\"101\": true}", new IResultCallback() {
@Override
public void onError(String code, String error) {
Toast.makeText(mContext, "开灯失败", Toast.LENGTH_SHORT).show();
}
@Override
public void onSuccess() {
Toast.makeText(mContext, "开灯成功", Toast.LENGTH_SHORT).show();
}
});
如果您需要监听设备状态的改变,如在线状态、移除通知、功能点状态改变等,需要注册 IDevListener 进行 监听。
mDevice.registerDevListener(new IDevListener() {
/**
* DP 数据更新
* devId 设备 ID
* dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true}
*/
@Override
public void onDpUpdate(String devId, String dpStr){
};
/**
* 设备移除回调
* devId 设备 ID
*/
@Override
public void onRemoved(String devId){
};
/**
* 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。
* devId 设备 ID
* online 是否在线,在线为 true
*/
@Override
public void onStatusChanged(String devId, boolean online){
};
/**
* 网络状态发生变动时的回调
* devId 设备 ID
* status 网络状态是否可用,可用为 true
*/
@Override
public void onNetworkStatusChanged(String devId, boolean status){
};
/**
* 设备信息更新回调
* devId 设备 ID
*/
@Override
public void onDevInfoUpdate(String devId){
};
}
调用 移除设备 接口将当前设备从对应家庭下移除。
mDevice.removeDevice(new IResultCallback() {
@Override
public void onError(String errorCode, String errorMsg) {
}
@Override
public void onSuccess() {
}
});
看到这里,相信您已经创建了一个自己的 App。然而,真正有趣精彩的部分才刚刚开始。我们会在之后推出更多关于智能场景、定时任务、多控关联等功能的介绍。
为了降低您的开发成本,涂鸦将 SDK 中按模块进行了功能抽离和 UI 封装,为您提供了一整套一键接入的 UI 业务包。您可以根据需要自由选择需要的业务模块。
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈