本項(xiàng)目由開發(fā)者發(fā)布在CSDN博客(ID為冷暖自知_源),主要介紹了如何使用機(jī)智云開源框架開發(fā)了一個(gè)智能家居系統(tǒng),具體來(lái)說(shuō)實(shí)現(xiàn)了燈的控制、門禁的控制、溫濕度的讀取、有毒氣體的檢測(cè)、人體紅外檢測(cè)等功能。本項(xiàng)目分成三部分來(lái)敘述。
本文是第一篇。
第一篇:總體介紹和安卓開發(fā)(邏輯控制部分實(shí)現(xiàn))
1.界面演示2.下載機(jī)智云安卓開源框架3.創(chuàng)建項(xiàng)目4.修改App圖標(biāo)、名字等信息5.填寫App ID與App Secret時(shí)APP和機(jī)智云云端綁定6.UI界面編寫7.思路整理及準(zhǔn)備工作8.編寫控制代碼、調(diào)試測(cè)試APP
第二篇:UI界面編寫
第三篇:ESP8266接入機(jī)智云,驗(yàn)證APP的功能
進(jìn)入正文
1.界面演示
進(jìn)入名為小智的的APP直接跳轉(zhuǎn)到設(shè)備界面,處于遠(yuǎn)程控制狀態(tài)
點(diǎn)擊進(jìn)入綜合系統(tǒng),這是大燈的控制面板,左邊是關(guān)閉狀態(tài),右邊是開啟狀態(tài),其中復(fù)位按鈕時(shí)復(fù)位門禁和大燈的
這是門禁開關(guān)的面板,開啟門禁需要輸入密碼,此處設(shè)置為:“open”
點(diǎn)擊綠色按鈕進(jìn)入密碼輸入界面。
指示門禁打開成功,按下紅色按鈕關(guān)閉門禁
溫濕度檢測(cè)
有毒氣體和人體紅外檢測(cè)
2.下載機(jī)智云安卓開源框架
2.1.下載機(jī)智云安卓開源框架:
注意剛開始打開,因?yàn)間radle版本的問(wèn)題會(huì)有一系列的問(wèn)題報(bào)錯(cuò),可以選擇Android studio自動(dòng)下載的方案,或者從網(wǎng)上找解決方案
下載到真機(jī)上,如下
開源框架主要目錄結(jié)構(gòu)說(shuō)明A. Libs: 包括 GizWifiSDK 在內(nèi)的的第三方庫(kù)目錄**assets: 包含 UIConfig.json 配置文件B. GizOpenSource: 組成模塊GizOpenSourceModules:組成模塊GosApplication.java // SDK 在此啟動(dòng)CommonModule // 公共方法類、資源文件讀取類ConfigModule // 設(shè)備配置模塊,包含 AirLink 及 SoftAPUserModule // 用戶模塊,包含 用戶登錄、用戶注冊(cè)、找回密碼DeviceModule // 設(shè)備模塊,包含 設(shè)備列表ControlModule // 控制模塊,包含 控制示例SettingsModule // 設(shè)置模塊,包含 設(shè)置菜單 及其 包含的子菜單項(xiàng)(關(guān)于等)PushModule // 推送模塊,包含 百度和極光的推送SDK 集成封裝ThirdAccountModule // 第三方登錄模塊, 包含 第三方登錄(QQ、微信等)view // 自定義控件utils // 工具類wxapi // 微信集成包zxing // 掃描二維碼
3.創(chuàng)建項(xiàng)目
在機(jī)智云創(chuàng)建一個(gè)賬號(hào),然后進(jìn)入開發(fā)者中心創(chuàng)建一個(gè)項(xiàng)目,如下:
數(shù)據(jù)點(diǎn)如下:
點(diǎn)擊應(yīng)用配置,選擇安卓開發(fā):
4.修改App圖標(biāo)、名字等信息
使用Android studio打開機(jī)智云的安卓開源框架
現(xiàn)在先修改一些簡(jiǎn)單的東西:
4.1.修改軟件圖標(biāo)如下所示的圖片
把這張圖片放進(jìn)工程的APP/res/drawable目錄下,以便待會(huì)應(yīng)用
進(jìn)入
4.2.修改APP名字為:小智
4.3.修改APP默認(rèn)啟動(dòng)進(jìn)入的Activity,直接進(jìn)入設(shè)備控制界面
把上面紅框額備份剪切到GosDeviceControlActivity下面,啟動(dòng)之后直接到這個(gè)Activity
注意還需要在:GosDeviceListActivity的Oncreate設(shè)置一下主題:
默認(rèn)標(biāo)題欄是灰色的,修改自己想要的顏色,把鼠標(biāo)放在AppTheme按住CRTL + 鼠標(biāo)左鍵,跳轉(zhuǎn)到
跳轉(zhuǎn)到這里:
修改后如下
4.4.修改進(jìn)入App默認(rèn)彈出的圖片,此處默認(rèn)為機(jī)智云的,現(xiàn)在我們換成自己的圖片
修改成如下的圖片。
把這個(gè)照片復(fù)制到,如下的目錄下:drawable目錄下
按如下的步驟修改:
修改成我們想要的圖片:
基本信息修改完成后可以下載到真機(jī)下看一下這個(gè)App的變化:
5.填寫App ID與App Secret時(shí)APP和機(jī)智云云端綁定
App ID與App Secret含義與作用
App ID:應(yīng)用標(biāo)識(shí)碼,當(dāng)開發(fā)者需要為一款智能產(chǎn)品開發(fā)應(yīng)用(包括iOS、Android、Web應(yīng)用等)時(shí),在機(jī)智云開發(fā)者中創(chuàng)建應(yīng)用的時(shí)候,后臺(tái)會(huì)自動(dòng)生成一個(gè)AppID,并與此設(shè)備進(jìn)行關(guān)聯(lián)。應(yīng)用開發(fā)時(shí)需要填入此AppID。在APP注冊(cè)的所有用戶綁定在該Appid下。
App Secret:App ID的驗(yàn)證密鑰。
如下圖所示,為APPID在開發(fā)APP過(guò)程中的作用。
步驟:
1.進(jìn)入機(jī)智云開發(fā)者中心,打開開發(fā)的項(xiàng)目,找到如下的信息
2.打開Android sturio的APP-》src-assets下的UIconfig.json文件填寫數(shù)據(jù)如下:
此文件詳細(xì)說(shuō)明:http://docs.gizwits.com/zh-cn/AppDev/Android%E7%AC%AC%E4%B8%89%E6%96%B9%E7%99%BB%E5%BD%95%E4%B8%8E%E6%8D%A2%E8%82%A4.html
備注:在這個(gè)文件同樣可以修改自定義的皮膚:
定義如下:
buttonColor:按鈕顏色
buttonTextColor:按鈕文字顏色
navigationBarColor:導(dǎo)航欄顏色
navigationBarTextColor:導(dǎo)航欄文字顏色
configProgressViewColor:配置中界面 progress view 顏色
先修改膚色為:
則對(duì)應(yīng)的代碼為:
“buttonColor”: “16B599”,“buttonTextColor”: “FFFFFF”,“navigationBarColor”: “16B599”,“navigationBarTextColor”: “FFFFFF”,“configProgressViewColor”: “000000”,
注意:這里的顏色值,字幕需要大寫
6.UI界面編寫
因?yàn)檫@部分內(nèi)容比較多,所以直接放在另一篇博客了:UI界面編寫
界面如下:
7.思路整理及準(zhǔn)備工作
在進(jìn)行控制代碼編寫之前先理清楚一下思路。
7.1. 我們寫的控制代碼如何和ESP8266芯片聯(lián)系起來(lái)?
在第5步的時(shí)候綁定了App和云端,機(jī)智云開源框架的SDK有一個(gè)回調(diào)接口。
SDK回調(diào)接口說(shuō)明:
APP端接收到MCU上報(bào)數(shù)據(jù)的回調(diào)接口:didReceiveData,判斷result為GizWifiErrorCode.GIZ_SDK_SUCCESS,則接收到的數(shù)據(jù)可能為普通數(shù)據(jù)點(diǎn)或者擴(kuò)展數(shù)據(jù)點(diǎn)。
那么我們只需要在工程中調(diào)用這個(gè)回調(diào)接口函數(shù),就可以在機(jī)智云服務(wù)器獲取我們工程相應(yīng)的數(shù)據(jù)點(diǎn)。
同理,機(jī)智云也提供了一個(gè)GizWifiDevice這個(gè)類,讓我們能去控制云端數(shù)據(jù)點(diǎn)的數(shù)據(jù),通過(guò)這個(gè)類的write()方法就可以控制。
如果當(dāng)我們寫好了ESP8266的代碼,并它燒錄進(jìn)開發(fā)版,進(jìn)行聯(lián)網(wǎng)和云端進(jìn)行連接,ESP開發(fā)版就會(huì)根據(jù)云端的數(shù)據(jù)去控制開發(fā)版(當(dāng)然這部分代碼還是得我們自己來(lái)寫,機(jī)智云只是提供了數(shù)據(jù)控制點(diǎn))
7.2.在工程中建立控制數(shù)據(jù)點(diǎn)的名稱
我們控制一個(gè)設(shè)備也是通過(guò)判斷哪一個(gè)數(shù)據(jù)點(diǎn)來(lái)進(jìn)行控制的,因此我們?cè)O(shè)置的數(shù)據(jù)點(diǎn)的名稱需要和工程數(shù)據(jù)點(diǎn)的名稱對(duì)應(yīng):
看一下工程的數(shù)據(jù)點(diǎn)的標(biāo)識(shí)名:
在GosDeviceControlActivity這個(gè)類定義這個(gè)數(shù)據(jù)點(diǎn),如下:
7.3.在工程中建立保存數(shù)據(jù)的變量
既然我們能從云端獲取這些數(shù)據(jù),那我們就需要把這些數(shù)據(jù)保存起來(lái),并存儲(chǔ)在本地變量中 。
7.4.建立一個(gè)ConcurrentHashMap的全局變量
用于存儲(chǔ)下發(fā)的指令:
例子:
比如需要使Red_OnOff 這個(gè)數(shù)據(jù)點(diǎn)變成1,那么只需要做如下操作:
map=new ConcurrentHashMap《》();map.put(RED_OnOff,true);//調(diào)用device的write方法device.write(map,0);
需要使Red_OnOff 這個(gè)數(shù)據(jù)點(diǎn)變成0,那么只需要做如下操作:
map=new ConcurrentHashMap《》();map.put(RED_OnOff,false);//調(diào)用device的write方法device.write(map,0);
7.5.聲明layout文件中控件的的變量
//聲明兩個(gè)按鈕變量,分別是復(fù)位和檢測(cè)復(fù)位private Button btn_Reset;private Button btn_reset_det;
//聲明TextView主要是顯示一些狀態(tài)private TextView tv_RED; //顯示大廳燈狀態(tài)的變量private TextView tv_GREEN; //顯示食廳燈狀態(tài)的變量private TextView tv_BLUE; //顯示臥室燈狀態(tài)的變量private TextView tv_indicate;//顯示門禁狀態(tài)的變量private TextView tv_racall; //溫度顯示private TextView tv_hum; //濕度顯示private TextView tv_body; //人體紅外檢測(cè)private TextView tv_gas; //有毒氣體檢測(cè)private TextView tv_dettimes; //人體紅外感應(yīng)次數(shù)
private CheckBox cb_01; //大廳燈開關(guān)的CheckBOxprivate CheckBox cb_02; //食廳燈開關(guān)的CheckBOxprivate CheckBox cb_03; //臥室燈開關(guān)的CheckBOx
private ImageButton iv_door_open; //門禁開的IamgeButtonprivate ImageButton iv_door_close;//門禁關(guān)的IamgeButton//記錄人體紅外檢測(cè)的次數(shù)private static int detcton_times=0;
7.6.在initView方法中獲取所有控件對(duì)象
8.編寫控制代碼
那就順著UI界面從上到下編寫吧。
8.1.編寫復(fù)位按鈕的代碼:
打開GosDeviceControlActivity.java這個(gè)類,在initView中為btn_Reset對(duì)應(yīng)的按鈕綁定監(jiān)聽器
8.2編寫紅外檢測(cè)復(fù)位按鈕的點(diǎn)擊事件
8.3.編寫大燈面板的點(diǎn)擊事件(CheckBox)
也就是所如果選中第一個(gè)CheckBox讓Red_OnOff數(shù)據(jù)點(diǎn)變?yōu)楦唠娖?,否則變?yōu)榈碗娖健?/p>
選中第二CheckBox讓Green_OnOff數(shù)據(jù)點(diǎn)變?yōu)楦唠娖?,否則變?yōu)榈碗娖健?/p>
選中第三個(gè)CheckBox讓Blue_OnOff數(shù)據(jù)點(diǎn)變?yōu)楦唠娖?,否則變?yōu)榈碗娖健?/p>
代碼如下,這部分代碼同樣寫在initView中:
//大燈面板的點(diǎn)擊事件 cb_01.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View view) {if(cb_01.isChecked()) {map=new ConcurrentHashMap《》();map.put(RED_OnOff,true); device.write(map,0); tv_RED.setText(“大廳燈開關(guān):開”); }else {
map=new ConcurrentHashMap《》();map.put(RED_OnOff,false); device.write(map,0); tv_RED.setText(“大廳燈開關(guān):關(guān)”); }
} }); cb_02.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View view) {if(cb_02.isChecked()) {map=new ConcurrentHashMap《》();map.put(GREEN_OnOff,true); device.write(map,0); tv_GREEN.setText(“食廳燈開關(guān):開”);
}else {map=new ConcurrentHashMap《》();map.put(GREEN_OnOff,false); device.write(map,0); tv_GREEN.setText(“食廳燈開關(guān):關(guān)”); }
} }); cb_03.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View view) {if(cb_03.isChecked()){//開藍(lán)燈指令map=new ConcurrentHashMap《》();map.put(BLUE_OnOff,true); device.write(map,0); tv_BLUE.setText(“臥室燈開關(guān):開”); }else {map=new ConcurrentHashMap《》();map.put(BLUE_OnOff,false); device.write(map,0); tv_BLUE.setText(“臥室燈開關(guān):關(guān)”); }
} });
8.4.編寫門禁開關(guān)面板
這部分相對(duì)于前面來(lái)說(shuō)是比較復(fù)雜的,因?yàn)楫?dāng)點(diǎn)擊了綠色按鈕開門的時(shí)候是需要輸入密碼的,在這里的操作是使用Intent跳轉(zhuǎn)到另一個(gè)Activity,同時(shí)使用Intent傳輸數(shù)據(jù),如果在另一個(gè)Activity輸入正確的密碼,那么就會(huì)回到原來(lái)這個(gè)Activity,并打開門禁,否則打開門禁,關(guān)閉門禁這個(gè)按鈕相對(duì)簡(jiǎn)單一點(diǎn),就直接是發(fā)送一個(gè)關(guān)閉的命令而已。
所以當(dāng)我們?cè)陂T禁開關(guān)點(diǎn)擊了綠色按鈕就會(huì)跳轉(zhuǎn)到LockActivity
也就是如下這個(gè)界面:
那么現(xiàn)在去LockActivity.java這個(gè)類去寫相關(guān)的控制函數(shù)了
8.5.LockActivity相關(guān)代碼
和上面一樣,這個(gè)控件有一個(gè)EditView,兩個(gè)按鈕:確定,取消,還需要使用一個(gè)變量來(lái)保存密碼,默認(rèn)為“abc”
同樣在initView獲取控件對(duì)象:
調(diào)用EidtView的addTextChangedListener方法來(lái)讀取我們輸入EditView輸入的數(shù)據(jù):
接下來(lái)就是編寫確認(rèn)按鈕(sure_button)和取消按鈕(cancle_button)的代碼了。
思路:當(dāng)在EditView輸入密碼時(shí),框內(nèi)的內(nèi)容會(huì)實(shí)時(shí)保存在mpassward這個(gè)變量中,當(dāng)按下確認(rèn)按鈕,就去判斷這個(gè)mpassward這個(gè)變量中是否保存有“open”這個(gè)字符串,如果有的話就返回上一級(jí),并返回正確的結(jié)果,如果輸入密碼為空提示輸入正確的密碼,輸入密碼錯(cuò)誤提示錯(cuò)誤;按下取消按鈕直接返回上一級(jí),并返回失?。?/p>
代碼如下:
確認(rèn)按鈕:
取消按鈕
8.6.處理從上一級(jí)處理返回結(jié)果
回到GosDevideContrlActivity去判斷返回的結(jié)果是否正確,正確則代開門禁的開關(guān),否則不打開。
8.7.從云端獲取溫濕度以及氣體檢測(cè)等數(shù)據(jù)
思路:使用機(jī)智云SDK的回到方法didReceiveData,獲取數(shù)據(jù),獲取到的是一串字符串,我們需要把這個(gè)字符串我們需要的信息提取出來(lái),保存在7.3節(jié)中建立的變量當(dāng)中,以便我們使用:
解析云端數(shù)據(jù)函數(shù):
在云端返回的是一個(gè)ConcurrentHashMap類型的數(shù)據(jù),需要把這些數(shù)據(jù)的有用信息提取出來(lái),代碼如下:
@SuppressWarnings(“unchecked”)protected void getDataFromReceiveDataMap(ConcurrentHashMap《String, Object》 dataMap) {// 已定義的設(shè)備數(shù)據(jù)點(diǎn),有布爾、數(shù)值和枚舉型數(shù)據(jù)
if (dataMap.get(“data”) != null) { ConcurrentHashMap《String, Object》 map1 = (ConcurrentHashMap《String, Object》) dataMap.get(“data”);for (String dataKey : map1.keySet()) {if (dataKey.equals(RED_OnOff)) { data_Red_OnOff = (Boolean) map1.get(dataKey); }if (dataKey.equals(GREEN_OnOff)) { data_Green_OnOff = (Boolean) map1.get(dataKey); }if (dataKey.equals(BLUE_OnOff)) { data_Blue_OnOff = (Boolean) map1.get(dataKey); }if (dataKey.equals(DOOR_OnOff)) { data_Door_OnOff = (Boolean) map1.get(dataKey); }if (dataKey.equals(KEY_MOVE_DETECTION)) { data_Move_Detection = (Boolean) map1.get(dataKey); }if (dataKey.equals(KEY_GAS_DETECTION)) { data_Gas_Detection = (Boolean) map1.get(dataKey); }if (dataKey.equals(KEY_TEMP)) {
data_temp = (Integer) map1.get(dataKey); }if (dataKey.equals(KEY_HUM)) {
data_hum = (Integer) map1.get(dataKey); } } }
有了這個(gè)數(shù)據(jù)解析的函數(shù),就可以把從云端獲取的數(shù)據(jù)提取出來(lái),保存在本地變量當(dāng)中給我們使用了,當(dāng)提取處信息之后,比如溫度濕度等信息,它已經(jīng)保存在 data_temp,date_hum中了,我們需要使用TextView把它們的值顯示出來(lái),但是這里有一點(diǎn)值得注意,子線程中是不能執(zhí)行UI操作的,也就是說(shuō)不能再didReceiveData方法中調(diào)用UI操作TextView,所以需要使用Handler機(jī)制,告訴主線程,數(shù)據(jù)已經(jīng)準(zhǔn)備好,然后主線程接收到信息之后就更新UI操作,也就是顯示溫度濕度等信息啦。
云端獲取數(shù)據(jù)代碼:
在主線程中更新UI,代碼如下:
最后在initDevide()方法中,設(shè)置回調(diào)的監(jiān)聽器
至此,所有的邏輯控制代碼已經(jīng)編寫完成。
8.8.調(diào)試測(cè)試
步驟:
1.進(jìn)入機(jī)智云官網(wǎng),打開你的項(xiàng)目,打開虛擬設(shè)備
2.點(diǎn)擊二維碼
3.使用APP掃描
4.掃描后進(jìn)入
5.使用APP控制看調(diào)試結(jié)果
經(jīng)過(guò)驗(yàn)證,我們所寫的控制代碼已經(jīng)能完成我們的需求了,既能控制工程云端的數(shù)據(jù)點(diǎn),又能把工程云端的數(shù)據(jù)點(diǎn)推送到APP上。
原文標(biāo)題:【機(jī)智云安卓開源框架1】實(shí)現(xiàn)簡(jiǎn)單智能家居系統(tǒng) 之 上篇
文章出處:【微信公眾號(hào):機(jī)智云開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
智能家居
+關(guān)注
關(guān)注
1928文章
9562瀏覽量
185127 -
安卓
+關(guān)注
關(guān)注
5文章
2130瀏覽量
57203 -
機(jī)智云
+關(guān)注
關(guān)注
2文章
590瀏覽量
26412
原文標(biāo)題:【機(jī)智云安卓開源框架1】實(shí)現(xiàn)簡(jiǎn)單智能家居系統(tǒng) 之 上篇
文章出處:【微信號(hào):IoTMaker,微信公眾號(hào):機(jī)智云開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論