前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DIY一款能够检测女友心情的智能灯泡App

DIY一款能够检测女友心情的智能灯泡App

原创
作者头像
涂小航说智能
修改2021-06-01 14:31:16
4580
修改2021-06-01 14:31:16
举报
文章被收录于专栏:用户8653471的专栏

参加了此次涂鸦实战训练营(基于App SDK玩转IoT App开发),主要目标是基于涂鸦的SDK开发一个基于IoT的控住智能灯的App。SDK支持iOS和Android开发,我参加此次的实战营主要目的是为了学习物联网的相关开发,自己了解一些Android的开发(并不善于Android UI的开发),所以我的App采用Android SDK开发,UI的也是比较简陋,主要以验证功能为主。

此次实战营需要一些Android或iOS的开发基础,新建一个Android的工程,并添加涂鸦的SDK参考Demo即可,下面主要讨论涂鸦的API使用。

Demo如下:

基于涂鸦 App SDK 开发一款 Android App 并控制智能灯

基于涂鸦 App SDK 快速地开发一款 iOS IoT App

以下内容为涂鸦开发者“@徐阳”创作,经其授权编辑发布:


功能主要分为以下几部分,账户管理,家庭管理,设备配网和设备控制。

账户管理

账户管理分为两个部分,用户注册和用户登录

用户登录

在界面上获取用户名和密码,然后赞登录按钮的回调函数中调用涂鸦的api,并且利用Toast输出结果。

代码语言:javascript
复制
TuyaHomeSdk.getUserInstance().loginWithPhonePassword("86", uerName, password, new ILoginCallback() {
    @Override
    public void onSuccess(User user) {
        Toast.makeText(MainActivity.this, "登录成功" , Toast.LENGTH_SHORT).show();
        //Toast.makeText(MainActivity.this, "登录成功,用户名:" +TuyaHomeSdk.getUserInstance().getUser().getUsername(), Toast.LENGTH_SHORT).show();

        Intent intent = new Intent(MainActivity.this,MenuActivity.class);
        startActivity(intent);

    }

    @Override
    public void onError(String code, String error) {
        Toast.makeText(MainActivity.this, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show();
    }
});

用户注册

用户注册其实分为两个部分,一个是获取验证码,一个是根据验证码注册账户

  • 获取验证码的过程,在获取按钮的回调函数中调用涂鸦API
代码语言:javascript
复制
TuyaHomeSdk.getUserInstance().getValidateCode("86",uerName, new IValidateCallback(){
    @Override
    public void onSuccess() {
        Toast.makeText(MainRegisterActivity.this, "获取验证码成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onError(String code, String error) {
        Toast.makeText(MainRegisterActivity.this, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show();
    }
});
  • 获得验证码后调用涂鸦api,进行账户的注册
代码语言:javascript
复制
TuyaHomeSdk.getUserInstance().registerAccountWithPhone("86",uerName,password,validatecode, new IRegisterCallback() {
    @Override
    public void onSuccess(User user) {
        Toast.makeText(MainRegisterActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onError(String code, String error) {
        Toast.makeText(MainRegisterActivity.this, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show();
    }
});

家庭管理

家庭管理包含新建家庭,删除家庭等。其中还包括新建room,将设备添加到room中,我的App中并没有实现room的功能,有兴趣可自己参考api实现。

  • 设备的配网,设备控制都需要家庭id,所以新建家庭是必须的。

枚举家庭

代码语言:javascript
复制
TuyaHomeSdk.getHomeManagerInstance().queryHomeList(new ITuyaGetHomeListCallback() {
    @Override
    public void onSuccess(List<HomeBean> homeBeans) {
        // do something
        //text_view.sette
        String stMsg = "ListHome Success,homesize="+homeBeans.size()+"\n";

        for(int i=0;i<homeBeans.size();i++)
        {
            stMsg += "Home Id:" + homeBeans.get(i).getHomeId() + "\n";
        }

        text_view.setText(stMsg);

        mHomeBeans = homeBeans;

    }
    @Override
    public void onError(String errorCode, String error) {
        // do something
        text_view.setText("ListHome Failed\n");
    }
});

新建家庭

代码语言:javascript
复制
List<String> rooms = new ArrayList();
rooms.add("myhome1");
TuyaHomeSdk.getHomeManagerInstance().createHome("myhome", 0, 0, "sh", rooms, new ITuyaHomeResultCallback() {
    @Override
    public void onSuccess(HomeBean bean) {
        // do something
        text_view.setText("NewHome Success\n");
    }
    @Override
    public void onError(String errorCode, String errorMsg) {
        // do something
        text_view.setText("NewHome Failed"+"\n");
    }
});

删除家庭

代码语言:javascript
复制
if(mHomeBeans == null)
{
    text_view.setText("No Home\n");
    return;
}
for(int i=0;i<mHomeBeans.size();i++) {
    TuyaHomeSdk.newHomeInstance(mHomeBeans.get(i).getHomeId()).dismissHome(new IResultCallback() {
        @Override
        public void onSuccess() {
            // do something
            text_view.setText("DeleteHome Success\n");
        }

        @Override
        public void onError(String code, String error) {
            // do something
            text_view.setText("DeleteHome Failed" + error + "\n");
        }
    });
}

设备配网

在配网按钮的回调中获取控件上的ssid,passwd的住,然后调用涂鸦配网API。

设备配网API需要homeid 所以必须完成家庭的管理,才可以进行设备的配网。

设备配网API调用成功后,利用获得控件上的ssid,passwd,开始广播配网。

代码语言:javascript
复制
TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId, new ITuyaActivatorGetToken() {

    @Override
    public void onSuccess(String token) {

        ActivatorBuilder builder = new ActivatorBuilder()
            .setSsid(ssidName)
            .setContext(EZActivity.this)
            .setPassword(password)
            .setActivatorModel(ActivatorModelEnum.TY_EZ)
            .setToken(token)
            .setListener(new ITuyaSmartActivatorListener() {

                @Override
                public void onError(String errorCode, String errorMsg) {
                 Toast.makeText(EZActivity.this, "配网失败", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onActiveSuccess(DeviceBean devResp) {
                 //多个设备同时配网,将多次回调

                 Toast.makeText(EZActivity.this, "配网成功", Toast.LENGTH_SHORT).show();

                 /*TuyaHomeSdk.newRoomInstance(roomId).addDevice(devResp.devId, new IResultCallback() {
                     @Override
                     public void onSuccess() {
                         // do something
                         Toast.makeText(EZActivity.this, "addDevice成功", Toast.LENGTH_SHORT).show();
                     }
                     @Override
                     public void onError(String code, String error) {
                         // do something
                         Toast.makeText(EZActivity.this, "addDevice失败", Toast.LENGTH_SHORT).show();
                     }
                 });*/

                 finish();


                }

                @Override
                public void onStep(String step, Object data) {

                 Toast.makeText(EZActivity.this, "配网Step:" + step, Toast.LENGTH_SHORT).show();

                 finish();
                }
             });

        ITuyaActivator mTuyaActivator = TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder);
        mTuyaActivator.start();

    }

    @Override
    public void onFailure(String s, String s1) {

    }
});

设备控制

UI做的比较简陋,实现开关灯,和5路灯的控制

控制灯需要调用getHomeDetail 得到设备的handle,在菜单页面的设备控制的回调函数中,先获得设备,然后启动当前的页面:

代码语言:javascript
复制
TuyaHomeSdk.newHomeInstance(mHomeBeans.get(0).getHomeId()).getHomeDetail(new ITuyaHomeResultCallback() {
    @Override
    public void onSuccess(HomeBean bean) {
        // do something
        List<DeviceBean> dev = bean.getDeviceList();
        if(dev.size()>0)
        {
            Intent intent = new Intent(MenuActivity.this,DeviceActivity.class);
            intent.putExtra("devid",dev.get(0).getDevId());  // 传递参数,根据需要填写
            startActivity(intent);
        }
        else
        {
            text_view.setText("No Fevice\n");
        }


    }


    @Override
    public void onError(String errorCode, String errorMsg) {
        // do something
        text_view.setText("Home Error\n");
    }
});

开关灯

代码语言:javascript
复制
dps = "{\"1\": true}";
//dps = "{\"102\": \"00ffff\"}";
mDevice.publishDps(dps, new IResultCallback() {
    @Override
    public void onError(String code, String error) {
        Toast.makeText(DeviceActivity.this, "开灯失败", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onSuccess() {
        Toast.makeText(DeviceActivity.this, "开灯成功", Toast.LENGTH_SHORT).show();
    }
});
  • 关灯,设为false

其他命令类似。

图片颜色和人脸识别

还实现了图片颜色和人脸检测的功能,主要是采用了别人的开源方案

https://github.com/bifan-wei/FaceDetector

获得图片数据,然后计算图片的平均值然后设置rgb,检测到人脸后设置高亮。

想象一下,“月上柳梢头,人约黄昏后”。你和你的心上人牵手回家,万籁俱寂,你拿着求婚戒指的手已经全是汗。一开门,家里的灯泡检测到人脸,一盏盏开启,为你烘托出浪漫的氛围,最后,单膝下跪,抱得美人归。

这里有很多发挥的空间,添加各种检测算法,检测不同的场景来设置不同的灯颜色。

总结

1. 涂鸦的API使用很简单,通过账户,家庭,房间对设备的管理定义也很合理,参考涂鸦的API doc就实现了控制设备基本的功能。这次的活动时间较短,其实还是需要开发者具有一定的Android或者iOS的开发技术。由于我自己并非Android开发,只是以前简单的学习过一点点,而且平时时间也有限,所以这次做的UI和实现的功能也是比较简单,主要是以功能验证为主了。 2. 在开发过程中获取家庭的详细信息 getHomeDetail 这个API开始没有调用,导致一直获得不到设备id,特此记录一下 3. 灯的功能点文档介绍不清晰, //设置 dpId 为 101 的布尔型功能点示例 作用:开关打开 dps = {"101": true}; 参考Demo的代码,开关的功能点为1。其他功能类似。 还有灯的模式和5路灯关系没有弄的很明白。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 账户管理
    • 用户登录
      • 用户注册
      • 家庭管理
        • 新建家庭
          • 删除家庭
          • 设备配网
          • 设备控制
          • 图片颜色和人脸识别
          • 总结
          相关产品与服务
          验证码
          腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档