你的位置:首頁(yè) > 互連技術(shù) > 正文

愈演愈烈的智能家居:手把手教你把一個(gè)設(shè)備轉(zhuǎn)變成智能設(shè)備

發(fā)布時(shí)間:2016-02-02 責(zé)任編輯:susan

【導(dǎo)讀】物聯(lián)網(wǎng)技術(shù)飛速發(fā)展,智能家居領(lǐng)域也跟著愈演愈烈,成為互聯(lián)網(wǎng)巨頭及家電大佬們爭(zhēng)相深耕的“肥沃土壤”,本文主要針對(duì)智能家居的軟硬件架構(gòu)技術(shù)做詳細(xì)分析。
 
HOW-想清楚要做哪些事情
  
以一款智能插座為例,我講的主題就是這個(gè)插座該怎么樣來(lái)生產(chǎn)、怎么樣來(lái)研發(fā)。第一步,我們先要把它分解。插座有很多結(jié)構(gòu)件,比如五金件這些東西,所以我們要搭建一個(gè)團(tuán)隊(duì),包括做工業(yè)設(shè)計(jì)、結(jié)構(gòu)設(shè)計(jì)的人,硬件工程師、電子類(lèi)工程師、軟件的工程師,以及生活端的,甚至是運(yùn)營(yíng)和銷(xiāo)售的。如下圖所示。
  
 
我們從傳統(tǒng)的一個(gè)設(shè)備到智能設(shè)備轉(zhuǎn)變的過(guò)程中,這一個(gè)東西非常重要,即WiFi模塊。這個(gè)地方?jīng)Q定了這個(gè)設(shè)備到底能不能跟我們的App進(jìn)行交互以及交互的效率如何。
  
大家可以看一下我們大概要做的事情,包括元器件選型、原理圖、結(jié)構(gòu)、工業(yè)設(shè)計(jì)、PCBA、打手板、開(kāi)模,這些東西完成的話(huà)代表著傳統(tǒng)的部分完成了,這里不再贅述。比較重要的是智能設(shè)備要怎樣實(shí)現(xiàn)通訊。現(xiàn)在ZigBee、WiFi、Z-Wave、BLE,這四種用得比較普遍,還有433、315等設(shè)備。谷歌也有一套協(xié)議,但是應(yīng)用得稍微少一點(diǎn)。我今天主要是從WiFi設(shè)備方面來(lái)講,看到底一個(gè)WiFi設(shè)備到底要怎么樣來(lái)做。
  
WiFi聯(lián)網(wǎng)的難題
  
WiFi設(shè)備面臨一個(gè)很大的難題,比如說(shuō)我做一個(gè)智能的水杯、一個(gè)智能的插座,這個(gè)水杯和插座是沒(méi)有交互界面的。但是我們必須解決一個(gè)問(wèn)題,即這個(gè)設(shè)備一定要聯(lián)網(wǎng),要連路由器。大家想到最直接的辦法是手機(jī)連路由器,打開(kāi)手機(jī)的設(shè)置,進(jìn)入WiFi列表,然后再輸入密碼。但是智能硬件里面沒(méi)有辦法進(jìn)行操作,這就是要面臨的第一個(gè)難題了,所以很多人內(nèi)心是非常憂(yōu)傷的。
  
這里介紹幾種給WiFi設(shè)備配置的方法。第一種是AP,AP是最傳統(tǒng)的方式,在AP里面主要是讓智能設(shè)備首先進(jìn)入AP模式里面,這樣能夠共享一個(gè)熱點(diǎn)出來(lái)。我們的手機(jī)直接連到這個(gè)設(shè)備里面,然后再把路由器的SSID推送給那個(gè)設(shè)備,那個(gè)設(shè)備可以在線連路由器。這里面AP有一個(gè)很麻煩的事情,就是它的交互特別復(fù)雜,特別是在iOS手機(jī)里面不允許手機(jī)的App直接調(diào)用WiFi的設(shè)置或是直接切換過(guò)去,我們可能要先退出后臺(tái),然后切換到蘋(píng)果的那一套設(shè)置里面,設(shè)置好了之后又要切換回來(lái),這樣特別麻煩。所以在演進(jìn)過(guò)程中就進(jìn)入了WPS。
  
WPS解決了第一步的問(wèn)題,可以在路由器里面有一個(gè)按鍵,智能設(shè)備里面也有一個(gè)按鍵,可以根據(jù)WPS的協(xié)議交換它的密鑰。但是這里面有一個(gè)很大的問(wèn)題,WPS需要進(jìn)行專(zhuān)門(mén)的認(rèn)證,而且現(xiàn)在支持的路由器非常少,所以用WPS技術(shù)來(lái)做的話(huà)可能會(huì)比較差一點(diǎn)。
  
再接下來(lái)又出了一個(gè)Smart Config,這一款應(yīng)用非常多,因?yàn)樗浅:?jiǎn)單,直接在手機(jī)上面向路由器發(fā)送SSID和密鑰,這個(gè)芯片再去抓路由器的包,抓到這個(gè)包之后再解密,解密出來(lái)之后就知道了路由器的SSID和密鑰,然后就可以去連。在這個(gè)基礎(chǔ)上微信也出了air kiss和另外的Smart link,也這個(gè)原理。
  
接下來(lái)又出現(xiàn)了光配置,屏幕按照一定的亮變把信息傳輸過(guò)去,但是這個(gè)應(yīng)用比較少一點(diǎn),問(wèn)題也比較多。
  
再接下來(lái)是聲波配置,AA付款和面對(duì)面收款里面就用到這個(gè)技術(shù)。
  
總體來(lái)說(shuō),AP和第三個(gè)稍微比較好一點(diǎn),但是我們?cè)趯?shí)際產(chǎn)品應(yīng)用里面也會(huì)發(fā)現(xiàn),這一類(lèi)技術(shù)面臨很多問(wèn)題,就是對(duì)路由器的一些芯片、兼容性都會(huì)有比較高得要求。我們以前出現(xiàn)很多這樣的例子,測(cè)試的時(shí)候拿了幾十款、上百種路由器測(cè)得沒(méi)有問(wèn)題,到了用戶(hù)家里,那一款路由器我們沒(méi)有測(cè)試過(guò),結(jié)果發(fā)現(xiàn)不行,這是一方面的限制。為了解決這種限制,后面又改成了不抓路由器的包,就抓手機(jī)發(fā)出來(lái)的包。抓手機(jī)發(fā)出來(lái)的包之后又帶來(lái)更大的問(wèn)題,正常手機(jī)的包是OK的,沒(méi)有那么多兼容性的問(wèn)題。去年iOS包出來(lái)的之后,蘋(píng)果的iPhone6會(huì)有一個(gè)問(wèn)題,連上WiFi離開(kāi)一段時(shí)間再回來(lái)WiFi就會(huì)丟失了,這時(shí)候不重啟手機(jī)就永遠(yuǎn)連不上WiFi了。蘋(píng)果為了解決這個(gè)問(wèn)題又更新部件,然后對(duì)這個(gè)又沒(méi)有用了,又抓不了包了,所以對(duì)傳統(tǒng)應(yīng)有還是有限制。還有一些跟技術(shù)沒(méi)有關(guān)系的限制,比如說(shuō)現(xiàn)在比較好一點(diǎn)的路由器是支持2.5G和4G的?,F(xiàn)在我們使用的模塊都是只有2.4G的,如果手機(jī)是雙頻、路由器是雙頻的默認(rèn)是是5G。所以我們又回到最原始的AP模式來(lái),因?yàn)槲覀儾挥酶脩?hù)解釋那么多東西,也沒(méi)有很多兼容性的問(wèn)題。
 
軟件架構(gòu)的選擇
  
這是一個(gè)軟件架構(gòu)要怎么樣選擇的問(wèn)題,就是我們現(xiàn)在智能設(shè)備聯(lián)網(wǎng)最基本的需求是什么。我們來(lái)看一下這個(gè)圖,智能設(shè)備聯(lián)網(wǎng)之后要實(shí)現(xiàn)跟手機(jī)APP的交互,一方面APP如果要去控制它,它必須能夠接收到APP發(fā)過(guò)來(lái)的控制信號(hào)。另一方面,如果直接在上面按,按完了之后這里面的狀態(tài)要能夠反饋到APP里面來(lái)。所以,我們?cè)谧黾夹g(shù)選型的時(shí)候,最基本要實(shí)現(xiàn)這兩個(gè)需求。
  
 
控制命令的上傳和下發(fā)的問(wèn)題,這里面決定了到底我們?cè)趺磥?lái)架構(gòu)的問(wèn)題。這是我昨天提出的問(wèn)題,就是為了解釋剛剛提出的需求。比如說(shuō)我在QQ上發(fā)布信息說(shuō)插座開(kāi)一下燈,然后它說(shuō)已經(jīng)開(kāi)了。我問(wèn)它是什么狀態(tài),然后它告訴我它已經(jīng)關(guān)了。我們要對(duì)智能設(shè)備進(jìn)行控制,這里面基本的需求一個(gè)是數(shù)據(jù),我要把想要的數(shù)據(jù)控制命令發(fā)給它,控制了之后又發(fā)回給我,這個(gè)做的事情其實(shí)就是IM的事情。我們做服務(wù)器端的架構(gòu)的時(shí)候,最初考慮的方案就是選擇了IM的方案。
  
物聯(lián)網(wǎng)跟互聯(lián)網(wǎng)實(shí)際上看起來(lái)有很大的差異,真正我們?cè)谧龅臅r(shí)候還是殊途同歸,我們還是都選擇了IM的方案。
  
看一下最簡(jiǎn)單的IM架構(gòu),這里面要保持長(zhǎng)連接,接下來(lái)做一些業(yè)務(wù)處理,下面是存儲(chǔ),如果App要去控制Device的時(shí)候,發(fā)到業(yè)務(wù)層處理完了之后,這里面有一個(gè)推送的,可以找到Device到底連了哪一臺(tái)機(jī),然后再把數(shù)據(jù)推送過(guò)來(lái)。如果Device自己的狀態(tài)發(fā)生變化,它的數(shù)據(jù)要推送給APP,基本上是這樣的工作流。如果App是黑莓等設(shè)備的,我們可能要專(zhuān)門(mén)推送到APNS里面來(lái)。
  
 
通信協(xié)議的選擇
  
接下來(lái)我們還需要一個(gè)好的通信協(xié)議,現(xiàn)在很多通信協(xié)議是XMPP,很多社交軟件都個(gè)在用,因?yàn)樗_(kāi)源做得比較好。MQTT是專(zhuān)門(mén)用來(lái)做物聯(lián)網(wǎng)的協(xié)議。另外,PROTOBUF是谷歌的,這三個(gè)比較的話(huà),MQTT和PROTOBUF是最適合做物聯(lián)網(wǎng)通信協(xié)議的,因?yàn)檫@兩個(gè)協(xié)議對(duì)數(shù)據(jù)量利用率非常高,不會(huì)帶來(lái)額外的開(kāi)銷(xiāo)的。
  
快速構(gòu)建云服務(wù)
  
再回到上圖,如果我們要做這樣一個(gè)系統(tǒng),為了要簡(jiǎn)單快速的出這樣一個(gè)產(chǎn)品,要利用很多開(kāi)源的組件,比如說(shuō)負(fù)載均衡這里,傳統(tǒng)的里面是比較難做的,我們用的比較多硬件負(fù)載均衡是F5或者是淘寶的LVS,我認(rèn)為L(zhǎng)VS對(duì)于目前做硬件的來(lái)說(shuō)肯定是夠的。再下面Connect Server現(xiàn)在也有很現(xiàn)成的開(kāi)源技術(shù),如果采用XMPP協(xié)議的話(huà)可能要用F5,像很多也完完全全做好了,如果在TTP這一層優(yōu)化比較好,做到八十到一百萬(wàn)長(zhǎng)連接也沒(méi)有問(wèn)題,而且會(huì)特別簡(jiǎn)單。像很多軌道函數(shù)都寫(xiě)的非常好,我們都不用關(guān)心怎么管理這些線程質(zhì)量、怎么管理連接,只要在上面寫(xiě)我們的業(yè)務(wù)代碼就行了。另外,我們這里面要做集群,我們有很多服務(wù)的時(shí)候直接在上面注冊(cè),后面調(diào)用的時(shí)候不用關(guān)心今天多了一臺(tái)機(jī)器、明天少了一臺(tái)機(jī)器以及這個(gè)機(jī)器的ID是什么。另外,服務(wù)要遠(yuǎn)程交易,我們要考慮IPC框架,像淘寶和Facebook的一些,都是開(kāi)源領(lǐng)域利用的非常好的。
  
我們肯定還要用到很多緩存,緩存方面我們用的比較多的。如果我們對(duì)開(kāi)源的框架用得比較好,簡(jiǎn)單的這個(gè)系統(tǒng)很快就可以完成了,不需要我們寫(xiě)很多東西,只需要在上面寫(xiě)業(yè)務(wù)代碼就能夠直接做好了。
  
這里面就是剛剛說(shuō)到的,如果你用Netty,只要在這里面寫(xiě)業(yè)務(wù)代碼,當(dāng)你接收到數(shù)據(jù)的時(shí)候這里面應(yīng)該怎么做,包括這里面出了異常的時(shí)候要怎么做。如果選用Netty還要考慮到一個(gè)情況,高并發(fā)的時(shí)候需要對(duì)數(shù)據(jù)包做拆包的事情。我們經(jīng)常發(fā)現(xiàn)這里接收到的數(shù)據(jù)并不是一個(gè)完整的數(shù)據(jù),比如說(shuō)我們發(fā)了大概2K左右的數(shù)據(jù),它給到你的可能只有很少。如果這里面不完整,把組包放進(jìn)來(lái)就可以了。具體的拆包、組包也提供了編碼性和解碼性,最重要的是在這個(gè)函數(shù)里面寫(xiě)你的業(yè)務(wù)代碼。
 
嵌入式開(kāi)發(fā)
  
我們要在設(shè)備端也實(shí)現(xiàn)接入,還要考慮嵌入式的開(kāi)發(fā)。嵌入式也有一個(gè)問(wèn)題,我們的設(shè)備都是需要成本的,不像寫(xiě)服務(wù)代碼一樣,服務(wù)器資源非常多,給到你很好的服務(wù)器可以用。在嵌入式方面,我們必須用最低的成本、最少的資源做最多的事情。每一個(gè)產(chǎn)品研發(fā)出來(lái),第一代選用的芯片可能比較好一點(diǎn),第二代為了這個(gè)產(chǎn)品能夠賣(mài)得更好,可能會(huì)做更改,對(duì)我們來(lái)說(shuō)可用的資源更多。通常我們用單片機(jī),我們比較常用FreeRTOS,它沒(méi)有TCPP協(xié)議的。做嵌入式開(kāi)發(fā)的時(shí)候我們還會(huì)遇到更多的問(wèn)題,像LWIP之類(lèi)的,寫(xiě)這個(gè)協(xié)議站的人可能并沒(méi)有用到很多產(chǎn)品,所以里面還是殘留了很多BUG。這里面舉了兩個(gè)非常明顯而且一定會(huì)遇到的問(wèn)題,一個(gè)是TIME_WAIT,還有一個(gè)是CLOSE_WAIT,如果對(duì)方?jīng)]有按照正常流程關(guān)閉,假如說(shuō)我們的APP直接刷了,可能就會(huì)產(chǎn)生這個(gè)CLOSE_WAIT,它一直在那里等,我們可能只開(kāi)放十多個(gè)端口接入,如果一直在等待,可能它就認(rèn)為這個(gè)請(qǐng)求還是正常的,就不會(huì)把它釋放出來(lái)。等我們給它分配的端口滿(mǎn)了之后,下一個(gè)請(qǐng)求就再也接不進(jìn)來(lái)了。一般有三次握手,如果斷開(kāi)了標(biāo)志著有四次握手,我們發(fā)現(xiàn)它沒(méi)有按照正常的四次握手,導(dǎo)致斷開(kāi)的時(shí)候少發(fā)了一些命令,所以就一直在等待,等待的時(shí)候數(shù)據(jù)怎么發(fā)也發(fā)不出來(lái)了。
  
還有我們經(jīng)??赡軙?huì)遇到一些問(wèn)題,比如說(shuō)這里面可用的只有10幾K、64K,我們要在上面寫(xiě)代碼,如果寫(xiě)了多線程,又是單核的CPU,這里面用的時(shí)間長(zhǎng)了會(huì)產(chǎn)生很多的內(nèi)存碎片。當(dāng)內(nèi)存碎片產(chǎn)生了之后,多線程再申請(qǐng)內(nèi)存做其他事情的時(shí)候,比如說(shuō)有一個(gè)線程需要申請(qǐng)的資源比較大的時(shí)候會(huì)申請(qǐng)不到,就會(huì)一直在那里等,就會(huì)發(fā)現(xiàn)是怎么回事,這個(gè)地方本來(lái)十幾毫秒就可以處理完的,可能等了一秒鐘或者兩秒鐘甚至?xí)r間更長(zhǎng)時(shí)間才能處理,這就是時(shí)間用了長(zhǎng)了之后產(chǎn)生了內(nèi)存碎片。我們回收內(nèi)存也做不了,所以經(jīng)常要做被動(dòng)的事情,要軟重啟一下,所有的線程再重新跑起來(lái)。
  
事情是否已經(jīng)結(jié)束
  
回到接下來(lái)的一個(gè)問(wèn)題,我們按照剛才的思路,我們把樣品做好了,模塊也開(kāi)發(fā)好了,APP也做好了,是不是所有事情都完成了呢?舉個(gè)例子,某手機(jī)廠商說(shuō)要做“東半球最好的手機(jī)”,這等于是他的情懷,為什么呢?做硬件和軟件非常大的區(qū)別是,純互聯(lián)網(wǎng)的硬件把程序代碼寫(xiě)好就可以使用了,但是硬件來(lái)說(shuō)的話(huà)還會(huì)涉及到很多生產(chǎn)工藝,還要做一些認(rèn)證。比如說(shuō)像我們的插座,我們要經(jīng)過(guò)3C認(rèn)證等等,如果過(guò)不了這個(gè)東西就不能賣(mài)。像這個(gè)手機(jī)當(dāng)時(shí)出了一個(gè)問(wèn)題,它那個(gè)表面的玻璃像普通的安卓手機(jī)一樣,下面開(kāi)了幾個(gè)孔,蘋(píng)果只開(kāi)了五個(gè)孔,它開(kāi)了三個(gè)孔,在生產(chǎn)里面要求的工藝非常高,開(kāi)三個(gè)孔的情況下可能真正的良品率只能達(dá)到30%、40%,大部分開(kāi)孔的時(shí)候會(huì)導(dǎo)致這個(gè)玻璃碎了。像這種情況下,我們會(huì)把一個(gè)產(chǎn)品設(shè)計(jì)的非常好,認(rèn)為這個(gè)東西非常漂亮、工藝非常好,但實(shí)際上也要考慮我們的生產(chǎn)能不能做。
  
我們現(xiàn)在做出來(lái)一個(gè)整體的架構(gòu),上面是一些產(chǎn)品,下面是模塊這里面是為了解決家里面的很多設(shè)備,所以有一個(gè)ZigBee的網(wǎng)關(guān),通過(guò)網(wǎng)關(guān)再來(lái)連接。
  
這是我們的一個(gè)系統(tǒng)構(gòu)架,比較復(fù)雜一點(diǎn),因?yàn)檫@里面整個(gè)系統(tǒng)涉及到的業(yè)務(wù)特別多,它的產(chǎn)品也特別多。這里面接入的時(shí)候,其實(shí)整體上來(lái)說(shuō)也都差不多,一個(gè)是設(shè)備層的接入,還有一些業(yè)務(wù)層,里面做了一些報(bào)表、數(shù)據(jù)分析,還有一些OTA,可能還有一塊沒(méi)有畫(huà)出來(lái),就是我們?cè)谧錾虡I(yè)智能的時(shí)候?qū)嶋H上是剛剛那位朋友問(wèn)了一個(gè)問(wèn)題,就是我們有沒(méi)有嘗試做一些更加智能的分析之類(lèi)的,實(shí)際上我們?cè)诟鶕?jù)用戶(hù)的需求在梳理一些模型,我們希望這些數(shù)據(jù)能夠幫我們分析用戶(hù)現(xiàn)在是在做什么。一個(gè)最簡(jiǎn)單的例子,當(dāng)某一個(gè)開(kāi)關(guān),可能是它每天晚上一點(diǎn)鐘都會(huì)亮一下,亮一兩分鐘又滅了,這可能意味著那個(gè)用戶(hù)有一個(gè)生物鐘,因?yàn)樯镧姇r(shí)間非常準(zhǔn),他每天都是這個(gè)時(shí)間點(diǎn)做這個(gè)動(dòng)作,比如說(shuō)上廁所之類(lèi)的,這個(gè)時(shí)候非常需要把房間的燈打開(kāi),包括走廊的燈、洗手間的燈都要打開(kāi)。我們把這個(gè)事件分析出來(lái),到了這個(gè)時(shí)間點(diǎn)之后就不用摸黑按這個(gè)開(kāi)關(guān)了,我們會(huì)把這個(gè)幾個(gè)開(kāi)關(guān)打開(kāi),這就是他的路線。如果要能夠做的更細(xì)致化一點(diǎn)的化,我們還會(huì)發(fā)現(xiàn),如果我們?cè)谒X(jué)的時(shí)候突然之間醒過(guò)來(lái),然后燈亮了,實(shí)際上是非常刺眼、非常難受的事情,我們?cè)诖蜷_(kāi)燈的時(shí)候,是不是把燈的亮度只調(diào)出一點(diǎn)點(diǎn),有一點(diǎn)微弱的光,不會(huì)刺眼,又有足夠的亮度可以照明,讓他走過(guò)去。這是我們做的更深層次的分析。


推薦閱讀:

爭(zhēng)得你死我活的LiFiWiFi:相互配合才是理想模式

殘酷的現(xiàn)實(shí):主流筆記本電池的續(xù)航和壽命都糟糕

保持‘腦洞大開(kāi)’:一場(chǎng)量子通信的‘神奇變變變’逆天心靈感應(yīng)

實(shí)現(xiàn)光通信的新手段:不只是照明的UV LED

中看也中用:被低估的NFC/RFID已悄悄把我們包圍

看著很美卻有‘致命傷’:只能淺嘗即止的VR如何擊破眩暈的弱點(diǎn)

解決CPU異常的‘功臣’,系統(tǒng)控制協(xié)處理器的全定制設(shè)計(jì)

特別推薦
技術(shù)文章更多>>
技術(shù)白皮書(shū)下載更多>>
熱門(mén)搜索
?

關(guān)閉

?

關(guān)閉