Airkiss 文章一

? ? 本文介紹微信的airkiss技術對wifi設備進行智能配置上網的場景,并分析其實現原理。這里再次說明,airkiss只是用于上網配置,其跟微信硬件平臺的通信流程和介入協議規范完全沒有關系,一個wifi設備并不一定要通過airkiss技術配置上網,它也可以利用傳統方法來配置,也可以利用其他廠商的智能配置技術來完成配置。所有的wifi智能配置上網技術的原理基本上是一致的,其開山鼻祖應該是TLsmartConfig。

目前幾乎所有的主流wifi廠商都提供了airkiss的接口庫,但是并沒有說明其實現原理和實現過程。網上也只有一份airkiss的實現技術方案。但需要對無線通信和socket編程器有一定基礎的的人才能理解。

一 ?傳統的上網配置過程

例如我們買了一個路由器,路由器沒有按鍵和顯示屏,但是我們都知道,路由器要配置好運營商的賬號和密碼才能接入互聯網。一般的做法是路由器作為熱點ap,并提供一個webservice來設置路由的各項參數。默認的ip是192.168.1.1 ? 我們通過電腦有限介入路由器,通過DHCP自動分配到一個192.168.1段的地址,然后通過瀏覽器來訪問192.168.1.1 ,就可以進入到路由器設置接,包括運營商的賬號和密碼,本機的ssid和密碼。然后我們的手機通過開啟wifi掃描到ssid,輸入密碼就可以訪問到互聯網

再比如 ,我們家里已經有一個可以上網的路由器。我們購買了一個無線攝像頭放在家里。他自然也要連接家里的路由,才能訪問這個攝像頭的廠商,這樣我們才可以用手機app接收到廠商服務器傳過來的數據并進行顯示,攝像頭也沒有顯示屏和按鍵。傳統的配置方法是:

1. 攝像頭恢復出廠設置后進入ap熱點+ station狀態。ap熱點的ssid和密碼是攝像頭的說明書說明,是廠商默認的。手機通過wifi連接到這個ap,然后通過瀏覽器訪問192.168.1.1(也是廠商默認),在這個界面設置家里的路由器的ssid和密碼,便于其作為station聯入家里的路由器

2. 當攝像頭連接路由器成功后,其便以單獨的station的模式運行,其會立即訪問廠商的服務器(其內部程序代碼會hardcode廠商服務的域名和ip),告知其已經上線,并且要在一段時間周期里面發送beacon心跳包維持長連接

3 手機斷開攝像頭的ap熱點,連接家里的路由器,打開攝像頭廠家提供的app,就可以通過廠商服務器查看家里的攝像頭的效果

所以傳統的配置上網的方法是wifi設備必須要以ap的模式運行,配置好以后在轉回station的模式運行。比較費事

二 ?智能配置上網的流程

智能設備上網的最早進入人們的視野好像是慶科在大張旗鼓的宣傳其為智能插座的一件配置功能,其實最早是Ti提出的技術,具體的操作

1. wifi設備以station混雜模式運行

2. 手機智能配置App通過某種協議發送家里的路由器ssid和密碼

3. wifi設備通過抓包獲取到ssid和密碼,然后連接到家里的路由器

三 智能配置的基本原理

1. 混雜模式

這里有沒有注意到,wifi設備剛開始同樣是station的模式運行。但是還有一個混雜模式,是指,正常的Wi-Fi設備都會有一個mac地址,其硬件電路會自動過濾目標的mac地址跟其他mac不同的數據包。開啟混雜模式就是我們平常說的抓包,就是空中符合802.11格式的數據包都接收進來,不管mac是否一樣

很明顯,手機智能配置app不知道該Wi-Fi設備的mac地址,所以手機wifi發送出的數據包,通過家里的路由轉發出去時,wifi設備必須要在混雜模式下才能接收到這些數據包。

2 信道切換

802.11有多個信道,某一個時候wifi設備和路由器都處于某一個信道。路由器一般都是默認在第六信道,所以要想家里的網信號好一點,可以嘗試將路由器的信道改到一個其他道,這樣就不會和鄰居家的wifi信道重疊了。wifi信號混在同一個頻道就會互相干擾

同理,我們也不能假定wifi設備是處于哪個信道,但是我們可以在app中確定手機wifi的發送信道,這樣要求wifi設備在一定的時刻切換信道,以便與接收到數據包。當wifi設備檢測到有效的數據包,藥鎖定在該信道進行后續的通信

3 利用數據幀的長度來承載有效信息

我們先來看一看802.2 SNAP(802.11的物理層協議)的數據幀格式



我們不去深入研究字段的含義,只需要知道DAT是加密的,如路由器會通過WAP2,WEP等方式加密數據.而DA(目標mac),SA(源mac),LLC(邏輯控制),SNA (廠商代碼和協議標識), FCS(校驗碼), 這五個字段雖然是沒有加密的,但是app的應用編程難以改變這些字段,需要操作系統才有權限修改,所以最終能利用的字段就是length,其沒有被加密,并且能夠被應用層編程所控制

由于Length是2個字節,但是一禎最長有1492個有效數據,所以也不能完全的利用16個比特。以最簡單的飯食來使用Length就是使用其中的一個字節,這樣如果我們要發送數據Ox12345678,那就連續發8個數據幀,第一次的長度是1,第二次的長度是2,以此類推

四 ?airkiss

顧名思義就是飛吻的意思,即手機發送的ssid和密碼經過路由轉發出去,被目前的wifi設備所檢測并截獲到。無線網絡協議一般場景都規定station只能和ap通信,而不能station和station通信(這種場景叫做AD-Hoc點對點)。接下來我們分析ssid和pwd怎么利用Length進行編碼的過程


1. 物理層

發送4個字節的前導碼序列【1,2,3,4】。即發送4個數據幀,幀長分別為1,2,3,4,其藥解決2個問題

1. 空氣中充滿無線信號,通過前導碼來識別出符合airkiss協議的數據包的開始

2. 數據包的數據是經過加密的,發送方的數據幀的有效數據的長度是1,經過編碼后的長度會發送變化。假設加密后的長度為N,那接收方接收到的數據長度是N。以后所有的數據幀接收的長度是M時,那發送方真正的數據長度是M-N+1。

Airkiss規定數據的長度使用9個bit進行編碼

2 數據鏈路層


數據鏈路層包括控制字段和數據字段

(1)Magic為4個數據幀,兩個幀的兩個9bit記錄將要發送的數據(PWD+Ramdon+SSID)的長度;兩個幀的兩個9bit記錄SSID的CRC校驗值。路由器的SSID是會被路由器廣播出來的,例如我們手機wifi掃描到路由器的名稱就是SSID。因此wifi設備也能得到路由器的SSID,其只要計算目前所能獲取到的SSID的CRC值跟MAGIC的SSID CRC值一樣,那之后的SSID數據就不用接收了,這樣能夠提高配置上網速度。Magic很重要,因此發送5遍。

2)PrefixCode為4個數據幀,兩個幀的兩個9bit記錄PWD的數據長度,另外兩個幀的兩個9bit記錄PWD長度的CRC校驗值。Magic中發送的長度是所有數據的長度,包括密碼PWD、隨機數(wifi配置成功后要回復該隨機數作為回復)和SSID。而這里是PWD的長度,用于對接收到的數據進行分段。

3)一個序列包括一個序列索引和一個序列數據。協議規定將有效數據以4個字節進行劃分,不夠補0。如我家路由的PWD是8313huang,那其會分為3個序列,分別是“8313”、“huan”“g\0\0\0”進行發送。Sequence header包括索引值和CRC值,而Data field就是4個數據幀,包含要發送的數據,如“8313”等。

4)如何區分Magic、Prefix、Sequence和Data,是由9bit的最高幾個bit來區分的。例如最高bit為1時表示是Data,其他是控制字段。

3.應用層

應用層即是手機配置上網APP要發送的數據,包括三部分的數據。分別是:

1)PWD。其先被發送是因為其是最重要的,而SSID已經在MAGIC字段中所確認。

2)1個字節的隨機數。wifi配置成功后要發送以該隨機數為內容的UDP廣播包作為回復,APP收到后即認為wifi設備已經成功聯網。

3)SSID。

五、ESP8266 Airkiss

微信硬件開放文檔有《airkiss_developer_manual.pdf》介紹在ESP8266平臺上利用Airkiss接口庫進行開發實現Airkiss協議的過程。而ESP8266的廠商提供的DEMO則更加直接地用一個接口就實現了Airkiss。

六、微信Airkiss

微信Airkiss在正式產品中是需要通過硬件JSAPI進行調用來調出發送SSID和PWD的界面,而硬件JSAPI需要經過驗證的服務號才能申請獲得權限。沒有權限時可以使用AirkissDebugger這個APP進行調試。


參考文獻http://blog.csdn.net/yueqian_scut/article/details/49313727?utm_source=tuicool&utm_medium=referral

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容