揭開智能配置上網(微信Airkiss)的神祕面紗

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

  目前幾乎全部的主流wifi廠商都提供了Airkiss的接口庫,但並無說明其原理和實現過程。網上也只見一份Airkiss技術實現方案文檔,但須要對無線通訊和socket編程有必定基礎的人才能理解。本文儘量深刻淺出地分析這項技術,幫助你們理解。瀏覽器

1、傳統配置上網過程服務器

  例如咱們買了一個路由器,路由器是沒有按鍵和屏顯示的。而咱們都知道,路由器要配置好運營商的帳號和密碼才能接入互聯網的。通常的作法都是路由器做爲熱點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連入家裏的路由器。socket

  2)當攝像頭鏈接路由器成功後,其即單獨以Station的模式運行(不用再作AP能夠省功耗),其會當即訪問廠商的服務器(其內部程序代碼會hardcode廠商服務的域名或者IP),告知其已經上線,而且要在一段週期內發送Beacon心跳包維持長鏈接。編碼

  3)手機斷開攝像頭的AP熱點,鏈接家裏的路由器。打開攝像頭的APP,便可以經過廠商服務器查看家裏的攝像頭的效果。加密

  因此傳統的配置上網方法是wifi設備必須以AP的模式運行,配置好之後再轉回Station模式運行。是否是比較費事?操作系統

2、智能配置上網流程調試

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

  1)wifi設備以Station混雜模式運行。

  2)手機智能配置APP經過某種協議包發送家裏路由器的SSID和密碼。

  3)wifi設備經過抓包獲取到SSID和密碼,而後鏈接家裏的路由器。

  整個過程是否是很簡單?

3、智能配置的基本原理

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是加密的,如路由器都會經過WAP二、WEP等方式加密數據等。而DA(目標MAC)、SA(源MAC)、LLC(邏輯控制)、SNA(廠商代碼和協議標識)、FCS(校驗碼),這五個字段雖然是沒有加密的,可是APP層的應用編程難以改變這些字段,須要操做系統纔有權限修改,因此最終可以利用的字段就是Length,其沒有被加密,並且可以被應用層編程所控制。

      因爲Length是兩個字節,可是一幀最長是1492個有效數據,因此也不能徹底利用16個比特。以最簡單的方法來使用Length就是使用其中的一個字節,這樣若是咱們要發送數據0x12345678,那就連續發8個數據幀,第一次的長度是1,第二次的長度是2,以此類推。

4、微信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。

5、ESP8266 Airkiss

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

6、微信Airkiss

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

 

  敬請關注微信公衆號:嵌入式企鵝圈,獲取更多嵌入式和物聯網原創技術分享!

相關文章
相關標籤/搜索