一、前言
我整理了从2015年至今关于ESP8266的学习笔记,梳理出来了开发环境、基础功能、进阶学习三大部分,方便自己和他人。可点此查看,欢迎交流。
之前在笔记4《ESP8266的SmartConfig》
http://blog.csdn.net/iotisan/article/details/54849410中,做了smartconfig例程的测试。这个例程是由于DEMO演示的,离商用还有段距离。
几周前,有网友就问我esp8266重新上电无法自动连接之前配置的路由器。这确实是目前DEMO最缺的一个功能,当首次将设备接入wifi之后,设备应该保存住SSID和PWD,在后续上电时能自己去连接wifi,而不是例程中每次上电都来一次。
当时忙别的事情没做,今天抽时间做了下处理。其实处理还挺简单,写篇笔记总结下,规范wifi连接操作。
本文作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/
二、编程思路
1. 路由器参数的保存和查询
在DEMO中,设置完STATION模式后,就直接smartconfig。我们应当在smartconfig之前做一个参数判断,判断是否有保存的路由器信息。有保存,就连接路由器。没保存,才smartconfig。
void user_init(void)
{
os_printf("SDK version:%s
", system_get_sdk_version());
wifi_set_opmode(STATION_MODE);
smartconfig_start(smartconfig_done);
}
关于这个路由器参数存储,查了下官方手册,发现SDK还是很贴心的,已经有API可以直接保存和查询了,而不需要我们再去做flash参数存储。
两个关键API摆出来。
保存
wifi_station_set_config
功能:设置 WiFi station 接口的配置参数,并保存到 flash
查询
wifi_station_get_config_default
功能:查询 WiFi station 接口保存在 flash 中的配置参数。
2. 已有路由器参数时的处理
没有路由器参数时的处理很简单,直接smartconfig。而当有路由器参数时,还需要做些处理。
我的思路是,以当前的参数去搜索下环境中是否存在这个AP。没有的话再启动smartconfig;有的话就直接connect。
wifi_station_scan
功能:获取AP的信息
三、代码操作
1.初始化时判断FLASH中是否存有有效的路由器参数。
void user_init(void)
{
wifi_set_opmode(STATION_MODE);
wifi_station_get_config_default(&s_staconf);
if (os_strlen(s_staconf.ssid) != 0) {
os_printf("user_scan
");
system_init_done_cb(user_scan);
} else {
os_printf("smartcfg
");
smartconfig_start(smartconfig_done);
}
}
2.已存有路由器参数,去搜索看看AP当前是否存在。
void ICACHE_FLASH_ATTR
user_scan(void)
{
struct scan_config config;
os_memset(&config, 0, sizeof(config));
config.ssid = s_staconf.ssid;
wifi_station_scan(&config, user_scan_done);
}
3.之后的操作就看个人处理了。
规范的处理是要开启一个线程,周期性检测AP的连接状态,处理不同的错误状态。我就不展开了。
四、测试效果
首次启动时,进行SmartCfg。
::rl:dsdSSDK version:1.2.0
smartcfg
mode : sta(18:fe:34:f8:8f:cf)
add if0
f 0,
:scandone
f 0,
:scandone
SC_STATUS_FIND_CHANNEL
:
TYPE: ESPTOUCH V2.4
T|PHONE MAC:
T|AP MAC :
SC_STATUS_GETTING_SSID_PSWD
SC_TYPE:SC_TYPE_ESPTOUCH
:T|SCAN SSID: Xiaomi_5BAB
:T|pswd: 1234567890
T|ssid: Xiaomi_5BAB
T|bssid: 8c be be 28 5b ac
SC_STATUS_LINK
:f -240,
:scandone
no Xiaomi_5BAB found, reconnect after 1s
reconnect
f 0,
:scandone
:add 0
aid 4
pm open phy_2,type:2 0 0
cnt
connected with Xiaomi_5BAB, channel 3
dhcp client start...
:ip:192.168.31.232,mask:255.255.255.0,gw:192.168.31.1
:SC_STATUS_LINK_OVER
Phone ip: 192.168.31.199
第二次上电,自动获取AP进行连接。
::l:d;lSSDK version:1.2.0
user_scan
mode : sta(18:fe:34:f8:8f:cf)
add if0
f 0, scandone
f 0,
:scandone
(4,"Xiaomi_5BAB",-45,"8c:be:be:28:5b:ac",3)
f -240,
:reconnect
scandone
f 0,
:scandone
:add 0
aid 4
pm open phy_2,type:2 0 0
cnt
connected with Xiaomi_5BAB, channel 3
dhcp client start...
:ip:192.168.31.232,mask:255.255.255.0,gw:192.168.31.1
五、总结
that’s all.