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结果一致

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