ESP32-Station Mode例程解析

由于毕设需要单片机实现联网功能进而实现手机控制,我对ESP32的Wi-Fi的Station的程序进行一番理解和整理。
ESP32例程下载地址

我们先分析每一句代码所蕴含的信息:

/* WiFi station Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.*/

#include //内存和字符串函数的定义
#include "freertos/FreeRTOS.h"//实时操作系统freertos头文件
#include "freertos/task.h"//freertos任务(线程)头文件
#include "freertos/event_groups.h"//freertos事件组
#include "esp_system.h"//ESP32系统头文件(包括系统枚举的定义和函数的声明)
#include "esp_wifi.h"//ESP32Wi-Fi功能头文件
#include "esp_event_loop.h"//ESP32事件轮询头文件
#include "esp_log.h"//ESP32日志信息头文件(打印输出代码信息)
#include "nvs_flash.h"//Non-volatile storage (NVS)非易失性存储库。用于把数据存储到 flash中,掉电或重启后数据仍然存在
#include "lwip/err.h"//轻量级TCP/IP协议栈之错误代码相应的头文件
#include "lwip/sys.h"//轻量级TCP/IP协议栈之系统相应的头文件
/* The examples use WiFi configuration that you can set via 'make menuconfig'.
If you'd rather not, just change the below entries to strings with
the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"
*/
//可以通过make menuconfig(Linux下)进行配置Wi-Fi Station要连接的AP的SSID和PSW

#define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID//AP对应的SSID
#define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD//AP对应的连接密钥
#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY//Station连接AP时重试的次数
//上面这三个宏定义可以直接修改(注意SSID和PSW都是字符串形式)或者在Kconfig.projbuild文件中进行修改。

/* FreeRTOS event group to signal when we are connected*/
static EventGroupHandle_t s_wifi_event_group;
/* The event group allows multiple bits for each event, but we only care about one event
* - are we connected to the AP with an IP? */
const int WIFI_CONNECTED_BIT = BIT0;//事件组允许每个事件有多个位,但是我们只关心一个事件,所以只设置一位(可追溯程序找到#define BIT0 0x00000001)
static const char *TAG = "wifi station";//该程序的标签为WiFi基站
static int s_retry_num = 0;//重试次数计数
static esp_err_t event_handler(void *ctx, system_event_t *event)//事件句柄(WiFi状态机)
{
switch(event->event_id) {//选择是哪个事件ID
case SYSTEM_EVENT_STA_START://状态位为开启STA
esp_wifi_connect();//开始连接WiFi
break;
case SYSTEM_EVENT_STA_GOT_IP://状态位为获取IP
ESP_LOGI(TAG, "got ip:%s",//打印分配到的IP到调试窗口
ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));//转换IP地址为ASIIC字符串
s_retry_num = 0;//由于连接成功,重置重试计数值
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);//置位连接标志位(由于成功获取到IP,即成功连接到WiFi)
break;
case SYSTEM_EVENT_STA_DISCONNECTED://状态位为断开连接
{
if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) {//如果计数值少于设定最大重试值
esp_wifi_connect();重新连接到WiFi
xEventGroupClearBits(s_wifi_event_group, WIFI_CONNECTED_BIT);//同上GOT_IP
s_retry_num++;//计数值加一
ESP_LOGI(TAG,"retry to connect to the AP");//打印重新连接信息
}
ESP_LOGI(TAG,"connect to the AP fail\n");//如果超过最大重连数则打印连接失败信息
break;
}
default:
break;
}
return ESP_OK;
}

void wifi_init_sta()//初始化STA
{
s_wifi_event_group = xEventGroupCreate();//创建事件组
tcpip_adapter_init();//TCP/IP适配器初始化
ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL) );//当wifi状态机的状态变化时,会调用函数event_handler(),并给它传递适当的参数
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();//配置WIFI默认属性
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
wifi_config_t wifi_config = {
.sta = {
.ssid = EXAMPLE_ESP_WIFI_SSID,//要连接的AP的SSID
.password = EXAMPLE_ESP_WIFI_PASS//要连接的AP的密码
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );//检查WIFI是否进入STA模式
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) );//检查WIFI是否配置成功
ESP_ERROR_CHECK(esp_wifi_start() );//检查WIFI是否成功启动
ESP_LOGI(TAG, "wifi_init_sta finished.");//打印配置STA成功
ESP_LOGI(TAG, "connect to ap SSID:%s password:%s"//打印SSID,
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);//打印密码
}
void app_main()//程序主函数
{
//Initialize NVS
esp_err_t ret = nvs_flash_init();//非易失性闪存初始化
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
//检查NVS分区是否不包含任何空页。如果NVS分区被截断,可能会发生这种情况。删除整个分区并再次调用nvs_flash_init,或者NVS分区包含新格式的数据,无法被此版本的代码识别
ESP_ERROR_CHECK(nvs_flash_erase());//擦写flash
ret = nvs_flash_init();//重新初始化nvs_flash
}
ESP_ERROR_CHECK(ret);//判断初始化是否成功
ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
wifi_init_sta();//初始化WIFI STA
}

ESP32的W-iFi编程模型如下图所示:
ESP32-Station Mode例程解析_第1张图片

ESP32 WIFI STA配置大致流程如下:

初始化NVS
初始化TCP/IP适配器
初始化事件调度器
初始化WiFi驱动
配置WiFi模式sta
配置WiFi接口参数
启动WiFi
WiFi状态机开始工作

参考网址:
让 ESP32 连接到你的 WiFi 热点

你可能感兴趣的:(WiFi,ESP32)