160_介绍配网的文章

一、背景

物联网时代技术开始规模化服务于民众,方便快捷显得尤为重要,WIFI 直连便是一个典型案例。

目前主流的 WIFI 配置模式有以下 2 种:

1、智能硬件处于 AP 模式(类似路由器,组成局域网),手机用于 STA 模式

手机连接到处于 AP 模式的智能硬件后组成局域网,手机发送需要连接路由的 SSID 及密码至智能硬件,智能硬件主动去连接指定路由后,完成配网

2、一键配网(smartConfig)模式

智能硬件处于混杂模式下,监听网络中的所有报文;手机 APP 将 SSID 和密码编码到 UDP 报文中,通过广播包或组播报发送,智能硬件接收到 UDP 报文后解码,得到正确的 SSID 和密码,然后主动连接指定 SSID 的路由完成连接。

AP 模式:

AP 是 (Wireless) Access Point 的缩写,即 (无线) 访问接入点。简单来讲就像是无线路由器一样,设备打开后进入 AP 模式,在手机的网络列表里面,可以搜索到类似 TPLINK_XXX 的名字(SSID)。

连接步骤:

1、智能硬件设备初始化并进入 AP 模式
2、手机扫描 WIFI 列表:扫描到智能硬件设备后(SSID)连接该智能硬件设备,通过 UDP 发送 经过 AES 加密过的 ssid/password/token
3、智能硬件设备通过 UDP 包获取配置信息,切换网络模式连接 WIFI 后配网完成

smartConfig 模式:

这种快速连接方式,相对于 AP 模式连接简化操作,更加贴近于市场

1、手机连上 WiFi,打开智能硬件指定 APP 软件,进入配置界面,输入手机所在 WiFi 密码,请求配网 TOKEN
2、智能硬件开启混杂模式监听所有网络数据包
3、手机通过广播、组播循环发送 ssid/password/token
4、硬件设备通过 UDP 包(长度)获取配置信息捕捉到 ssid/password/token,连接路由器(广播根据 UDP 包长度,组播根据 IP 地址信息)


从原理上讲只要芯片驱动支持开启混杂模式(WiFi Promiscuous),就可以支持一键配网功能

手机编码发送采用有 UDP 组播或广播,不同的发送方式和编码,对应的解码过程也不一样

1、广播:

发送方可通过改变其所需要发送数据包的长度进行控制,因此只要指定出一套利用长度编码的通讯协议,就可利用数据包的 Length 字段进行数据传递

2、 组播:

组播地址是保留的 D 类地址从224.0.0.0-239.255.255.255

IP 地址与 MAC 地址映射关系为:将 MAC 地址的前 25 位设定为 01.00.5e,而 MAC 地址的后 23 位对应 IP 地址位

故发送端可以将数据编码在组播 IP 的后 23bit 中,通过组播包发送接收端进行解码即可

二、smartConfig 原理浅析

在没有和其他设备(支持 smartConfig 技术)建立任何性质的通讯链路的情况下, 配置该设备接入 WIFI 网络 

普通权限的应用程序是没有能力完全控制和定义传输层及下层所有协议数据的, 唯一可以完全控制的就是应用层数据

本质上就是将 UDP 包头的数据长度作为 smartConfig 的数据,APP 端和设备端共用一套编码表即可解析数据 

TCP/IP 协议栈中的网络层和传输层的数据结构 

常用的网络层协议是 IPv4, IPv4 的头部绝大多数情况下都是定长的20字节

传输层协议是 UDP, 因为 UDP 协议头部为定长的 8 字节

明文长度 = 20 + 8 + dataLen

密文长度 = 20 + 8 + dataLen + 算法常量

例子:

如果需要发出一个密文长度为 500 字节的 802.11 帧,只需要在 UDP 中填充任意(500 – 20 – 8 – 算法常亮)个字节数据即可

因此,只需要利用可控的密文长度(dataLen)定义一张编码表即可将数据告诉任何知道这张编码表的设备(IoT硬件设备)

自定义一张编码表,流程如下:

dataLen --> 映射
1234    --> 起始符; 连续的3个起始符, 用于表示数据传输开始 
1324    --> 结束符; 连续的3个结束符, 用于表示数据传输结束 
110     --> 间隔符; 连续的2个间隔符, 用于表示数据符之间的间隔 
1000    --> 数据符; 表示 ASCII 0x00 
1001    --> 数据符; 表示 ASCII 0x01 
… 
1127    --> 数据符; 表示 ASCII 0x7F

假设我们要把字符串"Jay"告诉摄像头, 整个流程大致如下: (假设算法常亮为 16)

APP 端:
 
打开手机 APP, 在输入框中填入要发送的字符串”Jay”, 点击发送:

1.1、APP 连续发送 3 个 UDP 广播包, 填充数据为 1190 个字节 0x00 数据 ( 1234 – 16 – 20 – 8 = 1190 ), 表示传输开始 
1.2、APP 发送     1 个 UDP 广播包, 填充数据为 1030 个字节 0x00 数据 ( 1074 – 16 -20 – 8 = 1030  ), 传输字符 J 
1.3、APP 连续发送 2 个 UDP 广播包, 填充数据为 66   个字节 0x00 数据 ( 110 – 16 – 20 – 8 = 66    ), 表示数据间隔 
1.4、APP 发送     1 个 UDP 广播包, 填充数据为 1053 个字节 0x00 数据 ( 1097 – 16 -20 – 8 = 1053  ), 传输字符 1097 对应 a 
1.5、APP 连续发送 2 个 UDP 广播包, 填充数据为 66   个字节 0x00 数据 ( 110 – 16 – 20 – 8 = 66    ), 表示数据间隔 
1.6、APP 发送     1 个 UDP 广播包, 填充数据为 1077 个字节 0x00 数据 ( 1121 – 16 -20 – 8 = 1077  ), 传输字符 1121 对应 y 
1.7、APP 连续发送 3 个 UDP 广播包, 填充数据为 1280 个字节 0x00 数据 ( 1324- 16 – 20 – 8 = 1280  ), 表示传输结束

从步骤 1.1 开始循环多次, 直到超时或 IoT 设备成功接入 WIFI

IoT 设备端:

设备上电进入混杂模式,开始监听信号覆盖范围内的所有 WIFI 数据帧

捕获数据帧, 如果连续收到 3 个密文,其数据长度 dataLen 为 1234 字节, 且来自于同一个发射源 channel-A 的数据帧, 则进入下一步, 否则该步骤

捕获发射源 channel-A 的数据帧, 持续捕获密文数据长度为 110 或 1000-1127 之间的数据帧, 直到捕获到连续 3 个密文数据长度为 1324 的数据帧

将上述数据帧按照编码表进行映射, 由于手机 APP 并非是独占网络, 所以捕获到的数据可能有噪音, 比如解码出来的结果可能是(/表示分隔符): mnJ/o@a/ymmm

如果没有噪音, 记为候选数据RC, 重复捕获X, 进行二次验证, 通过则表示接收完成, 没通过也重复捕获 channel-A,

将这次所得结果同上一次做交集, 循环如此直到得出唯一结果, 即 RC, 之后再重复 5

由于捕获的数据帧头部信息中已经包含了 WIFI 的 BSSID 信息, 使用 "Jay" 作为密码去尝试连接相应的 WIFI

三、ESP32 配网实例:

手机 APP:

ESP-TOUCH

烧写设备端:
--------------------- 
作者:简一商业 
来源:CSDN 
原文:https://blog.csdn.net/liwei16611/article/details/81133191 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值