ESP8266学习笔记6:ESP8266规范wifi连接操作

一、前言

我整理了从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\n", 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. 已有路由器參数时的处理

没有路由器參数时的处理非常easy,直接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\n");
      system_init_done_cb(user_scan);
    } else {
      os_printf("smartcfg\n");
      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。

<Time:2015-08-21 10:52:37:703 Len:0001>:<Time:2015-08-21 10:52:52:687 Len:0315>:rl<Time:2015-08-21 10:52:52:906 Len:0078>:dsdSSDK version:1.2.0
smartcfg
mode : sta(18:fe:34:f8:8f:cf)
add if0
f 0,
<Time:2015-08-21 10:52:55:000 Len:0015>:scandone
f 0,
<Time:2015-08-21 10:52:57:187 Len:0034>:scandone
SC_STATUS_FIND_CHANNEL

<Time:2015-08-21 10:53:08:296 Len:0106>:
TYPE: ESPTOUCH V2.4
T|PHONE MAC:
T|AP MAC   :
SC_STATUS_GETTING_SSID_PSWD
SC_TYPE:SC_TYPE_ESPTOUCH

<Time:2015-08-21 10:53:11:250 Len:0026>:T|SCAN SSID: Xiaomi_5BAB

<Time:2015-08-21 10:53:11:578 Len:0086>:T|pswd: 1234567890
T|ssid: Xiaomi_5BAB
T|bssid: 8c be be 28 5b ac
SC_STATUS_LINK

<Time:2015-08-21 10:53:11:656 Len:0008>:f -240,
<Time:2015-08-21 10:53:13:906 Len:0068>:scandone
no Xiaomi_5BAB found, reconnect after 1s
reconnect
f 0,
<Time:2015-08-21 10:53:16:031 Len:0010>:scandone

<Time:2015-08-21 10:53:17:031 Len:0109>:add 0
aid 4
pm open phy_2,type:2 0 0
cnt 

connected with Xiaomi_5BAB, channel 3
dhcp client start...

<Time:2015-08-21 10:53:19:562 Len:0054>:ip:192.168.31.232,mask:255.255.255.0,gw:192.168.31.1

<Time:2015-08-21 10:53:22:515 Len:0047>:SC_STATUS_LINK_OVER
Phone ip: 192.168.31.199

第二次上电。自己主动获取AP进行连接。

<Time:2015-08-21 10:53:52:078 Len:0001>:<Time:2015-08-21 10:53:58:171 Len:0315>:l<Time:2015-08-21 10:53:58:390 Len:0094>:d;lSSDK version:1.2.0
user_scan
mode : sta(18:fe:34:f8:8f:cf)
add if0
f 0, scandone
f 0,
<Time:2015-08-21 10:54:00:531 Len:0063>:scandone
(4,"Xiaomi_5BAB",-45,"8c:be:be:28:5b:ac",3)
f -240,
<Time:2015-08-21 10:54:00:578 Len:0026>:reconnect
scandone
f 0,
<Time:2015-08-21 10:54:02:703 Len:0010>:scandone

<Time:2015-08-21 10:54:03:656 Len:0109>:add 0
aid 4
pm open phy_2,type:2 0 0
cnt 

connected with Xiaomi_5BAB, channel 3
dhcp client start...

<Time:2015-08-21 10:54:06:421 Len:0054>:ip:192.168.31.232,mask:255.255.255.0,gw:192.168.31.1

五、总结

that’s all.



时间: 2024-10-23 05:17:28

ESP8266学习笔记6:ESP8266规范wifi连接操作的相关文章

ALL-51单片机ESP8266学习-AT指令(ESP8266作为TCP客户端,连接自己制作的TCP服务器)

从这一节开始,以视频加源码的形式,后期视频和程序将放在链接中 资料链接 链接:https://pan.baidu.com/s/10MxI8-Q33-M_R2WEHqEi1A 密码:j1sz 14节:    51单片机ESP8266学习-AT指令(ESP8266作为TCP客户端,连接自己制作的手机TCP服务器,互相通信) 视频链接: 15节:    51单片机ESP8266学习-AT指令(ESP8266作为TCP客户端,连接自己制作的电脑TCP服务器,互相通信) 视频链接: 16节:    51单

android学习笔记--检测是否为wifi环境

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // 获取代表联网状态的NetWorkInfo对象 NetworkInfo wifiInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI); return wifiInfo != null && wifiInfo.isConnected() 返回t

iOS学习笔记(十六)——数据库操作(使用FMDB)

iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一篇文章简单介绍下FMDB的使用. 在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包. FMDB同时兼容ARC和非ARC工

OpenCV(C++接口)学习笔记2-像素级的图像操作

1.通过成员函数at(int y, int x)访问 这种方法需要知道像素保存的格式. (1) 这是为模板类型的函数,因为一个函数的返回类型只有在运行时才会知道. (2)这个函数返回的是一个向量即Vector,故有下标的操作. image.at<uchar>(j,i)= 255; 在单通道图像中,采用以上语句可以获取图像(i,j)处的灰度值(注:先行后列,一般用j表示行(rows),i表示列(cols)).如果是灰度图像的话,只需要更改一个数据就可以了.如果是rgb图像的话,就要用"

Hadoop学习笔记_5_分布式文件系统HDFS --shell操作

分布式文件系统HDFS --shell操作 分布式文件系统[Distributed File System]概述 数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统 . 分布式文件系统特点: 是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间. 通透性.让实际上是通过网络来访问文件的动作,由程序与用户看来,就像是访问本地的磁盘一般

RxJava 学习笔记(八) --- Combining 结合操作

@(Rxjava学习笔记) RxJava 学习笔记(八) - Combining 结合操作 RxJava 学习笔记八 Combining 结合操作 StartWith 在数据序列的开头插入一条指定的项 Merge 将多个Observable合并为一个 MergeDelayError 将多个Observable合并为一个 Zip 使用一个函数组合多个Observable发射的数据集合然后再发射这个结果 CombineLatest 当两个Observables中的任何一个发射了一个数据时通过一个指定

[Spring Data MongoDB]学习笔记--MongoTemplate插入修改操作

插入操作: 直接给个例子 import static org.springframework.data.mongodb.core.query.Criteria.where; import static org.springframework.data.mongodb.core.query.Criteria.query; … Person p = new Person("Bob", 33); mongoTemplate.insert(p);//还可以多加一个参数,来提供collectio

Linux学习笔记——第一篇——Ubuntu安装与操作

笔者是Windows的使用者,由于Coding的需要以及在Linux下开发的方便,所以开始使用Linux. 当然笔者还是割舍不下Windows的,毕竟很多通讯工具等软件以及游戏在Linux下是没有发行的,所以笔者使用了虚拟机啊. 下面给出简单的安装过程. 1.下载虚拟机软件,笔者比较喜欢VMPlayer,因为它比较轻便且免费,并且很好的支持了拖拽复制功能(VM TOOL),当然也可以使用如VirtualBox.VPC等 链接:https://my.vmware.com/web/vmware/fr

java 学习笔记之 流、文件的操作

ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import java.io.FilenameFilter; public class Test1 { public static void main(String[] args) { File file=new File("F:\\2017-2018-1\\javase"); // //获取该目录下