我是嵌入式学习菌,一名热爱学习的嵌入式工程师
关注我,一起变得更加优秀!
嵌入式学习菌
CSDN、B 站视频号同名同步分享嵌入式学习点滴~ 无捷径唯有坚持,愿与你并肩稳步前行!
17篇原创内容
公众号
下面结合工业场景实战案例(ESP32 作为工厂网关,STA 模式连接车间路由器,DHCP 自动获取 IP,联网后上报设备在线状态),把 STA 联网流程拆成「实际操作 + 代码触发 + 现象 / 日志」的形式,让流程更易理解:
场景前提
路由器信息:SSID = Factory_Router,密码 = Factory@123,开启 DHCP(自动分配 IP);
ESP32 功能:STA 模式连路由器,联网后向上位机发送 “设备在线” 的工业协议包;
核心状态机:wifi_sta_wait(初始)→ wifi_sta_connect(连接中)→ wifi_sta_GotIP(联网成功)。
步骤1:前置配置(联网前的准备)
代码操作(主函数 / 初始化函数中):
// 1. 初始化WiFi配置结构体 wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); // 初始化WiFi驱动 // 2. 配置STA模式参数(路由器SSID/密码) wifi_config_t wifi_sta_config = { .sta = { .ssid = "Factory_Router", // 车间路由器SSID .password = "Factory@123", // 路由器密码 .threshold.authmode = WIFI_AUTH_WPA2_PSK, // 加密方式 }, }; ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); // 设置为STA模式 ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_sta_config)); // 写入STA配置现象:无明显日志,仅完成 WiFi 底层驱动和参数初始化,状态机初始为 wifi_sta_wait。
步骤2:启动STA →触发WIFI_EVENT_STA_START
// 启动WiFi(STA模式) ESP_ERROR_CHECK(esp_wifi_start()); 代码触发: esp_wifi_start() 执行后,ESP-IDF 自动触发 WIFI_EVENT_STA_START 事件; 回调函数 wifi_event_handler 捕获该事件,执行: case WIFI_EVENT_STA_START: wifi_set_state(wifi_sta_connect); // 状态机切换为“连接中” break;现象 / 日志:
I (12345) wifi: wifi firmware version: xxxx
I (12346) wifi: config NVS flash: enabled
I (12347) wifi: config nano formating: disabled
I (12357) wifi_sta: start wifi sta success
W (12360) SCode: wifiStatus:0 (wait) → 1 (connect) // 自定义状态日志
核心意义:WiFi 硬件启动完成,状态机标记 “准备连接路由器”,接下来可以发起连接请求。
步骤3:发起连接→触发WIFI_EVENT_STA_CONNECTED
代码操作:
// 向路由器发起连接请求 ESP_ERROR_CHECK(esp_wifi_connect());代码触发:
ESP32 与路由器完成 802.11 协议层握手(验证 SSID / 密码),触发 WIFI_EVENT_STA_CONNECTED 事件;
回调函数捕获该事件,执行:
case WIFI_EVENT_STA_CONNECTED: wifi_info.connectCnt = 0; // 重置连接失败计数 UTIL_LOG_I("WIFI","WIFI CONNECTED"); // 打印连接成功日志 if(!conf_sys.wifi.dhcp) { // 本例是DHCP模式,此分支不执行 wifi_set_static_ip(arg); } break;现象 / 日志:
I (15678) wifi: new:<6,0>, old:<1,0>, ap:<255,255>, sta:<6,0>, prof:1
I (15679) wifi: state: init -> auth (b0)
I (15684) wifi: state: auth -> assoc (0)
I (15689) wifi: state: assoc -> run (10)
I (15700) WIFI: WIFI CONNECTED // 自定义Info日志
W (15702) SCode: WiFi已连接路由器,等待DHCP分配IP...
核心意义:ESP32 与路由器 “物理连接成功”,但此时还没有 IP 地址,无法访问网络(比如 ping 不通网关),需等待 DHCP 分配 IP。
步骤4:DHCP获取IP →触发IP_EVENT_STA_GOT_IP
底层操作:ESP32 内置的 DHCP 客户端向路由器发送 “IP 请求包”,路由器分配 IP(比如 192.168.1.100),触发 IP_EVENT_STA_GOT_IP 事件。
代码触发:回调函数捕获该事件,执行核心逻辑:
case IP_EVENT_STA_GOT_IP: { IP_EVENT_STA_GOT_IP_FUN(event_data); // 解析IP信息并打印 wifi_set_state(wifi_sta_GotIP); // 状态机切换为“联网成功” wifi_module_GetMac(DS_Sys.MAC,wifi_type_sta); // 获取MAC地址 // 业务逻辑:向上位机上报“设备在线” Scode_Send_Write_Pkg("DeviceOnline"); } break;现象 / 日志:
I (16890) esp_netif_handlers: sta ip: 192.168.1.100, mask: 255.255.255.0, gw: 192.168.1.1
I (16891) IP_EVENT: STA GOT IP:192.168.1.100 // 自定义IP日志
W (16895) SCode: wifiStatus:1 (connect) → 2 (GotIP)
W (16900) SCode: Send:[68][30][30][20][31][32][33][68][01][05][00][01][01] // 上报在线状态的协议包
W (16920) SCode: Rcv:<68><30><30><20><31><32><33><68><01><05><00><01><00> // 上位机应答“接收成功”
核心意义:ESP32 拿到可用的 IP 地址,真正实现联网成功,可以执行所有网络操作(ping 外网、MQTT 连接、TCP 通信等)。
步骤5:联网成功后的业务落地
此时状态机为 wifi_sta_GotIP,可以执行工业场景的核心业务:
例 1:通过 TCP 连接工厂服务器(192.168.1.200:8080),上报设备运行数据;
例 2:订阅 MQTT 主题 factory/device/status,接收上位机的控制指令;
例 3:同步 NTP 网络时间(比如日志中出现 Current Time: 2025-12-11 16:15:34)。
流程总结(通俗版)
就像“手机连家里 WiFi” 的过程:
手机设置里输入 WiFi 名称 / 密码(对应 ESP32 配置 STA 参数);
点击“连接”(对应esp_wifi_start())→ 手机提示 “正在连接”(对应wifi_sta_connect);
手机显示“已连接”(对应WIFI_EVENT_STA_CONNECTED),但此时可能还没网(没 IP);
路由器给手机分配 IP(对应IP_EVENT_STA_GOT_IP)→ 手机右上角出现 “WiFi 图标 + 网速”(对应wifi_sta_GotIP),能刷视频 / 上网(对应 ESP32 上报数据)。
这个流程的核心是「事件驱动」:不用轮询“是否连接成功 / 是否有 IP”,而是等 ESP-IDF 主动触发事件,回调函数按需处理,这也是工业级应用的核心设计(高效、低资源占用)。
小编也为零基础小白整理了一份嵌入式学习资料大全。
思维导图、C语言学习、单片机、学习笔记、实例项目……你需要的知识都在这儿!