8266wifi模块开发详解(三)Smartconfig配网

2020-03-17 14:38:18 浏览数 (1)

说明

设想这样一种场景,我们一般用手机连上WiFi的过程需要知道WiFi的名称(SSID)与密码(password)。手机上就触摸屏和输入法可以直接连接上,但是要是一个设备没有这些外设,又该如何使用呢?往往在嵌入式领域为了节约成本,都将数据直接通过网络上传至服务器,然后由服务器进行数据整理与显示。这时就需要借助SmartConfig这项技术了。

再举个实例,我们买了一个天猫精灵语音助手,想让天猫精灵连接到我们自己的WiFi上。首先需要从官网上下载相应的APP,然后在保证手机已经连接上网络的基础上,启动APP连接网络。天猫精灵会等待APP发送网络名称和密码,而这些信息就是通过广播的形式发送在无线网中,然后天猫精灵就可以启动配置了。

原理

要弄清楚这个过程内部是如何实现的,我们可以讲一讲smartconfig的实现。

smartconfig

在不同的厂商那里,有着不同的名称,比如乐鑫与高通都称为smartconfig,而在微信里称为Airkiss,实际上都是一个意思。

在实现的过程中,就是将WiFi模块处于AP STA模式,然后手机APP将SSID与密码编码发送到UDP的报文中,通过广播包或者组播包进行发送。WiFi模块接收到UDP的报文后进行解码,得到正确的SSID与密码,然后进行设备联网,从而达到我们联网的目的。

我们用一个简单的图来叙述这个过程

准确的说,smartconfig的技术本质是UDP广播,而这里的难点在于如果WiFi传输的数据不是加密的数据,那么直接将UDP数据发过来就可以让WiFi模块解析到了,然而并不是这样,由于路由器的加密方式不是固定的。所以这种办法是行不通的。路由器的加密方式分为三种:WPA/WPA2、WPA-PSK/WPA2-PSK、WEP。

那么这种又该如何告知WiFi模块呢?

先看一下协议封装包的格式

这里可以利用的信息就是长度信息,其他的字段暂时不好使用。

举个例子,假如我们需要发送“1,2,3”这个字符串,那么就可以将数据封成如下的包进行发送,因为1对应的ASCII码的表为0x31,2对应的0x32。

但是,真实的数据是否是这样呢?其实每个厂家都对编码进行了加密,这就避免了破解或者其他的问题。比如wechat的AirKiss就与Espressif的SmartConfig不同。下面我们来详细模拟一直传输规则。

分析

一般对于802.11帧,其实一帧数据的长度有几个部分,密文的长度 20字节包头 8字节UDP协议头 算法常量。

因此我们可以制定一套标准的规则,由于输出传输的长度是2字节,所以前面我们可以约定数据的开始与数据的结束,同时约定ASCII码的规则进行加密。

头部可以用0xF000作为标识。

0x1000 发三次表示数据开始

0x1FFF 发三次表示数据结束

0x1555 发三次表示数据间隔

0x1100 表示ASCII 0x00

.

.

0x117F 表示ASCII 0x7F

那么当我们需要发一个字符串hello时,我们就可以进行如下规则的发送

首先发送开始包的长度0x1000表示4096字节,减去包的封装信息(16 8 20)。所以填充在Length字段的数据长度为4052。

因为wifi的工作通道一般为1到13,如果不知道WiFi模块处于哪个channel,智能定时的去切换了。比如每个通道上发送100ms,然后再切换到其他的通道上,这样效率就很低了,所以配置网络一般很慢。

如果要将提高配网的成功率,可以先扫描一下当前的AP,获取到通道的信息,然后在这个通道上去监听UDP数据。这样可以大幅度的提高配网的效率及成功率。

实现

工程构建

目前可以用8266来做个实验,我们还是采用PIO进行实验。

进入里面有一个选项

只需将lib_deps复制到我们新创建的空的工程项目中即可

对于nodemcuv2的板子,可以配置如下

只需编译即可。可能会提示找不到头文件,在main.cpp文件中添加缺少的头文件即可。

编译通过了就可以了。接下来就是编译工程了。我们刚才下载的工程在.piolibdeps中

其中在例程中有smartconfig这个文件夹,将其转移到我们自己创立的工程文件中

通过代码查看,发现如果要使用smartconfig,是需要开启一个宏定义的。

开启宏定义的选项在platformio.ini中

代码语言:javascript复制
build_flags = -DJUSTWIFI_ENABLE_SMARTCONFIG

到这里,我们的基础工程库就配置好了。

然后编译,下载到板子上。

通过串口调试助手查看信息。

查看等待连接。

APP操作

在乐鑫的官方网站上下载ESP TOUCH

其安装包在releases中。

手机安装后,打开界面如下所示

点击CONFIRM开始进行配网操作。

配网成功后,串口调试助手打印出如下的信息

同时手机返回的消息如下,表示配网成功

此时WIFI模块已经连上wifi了。此时模块就可以上网了。

分析

对于该模块的分析,主要讲一下代码的结构。

首先,模块要开启STA模式,然后开始smartconfig

这里就进入到库函数的调用

这个宏会在_machine函数中,而_machine函数又在loop函数中,这样就在loop函数中不断的查询状态了。

最关键的是调用了WiFi.beginSmartConfig()。这才是进入smartconfig模式的关键。

总结

本文对smartconfig的原理及实现进行了详细的描述。与此相同的还有Airkiss技术,这些操作方式都是类似的。这种方式入网的好处不言而喻,简单的说就是节约成本,方便操作,但是缺点也有,就是成功率不高,而且有可能泄漏密码。但是真的好用就行。

0 人点赞