ESP-TOUCH編碼規則及解碼

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:

GuideCode515/514/513/512組成,4包爲一組,需要連續發送10組以上;通過Wireshark抓包發現ESP-TOUCH官方APP不同版本,發送的前導碼數量並不完全一致

App版本

循環發送數量

前導碼重複規律

AndroidESP-TOUCH

10

25組數據後重復發送10

IOSESP-TOUCH

39

98組數據後重復發送39

AndroidIOT Espressif

11

25組數據後重復發送10/9

IOSIOT Espressif

39

98組數據後重復發送39

 

AndroidESP-TOUCH


IOSESP-TOUCH

 

AndroidIOT Espressif

 

IOSIOT Espressif

 

2) DatumData:

DatumData5部分組成,分別爲”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:ssidcrc8結果1字節

④ bssid_crc8:bssidcrc8結果1字節

⑤ total_data xor:全部數據異或結果1字節

⑥ 如當前ssid是隱藏網絡,totaldata_len須加ssid_len;同時Data區也須加ssid;否則不加此2項內容;total_data xor必須加入ssid計算xor;

crc8採用標準多項式x8+x5+x4+1,依次對byteseqcrc8校驗

DatumData發送完後發送Data

 

3) Data:

Data5部分組成,分別爲:

 ip_address(4 byte) + ap_password + [ap_ssid]

其中ap_ssid需要根據當前網絡是否隱藏判斷是否需要加入;app上選擇爲隱藏才需要加入

 

4) DatumDataData發送規則:

一組由3包組成,每組傳送1字節有效數據,每包Length9bit,每一組由如下格式數據組成:

 

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,這個基準值將用在後續解碼中,非常重要,故必須先快速、準確的獲取基準值。該基準值會應該路由器加密方式不同或者手機設備不同而不同。

基準值:42

 

2) DatumDataData

正確獲取到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結果一致

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章