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编码规则及解码相关推荐
- Base64的编码规则和C#实现
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一: Base64的编码规则 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码. 它将需要编码 ...
- UTF-8的编码规则
UTF-8的编码规则: 1.对于单字节的字符,字节的第一位设为0,后面七位为这个字符的Unicode码. 因此对于英文字符,UTF-8编码和ASCII码是相同的. 2.对于n字节的字符(n>1) ...
- 一维,二维条形码/条码的编码规则
编码规则 唯一性:同种规格同种产品对应同一个产品代码,同种产品不同规格应对应不同的产品代码.根据产 品的不同性质,如:重量.包装.规格.气味.颜色.形状等等,赋予不同的商品代码. 永久性:产品代码一经 ...
- Base64编码和Python解码
base64是网络上最常见的用于传输8Bit字节码的编码方式之一,是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息. 采用Base64编码具有不可读性,需要解码后才能阅读. 本文是关于 ...
- ASN.1探索 - 3 编码规则与传输语法(3 - PER)
转自: http://wmfbravo.blog.163.com/ 感谢: wmfbravo 本章主要介绍BER和PER两种编码规则及其衍生规则. 3.3PER BER编码因其在大小上的开销过大而受人 ...
- 4位格雷码的顺序编码_格雷码编码规则_格雷码有什么规律
格雷码 典型的二进制格雷码简称格雷码,因1953年公开的弗兰克·格雷专利"Pulse Code Communication"而得名,当初是为了通信,现在则常用于模拟-数字转换和位置 ...
- UTF-8编码规则解析
在将多个(UTF-8)字节数组转换为字符串的时候,可能会发生乱码,这不是因为编码问题. UTF-8是一种变长字节编码方式.对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0:如果是多 ...
- ASN.1 -- 编码规则
描述ASN.1编码规则的标准 ITU-T Rec. X.690 | ISO/IEC 8825-1 (BER, CER and DER) ITU-T Rec. X.691 | ISO/IEC 8825- ...
- 三菱空调红外码值编码规则解析
三菱空调红外码值编码规则解析 一.空调红外控制原理 空调遥控器是通过发射断断续续的红外光来传递信息的,我们可以把发射的时候看做是"1",没发射的时候看做是"0" ...
最新文章
- 包云岗:关于RISC-V成为印度国家指令集的一些看法
- 工资8000以下的程序员注意了:《零coding数据大屏实战宝典.pdf》
- kafka数据丢失的场景
- 基于Google排名因素对Drupal进行SEO优化
- spring api层打包_Spring项目的按层打包已过时
- oracle比较两个字段相似度,比较两个字符串的相似度
- mysql常用操作指令总结
- Python——常见数据类型的调试笔记(“如何通过Debug信息判断数据类型”)
- 混IT,靠的是能力,不是技能
- 一道PHP面试题,求两个文件的相对路径
- ffmpeg-20160714-git-bin.7z
- IEC61850——开山篇
- 时域技术在天线测量中的应用
- ICCV 2021 | FACIAL :动态谈话人脸视频生成,姿态,眨眼皆可控!
- HTML5Point 如何去版权图片?
- 分享一个商品历史价格查询的网站
- intel RDT (Resource Director Technology) 管理LLC和内存带宽
- 2020年十大返利app排行榜
- 二十六、 对偶问题(※※※)
- windows10企业版开启RDP多用户同时登录
热门文章
- settings.xml 文件配置
- 【整理总结】Visual Studio 扩展和更新
- Struts2 源码分析——拦截器的机制
- USACO 3.2 kimbits DP
- Remoting技术使用配置文件示例
- SQLite入门与分析(四)---Page Cache之事务处理(3)
- php用什么工具调试代码,详细介绍利用开源的DebugBar工具调试PHP代码(图文)
- python自动创建目录_python自动目录环境
- 【控制】多智能体系统总结。4.控制协议。
- 【Paper】2021_Consensus Control of Leader-Following Multi-Agent Systems in Directed Topology