搜索
bottom↓
回复: 0

《DNESP32S3使用指南-IDF版_V1.6》第五十一章 WiFi一键配网

[复制链接]

出0入234汤圆

发表于 2024-8-6 11:02:12 | 显示全部楼层 |阅读模式
2.jpg
1)实验平台:正点原子ESP32S3开发板
2)购买链接:https://detail.tmall.com/item.htm?id=768499342659
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-347618-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学ESP32S3快速入门视频教程:https://www.bilibili.com/video/BV1sH4y1W7Tc
6)正点原子FPGA交流群:132780729
1.png
3.png


第五十一章 WiFi一键配网


       ESP32-S3的一键配网模式是一种方便快捷的WiFi配置方式。在这种模式下,用户无需手动输入WiFi的SSID和密码等信息,只需要通过一键操作,即可完成WiFi的配置和连接。本章节,作者使用乐鑫官方提供的SmartConfig软件一键配置WiFi账号与密码。
       本章分为如下几个小节:
       51.1 主流WIFI 配网方式简介
       51.2 硬件设计
       51.3 软件设计
       51.4 下载验证

       51.1 主流WIFI 配网方式简介
       目前主流的WIFI配网方式主要有以下三种:

       一、SoftAP配网
       ESP32-S3会建立一个WiFi热点(AP模式),用户将手机连接到这个热点后,将要连接的WiFi信息发送给ESP32-S3,ESP32-S3得到SSID和密码。
       ①:优点:很可靠,成功率基本达到100%,设备端的代码简单。
       ②:缺点:需要手动切换手机WiFi连接的网络,先连接到ESP32的AP网络,配置完成后再恢复连接正常WiFi网络,操作上存在复杂性,可能给用户带来困扰。
       ③:官方支持:没有提供Demo。

       二、Smartconfig配网
       ESP32-S3处于混杂模式下,监听网络中的所有报文,手机APP将当前连接的SSID和密码编码到UDP报文中,通过广播或组播的方式发送报文,ESP32-S3接收到UDP报文后解码,得到SSID和密码,然后使用该组SSID和密码去连接网络。
       ①:优缺点:简洁,用户容易操作,但配网成功率受环境影响较大。
       ②:官方支持:提供Demo和smart_config例程。

       三、Airkiss配网
       AirKiss是微信硬件平台提供的一种WIFI设备快速入网配置技术。要使用微信客户端的方式配置设备入网,需要设备支持AirKiss技术。Airkiss的原理和Smartconfig很类似,设备工作在混杂模式下,微信客户端发送包含SSID和密码的广播包,设备收到广播包解码得到SSID和密码。详细的可以参考微信官方的介绍。
       ①:优缺点:简洁,用户容易操作,但配网成功率受环境影响较大。
       ②:官方支持:提供Demo和smart_config例程。
本实验以Smartconfig软件对ESP32-S3设备进行一键配网,该软件的安装包可在乐鑫官方网站的相关下载网页找到,如下图所示。


第五十一章 WiFi一键配网1042.png
图51.1.1 Smartconfig软件下载

       下载成功后,需把安装包转移到安卓手机或者苹果手机上安装。

       51.2 硬件设计

       1. 例程功能
       本章实验功能简介:设备进入初始化状态,开启混监听所有网络数据包,此时LCD显示"In the distribution network......",表示设备已进入混监听模式。手机连上自己的WiFi,开启APP(EspTouch)软件,输入手机所在WiFi密码,请求配网,发送UDP广播包。ESP32 -S3通过UDP包(长度)获取配置信息捕捉到路由SSID和PASSWD,连接路由器,此时LCD显示路由的账号与密码,表示连接路由成功。

       2. 硬件资源

       1)LED灯
              LED-IO1

       2)XL9555
              IIC_INT-IO0(需在P5连接IO0)
              IIC_SDA-IO41
              IIC_SCL-IO42

       3)SPILCD
              CS-IO21
              SCK-IO12
              SDA-IO11
              DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连)
              PWR- IO1_3(XL9555)
              RST- IO1_2(XL9555)

       4)ESP32-S3内部WiFi

       3. 原理图
       本章实验使用的WiFi为ESP32-S3的片上资源,因此并没有相应的连接原理图。

       51.3 软件设计

       51.3.1 程序流程图
       程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:

第五十一章 WiFi一键配网1708.png
图51.3.1.1 程序流程图

       51.3.2 程序解析
       在本章节实验中,我们只关心main.c文件内容即可,该文件内容如下:
  1. i2c_obj_t i2c0_master;

  2. /* 定义事件 */
  3. static EventGroupHandle_t s_wifi_event_group;
  4. static const int CONNECTED_BIT = BIT0;
  5. static const int ESPTOUCH_DONE_BIT = BIT1;
  6. static const char *TAG = "smartconfig_example";
  7. static void smartconfig_task(void * parm);
  8. static char lcd_buff[100] = {0};


  9. /**
  10. * @brief       WIFI链接糊掉函数
  11. * @param       arg:传入网卡控制块
  12. * @param       event_base:WIFI事件
  13. * @param       event_id:事件ID
  14. * @param       event_data:事件数据
  15. * @retval      无
  16. */
  17. static void event_handler(void* arg, esp_event_base_t event_base,
  18.                                 int32_t event_id, void* event_data)
  19. {
  20.     if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START)
  21.     {
  22.         xTaskCreate(smartconfig_task, "smartconfig_task", 4096, NULL, 3, NULL);
  23.     }
  24. else if (event_base == WIFI_EVENT &&
  25. event_id == WIFI_EVENT_STA_DISCONNECTED)
  26.     {
  27.         esp_wifi_connect();
  28.         xEventGroupClearBits(s_wifi_event_group, CONNECTED_BIT);
  29.     }
  30.     else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP)
  31.     {
  32.         xEventGroupSetBits(s_wifi_event_group, CONNECTED_BIT);
  33.     }
  34.     else if (event_base == SC_EVENT && event_id == SC_EVENT_SCAN_DONE)
  35.     {
  36.         ESP_LOGI(TAG, "Scan done");
  37.         lcd_show_string(0,90,320,16,16,"In the distribution network", BLUE);
  38.     }
  39.     else if (event_base == SC_EVENT && event_id == SC_EVENT_FOUND_CHANNEL)
  40.     {
  41.         ESP_LOGI(TAG, "Found channel");
  42.     }
  43.     /* 已获取SSID和密码,表示配网成功 */
  44.     else if (event_base == SC_EVENT && event_id == SC_EVENT_GOT_SSID_PSWD)
  45.     {
  46.         ESP_LOGI(TAG, "Got SSID and password");

  47.         smartconfig_event_got_ssid_pswd_t *evt =
  48.                                 (smartconfig_event_got_ssid_pswd_t *)event_data;
  49.         wifi_config_t wifi_config;
  50.         uint8_t ssid[33] = { 0 };
  51.         uint8_t password[65] = { 0 };
  52.         uint8_t rvd_data[33] = { 0 };

  53.         bzero(&wifi_config, sizeof(wifi_config_t));
  54.         memcpy(wifi_config.sta.ssid, evt->ssid, sizeof(wifi_config.sta.ssid));
  55.         memcpy(wifi_config.sta.password, evt->password,
  56.                sizeof(wifi_config.sta.password));
  57.         wifi_config.sta.bssid_set = evt->bssid_set;

  58.         if (wifi_config.sta.bssid_set == true)
  59.         {
  60.             memcpy(wifi_config.sta.bssid, evt->bssid,
  61.                    sizeof(wifi_config.sta.bssid));
  62.         }

  63.         memcpy(ssid, evt->ssid, sizeof(evt->ssid));
  64.         memcpy(password, evt->password, sizeof(evt->password));
  65.         ESP_LOGI(TAG, "SSID:%s", ssid);
  66.         ESP_LOGI(TAG, "PASSWORD:%s", password);

  67.         lcd_fill(0,90,320,240,WHITE);
  68.         sprintf(lcd_buff, "%s",ssid);
  69.         lcd_show_string(0, 90, 320, 16, 16, lcd_buff, BLUE);
  70.         sprintf(lcd_buff, "%s",password);
  71.         lcd_show_string(0, 110, 320, 16, 16, lcd_buff, BLUE);
  72.         lcd_show_string(0,130,320,16,16,"distribution network", BLUE);

  73.         /* 手机APPEspTouch软件使用ESPTOUCH V2模式,会执行以下代码 */
  74.         if (evt->type == SC_TYPE_ESPTOUCH_V2)
  75.         {
  76.             ESP_ERROR_CHECK( esp_smartconfig_get_rvd_data(rvd_data,
  77.                              sizeof(rvd_data)) );
  78.             ESP_LOGI(TAG, "RVD_DATA:");

  79.             for (int i = 0; i < 33; i++)
  80.             {
  81.                 printf("%02x ", rvd_data);
  82.             }

  83.             printf("\n");
  84.         }

  85.         ESP_ERROR_CHECK( esp_wifi_disconnect() );
  86.         ESP_ERROR_CHECK( esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );
  87.         esp_wifi_connect();
  88.     }
  89.     else if (event_base == SC_EVENT && event_id == SC_EVENT_SEND_ACK_DONE)
  90.     {
  91.         xEventGroupSetBits(s_wifi_event_group, ESPTOUCH_DONE_BIT);
  92.     }
  93. }

  94. /**
  95. * @brief       WiFi一键配网
  96. * @param       无
  97. * @retval      无
  98. */
  99. static void wifi_smartconfig_sta(void)
  100. {
  101.     /* 初始化网卡 */
  102.     ESP_ERROR_CHECK(esp_netif_init());
  103.     /* 创建事件 */
  104.     s_wifi_event_group = xEventGroupCreate();
  105.     /* 使用默认配置初始化包括netif的Wi-Fi */
  106.     ESP_ERROR_CHECK(esp_event_loop_create_default());
  107.     /* 把WIFI网卡设置为STA模式 */
  108.     esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();
  109.     assert(sta_netif);
  110.     wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  111.     /* WIFI初始化 */
  112.     ESP_ERROR_CHECK( esp_wifi_init(&cfg) );

  113.     /* 注册WIFI事件 */
  114. ESP_ERROR_CHECK( esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID,
  115.                  &event_handler, NULL) );
  116. ESP_ERROR_CHECK( esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP,
  117.                  &event_handler, NULL) );
  118. ESP_ERROR_CHECK( esp_event_handler_register(SC_EVENT, ESP_EVENT_ANY_ID,
  119.                  &event_handler, NULL) );

  120.     ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
  121.     ESP_ERROR_CHECK( esp_wifi_start() );
  122. }

  123. /**
  124. * @brief       一键配网回调函数
  125. * @param       parm:传入的形参(未使用)
  126. * @retval      无
  127. */
  128. static void smartconfig_task(void * parm)
  129. {
  130.     parm = parm;
  131.     EventBits_t uxBits;
  132.     /* 设置配网协议 */
  133.     ESP_ERROR_CHECK( esp_smartconfig_set_type(SC_TYPE_ESPTOUCH) );
  134.     /* 设置配网参数 */
  135.     smartconfig_start_config_t cfg = SMARTCONFIG_START_CONFIG_DEFAULT();
  136.     /* 开始配网 */
  137.     ESP_ERROR_CHECK( esp_smartconfig_start(&cfg) );

  138.     while (1)
  139.     {
  140.         /* 获取事件 */
  141.         uxBits = xEventGroupWaitBits(s_wifi_event_group, CONNECTED_BIT
  142. | ESPTOUCH_DONE_BIT, true, false, portMAX_DELAY);
  143.         
  144.         /* 配网成功 */
  145.         if(uxBits & CONNECTED_BIT)
  146.         {
  147.             ESP_LOGI(TAG, "WiFi Connected to ap");
  148.         }

  149.         /* 智能配置结束 */
  150.         if(uxBits & ESPTOUCH_DONE_BIT)
  151.         {
  152.             /* 配网结束,删除任务 */
  153.             esp_smartconfig_stop();
  154.             vTaskDelete(NULL);
  155.         }
  156.     }
  157. }

  158. /**
  159. * @brief       程序入口
  160. * @param       无
  161. * @retval      无
  162. */
  163. void app_main(void)
  164. {
  165.     /* 省略部分代码..... */

  166.     wifi_smartconfig_sta();

  167.     while (1)
  168.     {
  169.         LED_TOGGLE();
  170.         vTaskDelay(500);
  171.     }
  172. }
复制代码
       上述源码是把ESP32-S3设备配置为STA模式,然后开启配网任务并启动配网,此时,ESP32-S3处于混杂模式下,监听网络中的所有报文,当手机APP将当前连接的SSID和密码编码到UDP报文中,通过广播或组播的方式发送报文,ESP32-S3接收到UDP报文后解码,得到SSID和密码,然后使用该组SSID和密码去连接当前网络。

       51.4 下载验证
       程序下载成功后,我们打开“EspTouch”软件,在此软件下点击 “EspTouch”选项,注意:手机必须连接WiFi,才能一键配网,如下图所示。

第五十一章 WiFi一键配网7713.png
图51.4.1 手机配置要连接的WiFi账号与密码

       此时,我们填写好“ALIENTEK-YF_5G”WiFi密码和传输方式,可按下确定按键发送UDP报文。当ESP32-S3设备接收到这个报文时,系统会提取该报文的SSID和密码去连接该网络。下图是ESP32-S3配网成功效果图。

第五十一章 WiFi一键配网7881.png
图51.4.2 配网成功

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 06:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表