wifi设置在连接Wi-Fi之前需要先初始化好相关的底层组件。在ESP-IDF框架下标准的初始化顺序通常如下初始化底层网络协议栈调用 esp_netif_init()。这就像给网络通信准备好道路和交通规则。创建默认事件循环调用 esp_event_loop_create_default()。这就是一个不停运转的消息中心负责接收和分发所有事件。创建默认网络接口根据你的用途调用 esp_netif_create_default_wifi_sta()作为Station连接路由器或 esp_netif_create_default_wifi_ap()作为AP创建热点。初始化Wi-Fi驱动调用 esp_wifi_init()。这会启动Wi-Fi硬件和底层驱动。第二步核心事件准备工作完成后就可以开始连接了。对于最常见的Station模式连接路由器你需要关注以下几个按顺序发生的事件WIFI_EVENT_STA_START当你调用 esp_wifi_start() 后Wi-Fi驱动启动成功就会发出此事件。你应该在这个事件的处理函数中调用 esp_wifi_connect() 来真正发起连接。WIFI_EVENT_STA_CONNECTED当ESP32成功连接到路由器AP时触发。这代表物理层的Wi-Fi连接已建立但此时还没有IP地址。系统会自动启动DHCP客户端开始获取IP。IP_EVENT_STA_GOT_IP这是最重要的一个事件当DHCP客户端成功从路由器获取到IP地址后触发。这标志着整个网络连接已完全就绪。只有在这里你才可以安全地创建socket、发起HTTP请求等网络通信操作。函数解释snprintf安全格式化字符串头文件里用 DECLARE声明源文件里用 DEFINE定义。所以 DECLARE 和 DEFINE 的配合是C语言管理全局资源的标准惯用法#define ESP_EVENT_DECLARE_BASE(id) extern esp_event_base_t const id#define ESP_EVENT_DEFINE_BASE(id) esp_event_base_t const id #id所以这行代码声明了一个名为 id 的全局字符串常量它的值就是它自己的名字 id。void wifi_init_sta(void){s_wifi_event_group xEventGroupCreate();ESP_ERROR_CHECK(esp_netif_init());tcpip协议初始化ESP_ERROR_CHECK(esp_event_loop_create_default());esp_netif_create_default_wifi_sta();创建sta对象wifi_init_config_t cfg WIFI_INIT_CONFIG_DEFAULT();初始化结构体ESP_ERROR_CHECK(esp_wifi_init(cfg));通过上面结构体的配置去初始化wifiesp_event_handler_instance_t instance_any_id;用于取消相应的事件esp_event_handler_instance_t instance_got_ip;ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,ESP_EVENT_ANY_ID,表示捕获所有wifi事件event_handler,NULL,instance_any_id));ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,IP_EVENT_STA_GOT_IP,获取到ip事件event_handler,NULL,instance_got_ip));wifi_config_t wifi_config {填充结构体成员.sta {.ssid EXAMPLE_ESP_WIFI_SSID,你的wifi名称.password EXAMPLE_ESP_WIFI_PASS,你的wifi密码/* Authmode threshold resets to WPA2 as default if password matches WPA2 standards (password len 8).* If you want to connect the device to deprecated WEP/WPA networks, Please set the threshold value* to WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK and set the password with length and format matching to* WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK standards.*/.threshold.authmode ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD,加密等级.sae_pwe_h2e ESP_WIFI_SAE_MODE,.sae_h2e_identifier EXAMPLE_H2E_IDENTIFIER,},};ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );设置sta模式ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, wifi_config) );将结构体配置设置进去ESP_ERROR_CHECK(esp_wifi_start() );启动wifiESP_LOGI(TAG, wifi_init_sta finished.);/* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum* number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */EventBits_t bits xEventGroupWaitBits(s_wifi_event_group,WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,pdFALSE,pdFALSE,portMAX_DELAY);/* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually* happened. */if (bits WIFI_CONNECTED_BIT) {ESP_LOGI(TAG, connected to ap SSID:%s password:%s,EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);} else if (bits WIFI_FAIL_BIT) {ESP_LOGI(TAG, Failed to connect to SSID:%s, password:%s,EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);} else {ESP_LOGE(TAG, UNEXPECTED EVENT);}}OSI 七层模型是什么第 1 层物理层Physical Layer干什么的负责传输原始比特流0 和 1。它规定了网线用什么接口、网线里有几根铜线、电压是多少伏代表“1”多少伏代表“0”。关键设备网线、光纤、集线器Hub、中继器。和你之前问的关联SPI串行外设接口 就属于这一层的工作范畴它规定了芯片引脚上的电平高低如何传递数据。第 2 层数据链路层Data Link Layer干什么的把物理层的“0 和 1”组装成数据帧Frame并负责在同一局域网同一个交换机下 内找到对方。它引入了 MAC 地址物理地址就像快递员在同一个小区里根据门牌号送件。关键设备交换机Switch、网桥。关键协议以太网Ethernet、Wi-Fi802.11。第 3 层网络层Network Layer干什么的负责把数据从一个网络路由转发到另一个网络。它引入了 IP 地址就像快递总站根据邮编和城市把包裹发往正确的城市。关键设备路由器Router。关键协议IP网际协议——这就是 TCP/IP 里的那个“IP”。第 4 层传输层Transport Layer干什么的负责端到端的可靠通信。它解决两个核心问题① 数据有没有丢② 数据顺序对不对这一层引入了端口号Port用来区分电脑上不同的应用程序比如 80 端口是网页443 是加密网页。关键协议TCP传输控制协议——可靠有重传机制以及 UDP——不可靠但速度快用于视频通话、直播。第 5 层会话层Session Layer干什么的负责建立、管理和终止通信双方之间的会话连接。通俗讲就是“你好我们聊完了再见”。实际现状现在的网络协议栈中这一层功能已经被弱化或并入应用层了日常开发很少单独提它。第 6 层表示层Presentation Layer干什么的负责数据格式转换、加密、压缩。比如把图片转成 JPEG 格式把文字转成 ASCII 或 Unicode或者把数据加密防止偷看。实际现状同样现在的应用层软件如浏览器自己就完成了这些工作这一层也逐渐被合并了。第 7 层应用层Application Layer干什么的最靠近用户的一层直接为应用程序提供网络服务。这一层规定了数据的具体“格式”和“业务逻辑”。关键协议HTTP网页、HTTPS、FTP文件传输、SMTP邮件以及你刚才问的 MQTT——它们统统都在这一层。