ESP-TOUCH编码规则及解码
https://blog.csdn.net/flyingcys/article/details/54670688
1.?概述
ESP-TOUCH是Espressif公司自主研究的一鍵智能配網工具,幫助用戶將使用ESP8266的硬件產品連接Wi-Fi網絡。用戶只需在手機上配合硬件產品進行簡單的操作即可實現智能配網連接Wi-Fi路由。
目前app是開源的,Android和ios代碼均可在github上下載到,設備端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也可以各大應用市場下載到。同時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結果一致
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/flyingcys/article/details/54670688
文章標簽:?esp-touchsmartconfig物聯網
個人分類:?Esp8266
上一篇IoT-Camera學習筆記之初識IoT-Camera(二)
下一篇TP-LINK_841N_V8路由器硬改升級OpenWRT記
ESP8266學習筆記4:ESP8266的SmartConfig
今天花了將近一天的時間來研究ESP8266的SmartConfig功能,這個應該算是wifi云產品的標配。這篇文章先把SmartConfig操作一遍,我還寫了另一篇文章梳理了物理層的具體協議,http...
-
小豬快跑了的啦2018-06-07 12:32:46#4樓
樓主的密碼數據那里有錯誤,CRC的校驗應該是0x02,嘻嘻,發現了。感謝樓主的共享,本來的疑惑都在你的文章解開了
-
huangshengnp2017-07-11 14:22:48#3樓
請問如果需要通過此apk想設備發送命令并實現接收設備返回的一些信息,要如何實現?
-
夢幻貝殼2017-06-20 12:41:07#2樓
分析得很好!!!
-
C維2017-02-06 16:58:54#1樓
感謝,找了好久才找到規則說明。
總結
以上是生活随笔為你收集整理的ESP-TOUCH编码规则及解码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++中的连续赋值
- 下一篇: 嵌入式设备web服务器比较