ESP32 自己创建Wi-Fi热点

作者:追风剑情 发布于:2026-5-26 1:43 分类:物联网

ESP32 的默认网关是 192.168.4.1(也是 ESP32 自己的 IP)。

#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "lwip/err.h"
#include "lwip/sys.h"
#include "lwip/netdb.h"

// ========== 热点配置 ==========
#define ESP_WIFI_SSID      "ESP32_HOT"   // 热点名称(可自定义)
#define ESP_WIFI_PASS      "12345678"    // 热点密码(至少8位)
#define ESP_WIFI_CHANNEL   1             // 信道(1-11)
#define ESP_MAX_STA_CONN   4             // 最大连接设备数

static const char *TAG = "ESP32_SOFTAP";

// ========== Wi-Fi 初始化(SoftAP 模式)==========
void wifi_init_softap(void)
{
    // 1. 初始化 NVS
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);

    // 2. 初始化 TCP/IP 栈和事件循环
    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    // 3. 创建默认的 SoftAP 网络接口
    esp_netif_create_default_wifi_ap();

    // 4. 初始化 Wi-Fi 驱动
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    // 5. 配置 SoftAP 参数
    wifi_config_t wifi_config = {
        .ap = {
            .ssid = ESP_WIFI_SSID,
            .ssid_len = strlen(ESP_WIFI_SSID),
            .password = ESP_WIFI_PASS,
            .channel = ESP_WIFI_CHANNEL,
            .max_connection = ESP_MAX_STA_CONN,
            .authmode = WIFI_AUTH_WPA2_PSK,  // 使用 WPA2 加密
            .pmf_cfg = {
                .required = false,
            },
        },
    };
    
    // 密码检查(WPA2 需要至少8位密码)
    if (strlen(ESP_WIFI_PASS) < 8) {
        ESP_LOGE(TAG, "密码长度不足 8 位!");
        return;
    }

    // 6. 设置并启动 Wi-Fi
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config));
    ESP_ERROR_CHECK(esp_wifi_start());

    ESP_LOGI(TAG, "========== SoftAP 热点已启动 ==========");
    ESP_LOGI(TAG, "  热点名称: %s", ESP_WIFI_SSID);
    ESP_LOGI(TAG, "  密码:     %s", ESP_WIFI_PASS);
    ESP_LOGI(TAG, "  信道:     %d", ESP_WIFI_CHANNEL);
    ESP_LOGI(TAG, "  最大连接数: %d", ESP_MAX_STA_CONN);
    ESP_LOGI(TAG, "======================================");
}

// ========== 获取已连接的设备信息 ==========
void print_connected_stations(void)
{
    wifi_sta_list_t station_list;
    memset(&station_list, 0, sizeof(station_list));
    
    esp_wifi_ap_get_sta_list(&station_list);
    
    ESP_LOGI(TAG, "当前连接的设备数: %d", station_list.num);
    
    for (int i = 0; i < station_list.num; i++) {
        ESP_LOGI(TAG, "  设备 %d MAC: %02x:%02x:%02x:%02x:%02x:%02x",
                 i + 1,
                 station_list.sta[i].mac[0],
                 station_list.sta[i].mac[1],
                 station_list.sta[i].mac[2],
                 station_list.sta[i].mac[3],
                 station_list.sta[i].mac[4],
                 station_list.sta[i].mac[5]);
    }
}

// ========== 主函数 ==========
void app_main(void)
{
    // 初始化 SoftAP 热点
    wifi_init_softap();
    
    // 获取 ESP32 自身的 IP 地址(默认是 192.168.4.1)
    esp_netif_t *netif = esp_netif_get_handle_from_ifkey("WIFI_AP_DEF");
    esp_netif_ip_info_t ip_info;
    esp_netif_get_ip_info(netif, &ip_info);
    
    ESP_LOGI(TAG, "ESP32 的 IP 地址: " IPSTR, IP2STR(&ip_info.ip));
    ESP_LOGI(TAG, "请用电脑连接热点 '%s',然后访问 http://" IPSTR, 
             ESP_WIFI_SSID, IP2STR(&ip_info.ip));
    
    // 主循环:每 10 秒打印一次已连接的设备
    while (1) {
        vTaskDelay(10000 / portTICK_PERIOD_MS);
        print_connected_stations();
    }
}

11111.png

标签: IoT

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号