ESP-TOUCH编码规则及解码
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”;
l totaldata_len:总数据长度1字节;
固定5字节DatumData + ip地址长度+ password_len + [ssid_len];其中:ssid_len需要根据当前网络是否隐藏判断是否需要加入;如app上选择为隐藏才需要加入
l password_len:密码长度1字节
l ssid_crc8:ssid的crc8结果1字节
l bssid_crc8:bssid的crc8结果1字节
l total_data xor:全部数据异或结果1字节
l 如当前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) |
l sequence header: 从0开始,每一组数据加1
l ssid是否发送,需要根据当前网络是否为隐藏网络,如是隐藏网络则须发送ssid;否则不发送
l 每一包数据内的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结果一致
转载地址:http://blog.****.net/flyingcys/article/details/54670688