esp32s3-idf使用smart_config一键配网

所谓配网,就是让esp32收到wifi的账号和密码,自己去连接wifi,使用的的是乐鑫开发的esptouch这个配网app,只支持2.4ghz的wifi,不支持5g。

配网的流程是esp32先开启配网,然后手机打开配网软件,配网软件会连续发送三个开始码,然后发送账号密码,在发送三个终止码。

esp32端通过事件接收机制,会收到事件的数据,每一个事件类型都对应一个数据类型,然后处理数据获取账号和密码,再配置wifi就可以连接了。

  • WIFI_EVENT_*:如 WIFI_EVENT_STA_CONNECTED 对应 wifi_event_sta_connected_t,WIFI_EVENT_STA_DISCONNECTED 对应 wifi_event_sta_disconnected_t

  • IP_EVENT_*:如 IP_EVENT_STA_GOT_IP 对应 ip_event_got_ip_t

  • SC_EVENT_*(SmartConfig):如 SC_EVENT_GOT_SSID_PSWD 对应 smartconfig_event_got_ssid_pswd_t,SC_EVENT_SEND_ACK_DONE 一般无数据

    #include <stdio.h>
    #include "esp_wifi.h"
    #include "nvs_flash.h"
    #include "esp_event.h"
    #include "esp_err.h"
    #include "esp_log.h"
    #include <string.h>
    #include "esp_smartconfig.h"

    #define TAG "STA"
    #define TAG2 "IP"

    void wifi_cb(void* event_handler_arg,esp_event_base_t event_base,int32_t event_id,void* event_data){
    if(event_base==WIFI_EVENT){
    switch (event_id)
    {
    case WIFI_EVENT_STA_START://开启sta模式成功
    esp_wifi_connect();//链接路由器
    break;
    case WIFI_EVENT_STA_CONNECTED://成功连接到路由器
    ESP_LOGI(TAG,"esp32s3 connected wifi");
    case WIFI_EVENT_STA_DISCONNECTED://断开连接
    ESP_LOGI(TAG,"esp32s3 disconnected wifi");
    esp_wifi_connect();
    default:
    break;
    }
    }
    else if (event_base==IP_EVENT)
    {
    switch (event_id)
    {
    case IP_EVENT_STA_GOT_IP:
    ESP_LOGI(TAG2,"esp32 got ip,connnecet success");
    break;

    复制代码
          default:
              break;
          }
      }
    
      else if (event_base==SC_EVENT)
      {
          switch (event_id)
          {
          case SC_EVENT_GOT_SSID_PSWD://获得wifi的账号和密码
          //类型转换,告诉编辑器是哪一个数据类型,不同事件对应不同的数据类型,void*数据类型不能直接访问成员数据
          //得到数据类型后按照结构体定义的顺序进行偏移
              smartconfig_event_got_ssid_pswd_t *evt=(smartconfig_event_got_ssid_pswd_t *)event_data;
              wifi_config_t wifi_config={0};
              memset(&wifi_config,0,sizeof(wifi_config));
              //char*加上数组可以返回数组的地址
              snprintf((char*)wifi_config.sta.ssid,sizeof(wifi_config.sta.ssid),"%s",(char*)evt->ssid);
              snprintf((char*)wifi_config.sta.password,sizeof(wifi_config.sta.password),"%s",(char*)evt->password);
              wifi_config.sta.bssid_set=evt->bssid_set;
              if(wifi_config.sta.bssid_set){
                  memcpy(wifi_config.sta.bssid,evt->bssid,6);
              }
              esp_wifi_disconnect();
              //选择网卡和配置wifi
              esp_wifi_set_config(WIFI_IF_STA,&wifi_config);
              esp_wifi_connect();
              break;
          case SC_EVENT_SEND_ACK_DONE://发送应答完成
              esp_smartconfig_stop();//结束smart_config配网
              break;
          default:
              break;
          }
      }

    }

    void app_main(void)
    {
    //初始化nvs,后续会用来保存wifi的账号密码
    nvs_flash_init();
    //初始化网络接口(TCP/IP 协议栈相关)
    esp_netif_init();
    //创建创建默认事件循环机制
    esp_event_loop_create_default();
    //创建默认的 STA(站点)网络接口对象。
    esp_netif_create_default_wifi_sta();
    //按照默认配置,初始化wifi的操作
    wifi_init_config_t cfg=WIFI_INIT_CONFIG_DEFAULT();
    esp_wifi_init(&cfg);
    //向事件循环里面加入回调函数,有对应事件发生时会自动调用回调函数
    esp_event_handler_register(WIFI_EVENT,ESP_EVENT_ANY_ID,wifi_cb,NULL);//sta,数据链路层·
    //获取到ip,网络层
    esp_event_handler_register(IP_EVENT,IP_EVENT_GOT_IP6,wifi_cb,NULL);
    //捕获所有的关于smartconfig的事件
    esp_event_handler_register(SC_EVENT,ESP_EVENT_ANY_ID,wifi_cb,NULL);

    复制代码
      esp_wifi_set_mode(WIFI_MODE_STA);
      //启动 Wi‑Fi,开始连接流程
      esp_wifi_start();
      smartconfig_start_config_t cfg2=SMARTCONFIG_START_CONFIG_DEFAULT();
      esp_smartconfig_start(&cfg2);

    }

相关推荐
minji...5 分钟前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
运维行者_1 小时前
OpManager MSP NetFlow Analyzer集成解决方案,应对多客户端网络流量监控挑战
大数据·运维·服务器·网络·数据库·自动化·运维开发
dashizhi20152 小时前
共享文件禁止拖动本地磁盘、共享文件禁止另存为、禁止打印共享文件、禁止复制共享文件的方法
运维·服务器·网络·安全·电脑
网教盟人才服务平台2 小时前
AI 全面重塑网络攻防生态,智能安全进入深度对抗时代
网络·人工智能·安全
头铁的伦5 小时前
QNX 网络模型
linux·网络·车载系统
小贾要学习5 小时前
【Linux】TCP网络通信编程
linux·服务器·网络·c++·网络协议·tcp/ip
vortex55 小时前
构建可审计、可分层、可扩展的SSH身份管理体系
网络·ssh·php
Hello_Embed6 小时前
嵌入式上位机开发入门(十九):Socket 状态检测与断线重连
网络·单片机·网络协议·tcp/ip·嵌入式
cheems95276 小时前
[SpringMVC]Cookie 和Session 从无状态协议到状态保存实务
网络·http
Bruce_Liuxiaowei7 小时前
2026年4月第2周网络安全形势周报(3)
网络·安全·web安全