伴隨著物聯(lián)網(wǎng)的大潮,無(wú)數(shù)的設(shè)備被安裝上WiFi模塊,接入到互聯(lián)網(wǎng)上。比如國(guó)內(nèi)的家電巨頭海爾、美的、格力、海信等,已經(jīng)在2014年推出了一系列帶WiFi的智能家電產(chǎn)品,包括空調(diào)、冰箱、洗衣機(jī)、熱水器、空氣凈化器、烤箱、電飯煲等等。等待了這么多年,智能家居終于開始成熟了。
相對(duì)于藍(lán)牙和ZigBee等其他無(wú)線網(wǎng)絡(luò)技術(shù),WiFi最大的優(yōu)勢(shì)是無(wú)需依賴手機(jī)或者其他中間設(shè)備,通過WiFi路由器,就能夠連接到互聯(lián)網(wǎng)上,直接與云服務(wù)器連接或者進(jìn)行遠(yuǎn)程控制。而且目前的WiFi模塊功耗和價(jià)格已經(jīng)下降得很多,很容易被嵌入到各種物聯(lián)網(wǎng)設(shè)備中,無(wú)需過多的擔(dān)心成本和功耗。
但是,將WiFi模塊用在物聯(lián)網(wǎng)設(shè)備中,也有一個(gè)麻煩,就是WiFi的初始設(shè)置。要讓這些設(shè)備連接上WiFi路由器,需要首先讓它們知道WiFi路由器的名稱(SSID)和密碼。但是不同于傳統(tǒng)的PC或者手機(jī),大多數(shù)物聯(lián)網(wǎng)設(shè)備沒有按鍵或者觸摸屏這樣的輸入接口,因此需要其他的方法將路由器的SSID和密碼告知物聯(lián)網(wǎng)設(shè)備。因?yàn)檫@些物聯(lián)網(wǎng)設(shè)備大多有與之配套的手機(jī)APP,問題也就變成了如何將SSID和密碼從手機(jī)APP傳送給這些設(shè)備。從目前已知的方法來看,主要有以下兩種。
第一種是基于WiFi模塊的SoftAP模式。在WiFi協(xié)議中,設(shè)備可以工作在AP模式,也可以工作在Station模式。比如WiFi路由器就是典型的AP,而手機(jī)和PC就是典型的Station。物聯(lián)網(wǎng)設(shè)備在絕大多數(shù)情況下都是工作Station模式,但是為了支持初始配置,許多WiFi模塊支持AP模式,當(dāng)然,不是全功能的AP模式,只是有限的功能,所以稱之為SoftAP。利用SoftAP進(jìn)行WiFi初始配置的流程如下:
- 設(shè)備啟動(dòng)時(shí),如果發(fā)現(xiàn)WiFi沒有配置,則啟動(dòng)SoftAP模式,自己變成一個(gè)WiFi熱點(diǎn)。
- 手機(jī)連接上SoftAP,打開APP,輸入WiFi路由器的SSID和密碼,傳送給SoftAP。
- SoftAP收到SSID和密碼后,切換到Station模式,連接指定的WiFi路由器,同時(shí)將SSID和密碼保存在本地。
- 下次設(shè)備啟動(dòng)時(shí),因?yàn)閃iFi已經(jīng)配置好了,設(shè)備之間進(jìn)入Station模式,連接指定的WiFi路由器。
使用這種方式的智能設(shè)備很多,比如小K智能開關(guān),第一次啟動(dòng)后會(huì)產(chǎn)生一個(gè)OK_SP3的熱點(diǎn),完成配置后就沒有了。
在具體APP的實(shí)現(xiàn)中,需要考慮Android和iOS的不同。比如WiFi路由器SSID一般是不用用戶輸入的,APP會(huì)提供一個(gè)周圍熱點(diǎn)的SSID列表,用戶選擇即可。但是iOS是不支持在APP中做WiFi掃描的,因此需要設(shè)備端先掃描一個(gè)SSID列表發(fā)給手機(jī),然后用戶在APP里面選擇。另外iOS是不支持在APP中切換WiFi連接的,因此用戶需要先手工連接到SoftAP,完成配置后,再切換回來。而Android中是可以的。Android的APP中可以先自動(dòng)連接SoftAP,配置完成后,再自動(dòng)切換到原來的AP,而用戶可能感覺不到這個(gè)過程,從而改善了用戶體驗(yàn)。
第二種是基于WiFi模塊的Sniffer模式。基于SoftAP的方式可以保證配置成功,但是用戶體驗(yàn)不太好。因?yàn)樗笫謾C(jī)先連接到SoftAP上,無(wú)論是手工的(iOS)還是自動(dòng)的(Android),配置完成后再切換回來。在此期間,手機(jī)因?yàn)殡x開了原先的WiFi路由器,因此失去了與互聯(lián)網(wǎng)的連接。這個(gè)是許多用戶感覺不爽的地方。而Sniffer模式不同。使用這種配置方式,用戶手機(jī)不需要斷開與當(dāng)前WiFi路由器的連接,從而可以保持與互聯(lián)網(wǎng)的連接。這也是這種方式經(jīng)常被稱為智能配置的原因。這種方式要求WiFi模塊支持Sniffer模式,也就是雜收模式(Promiscuous)。對(duì)無(wú)線通信熟悉的人都知道,無(wú)線通信本質(zhì)上是一種廣播。理論上,一個(gè)WiFi設(shè)備可以收到空氣中的所有包,只不過正常工作時(shí),底層將不需要的包過濾掉了。打開雜收模式,就是將底層收到的所有包,直接提交給上層處理。這樣,雖然WiFi模塊與路由器和手機(jī)之間沒有連接,但是它可以監(jiān)聽手機(jī)發(fā)出來的包,而手機(jī)APP也可以在這些包里面隱含配置信息,從而達(dá)到將配置信息傳送給WiFi模塊的目的。
手機(jī)發(fā)包時(shí),是連接在WiFi路由器上的。如果WiFi路由器是加密的,比如WEP和WPA,那么WiFi模塊收到的包必然也是加密的,模塊無(wú)法直接獲得包里面的信息,那么手機(jī)與模塊之間怎么傳遞信息呢?這就要深入理解一下WiFi幀的結(jié)構(gòu)。

?圖1,通用的WiFi幀結(jié)構(gòu)
從上圖可以看出,WiFi幀包括幀頭,幀體和校驗(yàn)和三部分。其中幀頭是不加密的,幀體部分根據(jù)幀類型的不同,有加密的,也有不加密的,比如管理幀ProbeRequest中的幀體部分就是不加密的。
另外,WiFi幀的長(zhǎng)度也是很有用的信息。不管幀怎樣加密,對(duì)于一定的加密方式(WEP,CCMP,TKIP),加密后的幀長(zhǎng)度總是原始數(shù)據(jù)長(zhǎng)度加上一個(gè)固定的偏移。這樣手機(jī)APP就可以通過控制數(shù)據(jù)包長(zhǎng)度的方式來傳遞有用信息。
總結(jié)起來,目前的智能配置一般有下面三種方式:
1, 第一種方式通過WiFi幀的長(zhǎng)度傳遞信息。比如要傳遞一個(gè)字符串”abc”,三個(gè)字符a、b、c對(duì)應(yīng)的ASCII分別是97、98、99。手機(jī)APP可以生成數(shù)據(jù)包,控制其長(zhǎng)度為97、98、99加上固定的偏移量。這樣WiFi模塊捕獲到包之后,就可以根據(jù)包長(zhǎng)度提取有用的信息了。目前微信的airkiss就是使用這樣的方式。京東的通用智能家居APP也是使用的這樣的方式。
2, 第二種方式通過WiFi幀的MAC地址傳遞信息。WiFi幀頭雖然是不加密的,但是它的內(nèi)容都是底層WiFi驅(qū)動(dòng)填寫的,而手機(jī)APP處于應(yīng)用層,是無(wú)法控制其中的內(nèi)容的,但是有一個(gè)例外。就是手機(jī)APP發(fā)送UDP組播包時(shí),組播包的目的IP地址的后23位會(huì)映射到WiFi幀目的MAC地址后23位,這樣手機(jī)APP可以通過修改UDP包的組播地址,達(dá)到傳遞信息的目的。比如傳遞“abc”,可以發(fā)送3個(gè)組播包,目的地址分別是229.0.0.97,239.0.0.98,239.0.0.99。這樣WiFi模塊捕獲到包之后,就可以從MAC地址中提取到有用的信息了。比如海爾的U+智能設(shè)備就是采用這樣的方式。
3, 第三種方式是通過管理幀的幀體部分傳遞信息,一般使用ProbeRequest,因?yàn)樗鞘謾C(jī)APP可以在應(yīng)用層控制的。手機(jī)APP可以在應(yīng)用層構(gòu)造一個(gè)目標(biāo)SSID,啟動(dòng)掃描。比如傳遞”abc”,可以讓手機(jī)掃描名為“abc”的目標(biāo)SSID。WiFi模塊捕捉到這樣的掃描幀之后,就可以從中提取出有用的信息了。
當(dāng)然,上面說的只是原理,真正實(shí)現(xiàn)的時(shí)候,有許多細(xì)節(jié)需要考慮。比如WiFi模塊并不知道手機(jī)在哪個(gè)WiFi信道上發(fā)包,要捕捉到手機(jī)發(fā)出的包,首先要鎖定信道。這就需要一些技巧。另外,安全性也是一個(gè)問題。因?yàn)槭謾C(jī)要把WiFi路由器的密碼傳送給WiFi模塊,如果是明文的,很容易就被截取了,從而給WiFi網(wǎng)絡(luò)帶來極大的安全隱患,這就需要對(duì)數(shù)據(jù)做擾碼,這就需要八仙過海、各顯神通了。
另外,SoftAP和智能配置也不是完全互斥的。智能配置雖然方便,但是在WiFi環(huán)境很復(fù)雜的時(shí)候,還是有一定的失敗概率,而SoftAP是可以保證成功的。所以很多智能設(shè)備都是先用智能方式配置,如果失敗就切換到SoftAP,比如海爾的U+智能家居設(shè)備。
