授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。

QQ技术互动交流群:ESP8266&32 物联网开发 群号622368884,不喜勿喷

一、你如果想学基于Arduino的ESP8266开发技术

一、基础篇

  1. ESP8266开发之旅 基础篇① 走进ESP8266的世界
  2. ESP8266开发之旅 基础篇② 如何安装ESP8266的Arduino开发环境
  3. ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明
  4. ESP8266开发之旅 基础篇④ ESP8266与EEPROM
  5. ESP8266开发之旅 基础篇⑤ ESP8266 SPI通信和I2C通信
  6. ESP8266开发之旅 基础篇⑥ Ticker——ESP8266定时库

二、网络篇

  1. ESP8266开发之旅 网络篇① 认识一下Arduino Core For ESP8266
  2. ESP8266开发之旅 网络篇② ESP8266 工作模式与ESP8266WiFi库
  3. ESP8266开发之旅 网络篇③ Soft-AP——ESP8266WiFiAP库的使用
  4. ESP8266开发之旅 网络篇④ Station——ESP8266WiFiSTA库的使用
  5. ESP8266开发之旅 网络篇⑤ Scan WiFi——ESP8266WiFiScan库的使用
  6. ESP8266开发之旅 网络篇⑥ ESP8266WiFiGeneric——基础库
  7. ESP8266开发之旅 网络篇⑦ TCP Server & TCP Client
  8. ESP8266开发之旅 网络篇⑧ SmartConfig——一键配网
  9. ESP8266开发之旅 网络篇⑨ HttpClient——ESP8266HTTPClient库的使用
  10. ESP8266开发之旅 网络篇⑩ UDP服务
  11. ESP8266开发之旅 网络篇⑪ WebServer——ESP8266WebServer库的使用
  12. ESP8266开发之旅 网络篇⑫ 域名服务——ESP8266mDNS库
  13. ESP8266开发之旅 网络篇⑬ SPIFFS——ESP8266 Flash文件系统
  14. ESP8266开发之旅 网络篇⑭ web配网
  15. ESP8266开发之旅 网络篇⑮ 真正的域名服务——DNSServer
  16. ESP8266开发之旅 网络篇⑯ 无线更新——OTA固件更新

三、应用篇

  1. ESP8266开发之旅 应用篇① 局域网应用 ——炫酷RGB彩灯
  2. ESP8266开发之旅 应用篇② OLED显示天气屏
  3. ESP8266开发之旅 应用篇③ 简易版WiFi小车

四、高级篇

  1. ESP8266开发之旅 进阶篇① 代码优化 —— ESP8266内存管理
  2. ESP8266开发之旅 进阶篇② 闲聊Arduino IDE For ESP8266配置
  3. ESP8266开发之旅 进阶篇③ 闲聊 ESP8266 Flash
  4. ESP8266开发之旅 进阶篇④ 常见问题 —— 解决困扰
  5. ESP8266开发之旅 进阶篇⑤ 代码规范 —— 像写文章一样优美
  6. ESP8266开发之旅 进阶篇⑥ ESP-specific APIs说明

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上。
    直接看一个概念图:

    简单操作步骤如下:

  1. 8266 端作为station,进入smartconfig, 等待手机端发出的用户名和密码。
  2. 手机端把填写当前网络的密码通过UDP广播;
  3. 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. 实例

  1. 请往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");
}
  1. 然后使用ESP8266提供的App ESPTouch 或者还是使用博主后面写的App SmartConfigAPP。
    当然,有兴趣的读者也可以获取到源码,请看 传输门,麻烦star。
    博主app配置如下:

注意点:

  • 如果没有配置成功,一般都是没有进入到SmartConfig中,最好重启一下吧。

测试结果:

4. 总结

本篇非常简单,三个方法,简单步骤,一键配置网络,值得拥有。

ESP8266开发之旅 网络篇⑧ SmartConfig——一键配网的更多相关文章

  1. ESP8266开发之旅 网络篇⑯ 无线更新——OTA固件更新

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  2. ESP8266开发之旅 网络篇⑦ TCP Server & TCP Client

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  3. ESP8266开发之旅 网络篇⑨ HttpClient——ESP8266HTTPClient库的使用

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  4. ESP8266开发之旅 网络篇⑩ UDP服务

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  5. ESP8266开发之旅 网络篇⑪ WebServer——ESP8266WebServer库的使用

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  6. ESP8266开发之旅 网络篇⑬ SPIFFS——ESP8266 SPIFFS文件系统

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  7. ESP8266开发之旅 网络篇⑭ web配网

    1. 前言     目前,市面上流行多种配网方式: WIFI模块的智能配网(SmartConfig以及微信AirKiss配网) SmartConfig 配网方式 请参考博主之前的博文 ESP8266开 ...

  8. ESP8266开发之旅 网络篇④ Station——ESP8266WiFiSTA库的使用

    1. 前言     在前面的篇章中,博主给大家讲解了ESP8266的软硬件配置以及基本功能使用,目的就是想让大家有个初步认识.并且,博主一直重点强调 ESP8266 WiFi模块有三种工作模式: St ...

  9. ESP8266开发之旅 网络篇③ Soft-AP——ESP8266WiFiAP库的使用

    1. 前言     在前面的篇章中,博主给大家讲解了ESP8266的软硬件配置以及基本功能使用,目的就是想让大家有个初步认识.并且,博主一直重点强调 ESP8266 WiFi模块有三种工作模式: St ...

随机推荐

  1. Windows Docker 部署 Spring Boot 项目

    目录 Docker Configuration Config IDEA Plugin Create Spring Boot Project Containerize It Use Dockerfile ...

  2. pt-table-sync 配合pt-table-checksum 修复主从不一致

    pt-table-sync 配合pt-table-checksum 修复主从不一致. 先执行下面这条语句,打印出要执行的命令,确认无误后再将  --print  改为  --execute 执行.注意 ...

  3. 1,eclipse导入项目jdk版本不一样解决方案 2,java报javax.servlet.jsp cannot be resolved to a type

    一:eclipse导入项目jdk版本不一样解决方案 参考博文: https://www.cnblogs.com/chenmingjun/p/8472885.html 选中项目右键 --> Pro ...

  4. Spring 梳理 - filter、interceptor、aop实现与区别 -第二篇

    spring mvc中的Interceptor可以理解为是Spring MVC框架对AOP的一种实现方式.一般简单的功能又是通用的,每个请求都要去处理的,比如判断token是否失效可以使用spring ...

  5. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(线程池版)

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from queue import Queue import requests from lxml import etree ...

  6. Python IAQ中文版 - Python中少有人回答的问题

    Python中少有人回答的问题 The Python IAQ: Infrequently Answered Questions 1 Q: 什么是"少有人回答的问题(Infrequently ...

  7. node学习笔记(二)流和缓冲区

    内容 视频 第四章内容 菜鸟教程服务器 //复制文件 function de(x) { console.log(x); } var fs=require('fs'); fs.mkdir('stuff' ...

  8. (八十三)c#Winform自定义控件-导航菜单(扩展)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  9. 分库分表(3) ---SpringBoot + ShardingSphere 实现读写分离

    分库分表(3)---ShardingSphere实现读写分离 有关ShardingSphere概念前面写了两篇博客: 1.分库分表(1) --- 理论 2. 分库分表(2) --- ShardingS ...

  10. package.json详解

    1.概念 Node.js项目遵循模块化的架构,当我们创建了一个Node.js项目,意味着创建了一个模块,这个模块的描述文件,被称为package.json 亦即:模块的描述文件 = package.j ...