news 2026/9/3 1:37:15

工业场景实战案例--wifi联网

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
工业场景实战案例--wifi联网

我是嵌入式学习菌,一名热爱学习的嵌入式工程师

关注我,一起变得更加优秀!

嵌入式学习菌

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语言学习、单片机、学习笔记、实例项目……你需要的知识都在这儿!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 23:58:40

线程组之间的JMeter传递变量

下面&#xff0c;我们将看看如何在线程组之间共享和传递变量。 在开发高级JMeter脚本时&#xff0c;很可能您将拥有多个线程组。每个线程组将执行不同的请求。 一个很好的例子是我们需要使用Bearer Tokens对用户进行身份验证。一个线程组执行身份验证并保存令牌。另一个线程组…

作者头像 李华
网站建设 2026/9/2 12:43:46

一次性搞定多任务!Python自动化复用浏览器技巧大揭秘

复用浏览器 简介 在 Web 自动化测试中&#xff0c;浏览器复用是指将已打开的浏览器实例用于多个测试用例。这可以显著提高测试效率和性能&#xff0c;并减少资源消耗。浏览器复用通常与浏览器驱动程序&#xff08;如 Selenium WebDriver&#xff09;一起使用&#xff0c;以便…

作者头像 李华
网站建设 2026/9/2 17:39:55

如何将相册装修成美团风格?看这里!

&#x1f64b;有小伙伴反馈&#xff1a;相册布局能否装修成像美团店铺那样&#xff1f;也就是顶部有一个商家信息卡片&#xff0c;下面就是左右两级分类&#xff0c;这样简洁明了&#xff0c;方便客户快速找款看款 &#x1f44c;包的&#x1f4af;支持的 ⬇️下面将介绍如何将相…

作者头像 李华
网站建设 2026/9/2 4:48:54

EmotiVoice官方认证培训课程上线

EmotiVoice官方认证培训课程上线&#xff1a;高表现力多情感语音合成技术深度解析 在智能语音助手越来越“懂你”的今天&#xff0c;我们是否还满足于那种语气平淡、毫无波澜的机械朗读&#xff1f;当AI开始扮演虚拟偶像、游戏NPC甚至心理陪伴者时&#xff0c;“说什么”已经不…

作者头像 李华
网站建设 2026/9/3 2:55:15

解密prompt系列61. 手搓代码沙箱与FastAPI-MCP实战

最近Vibe Code在各种技术社区刷屏&#xff0c;不过说实话&#xff0c;在日常工作中&#xff0c;我更多是用LLM来生成文档、批量修改代码或者排查问题。毕竟业务需求嘛&#xff0c;很少有能一次性描述清楚的&#xff08;懂的都懂哈哈~&#xff09;。但在看了最新的SWE-Bench Pro…

作者头像 李华
网站建设 2026/9/3 0:57:10

Kubernetes Deployment:部署与管理应用指南

在上一章节中&#xff0c;介绍了pod&#xff0c;以及介绍了如何使用命令行来创建一个pod。那么问题来了&#xff0c;一般来说&#xff0c;我们部署微服务不可能只部署一个噻&#xff0c;肯定是部署多个&#xff0c;但是我们总不可能说&#xff0c;写一个for循环&#xff0c;启动…

作者头像 李华