Wi-Fi 连接¶
在本章中,我们要把这个电源插座连接到 Wi-Fi 网络。此 Wi-Fi 网络信息已嵌入到设备固件中,源代码可在 3_wifi_connection/ 目录中查看。
代码¶
#include <esp_wifi.h>
#include <esp_event_loop.h>
tcpip_adapter_init();
esp_event_loop_init(event_handler, NULL);
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
esp_wifi_set_mode(WIFI_MODE_STA);
wifi_config_t wifi_config = {
.sta = {
.ssid = EXAMPLE_ESP_WIFI_SSID,
.password = EXAMPLE_ESP_WIFI_PASS,
},
};
esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);
esp_wifi_start();
在上述代码中:
- 我们调用 tcpip_adapter_init() 来初始化 TCP/IP 堆栈;
- 调用 esp_wifi_init() 和 esp_wifi_set_mode() 来初始化 Wi-Fi 子系统及其 station 接口;
- 最后,使用嵌入的 SSID 和密码配置 Wi-Fi 网络,调用 esp_wifi_start() 启动 station 接口。
Wi-Fi 协议栈会发出断开连接、建立连接、获取到 IP 地址等异步事件。事件循环 (event loop) 从 TCP/IP 堆栈和 Wi-Fi 子系统收集事件,调用 esp_event_loop_init() 初始化 event loop,event loop 将这些事件传递给通过第一参数注册的回调函数。
异步事件处理程序在 Event Loop 注册,其实现方式如下:
esp_err_t event_handler(void *ctx, system_event_t *event)
{
switch(event->event_id) {
case SYSTEM_EVENT_STA_START:
esp_wifi_connect();
break;
case SYSTEM_EVENT_STA_GOT_IP:
ESP_LOGI(TAG, "Connected with IP Address:%s",
ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
esp_wifi_connect();
break;
return ESP_OK;
}
事件处理程序当前处理 3 个事件,当接收到 SYSTEM_EVENT_STA_START 事件后,要求 station 接口调用 esp_wifi_connect() 进行网络连接。收到 Wi-Fi 断开事件,也会要求 station 接口调用 esp_wifi_connect() 重新进行网络连接。
ESP32 接收到获取 IP 地址即相当于 SYSTEM_EVENT_STA_GOT_IP 事件发生,在这种情况下,我们只在控制台打印 IP 地址。
未完待续¶
现在您可以修改应用程序,输入 Wi-Fi 网络的 SSID 和密码。如果您已将该代码编译并烧录至开发板,ESP32 将连接到您设置的 Wi-Fi 网络,并在控制台上打印 IP 地址。当然,我们还保留了插座按下按钮触发 GPIO 的功能。
但这种方法有个弊端:Wi-Fi 配置被写死到了固件中。虽然这种方法对业余开发项目而言没有问题,但是如果用于量产,终端用户则希望自定义配置设备。这就是我们下一章要讨论的问题。