ESP-TOUCH编码规则及解码
https://blog.csdn.net/flyingcys/article/details/54670688
1.?概述
ESP-TOUCH是Espressif公司自主研究的一鍵智能配網(wǎng)工具,幫助用戶將使用ESP8266的硬件產(chǎn)品連接Wi-Fi網(wǎng)絡(luò)。用戶只需在手機上配合硬件產(chǎn)品進行簡單的操作即可實現(xiàn)智能配網(wǎng)連接Wi-Fi路由。
目前app是開源的,Android和ios代碼均可在github上下載到,設(shè)備端RTOS版本SDK和NON_OS版本SDK使用同樣的ESP-TOUCH。下載地址如下:
| 安卓版 | https://github.com/EspressifApp/ESP-TOUCHForAndroid | 最新版本:0.3.4.5 |
| ios版 | https://github.com/EspressifApp/ESP-TOUCHForIOS | 最新版本:0.3.5.1 |
正式版app也可以各大應(yīng)用市場下載到。同時ESP-TOUCH用戶指南手冊可在Espressif官網(wǎng)下載到,目前最新版本為30b-esp-touch_user_guide_cn_v1.1_20160412.pdf。目前官方對ESP-TOUCH持續(xù)優(yōu)化中,應(yīng)用時請使用最新版本的代碼。
ESP-TOUCH的設(shè)備端解碼Espressif沒有開源,提供的是一個smartconfig.a文件,但提供了sniffer接口供需要自己開發(fā)的鍵配網(wǎng)協(xié)議的用戶使用。sniffer接口使用指南也可在Espressif官網(wǎng)下載到,詳見esp8266-technical_reference_cn.pdf的第14章《sniffer應(yīng)用設(shè)計說明》以及20a-esp8266_rtos_sdk_programming_guide_cn.pdf的第4部分《sniffer結(jié)構(gòu)體說明》。
2.?ESP-TOUCH編碼原理
由于設(shè)備一開始并未連接Wi-Fi網(wǎng)絡(luò),ESP-TOUCH無法直接向設(shè)備發(fā)送數(shù)據(jù),ESP-TOUCH只能通過向手機當(dāng)前接入的AP發(fā)送一系列UDP包,其中每一包的長度(Length字段)都按照ESP-TOUCH的通訊協(xié)議編碼,SSID和密碼就包含在Length字段中
?
受MTU長度限制,一個udp數(shù)據(jù)包Length最大只能傳輸10bit數(shù)據(jù)(最大1500byte),而udp數(shù)據(jù)包長度和丟包率/亂序率成正比,即數(shù)據(jù)包長度越長,丟包率/亂序率越高,所有一般將最大數(shù)據(jù)包長度限制在9bit以內(nèi)
此時設(shè)備應(yīng)工作在在混雜模式下,才能接收到ESP-TOUCH發(fā)送的數(shù)據(jù)包.在混雜模式下,設(shè)備將收到當(dāng)前環(huán)境下所有環(huán)境下所有Wi-Fi設(shè)備(AP/STATION)數(shù)據(jù),需要通過一定的算法,才能正確的識別到ESP-TOUCH的數(shù)據(jù)包.
3.?ESP-TOUCH編碼
ESP-TOUCH編碼由”GuideCode”+”DatumData”+”Data”3部分組成
1)?GuideCode:
GuideCode由515/514/513/512組成,4包為一組,需要連續(xù)發(fā)送10組以上;通過Wireshark抓包發(fā)現(xiàn)ESP-TOUCH官方APP不同版本,發(fā)送的前導(dǎo)碼數(shù)量并不完全一致
| App版本 | 循環(huán)發(fā)送數(shù)量 | 前導(dǎo)碼重復(fù)規(guī)律 |
| Android版ESP-TOUCH | 10組 | 25組數(shù)據(jù)后重復(fù)發(fā)送10組 |
| IOS版ESP-TOUCH | 39組 | 98組數(shù)據(jù)后重復(fù)發(fā)送39組 |
| Android版IOT Espressif | 11組 | 25組數(shù)據(jù)后重復(fù)發(fā)送10組/9組 |
| IOS版IOT Espressif | 39組 | 98組數(shù)據(jù)后重復(fù)發(fā)送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:總數(shù)據(jù)長度1字節(jié);
????固定5字節(jié)DatumData + ip地址長度+ password_len + [ssid_len];其中:ssid_len需要根據(jù)當(dāng)前網(wǎng)絡(luò)是否隱藏判斷是否需要加入;如app上選擇為隱藏才需要加入
② password_len:密碼長度1字節(jié)
③?ssid_crc8:ssid的crc8結(jié)果1字節(jié)
④?bssid_crc8:bssid的crc8結(jié)果1字節(jié)
⑤?total_data xor:全部數(shù)據(jù)異或結(jié)果1字節(jié)
⑥?如當(dāng)前ssid是隱藏網(wǎng)絡(luò),totaldata_len須加ssid_len;同時Data區(qū)也須加ssid;否則不加此2項內(nèi)容;但total_data xor必須加入ssid計算xor;
crc8采用標(biāo)準(zhǔn)多項式x8+x5+x4+1,依次對byte和seq做crc8校驗
DatumData發(fā)送完后發(fā)送Data
?
3)?Data:
Data由5部分組成,分別為:
?ip_address(4 byte) + ap_password + [ap_ssid]
其中ap_ssid需要根據(jù)當(dāng)前網(wǎng)絡(luò)是否隱藏判斷是否需要加入;如app上選擇為隱藏才需要加入
?
4)?DatumData和Data發(fā)送規(guī)則:
一組由3包組成,每組傳送1字節(jié)有效數(shù)據(jù),每包Length為9bit,每一組由如下格式數(shù)據(jù)組成:
| ? | 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開始,每一組數(shù)據(jù)加1
②?ssid是否發(fā)送,需要根據(jù)當(dāng)前網(wǎng)絡(luò)是否為隱藏網(wǎng)絡(luò),如是隱藏網(wǎng)絡(luò)則須發(fā)送ssid;否則不發(fā)送
③?每一包數(shù)據(jù)內(nèi)的3個數(shù)據(jù)在組包完成后都須+40
4.?ESP-TOUCH解碼
我們將手機連接上路由,在手機上通過安卓版Esp_touoch發(fā)包,并在PC上通過Wireshark抓包。其中路由器名稱為“360wifi”,密碼為“1234567890”。我們可以看到在Wireshark上抓到有規(guī)律的數(shù)據(jù)包:
1)?GuideCode:
在設(shè)備上,我們接收到的實際數(shù)據(jù)包長度為557/556/555/554,按照編碼規(guī)則對應(yīng)515/514/513/512。所以,我們就可以獲取到數(shù)據(jù)包基準(zhǔn)值為554-512=42,這個基準(zhǔn)值將用在后續(xù)解碼中,非常重要,故必須先快速、準(zhǔn)確的獲取基準(zhǔn)值。該基準(zhǔn)值會應(yīng)該路由器加密方式不同或者手機設(shè)備不同而不同。
l?基準(zhǔn)值:42
2)?DatumData與Data
正確獲取到GuideCode的基準(zhǔn)值后,我們在接收到余下的數(shù)據(jù)包后,將數(shù)據(jù)包長度減去基準(zhǔn)值,并按照上訴編碼規(guī)則反推。?
?
?
?
我們將數(shù)據(jù)依次記錄并整理成表格,如下所示:
| 減基準(zhǔn)值前 (十進制格式顯示) | 減基準(zhǔn)值后 (十進制格式顯示) | 減去序號40 (16進制格式顯示) | 解碼結(jié)果 | ||
| 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解碼結(jié)果驗證
從上面的表格,我們正確的獲取到Esp_Touch配置app發(fā)送的數(shù)據(jù):
① 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解碼結(jié)果與EspTouch發(fā)送app結(jié)果一致
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 https://blog.csdn.net/flyingcys/article/details/54670688
文章標(biāo)簽:?esp-touchsmartconfig物聯(lián)網(wǎng)
個人分類:?Esp8266
上一篇IoT-Camera學(xué)習(xí)筆記之初識IoT-Camera(二)
下一篇TP-LINK_841N_V8路由器硬改升級OpenWRT記
ESP8266學(xué)習(xí)筆記4:ESP8266的SmartConfig
今天花了將近一天的時間來研究ESP8266的SmartConfig功能,這個應(yīng)該算是wifi云產(chǎn)品的標(biāo)配。這篇文章先把SmartConfig操作一遍,我還寫了另一篇文章梳理了物理層的具體協(xié)議,http...
-
小豬快跑了的啦2018-06-07 12:32:46#4樓
樓主的密碼數(shù)據(jù)那里有錯誤,CRC的校驗應(yīng)該是0x02,嘻嘻,發(fā)現(xiàn)了。感謝樓主的共享,本來的疑惑都在你的文章解開了
-
huangshengnp2017-07-11 14:22:48#3樓
請問如果需要通過此apk想設(shè)備發(fā)送命令并實現(xiàn)接收設(shè)備返回的一些信息,要如何實現(xiàn)?
-
夢幻貝殼2017-06-20 12:41:07#2樓
分析得很好!!!
-
C維2017-02-06 16:58:54#1樓
感謝,找了好久才找到規(guī)則說明。
總結(jié)
以上是生活随笔為你收集整理的ESP-TOUCH编码规则及解码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++中的连续赋值
- 下一篇: 嵌入式设备web服务器比较