SmartConfig 方式配网,每个厂商的编码方式和报文选择上有自己的协议,对于 ESP8266,采用的协议是乐鑫 ESP-TOUCH协议。 比如广播模式UDP接收IP地址是255.255.255.255 smartconfig工作原理 所谓SmartConfig就是手机App端发送包含WIFI用户名以及密码的UDP广播包,智能终端(开启了sniffer混杂模式)的WIFI芯片可以接收到该UDP包,只要知道UDP包的组织形式,就可以通过接收到的UDP包解密出WIFI用户名密码,然后智能硬件配置收到的用户名密码到指定的WIFI AP上。 - 设备进入 Wi-Fi 混杂模式(promiscuous mode)以监听捕获周围的 Wi-Fi 报文。由于设备暂未联网,且 Wi-Fi 网络的数据帧已通过加密,设备无法获取 payload 的内容,但可以获取报文的某些特征数据,例如每个报文的长度。同时对于某些数据帧,例如 UDP 的广播包或多播包,其报文的帧头结构比较固定,较容易识别。 - 此时在手机 App 或者小程序侧,即可通过发送 UDP 的广播包或多播包,并利用报文的特征,例如长度变化进行编码。 - 将目标 Wi-Fi 路由器的 SSID/PSW 字符以约定的编码方式发送出去,设备端在捕获到 UDP 报文后,按约定的方式进行解码,即可得到目标 Wi-Fi 路由器的相关信息并进行联网。 设备通过 UDP 包(长度)获取配置信息,切换网络模式,连接上家里 WiFi,配置完成。 关于UDP数据包发送有一个难点是,如果WLAN都是不加密的话,那UDP直接把相关信息发出来就好,但可惜路由器AP的加密方式是不固定的,模块没法知道UDP数据是何种加密方式,因此没办法解析出DATA信息,DATA不行,聪明的人类打算从其他字段下手,大部分字段手机端无法获得权限,最适合的只剩下长度字段。 参考资料: 假设我们要把字符串”CJey”(密码)告诉摄像头, 整个流程大致如下: (假设常量C为16) 手机app部分: 打开手机app, 在输入框中填入要发送的字符串”CJey”, 点击发送 app连续发送三个UDP广播包, 填充数据为1190个0x00字节(1234 - 16 - 20 - 8 = 1190), 表示传输开始 app发送一个UDP广播包, 填充数据为1023个0x00字节(1067 - 16 -20 - 8 = 1023), 传输字符C app连续发送两个UDP广播包, 填充数据为66个0x00字节(110 - 16 - 20 - 8 = 66), 表示数据间隔 app发送一个UDP广播包, 填充数据为1030个0x00字节(1074 - 16 -20 - 8 = 1030), 传输字符J app连续发送两个UDP广播包, 填充数据为66个0x00字节(110 - 16 - 20 - 8 = 66), 表示数据间隔 app发送一个UDP广播包, 填充数据为1057个0x00字节(1101 - 16 -20 - 8 = 1057), 传输字符e app连续发送两个UDP广播包, 填充数据为66个0x00字节(110 - 16 - 20 - 8 = 66), 表示数据间隔 app发送一个UDP广播包, 填充数据为1077个0x00字节(1121 - 16 -20 - 8 = 1077), 传输字符y app连续发送三个UDP广播包, 填充数据为1280个0x00字节(1324- 16 - 20 - 8 = 1280), 表示传输结束 从1开始循环多次, 直到超时或者摄像头成功接入wifi, 向app汇报成功 摄像头部分: 摄像头通电, 没有可用的wifi, 进入混杂模式, 开始监听信号覆盖范围内的所有wifi数据帧 捕获数据帧, 如果连续收到3个密文长度为1234, 且来自于同一个发射源X的数据帧, 则进入下一步, 否则重复2 捕获发射源X的数据帧, 持续捕获密文长度为110或者1000-1127之间的数据帧, 直到捕获到连续3个密文长度为1324的数据帧 将上述数据帧按照编码表进行映射, 由于手机app并非是独占网络, 所以捕获到的数据可能有噪音, 比如解码出来的结果可能是(/表示分隔符): ACX/J/o@e/ymmm 如果没有噪音, 记为候选数据RC, 重复捕获X, 进行二次验证, 通过则表示接收完成, 没通过也重复捕获X, 将这次所得结果同上一次做交集, 循环如此直到得出唯一结果, 即RC, 之后再重复5 由于捕获的数据帧头部信息中已经包含了wifi的bssid信息, 使用”CJey”作为密码去尝试连接相应的wifi, 成功则向app报告, 失败则继续重复2
本文目录
本文目录