前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >8266wifi模块开发详解(三)Smartconfig配网

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

作者头像
bigmagic
发布2020-03-17 14:38:18
2.3K0
发布2020-03-17 14:38:18
举报
文章被收录于专栏:嵌入式iot嵌入式iot

说明

设想这样一种场景,我们一般用手机连上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技术,这些操作方式都是类似的。这种方式入网的好处不言而喻,简单的说就是节约成本,方便操作,但是缺点也有,就是成功率不高,而且有可能泄漏密码。但是真的好用就行。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式IoT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
  • 原理
    • smartconfig
      • 分析
      • 实现
        • 工程构建
          • APP操作
            • 分析
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档