參加了這次塗鴉實戰訓練營(基於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. });
用戶註冊其實分爲兩個部分,一個是獲取驗證碼,一個是根據驗證碼註冊帳戶函數
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. });
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實現。
枚舉家庭
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. });
其餘命令相似。
還實現了圖片顏色和人臉檢測的功能,主要是採用了別人的開源方案
https://github.com/bifan-wei/FaceDetector
得到圖片數據,而後計算圖片的平均值而後設置rgb,檢測到人臉後設置高亮。
想象一下,「月上柳梢頭,人約黃昏後」。你和你的心上人牽手回家,萬籟俱寂,你拿着求婚戒指的手已經全是汗。一開門,家裏的燈泡檢測到人臉,一盞盞開啓,爲你烘托出浪漫的氛圍,最後,單膝下跪,抱得美人歸。
這裏有不少發揮的空間,添加各類檢測算法,檢測不一樣的場景來設置不一樣的燈顏色。
//設置 dpId 爲 101 的布爾型功能點示例 做用:開關打開 dps = {"101": true};參考Demo的代碼,開關的功能點爲1。其餘功能相似。還有燈的模式和5路燈關係沒有弄的很明白。