DIY一款能隨周圍環境變化的智能燈泡,求婚必備!

參加了這次塗鴉實戰訓練營(基於App SDK玩轉IoT App開發),主要目標是基於塗鴉的SDK開發一個基於IoT的控住智能燈的App。SDK支持iOS和Android開發,我參加這次的實戰營主要目的是爲了學習物聯網的相關開發,本身瞭解一些Android的開發(並不善於Android UI的開發),因此個人App採用Android SDK開發,UI的也是比較簡陋,主要以驗證功能爲主。html

這次實戰營須要一些Android或iOS的開發基礎,新建一個Android的工程,並添加塗鴉的SDK參考Demo便可,下面主要討論塗鴉的API使用。android

Demo以下:ios

基於塗鴉 App SDK 開發一款 Android App 並控制智能燈git

基於塗鴉 App SDK 快速地開發一款 iOS IoT Appgithub

如下內容爲塗鴉開發者「@徐陽創做,經其受權編輯發佈:算法


功能主要分爲如下幾部分,帳戶管理,家庭管理,設備配網和設備控制。api

帳戶管理

帳戶管理分爲兩個部分,用戶註冊和用戶登陸app

用戶登陸

 

在界面上獲取用戶名和密碼,而後贊登陸按鈕的回調函數中調用塗鴉的api,而且利用Toast輸出結果。ide

1.  TuyaHomeSdk.getUserInstance().loginWithPhonePassword("86", uerName, password, new ILoginCallback() {
    
2.      @Override
    
3.      public void onSuccess(User user) {
    
4.          Toast.makeText(MainActivity.this, "登陸成功" , Toast.LENGTH_SHORT).show();
    
5.          //Toast.makeText(MainActivity.this, "登陸成功,用戶名:" +TuyaHomeSdk.getUserInstance().getUser().getUsername(), Toast.LENGTH_SHORT).show();
    

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

10.      }
    

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

用戶註冊

用戶註冊其實分爲兩個部分,一個是獲取驗證碼,一個是根據驗證碼註冊帳戶函數

  • 獲取驗證碼的過程,在獲取按鈕的回調函數中調用塗鴉API
1.  TuyaHomeSdk.getUserInstance().getValidateCode("86",uerName, new IValidateCallback(){
    

3.      @Override
    

5.      public void onSuccess() {
    

7.          Toast.makeText(MainRegisterActivity.this, "獲取驗證碼成功", Toast.LENGTH_SHORT).show();
    

9.      }
    

13.      @Override
    

15.      public void onError(String code, String error) {
    

17.          Toast.makeText(MainRegisterActivity.this, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show();
    

19.      }
    

21.  });
  • 得到驗證碼後調用塗鴉api,進行帳戶的註冊
1.  TuyaHomeSdk.getUserInstance().registerAccountWithPhone("86",uerName,password,validatecode, new IRegisterCallback() {
    

3.      @Override
    

5.      public void onSuccess(User user) {
    

7.          Toast.makeText(MainRegisterActivity.this, "註冊成功", Toast.LENGTH_SHORT).show();
    

9.      }
    

11.      @Override
    

13.      public void onError(String code, String error) {
    

15.          Toast.makeText(MainRegisterActivity.this, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show();
    

17.      }
    

19.  });

家庭管理

家庭管理包含新建家庭,刪除家庭等。其中還包括新建room,將設備添加到room中,個人App中並無實現room的功能,有興趣可本身參考api實現。

  • 設備的配網,設備控制都須要家庭id,因此新建家庭是必須的。

    

枚舉家庭

1.  TuyaHomeSdk.getHomeManagerInstance().queryHomeList(new ITuyaGetHomeListCallback() {
    

3.      @Override
    

5.      public void onSuccess(List<HomeBean> homeBeans) {
    

7.          // do something
    

9.          //text_view.sette
    

11.          String stMsg = "ListHome Success,homesize="+homeBeans.size()+"n";
    

15.          for(int i=0;i<homeBeans.size();i++)
    

17.          {
    

19.              stMsg += "Home Id:" + homeBeans.get(i).getHomeId() + "n";
    

21.          }
    

25.          text_view.setText(stMsg);
    

29.          mHomeBeans = homeBeans;
    

33.      }
    

35.      @Override
    

37.      public void onError(String errorCode, String error) {
    

39.          // do something
    

41.          text_view.setText("ListHome Failedn");
    

43.      }
    

45.  });

新建家庭

1.  List<String> rooms = new ArrayList();
    

3.  rooms.add("myhome1");
    

5.  TuyaHomeSdk.getHomeManagerInstance().createHome("myhome", 0, 0, "sh", rooms, new ITuyaHomeResultCallback() {
    

7.      @Override
    

9.      public void onSuccess(HomeBean bean) {
    

11.          // do something
    

13.          text_view.setText("NewHome Successn");
    

15.      }
    

17.      @Override
    

19.      public void onError(String errorCode, String errorMsg) {
    

21.          // do something
    

23.          text_view.setText("NewHome Failed"+"n");
    

25.      }
    

27.  });

刪除家庭

1.  if(mHomeBeans == null)
    

3.  {
    

5.      text_view.setText("No Homen");
    

7.      return;
    

9.  }
    

11.  for(int i=0;i<mHomeBeans.size();i++) {
    

13.      TuyaHomeSdk.newHomeInstance(mHomeBeans.get(i).getHomeId()).dismissHome(new IResultCallback() {
    

15.          @Override
    

17.          public void onSuccess() {
    

19.              // do something
    

21.              text_view.setText("DeleteHome Successn");
    

23.          }
    

27.          @Override
    

29.          public void onError(String code, String error) {
    

31.              // do something
    

33.              text_view.setText("DeleteHome Failed" + error + "n");
    

35.          }
    

37.      });
    

39.  }

設備配網

在配網按鈕的回調中獲取控件上的ssid,passwd的住,而後調用塗鴉配網API。

設備配網API須要homeid 因此必須完成家庭的管理,才能夠進行設備的配網。

設備配網API調用成功後,利用得到控件上的ssid,passwd,開始廣播配網。

1.   TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId, new ITuyaActivatorGetToken() {
    

3.      @Override
    
4.      public void onSuccess(String token) {
    

6.          ActivatorBuilder builder = new ActivatorBuilder()
    
7.              .setSsid(ssidName)
    
8.              .setContext(EZActivity.this)
    
9.              .setPassword(password)
    
10.              .setActivatorModel(ActivatorModelEnum.TY_EZ)
    
11.              .setToken(token)
    
12.              .setListener(new ITuyaSmartActivatorListener() {
    

14.                  @Override
    
15.                  public void onError(String errorCode, String errorMsg) {
    
16.                   Toast.makeText(EZActivity.this, "配網失敗", Toast.LENGTH_SHORT).show();
    
17.                  }
    

19.                  @Override
    
20.                  public void onActiveSuccess(DeviceBean devResp) {
    
21.                   //多個設備同時配網,將屢次回調
    

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

25.                   /*TuyaHomeSdk.newRoomInstance(roomId).addDevice(devResp.devId, new IResultCallback() {
    
26.                       @Override
    
27.                       public void onSuccess() {
    
28.                           // do something
    
29.                           Toast.makeText(EZActivity.this, "addDevice成功", Toast.LENGTH_SHORT).show();
    
30.                       }
    
31.                       @Override
    
32.                       public void onError(String code, String error) {
    
33.                           // do something
    
34.                           Toast.makeText(EZActivity.this, "addDevice失敗", Toast.LENGTH_SHORT).show();
    
35.                       }
    
36.                   });*/
    

38.                   finish();
    

41.                  }
    

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

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

48.                   finish();
    
49.                  }
    
50.               });
    

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

55.      }
    

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

60.      }
    
61.  });

設備控制

     

UI作的比較簡陋,實現開關燈,和5路燈的控制

控制燈須要調用getHomeDetail 獲得設備的handle,在菜單頁面的設備控制的回調函數中,先得到設備,而後啓動當前的頁面:

1.  TuyaHomeSdk.newHomeInstance(mHomeBeans.get(0).getHomeId()).getHomeDetail(new ITuyaHomeResultCallback() {
    

3.      @Override
    

5.      public void onSuccess(HomeBean bean) {
    

7.          // do something
    

9.          List<DeviceBean> dev = bean.getDeviceList();
    

11.          if(dev.size()>0)
    

13.          {
    

15.              Intent intent = new Intent(MenuActivity.this,DeviceActivity.class);
    

17.              intent.putExtra("devid",dev.get(0).getDevId());  // 傳遞參數,根據須要填寫
    

19.              startActivity(intent);
    

21.          }
    

23.          else
    

25.          {
    

27.              text_view.setText("No Fevicen");
    

29.          }
    

35.      }
    

41.      @Override
    

43.      public void onError(String errorCode, String errorMsg) {
    

45.          // do something
    

47.          text_view.setText("Home Errorn");
    

49.      }
    

51.  });

開關燈

1.  dps = "{"1": true}";
    

3.  //dps = "{"102": "00ffff"}";
    

5.  mDevice.publishDps(dps, new IResultCallback() {
    

7.      @Override
    

9.      public void onError(String code, String error) {
    

11.          Toast.makeText(DeviceActivity.this, "開燈失敗", Toast.LENGTH_SHORT).show();
    

13.      }
    

17.      @Override
    

19.      public void onSuccess() {
    

21.          Toast.makeText(DeviceActivity.this, "開燈成功", Toast.LENGTH_SHORT).show();
    

23.      }
    

25.  });
  • 關燈,設爲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路燈關係沒有弄的很明白。

相關文章
相關標籤/搜索