注:本篇文章屬于轉(zhuǎn)載
本文介紹微信利用Airkiss技術(shù)對wifi設(shè)備進行智能配置上網(wǎng)的場景本讥,并分析其實現(xiàn)的原理。這里再次說明,Airkiss只是用于配置上網(wǎng)拷沸,其跟微信硬件平臺的通信流程和接入?yún)f(xié)議規(guī)范完全沒有關(guān)系色查。一個wifi設(shè)備并不一定要通過Airkiss技術(shù)來配置上網(wǎng),它也可以利用傳統(tǒng)的方法來配置撞芍,也可以利用其它廠商的智能配置技術(shù)來完成配置秧了。所有的wifi智能配置上網(wǎng)技術(shù)的原理基本上都是一致的,其開山鼻祖應(yīng)該是TIsmartConfig序无。
目前幾乎所有的主流wifi廠商都提供了Airkiss的接口庫验毡,但并沒有說明其原理和實現(xiàn)過程。網(wǎng)上也只見一份Airkiss技術(shù)實現(xiàn)方案文檔帝嗡,但需要對無線通信和socket編程有一定基礎(chǔ)的人才能理解晶通。本文盡可能深入淺出地分析這項技術(shù),幫助大家理解哟玷。
一狮辽、傳統(tǒng)配置上網(wǎng)過程
例如我們買了一個路由器,路由器是沒有按鍵和屏顯示的巢寡。而我們都知道喉脖,路由器要配置好運營商的賬號和密碼才能接入互聯(lián)網(wǎng)的。一般的做法都是路由器作為熱點AP抑月,其提供一個WebServer來設(shè)置路由的各項參數(shù)树叽,默認IP是192.168.1.1(或者其他IP,路由器說明書上會說明)爪幻;我們通過電腦有線接入路由器菱皆,通過DHCP自動分配到一個192.168.1段的地址。然后通過瀏覽器來訪問http://192.168.1.1挨稿,即可以進入路由器設(shè)置界面進行設(shè)置仇轻,包括運營商的賬號和密碼、本機的SSID和密碼奶甘。然后我們的手機就可以開啟wifi掃描到SSID篷店,輸入密碼即可以訪問互聯(lián)網(wǎng)了。
再比如臭家,我們家里已經(jīng)有了一個可以上網(wǎng)的路由器(SSIDx和pwdx)疲陕。我們購買了一個無線攝像頭裝在家里。它自然也要連到家里的路由钉赁,才能訪問這個攝像頭的廠商蹄殃,這樣我們才可以用手機的APP接收到廠商服務(wù)器傳過來的數(shù)據(jù)進行顯示。攝像頭也沒有顯示屏和按鍵(reset鍵不算啦)你踩。傳統(tǒng)的配置方法是:
1)攝像頭恢復(fù)出廠設(shè)置后默認進入AP(熱點)+Station(工作站)狀態(tài)诅岩。AP熱點的SSID和密碼由攝像頭的說明書說明讳苦,是廠商默認的。手機通過wifi連接到該AP吩谦,然后通過瀏覽器訪問http://192.168.1.1(也是廠商默認的)鸳谜,在該界面設(shè)置家里的路由器的SSID和密碼,便于其作為Station連入家里的路由器式廷。
2)當(dāng)攝像頭連接路由器成功后咐扭,其即單獨以Station的模式運行(不用再做AP可以省功耗),其會立即訪問廠商的服務(wù)器(其內(nèi)部程序代碼會hardcode廠商服務(wù)的域名或者IP)滑废,告知其已經(jīng)上線蝗肪,并且要在一段周期內(nèi)發(fā)送Beacon心跳包維持長連接。
3)手機斷開攝像頭的AP熱點蠕趁,連接家里的路由器穗慕。打開攝像頭的APP,即可以通過廠商服務(wù)器查看家里的攝像頭的效果妻导。
所以傳統(tǒng)的配置上網(wǎng)方法是wifi設(shè)備必須以AP的模式運行逛绵,配置好以后再轉(zhuǎn)回Station模式運行。是不是比較費事倔韭?
二术浪、智能配置上網(wǎng)流程
智能配置上網(wǎng)最新走進人們視野好像是慶科在大張旗鼓地宣傳其智能插座的一鍵配置功能,其實最早是Ti推出的技術(shù)寿酌。它是怎樣操作呢胰苏?
1)wifi設(shè)備以Station混雜模式運行。
2)手機智能配置APP通過某種協(xié)議包發(fā)送家里路由器的SSID和密碼醇疼。
3)wifi設(shè)備通過抓包獲取到SSID和密碼硕并,然后連接家里的路由器。
整個過程是不是很簡單秧荆?
三倔毙、智能配置的基本原理
1.混雜模式
這里有沒有注意到,wifi設(shè)備剛開始同樣是以Station的模式運行乙濒,但是還有一個混雜模式陕赃。是什么意思?它是指正常的wifi設(shè)備都有一個MAC地址颁股,其硬件電路會自動過濾目標(biāo)MAC地址跟其MAC不同的數(shù)據(jù)包么库。開啟混雜模式就是我們平常時說的抓包,就是空中符合802.11格式的數(shù)據(jù)包都接收進來甘有,不管MAC是否一樣诉儒。
很明顯,手機智能配置APP并不知道該wifi設(shè)備的MAC地址亏掀,所以手機wifi發(fā)送出的數(shù)據(jù)包忱反,通過家里的路由器轉(zhuǎn)發(fā)出去時运准,wifi設(shè)備必須要在混雜模式下才能接收到這些數(shù)據(jù)包。
2.信道切換
802.11有多個信道缭受,某個時刻wifi設(shè)備和路由器都是處于某個信道。路由器一般都是默認在第6個信道该互。所以如果想家里的wifi信號更好一點米者,可以嘗試將路由器的信道改到一個其他值,這樣就不會跟鄰居家的wifi信道重疊了宇智。無線信號混在同一個頻道就會干擾的蔓搞。
同理,我們也不能假定wifi設(shè)備是處于哪個信道随橘,但我們可以在APP中確定手機wifi的發(fā)送信道喂分,這樣可以要求wifi設(shè)備在一定的時刻內(nèi)切換信道,以便于接收數(shù)據(jù)包机蔗。當(dāng)wifi設(shè)備檢測到有效的數(shù)據(jù)包后蒲祈,要鎖定在該信道進行后續(xù)通信。
3.利用數(shù)據(jù)幀的長度來承載有效信息
我們先來看看802.2 SNAP(802.11物理層協(xié)議)的數(shù)據(jù)幀格式:
我們不去深入研究各個字段的含義萝嘁,只需要知道DAT是加密的梆掸,如路由器都會通過WAP2、WEP等方式加密數(shù)據(jù)等牙言。而DA(目標(biāo)MAC)酸钦、SA(源MAC)、LLC(邏輯控制)咱枉、SNA(廠商代碼和協(xié)議標(biāo)識)卑硫、FCS(校驗碼),這五個字段雖然是沒有加密的蚕断,但是APP層的應(yīng)用編程難以改變這些字段欢伏,需要操作系統(tǒng)才有權(quán)限修改,所以最終能夠利用的字段就是Length亿乳,其沒有被加密颜懊,而且能夠被應(yīng)用層編程所控制。
由于Length是兩個字節(jié)风皿,但是一幀最長是1492個有效數(shù)據(jù)河爹,所以也不能完全利用16個比特。以最簡單的方法來使用Length就是使用其中的一個字節(jié)桐款,這樣如果我們要發(fā)送數(shù)據(jù)0x12345678咸这,那就連續(xù)發(fā)8個數(shù)據(jù)幀,第一次的長度是1魔眨,第二次的長度是2媳维,以此類推酿雪。
四、微信Airkiss
Airkiss顧名思義是飛吻的意思侄刽,即手機發(fā)送的SSID和密碼經(jīng)過路由轉(zhuǎn)發(fā)出去指黎,被目前wifi設(shè)備所檢測并截獲到。無線網(wǎng)絡(luò)協(xié)議一般場景都規(guī)定station只能和AP通信州丹,而不能station和station通信(這種場景叫做AD-Hoc點對點)醋安。接下來我們分析SSID和pwd怎么利用Length進行編碼的過程。
1.???物理層
發(fā)送4個字節(jié)的前導(dǎo)碼序列墓毒,{1,2,3,4}吓揪。即發(fā)送4個數(shù)據(jù)幀,幀長度分別是1,2,3,4.其要解決兩個問題:
1)空中充滿無線信號所计,通過前導(dǎo)碼來識別出符合airkiss協(xié)議的數(shù)據(jù)包的開始柠辞。
2)數(shù)據(jù)包的數(shù)據(jù)是經(jīng)過加密的,發(fā)送方的數(shù)據(jù)幀的有效數(shù)據(jù)的長度是1主胧,經(jīng)過編碼后的長度會發(fā)送變化叭首。假設(shè)加密后的長度為N,那接收方接收到的數(shù)據(jù)長度是N踪栋。以后所有的數(shù)據(jù)幀接收的長度是M時放棒,那發(fā)送方真正的數(shù)據(jù)長度是M-N+1。
Airkiss規(guī)定數(shù)據(jù)的長度使用9個bit進行編碼己英。
2.數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層的包括控制字段和數(shù)據(jù)字段间螟。
1)Magic為4個數(shù)據(jù)幀,兩個幀的兩個9bit記錄將要發(fā)送的數(shù)據(jù)(PWD+Ramdon+SSID)的長度损肛;兩個幀的兩個9bit記錄SSID的CRC校驗值厢破。路由器的SSID是會被路由器廣播出來的,例如我們手機wifi掃描到路由器的名稱就是SSID治拿。因此wifi設(shè)備也能得到路由器的SSID摩泪,其只要計算目前所能獲取到的SSID的CRC值跟MAGIC的SSID CRC值一樣,那之后的SSID數(shù)據(jù)就不用接收了劫谅,這樣能夠提高配置上網(wǎng)速度见坑。Magic很重要,因此發(fā)送5遍捏检。
2)PrefixCode為4個數(shù)據(jù)幀荞驴,兩個幀的兩個9bit記錄PWD的數(shù)據(jù)長度,另外兩個幀的兩個9bit記錄PWD長度的CRC校驗值贯城。Magic中發(fā)送的長度是所有數(shù)據(jù)的長度熊楼,包括密碼PWD、隨機數(shù)(wifi配置成功后要回復(fù)該隨機數(shù)作為回復(fù))和SSID能犯。而這里是PWD的長度鲫骗,用于對接收到的數(shù)據(jù)進行分段犬耻。
3)一個序列包括一個序列索引和一個序列數(shù)據(jù)。協(xié)議規(guī)定將有效數(shù)據(jù)以4個字節(jié)進行劃分执泰,不夠補0枕磁。如我家路由的PWD是8313huang,那其會分為3個序列术吝,分別是“8313”计济、“huan”“g\0\0\0”進行發(fā)送。Sequence header包括索引值和CRC值顿苇,而Data field就是4個數(shù)據(jù)幀,包含要發(fā)送的數(shù)據(jù)税弃,如“8313”等纪岁。
4)如何區(qū)分Magic、Prefix则果、Sequence和Data幔翰,是由9bit的最高幾個bit來區(qū)分的。例如最高bit為1時表示是Data西壮,其他是控制字段遗增。
3.應(yīng)用層
應(yīng)用層即是手機配置上網(wǎng)APP要發(fā)送的數(shù)據(jù),包括三部分的數(shù)據(jù)款青。分別是:
1)PWD做修。其先被發(fā)送是因為其是最重要的,而SSID已經(jīng)在MAGIC字段中所確認抡草。
2)1個字節(jié)的隨機數(shù)饰及。wifi配置成功后要發(fā)送以該隨機數(shù)為內(nèi)容的UDP廣播包作為回復(fù),APP收到后即認為wifi設(shè)備已經(jīng)成功聯(lián)網(wǎng)康震。
3)SSID燎含。
五、ESP8266 Airkiss
微信硬件開放文檔有《airkiss_developer_manual.pdf》介紹在ESP8266平臺上利用Airkiss接口庫進行開發(fā)實現(xiàn)Airkiss協(xié)議的過程腿短。而ESP8266的廠商提供的DEMO則更加直接地用一個接口就實現(xiàn)了Airkiss屏箍。
六、微信Airkiss
微信Airkiss在正式產(chǎn)品中是需要通過硬件JSAPI進行調(diào)用來調(diào)出發(fā)送SSID和PWD的界面橘忱,而硬件JSAPI需要經(jīng)過驗證的服務(wù)號才能申請獲得權(quán)限赴魁。沒有權(quán)限時可以使用AirkissDebugger這個APP進行調(diào)試。