1. 概述
ESP-TOUCH是Espressif公司自主研究的一鍵智能配網工具,幫助用戶將使用ESP8266的硬件產品連接Wi-Fi網絡。用戶只需在手機上配合硬件產品進行簡單的操作即可實現智能配網連接Wi-Fi路由。
目前app是開源的,Android和ios代碼均可在github上下載到,設備端RTOS版本SDK和NON_OS版本SDK使用同樣的ESP-TOUCH。下載地址如下:
安卓版 | 最新版本:0.3.4.5 | |
ios版 | 最新版本:0.3.5.1 |
正式版app也可以各大應用市場下載到。同時ESP-TOUCH用戶指南手冊可在Espressif官網下載到,目前最新版本爲30b-esp-touch_user_guide_cn_v1.1_20160412.pdf。目前官方對ESP-TOUCH持續優化中,應用時請使用最新版本的代碼。
ESP-TOUCH的設備端解碼Espressif沒有開源,提供的是一個smartconfig.a文件,但提供了sniffer接口供需要自己開發的鍵配網協議的用戶使用。sniffer接口使用指南也可在Espressif官網下載到,詳見esp8266-technical_reference_cn.pdf的第14章《sniffer應用設計說明》以及20a-esp8266_rtos_sdk_programming_guide_cn.pdf的第4部分《sniffer結構體說明》。
2. ESP-TOUCH編碼原理
由於設備一開始並未連接Wi-Fi網絡,ESP-TOUCH無法直接向設備發送數據,ESP-TOUCH只能通過向手機當前接入的AP發送一系列UDP包,其中每一包的長度(Length字段)都按照ESP-TOUCH的通訊協議編碼,SSID和密碼就包含在Length字段中
受MTU長度限制,一個udp數據包Length最大隻能傳輸10bit數據(最大1500byte),而udp數據包長度和丟包率/亂序率成正比,即數據包長度越長,丟包率/亂序率越高,所有一般將最大數據包長度限制在9bit以內
此時設備應工作在在混雜模式下,才能接收到ESP-TOUCH發送的數據包.在混雜模式下,設備將收到當前環境下所有環境下所有Wi-Fi設備(AP/STATION)數據,需要通過一定的算法,才能正確的識別到ESP-TOUCH的數據包.
3. ESP-TOUCH編碼
ESP-TOUCH編碼由”GuideCode”+”DatumData”+”Data”3部分組成
1) GuideCode:
GuideCode由515/514/513/512組成,4包爲一組,需要連續發送10組以上;通過Wireshark抓包發現ESP-TOUCH官方APP不同版本,發送的前導碼數量並不完全一致
App版本 | 循環發送數量 | 前導碼重複規律 |
Android版ESP-TOUCH | 10組 | 25組數據後重復發送10組 |
IOS版ESP-TOUCH | 39組 | 98組數據後重復發送39組 |
Android版IOT Espressif | 11組 | 25組數據後重復發送10組/9組 |
IOS版IOT Espressif | 39組 | 98組數據後重復發送39組 |
Android版ESP-TOUCH
IOS版ESP-TOUCH
Android版IOT Espressif
IOS版IOT Espressif
2) DatumData:
DatumData由5部分組成,分別爲”totaldata_len” + ”password_len” + ”ssid_crc8” + “bssid_crc8” + “total_data xor”;
① totaldata_len:總數據長度1字節;
固定5字節DatumData + ip地址長度+ password_len + [ssid_len];其中:ssid_len需要根據當前網絡是否隱藏判斷是否需要加入;如app上選擇爲隱藏才需要加入
② password_len:密碼長度1字節
③ ssid_crc8:ssid的crc8結果1字節
④ bssid_crc8:bssid的crc8結果1字節
⑤ total_data xor:全部數據異或結果1字節
⑥ 如當前ssid是隱藏網絡,totaldata_len須加ssid_len;同時Data區也須加ssid;否則不加此2項內容;但total_data xor必須加入ssid計算xor;
crc8採用標準多項式x8+x5+x4+1,依次對byte和seq做crc8校驗
DatumData發送完後發送Data
3) Data:
Data由5部分組成,分別爲:
ip_address(4 byte) + ap_password + [ap_ssid]
其中ap_ssid需要根據當前網絡是否隱藏判斷是否需要加入;如app上選擇爲隱藏才需要加入
4) DatumData和Data發送規則:
一組由3包組成,每組傳送1字節有效數據,每包Length爲9bit,每一組由如下格式數據組成:
| control byte | high 4 bits | low 4 bits |
1st 9bits | 0x0 | crc(high) | data(high) |
2nd 9bits | 0x1 | sequence header | |
3rd 9bits | 0x0 | crc(low) | data(low) |
① sequence header: 從0開始,每一組數據加1
② ssid是否發送,需要根據當前網絡是否爲隱藏網絡,如是隱藏網絡則鬚髮送ssid;否則不發送
③ 每一包數據內的3個數據在組包完成後都須+40
4. ESP-TOUCH解碼
我們將手機連接上路由,在手機上通過安卓版Esp_touoch發包,並在PC上通過Wireshark抓包。其中路由器名稱爲“360wifi”,密碼爲“1234567890”。我們可以看到在Wireshark上抓到有規律的數據包:
1) GuideCode:
在設備上,我們接收到的實際數據包長度爲557/556/555/554,按照編碼規則對應515/514/513/512。所以,我們就可以獲取到數據包基準值爲554-512=42,這個基準值將用在後續解碼中,非常重要,故必須先快速、準確的獲取基準值。該基準值會應該路由器加密方式不同或者手機設備不同而不同。
l 基準值:42
2) DatumData與Data
正確獲取到GuideCode的基準值後,我們在接收到餘下的數據包後,將數據包長度減去基準值,並按照上訴編碼規則反推。
我們將數據依次記錄並整理成表格,如下所示:
減基準值前 (十進制格式顯示) | 減基準值後 (十進制格式顯示) | 減去序號40 (16進制格式顯示) | 解碼結果 | ||
CRC8 | 序號 | value | |||
83/338/268 | 41/296/226 | 0x01/0x100/0xba | 0x0b | 0x00 | 0x1a |
258/339/236 | 216/297/194 | 0xb0/0x101/0x9a | 0xb9 | 0x01 | 0x0a |
250/340/214 | 208/298/172 | 0xa8/0x102/0x84 | 0xa8 | 0x02 | 0x84 |
330/341/96 | 258/299/54 | 0xda/0x103/0x0e | 0xd0 | 0x03 | 0xae |
192/342/122 | 150/300/80 | 0x6e/0x104/0x28 | 0x62 | 0x04 | 0xe8 |
236/343/286 | 194/301/244 | 0x9a/0x105/0xcc | 0x9c | 0x05 | 0xac |
227/344/264 | 185/302/222 | 0x91/0x106/0xb6 | 0x9b | 0x06 | 0x16 |
86/345/97 | 44/303/55 | 0x04/0x107/0x0f | 0x00 | 0x07 | 0x4f |
162/346/132 | 120/304/90 | 0x50/0x108/0x32 | 0x53 | 0x08 | 0x02 |
197/347/163 | 155/305/121 | 0x73/0x109/0x51 | 0x75 | 0x09 | 0x31 |
277/348/116 | 235/306/74 | 0xc3/0x10a/0x22 | 0xc2 | 0x0a | 0x32 |
165/349/213 | 123/307/171 | 0x53/0x10b/0x83 | 0x58 | 0x0b | 0x33 |
261/350/166 | 219/308/124 | 0xb3/0x10c/0x84 | 0xb8 | 0x0c | 0x34 |
117/351/327 | 75/309/285 | 0x23/0x10d/0xF5 | 0x2f | 0x0d | 0x35 |
229/352/216 | 187/310/174 | 0x93/0x10e/0x86 | 0x98 | 0x0e | 0x36 |
85/353/121 | 43/311/79 | 0x03/0x10f/0x27 | 0x03 | 0x0f | 0x37 |
277/354/186 | 235/312/144 | 0xc3/0x110/0x68 | 0xc6 | 0x10 | 0x38 |
165/355/283 | 123/313/241 | 0x53/0x111/0xc9 | 0x5c | 0x11 | 0x39 |
85/356/274 | 43/314/232 | 0x03/0x112/0xc0 | 0x0c | 0x12 | 0x30 |
5. ESP-TOUCH解碼結果驗證
從上面的表格,我們正確的獲取到Esp_Touch配置app發送的數據:
① totaldata_len:0x1a((5+4+10)+7)
② password_len:0x0a
③ ssid_crc8:0x84
④ bssid_crc8:0xae
⑤ total_data xor:0xe8
⑥ ip_address:”172.22.79.2”
⑦ ap_password:”1234567890”
手機ip_address
EspTouch配置界面
由上可見,EspTouch解碼結果與EspTouch發送app結果一致