1. 程式人生 > >如何通過微信配置智慧裝置的WIFI引數

如何通過微信配置智慧裝置的WIFI引數

揭開智慧配置上網(微信Airkiss)的奧妙面紗

轉載地址:http://www.myexception.cn/ai/2027920.html 揭開智慧配置上網(微信Airkiss)的神祕面紗

本文介紹微信利用Airkiss技術對wifi裝置進行智慧配置上網的場景,並分析其實現的原理。這裡再次說明,Airkiss只是用於配置上網,其跟微信硬體平臺的通訊流程和接入協議規範完全沒有關係。一個wifi裝置並不一定要通過Airkiss技術來配置上網,它也可以利用傳統的方法來配置,也可以利用其它廠商的智慧配置技術來完成配置。所有的wifi智慧配置上網技術的原理基本上都是一致的,其開山鼻祖應該是TIsmartConfig。

目前幾乎所有的主流wifi廠商都提供了Airkiss的介面庫,但並沒有說明其原理和實現過程。網上也只見一份Airkiss技術實現方案文件,但需要對無線通訊和socket程式設計有一定基礎的人才能理解。本文儘可能深入淺出地分析這項技術,幫助大家理解。

一、傳統配置上網過程

例如我們買了一個路由器,路由器是沒有按鍵和屏顯示的。而我們都知道,路由器要配置好運營商的賬號和密碼才能接入網際網路的。一般的做法都是路由器作為熱點AP,其提供一個WebServer來設定路由的各項引數,預設IP是192.168.1.1(或者其他IP,路由器說明書上會說明);我們通過電腦有線接入路由器,通過DHCP自動分配到一個192.168.1段的地址。然後通過瀏覽器來訪問http://192.168.1.1,即可以進入路由器設定介面進行設定,包括運營商的賬號和密碼、本機的SSID和密碼。然後我們的手機就可以開啟wifi掃描到SSID,輸入密碼即可以訪問網際網路了。

再比如,我們家裡已經有了一個可以上網的路由器(SSIDx和pwdx)。我們購買了一個無線攝像頭裝在家裡。它自然也要連到家裡的路由,才能訪問這個攝像頭的廠商,這樣我們才可以用手機的APP接收到廠商伺服器傳過來的資料進行顯示。攝像頭也沒有顯示屏和按鍵(reset鍵不算啦)。傳統的配置方法是:

1)攝像頭恢復出廠設定後預設進入AP(熱點)+Station(工作站)狀態。AP熱點的SSID和密碼由攝像頭的說明書說明,是廠商預設的。手機通過wifi連線到該AP,然後通過瀏覽器訪問http://192.168.1.1(也是廠商預設的),在該介面設定家裡的路由器的SSID和密碼,便於其作為Station連入家裡的路由器。

2)當攝像頭連線路由器成功後,其即單獨以Station的模式執行(不用再做AP可以省功耗),其會立即訪問廠商的伺服器(其內部程式程式碼會hardcode廠商服務的域名或者IP),告知其已經上線,並且要在一段週期內傳送Beacon心跳包維持長連線。

3)手機斷開攝像頭的AP熱點,連線家裡的路由器。開啟攝像頭的APP,即可以通過廠商伺服器檢視家裡的攝像頭的效果。

所以傳統的配置上網方法是wifi裝置必須以AP的模式執行,配置好以後再轉回Station模式執行。是不是比較費事?

二、智慧配置上網流程

智慧配置上網最新走進人們視野好像是慶科在大張旗鼓地宣傳其智慧插座的一鍵配置功能,其實最早是Ti推出的技術。它是怎樣操作呢?

1)wifi裝置以Station混雜模式執行。

2)手機智慧配置APP通過某種協議包傳送家裡路由器的SSID和密碼。

3)wifi裝置通過抓包獲取到SSID和密碼,然後連線家裡的路由器。

整個過程是不是很簡單?

三、智慧配置的基本原理

1.混雜模式

這裡有沒有注意到,wifi裝置剛開始同樣是以Station的模式執行,但是還有一個混雜模式。是什麼意思?它是指正常的wifi裝置都有一個MAC地址,其硬體電路會自動過濾目標MAC地址跟其MAC不同的資料包。開啟混雜模式就是我們平常時說的抓包,就是空中符合802.11格式的資料包都接收進來,不管MAC是否一樣。

很明顯,手機智慧配置APP並不知道該wifi裝置的MAC地址,所以手機wifi傳送出的資料包,通過家裡的路由器轉發出去時,wifi裝置必須要在混雜模式下才能接收到這些資料包。

2.通道切換

802.11有多個通道,某個時刻wifi裝置和路由器都是處於某個通道。路由器一般都是預設在第6個通道。所以如果想家裡的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是兩個位元組,但是一幀最長是1492個有效資料,所以也不能完全利用16個位元。以最簡單的方法來使用Length就是使用其中的一個位元組,這樣如果我們要傳送資料0x12345678,那就連續發8個數據幀,第一次的長度是1,第二次的長度是2,以此類推。

四、微信Airkiss

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

1.   物理層

傳送4個位元組的前導碼序列,{1,2,3,4}。即傳送4個數據幀,幀長度分別是1,2,3,4.其要解決兩個問題:

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進行除錯。