ESP32系列教程之SmartConfig智能配网

SmartConfig介绍

随着越来越多智能家居设备进入家庭,这些产品大部分都是要连接家庭的WiFi网络的。而WiFi网络的接入需要知道无线路由器的名称(SSID)和密码,绝大多数的智能家居是没有输入接口的,在设备中预先设置WiFi的名称和密码显然是不现实的,这样对于智能家居要连接的无线路由器输入无线路由器的名字和密码就成了一个困难。为了克服这个问题,人们使用了多种配网方法,比如智能家居热点配网,手机热点配网,蓝牙辅助配网等等,这些配网方式都存在一定的不方便之处,而smartConfig配网方式是这些无线配网方式里面比较方便和快捷的配网方式之一。

ESP8266、ESP32使用了ESP-Touch协议,它适用于TI开发的SmartConfig技术。SmartConfig又名快连,用于将基于Wi-Fi的新型物联网设备连接到Wi-Fi网络。当前设备在没有和其他设备建立任何实际性通信链接的状态下,一键配置该设备接入WIFI。
smartconfig的配网基本原理是通过手机直接发送报文到待配网设备。手机发送UDP广播报文,待配网设备扫描所有的可用无线信道,找到发送smartConfig的报文,并锁定在这一信道上开始接收数据。

smartconfig完成配网主要分以下3个步骤:

  1. 设备进入初始化状态,开始监听附近的WiFi数据包。
  2. 手机/平板设置WiFi名称和密码后,发送UDP广播包。
  3. 设备通过UDP包(长度)获取配置信息,切换网络模式,连接上家里WiFi,配置完成。

SmartConfig智能配网代码说明

  1. 引入头文件
#include <WiFi.h>
  1. SmartConfig智能配网

SmartConfig智能配网用到的主要函数为WiFi.beginSmartConfig()。通过查询SmartConfig连接状态判断WiFi是否连接成功,用到的主要函数为WiFi.smartConfigDone()

void smart_config(void)
{
    // Init WiFi as Station, start SmartConfig
    WiFi.mode(WIFI_AP_STA);
    WiFi.beginSmartConfig();

    // Wait for SmartConfig packet from mobile
    Serial.println("Waiting for SmartConfig.");
    while (!WiFi.smartConfigDone())
    {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("SmartConfig received.");

    // Wait for WiFi to connect to AP
    Serial.println("Waiting for WiFi");
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        Serial.print(".");
    }

    WiFi.setAutoConnect(true); // 设置自动连接
}
  1. 开机自动连接WiFi
bool connect_wifi(void)
{
    WiFi.mode(WIFI_STA);
    WiFi.begin(); //启动WIFI连接
    Serial.println("Connection WIFI");

    int retry_count = 0;
    while (retry_count < MAX_RETRY)
    {
        delay(500);
        Serial.print(".");
        retry_count++;
        if (WiFi.status() == WL_CONNECTED) //检查连接状态
        {
            return true;
        }
    }
    return false;
}
  1. 开机判断联网方式,初次联网,则进入SmartConfig智能配网
void setup_wifi(void)
{
    if (!connect_wifi())
    {
        smart_config();
    }
}

程序运行结果

Connection WIFI
..........Waiting for SmartConfig.
...............................................
SmartConfig received.
Waiting for WiFi

WiFi connected: Ohyes
IP address: 192.168.3.94
hello world!
hello world!
Connection WIFI
.........
WiFi connected: Ohyes
IP address: 192.168.3.94
hello world!
hello world!
hello world!
hello world!
hello world!
hello world!

附录:完整代码

完整代码可在GitHub下载:canhetingsky/ESP32_DEV/ESP32_SmartConfig

#include <WiFi.h>

#define MAX_RETRY 10

void smart_config(void)
{
    // Init WiFi as Station, start SmartConfig
    WiFi.mode(WIFI_AP_STA);
    WiFi.beginSmartConfig();

    // Wait for SmartConfig packet from mobile
    Serial.println("Waiting for SmartConfig.");
    while (!WiFi.smartConfigDone())
    {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("SmartConfig received.");

    // Wait for WiFi to connect to AP
    Serial.println("Waiting for WiFi");
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        Serial.print(".");
    }

    WiFi.setAutoConnect(true); // 设置自动连接
}

bool connect_wifi(void)
{
    WiFi.mode(WIFI_STA);
    WiFi.begin(); //启动WIFI连接
    Serial.println("Connection WIFI");

    int retry_count = 0;
    while (retry_count < MAX_RETRY)
    {
        delay(500);
        Serial.print(".");
        retry_count++;
        if (WiFi.status() == WL_CONNECTED) //检查连接状态
        {
            return true;
        }
    }
    return false;
}

void setup_wifi(void)
{
    if (!connect_wifi())
    {
        smart_config();
    }

    Serial.println("");
    Serial.print("WiFi connected: ");
    Serial.println(WiFi.SSID());
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
}

void setup()
{
    // put your setup code here, to run once:
    Serial.begin(115200);
    setup_wifi();
}

void loop()
{
    // put your main code here, to run repeatedly:
    Serial.println("hello world!");
    delay(1000);
}

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

残荷亭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值