本文介紹微信利用Airkiss技術(shù)對(duì)wifi裝備進(jìn)行智能配置上網(wǎng)的場(chǎng)景,并分析其實(shí)現(xiàn)的原理。這里再次說(shuō)明,Airkiss只是用于配置上網(wǎng),其跟微信硬件平臺(tái)的通訊流程和接入?yún)f(xié)議規(guī)范完全沒(méi)有關(guān)系。1個(gè)wifi裝備其實(shí)不1定要通過(guò)Airkiss技術(shù)來(lái)配置上網(wǎng),它也能夠利用傳統(tǒng)的方法來(lái)配置,也能夠利用其它廠商的智能配置技術(shù)來(lái)完成配置。所有的wifi智能配置上網(wǎng)技術(shù)的原理基本上都是1致的,其開(kāi)山鼻祖應(yīng)當(dāng)是TIsmartConfig。
目前幾近所有的主流wifi廠商都提供了Airkiss的接口庫(kù),但并沒(méi)有說(shuō)明其原理和實(shí)現(xiàn)進(jìn)程。網(wǎng)上也只見(jiàn)1份Airkiss技術(shù)實(shí)現(xiàn)方案文檔,但需要對(duì)無(wú)線通訊和socket編程有1定基礎(chǔ)的人材能理解。本文盡量深入淺出地分析這項(xiàng)技術(shù),幫助大家理解。
1、傳統(tǒng)配置上網(wǎng)進(jìn)程
例如我們買了1個(gè)路由器,路由器是沒(méi)有按鍵和屏顯示的。而我們都知道,路由器要配置好運(yùn)營(yíng)商的賬號(hào)和密碼才能接入互聯(lián)網(wǎng)的。1般的做法都是路由器作為熱門(mén)AP,其提供1個(gè)WebServer來(lái)設(shè)置路由的各項(xiàng)參數(shù),默許IP是192.168.1.1(或其他IP,路由器說(shuō)明書(shū)上會(huì)說(shuō)明);我們通過(guò)電腦有線接入路由器,通過(guò)DHCP自動(dòng)分配到1個(gè)192.168.1段的地址。然后通過(guò)閱讀器來(lái)訪問(wèn)http://192.168.1.1,便可以進(jìn)入路由器設(shè)置界面進(jìn)行設(shè)置,包括運(yùn)營(yíng)商的賬號(hào)和密碼、本機(jī)的SSID和密碼。然后我們的手機(jī)就能夠開(kāi)啟wifi掃描到SSID,輸入密碼便可以訪問(wèn)互聯(lián)網(wǎng)了。
再比如,我們家里已有了1個(gè)可以上網(wǎng)的路由器(SSIDx和pwdx)。我們購(gòu)買了1個(gè)無(wú)線攝像頭裝在家里。它自然也要連到家里的路由,才能訪問(wèn)這個(gè)攝像頭的廠商,這樣我們才可以用手機(jī)的APP接收到廠商服務(wù)器傳過(guò)來(lái)的數(shù)據(jù)進(jìn)行顯示。攝像頭也沒(méi)有顯示屏和按鍵(reset鍵不算啦)。傳統(tǒng)的配置方法是:
1)攝像頭恢復(fù)出廠設(shè)置后默許進(jìn)入AP(熱門(mén))+Station(工作站)狀態(tài)。AP熱門(mén)的SSID和密碼由攝像頭的說(shuō)明書(shū)說(shuō)明,是廠商默許的。手機(jī)通過(guò)wifi連接到該AP,然后通過(guò)閱讀器訪問(wèn)http://192.168.1.1(也是廠商默許的),在該界面設(shè)置家里的路由器的SSID和密碼,便于其作為Station連入家里的路由器。
2)當(dāng)攝像頭連接路由器成功后,其即單獨(dú)以Station的模式運(yùn)行(不用再做AP可以省功耗),其會(huì)立即訪問(wèn)廠商的服務(wù)器(其內(nèi)部程序代碼會(huì)hardcode廠商服務(wù)的域名或IP),告知其已上線,并且要在1段周期內(nèi)發(fā)送Beacon心跳包保持長(zhǎng)連接。
3)手機(jī)斷開(kāi)攝像頭的AP熱門(mén),連接家里的路由器。打開(kāi)攝像頭的APP,便可以通過(guò)廠商服務(wù)器查看家里的攝像頭的效果。
所以傳統(tǒng)的配置上網(wǎng)方法是wifi裝備必須以AP的模式運(yùn)行,配置好以后再轉(zhuǎn)回Station模式運(yùn)行。是否是比較費(fèi)事?
2、智能配置上網(wǎng)流程
智能配置上網(wǎng)最新走進(jìn)人們視野好像是慶科在大張旗鼓地宣揚(yáng)其智能插座的1鍵配置功能,其實(shí)最早是Ti推出的技術(shù)。它是怎樣操作呢?
1)wifi裝備以Station混雜模式運(yùn)行。
2)手機(jī)靈能配置APP通過(guò)某種協(xié)議包發(fā)送家里路由器的SSID和密碼。
3)wifi裝備通過(guò)抓包獲得到SSID和密碼,然后連接家里的路由器。
全部進(jìn)程是否是很簡(jiǎn)單?
3、智能配置的基本原理
1.混雜模式
這里有無(wú)注意到,wifi裝備剛開(kāi)始一樣是以Station的模式運(yùn)行,但是還有1個(gè)混雜模式。是甚么意思?它是指正常的wifi裝備都有1個(gè)MAC地址,其硬件電路會(huì)自動(dòng)過(guò)濾目標(biāo)MAC地址跟其MAC不同的數(shù)據(jù)包。開(kāi)啟混雜模式就是我們平常時(shí)說(shuō)的抓包,就是空中符合802.11格式的數(shù)據(jù)包都接收進(jìn)來(lái),不管MAC是不是1樣。
很明顯,手機(jī)靈能配置APP其實(shí)不知道該wifi裝備的MAC地址,所以手機(jī)wifi發(fā)送出的數(shù)據(jù)包,通過(guò)家里的路由器轉(zhuǎn)發(fā)出去時(shí),wifi裝備必須要在混雜模式下才能接收到這些數(shù)據(jù)包。
2.信道切換
802.11有多個(gè)信道,某個(gè)時(shí)刻wifi裝備和路由器都是處于某個(gè)信道。路由器1般都是默許在第6個(gè)信道。所以如果想家里的wifi信號(hào)更好1點(diǎn),可以嘗試將路由器的信道改到1個(gè)其他值,這樣就不會(huì)跟鄰居家的wifi信道堆疊了。無(wú)線信號(hào)混在同1個(gè)頻道就會(huì)干擾的。
同理,我們也不能假定wifi裝備是處于哪一個(gè)信道,但我們可以在APP中肯定手機(jī)wifi的發(fā)送信道,這樣可以要求wifi裝備在1定的時(shí)刻內(nèi)切換信道,以便于接收數(shù)據(jù)包。當(dāng)wifi裝備檢測(cè)到有效的數(shù)據(jù)包后,要鎖定在該信道進(jìn)行后續(xù)通訊。
3.利用數(shù)據(jù)幀的長(zhǎng)度來(lái)承載有效信息
我們先來(lái)看看802.2 SNAP(802.11物理層協(xié)議)的數(shù)據(jù)幀格式:
我們不去深入研究各個(gè)字段的含義,只需要知道DAT是加密的,如路由器都會(huì)通過(guò)WAP2、WEP等方式加密數(shù)據(jù)等。而DA(目標(biāo)MAC)、SA(源MAC)、LLC(邏輯控制)、SNA(廠商朝碼和協(xié)議標(biāo)識(shí))、FCS(校驗(yàn)碼),這5個(gè)字段雖然是沒(méi)有加密的,但是APP層的利用編程難以改變這些字段,需要操作系統(tǒng)才有權(quán)限修改,所以終究能夠利用的字段就是Length,其沒(méi)有被加密,而且能夠被利用層編程所控制。
由于Length是兩個(gè)字節(jié),但是1幀最長(zhǎng)是1492個(gè)有效數(shù)據(jù),所以也不能完全利用16個(gè)比特。以最簡(jiǎn)單的方法來(lái)使用Length就是使用其中的1個(gè)字節(jié),這樣如果我們要發(fā)送數(shù)據(jù)0x12345678,那就連續(xù)發(fā)8個(gè)數(shù)據(jù)幀,第1次的長(zhǎng)度是1,第2次的長(zhǎng)度是2,以此類推。
4、微信Airkiss
Airkiss顧名思義是飛吻的意思,即手機(jī)發(fā)送的SSID和密碼經(jīng)過(guò)路由轉(zhuǎn)發(fā)出去,被目前wifi裝備所檢測(cè)并截獲到。無(wú)線網(wǎng)絡(luò)協(xié)議1般場(chǎng)景都規(guī)定station只能和AP通訊,而不能station和station通訊(這類場(chǎng)景叫做AD-Hoc點(diǎn)對(duì)點(diǎn))。接下來(lái)我們分析SSID和pwd怎樣利用Length進(jìn)行編碼的進(jìn)程。
1. 物理層
發(fā)送4個(gè)字節(jié)的前導(dǎo)碼序列,{1,2,3,4}。即發(fā)送4個(gè)數(shù)據(jù)幀,幀長(zhǎng)度分別是1,2,3,4.其要解決兩個(gè)問(wèn)題:
1)空中充滿無(wú)線信號(hào),通過(guò)前導(dǎo)碼來(lái)辨認(rèn)出符合airkiss協(xié)議的數(shù)據(jù)包的開(kāi)始。
2)數(shù)據(jù)包的數(shù)據(jù)是經(jīng)過(guò)加密的,發(fā)送方的數(shù)據(jù)幀的有效數(shù)據(jù)的長(zhǎng)度是1,經(jīng)過(guò)編碼后的長(zhǎng)度會(huì)發(fā)送變化。假定加密后的長(zhǎng)度為N,那接收方接收到的數(shù)據(jù)長(zhǎng)度是N。以后所有的數(shù)據(jù)幀接收的長(zhǎng)度是M時(shí),那發(fā)送方真實(shí)的數(shù)據(jù)長(zhǎng)度是M-N+1。
Airkiss規(guī)定數(shù)據(jù)的長(zhǎng)度使用9個(gè)bit進(jìn)行編碼。
2.數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層的包括控制字段和數(shù)據(jù)字段。
1)Magic為4個(gè)數(shù)據(jù)幀,兩個(gè)幀的兩個(gè)9bit記錄將要發(fā)送的數(shù)據(jù)(PWD+Ramdon+SSID)的長(zhǎng)度;兩個(gè)幀的兩個(gè)9bit記錄SSID的CRC校驗(yàn)值。路由器的SSID是會(huì)被路由器廣播出來(lái)的,例如我們手機(jī)wifi掃描到路由器的名稱就是SSID。因此wifi裝備也能得到路由器的SSID,其只要計(jì)算目前所能獲得到的SSID的CRC值跟MAGIC的SSID CRC值1樣,那以后的SSID數(shù)據(jù)就不用接收了,這樣能夠提高配置上網(wǎng)速度。Magic很重要,因此發(fā)送5遍。
2)PrefixCode為4個(gè)數(shù)據(jù)幀,兩個(gè)幀的兩個(gè)9bit記錄PWD的數(shù)據(jù)長(zhǎng)度,另外兩個(gè)幀的兩個(gè)9bit記錄PWD長(zhǎng)度的CRC校驗(yàn)值。Magic中發(fā)送的長(zhǎng)度是所有數(shù)據(jù)的長(zhǎng)度,包括密碼PWD、隨機(jī)數(shù)(wifi配置成功后要回復(fù)該隨機(jī)數(shù)作為回復(fù))和SSID。而這里是PWD的長(zhǎng)度,用于對(duì)接收到的數(shù)據(jù)進(jìn)行分段。
3)1個(gè)序列包括1個(gè)序列索引和1個(gè)序列數(shù)據(jù)。協(xié)議規(guī)定將有效數(shù)據(jù)以4個(gè)字節(jié)進(jìn)行劃分,不夠補(bǔ)0。如我家路由的PWD是8313huang,那其會(huì)分為3個(gè)序列,分別是“8313”、“huan”“g???”進(jìn)行發(fā)送。Sequence header包括索引值和CRC值,而Data field就是4個(gè)數(shù)據(jù)幀,包括要發(fā)送的數(shù)據(jù),如“8313”等。
4)如何辨別Magic、Prefix、Sequence和Data,是由9bit的最高幾個(gè)bit來(lái)辨別的。例如最高bit為1時(shí)表示是Data,其他是控制字段。
3.利用層
利用層即是手機(jī)配置上網(wǎng)APP要發(fā)送的數(shù)據(jù),包括3部份的數(shù)據(jù)。分別是:
1)PWD。其先被發(fā)送是由于其是最重要的,而SSID已在MAGIC字段中所確認(rèn)。
2)1個(gè)字節(jié)的隨機(jī)數(shù)。wifi配置成功后要發(fā)送以該隨機(jī)數(shù)為內(nèi)容的UDP廣播包作為回復(fù),APP收到后即認(rèn)為wifi裝備已成功聯(lián)網(wǎng)。
3)SSID。
5、ESP8266 Airkiss
微信硬件開(kāi)放文檔有《airkiss_developer_manual.pdf》介紹在ESP8266平臺(tái)上利用Airkiss接口庫(kù)進(jìn)行開(kāi)發(fā)實(shí)現(xiàn)Airkiss協(xié)議的進(jìn)程。而ESP8266的廠商提供的DEMO則更加直接地用1個(gè)接口就實(shí)現(xiàn)了Airkiss。
6、微信Airkiss
微信Airkiss在正式產(chǎn)品中是需要通過(guò)硬件JSAPI進(jìn)行調(diào)用來(lái)調(diào)動(dòng)身送SSID和PWD的界面,而硬件JSAPI需要經(jīng)過(guò)驗(yàn)證的服務(wù)號(hào)才能申請(qǐng)取得權(quán)限。沒(méi)有權(quán)限時(shí)可使用AirkissDebugger這個(gè)APP進(jìn)行調(diào)試。
敬請(qǐng)關(guān)注微信公眾號(hào):嵌入式企鵝圈,獲得更多嵌入式和物聯(lián)網(wǎng)原創(chuàng)技術(shù)分享!
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。