ESP8266开发之旅 网络篇⑧ SmartConfig——一键配网
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。
QQ技术互动交流群:ESP8266&32 物联网开发 群号622368884,不喜勿喷
一、你如果想学基于Arduino的ESP8266开发技术
一、基础篇
二、网络篇
- ESP8266开发之旅 网络篇① 认识一下Arduino Core For ESP8266
- ESP8266开发之旅 网络篇② ESP8266 工作模式与ESP8266WiFi库
- ESP8266开发之旅 网络篇③ Soft-AP——ESP8266WiFiAP库的使用
- ESP8266开发之旅 网络篇④ Station——ESP8266WiFiSTA库的使用
- ESP8266开发之旅 网络篇⑤ Scan WiFi——ESP8266WiFiScan库的使用
- ESP8266开发之旅 网络篇⑥ ESP8266WiFiGeneric——基础库
- ESP8266开发之旅 网络篇⑦ TCP Server & TCP Client
- ESP8266开发之旅 网络篇⑧ SmartConfig——一键配网
- ESP8266开发之旅 网络篇⑨ HttpClient——ESP8266HTTPClient库的使用
- ESP8266开发之旅 网络篇⑩ UDP服务
- ESP8266开发之旅 网络篇⑪ WebServer——ESP8266WebServer库的使用
- ESP8266开发之旅 网络篇⑫ 域名服务——ESP8266mDNS库
- ESP8266开发之旅 网络篇⑬ SPIFFS——ESP8266 Flash文件系统
- ESP8266开发之旅 网络篇⑭ web配网
- ESP8266开发之旅 网络篇⑮ 真正的域名服务——DNSServer
- ESP8266开发之旅 网络篇⑯ 无线更新——OTA固件更新
三、应用篇
四、高级篇
1. 前言
前面的博文中,博主提供的实例源代码通常都是固定了WiFi热点的账号密码。但是,在实际产品开发中,这样的限制是行不通的。
当你拿到一块WiFi模块,如果需要连上网络,则需要将SSID名称、密码设置到模块当中。一般有几种方式:
- 一种就是通过串口接到输入设备,通过串口输入AT指令(SSID名称和密码),但是前提是该模块本身烧入了AT固件,很明显不符合Arduino core for ESP8266开发;
- 一种就是设备提供一个AP热点,手机连上这个热点,然后通过手机把家里的WiFi的SSID和密码配置到设备上,最后手机再切换回家里的WiFi(这里就是博主后面会讲到的Web配网),这种配网成功率可以说是100%。
- 通过SmartConfig技术配置,微信的AirKiss、ESP8266的esptouch(博主也把esptouch的代码抽取了一个module,供Android Studio开发app的同学直接引入),这是最智能的配网方式。但是缺点也很明显,那就是配网成功率未达到100%,同时SmartConfig还得另外安装一个app。SmartConfig最佳的应用场景就是你开发的产品需要搭配App来使用。
2. smartconfig
8266核心库提供了SmartConfig技术,那么smartconfig到底是什么呢?
2.1 smartconfig工作原理
所谓SmartConfig就是手机App端发送包含WIFI用户名以及密码的UDP广播包,智能终端(开启了sniffer混杂模式)的WIFI芯片可以接收到该UDP包,只要知道UDP包的组织形式,就可以通过接收到的UDP包解密出WIFI用户名密码,然后智能硬件配置收到的用户名密码到指定的WIFI AP上。
直接看一个概念图:

简单操作步骤如下:
- 8266 端作为station,进入smartconfig, 等待手机端发出的用户名和密码。
- 手机端把填写当前网络的密码通过UDP广播;
- 8266 获取到信息之后推出smartconfig配置,连接网络;
2.2 smartconfig支持库
还记得,博主其实在 ESP8266开发之旅 网络篇④ Station——ESP8266WiFiSTA库的使用 有稍微涉及到smartconfig。而且,请读者放心,smartconfig配置非常简单,方法就三个:
- beginSmartConfig
- stopSmartConfig
- smartConfigDone
2.2.1 beginSmartConfig —— 启动配网模式
函数说明:
/**
* 启动配网模式
* @return bool 是否启动配网模式成功
*/
bool beginSmartConfig();
看看 beginSmartConfig 源码:
/**
* 启动 SmartConfig
*/
bool ESP8266WiFiSTAClass::beginSmartConfig() {
//SmartConfig已经开启了
if(_smartConfigStarted) {
return false;
}
//开启STA模式
if(!WiFi.enableSTA(true)) {
// enable STA failed
return false;
}
//调用真正的smartconfig_start,并设置了_smartConfigCallback 回调函数
if(smartconfig_start(reinterpret_cast<sc_callback_t>(&ESP8266WiFiSTAClass::_smartConfigCallback), 1)) {
_smartConfigStarted = true;
_smartConfigDone = false;
return true;
}
return false;
}
注意点:
- SmartConfig需要处于STA工作模式;
我们看看 _smartConfigCallback 会做什么?源码:
/**
* _smartConfigCallback
* @param st
* @param result
*/
void ESP8266WiFiSTAClass::_smartConfigCallback(uint32_t st, void* result) {
sc_status status = (sc_status) st;
if(status == SC_STATUS_LINK) {
//获取到配网信息(账号密码)
station_config* sta_conf = reinterpret_cast<station_config*>(result);
//把配置写到flash
wifi_station_set_config(sta_conf);
//断开连接
wifi_station_disconnect();
//重新连接
wifi_station_connect();
//标记配网完成
_smartConfigDone = true;
} else if(status == SC_STATUS_LINK_OVER) {
//停止配网
WiFi.stopSmartConfig();
}
}
2.2.2 stopSmartConfig —— 停止Smartconfig
函数说明:
/**
* 停止Smartconfig
* @return bool 是否停止配网模式成功
*/
bool stopSmartConfig();
源码:
/**
* Stop SmartConfig
*/
bool ESP8266WiFiSTAClass::stopSmartConfig() {
if(!_smartConfigStarted) {
return true;
}
//调用停止函数
if(smartconfig_stop()) {
_smartConfigStarted = false;
return true;
}
return false;
}
2.2.3 smartConfigDone —— 是否完成配网
函数说明:
/**
* 查找状态看是否配网完成
* @return bool 是否启动配网模式成功
*/
bool smartConfigDone();
源码:
/**
* Query SmartConfig status, to decide when stop config
* @return smartConfig Done
*/
bool ESP8266WiFiSTAClass::smartConfigDone() {
if(!_smartConfigStarted) {
return false;
}
//返回状态 _smartConfigCallback 会改变状态
return _smartConfigDone;
}
3. 实例
- 请往8266WiFi模块先烧入以下代码:
#include <ESP8266WiFi.h>
void smartConfig()
{
WiFi.mode(WIFI_STA);
Serial.println("\r\nWait for Smartconfig");
delay(2000);
// 等待配网
WiFi.beginSmartConfig();
while (1)
{
Serial.print(".");
delay(500);
if (WiFi.smartConfigDone())
{
Serial.println("SmartConfig Success");
Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
WiFi.setAutoConnect(true); // 设置自动连接
break;
}
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void setup()
{
Serial.begin(115200);
smartConfig();
}
void loop()
{
delay(100);
Serial.println("loop");
}
- 然后使用ESP8266提供的App ESPTouch 或者还是使用博主后面写的App SmartConfigAPP。
当然,有兴趣的读者也可以获取到源码,请看 传输门,麻烦star。
博主app配置如下:


注意点:
- 如果没有配置成功,一般都是没有进入到SmartConfig中,最好重启一下吧。
测试结果:

4. 总结
本篇非常简单,三个方法,简单步骤,一键配置网络,值得拥有。
ESP8266开发之旅 网络篇⑧ SmartConfig——一键配网的更多相关文章
- ESP8266开发之旅 网络篇⑯ 无线更新——OTA固件更新
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑦ TCP Server & TCP Client
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑨ HttpClient——ESP8266HTTPClient库的使用
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑩ UDP服务
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑪ WebServer——ESP8266WebServer库的使用
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑬ SPIFFS——ESP8266 SPIFFS文件系统
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑭ web配网
1. 前言 目前,市面上流行多种配网方式: WIFI模块的智能配网(SmartConfig以及微信AirKiss配网) SmartConfig 配网方式 请参考博主之前的博文 ESP8266开 ...
- ESP8266开发之旅 网络篇④ Station——ESP8266WiFiSTA库的使用
1. 前言 在前面的篇章中,博主给大家讲解了ESP8266的软硬件配置以及基本功能使用,目的就是想让大家有个初步认识.并且,博主一直重点强调 ESP8266 WiFi模块有三种工作模式: St ...
- ESP8266开发之旅 网络篇③ Soft-AP——ESP8266WiFiAP库的使用
1. 前言 在前面的篇章中,博主给大家讲解了ESP8266的软硬件配置以及基本功能使用,目的就是想让大家有个初步认识.并且,博主一直重点强调 ESP8266 WiFi模块有三种工作模式: St ...
随机推荐
- LayUI 上传IE11上传格式错误之后, layer.load(1)的动画一直在,没有关闭(仅限IE11)
这个问题,测试反馈的时候,有丝丝的不相信,毕竟layui大家都是那么用的,结果后来用最简单的测试,发现确实会出现动画一直在的情况,如下: 上网搜索,也没发现一些有效的信息,最后就是自己读upload. ...
- Java线程池Executor&ThreadPool
java自1.5版本之后,提供线程池,供开发人员快捷方便的创建自己的多线程任务.下面简单的线程池的方法及说明. 1.Executor 线程池的顶级接口.定义了方法execute(Runnable),该 ...
- Unity-遇到的问题小总结
1. event trigger后面显示不了对应的方法 原因:我是直接把脚本拖拽进去的,这是没有实例化的,拖拽进去的应该是挂载这个脚本的GameObject就可以了 2.制作prefeb 将场景中的单 ...
- python爬虫入门新手向实战 - 爬取猫眼电影Top100排行榜
本次主要爬取Top100电影榜单的电影名.主演和上映时间, 同时保存为excel表个形式, 其他相似榜单也都可以依葫芦画瓢 首先打开要爬取的网址https://maoyan.com/board/4, ...
- Dubbo学习系列之十三(Mycat数据库代理)
软件界有只猫,不用我说,各位看官肯定知道是哪只,那就是大名鼎鼎的Tomcat,现在又来了一只猫,据说是位东方萌妹子,暂且认作Tom猫的表妹,本来叫OpencloudDB,后又改名为Mycat,或许Ca ...
- MySQL在Linux系统环境的安装和无主机登录配置
将mysql 安装在单个Linux系统主机,并配置本地或远程(此处可仅单指局域状态下的环境)的无主机登录.谨记的是:操作完mysql 设置时,需以flush privileges进行权限 ...
- .NetCore技术研究-一套代码同时支持.NET Framework和.NET Core
在.NET Core的迁移过程中,我们将原有的.NET Framework代码迁移到.NET Core.如果线上只有一个小型的应用还好,迁移升级完成后,只需要维护.NET Core这个版本的代码. 但 ...
- 12-DOM相关案例
12-关于DOM操作的相关案例 1.模态框案例 需求: 打开网页时有一个普通的按钮,点击当前按钮显示一个背景图,中心并弹出一个弹出框,点击X的时候会关闭当前的模态框 代码如下: <!DOCT ...
- Python控制函数运行时间
在某个Flask项目在做后端接口时需要设置超时响应,因为接口中使用爬虫请求了多个网站,响应时间时长时短. 我需要设置一个最大响应时间,时间内如果接口爬虫没跑完,直接返回请求超时. 从网上了解到有两种方 ...
- Go中使用seed得到相同随机数的问题
1. 重复的随机数 废话不多说,首先我们来看使用seed的一个很神奇的现象. func main() { for i := 0; i < 5; i++ { rand.Seed(time.Now( ...