8. WiFi配网

为了实现一个优雅的移动端主动控制,我们还提供了一个WiFi连接控制方案。

1764042185806-fd978e99-c4f4-4773-bc4c-74ee9cc5f33e.svg

这个流程主要是:

  1. 初始化WiFi连接,进入STA模式,否则进AP模式
  2. 进入STA模式,创建WebSocket服务
  3. 启动WebSocket服务器
  4. 处理客户端请求
  5. 处理不同的WebSocket消息:电机参数、舵机参数、平衡控制、摇杆控制、其他参数的解析
  6. 设置为WebCommand
  7. 进入主循环处理命令

8.1 核心程序

初始化WiFi:

bool WiFiHandler::begin() {
    Serial.println("\n[WiFi] 正在初始化...");
    
    // 先尝试使用SmartConfig连接WiFi
    if (connectWiFiSmartConfig()) {
        currentMode = WiFiMode::STA;
        Serial.printf("[WiFi] STA模式已连接,IP: %s\n", WiFi.localIP().toString().c_str());
    } else {
        // 连接失败,启动AP模式
        startAP();
        currentMode = WiFiMode::AP;
        Serial.printf("[WiFi] AP模式已启动,IP: %s\n", apIP.toString().c_str());
    }
    
    // 创建Web服务器和WebSocket服务器
    webServer = new WebServer(80);
    wsServer = new WebSocketsServer(81);
    
    // 设置路由
    setupWebServer();
    
    // 启动WebSocket服务器
    wsServer->begin();
    wsServer->onEvent([](uint8_t num, WStype_t type, uint8_t* payload, size_t length) {
        if (instance != nullptr) {
            instance->webSocketEvent(num, type, payload, length);
        }
    });
    
    // 启动Web服务器
    webServer->begin();
    
    Serial.println("[WiFi] Web服务器已启动");
    Serial.printf("[访问] http://%s\n", getIPAddress().c_str());
    
    return true;
}

这个程序主要实现了如下流程:

  1. 选择配网方式:优先选择STA模式,否则使用AP模式。
  2. 网络服务启动:创建一个Web服务器,端口号为80;创建一个WebSocket服务器,端口号为81。启动Web、WebSocket服务器实现双向通信,处理控制命令,设置事件回调处理消息。设置三个路由,分别是"/"、"/debug"、"/control"。

8.2 SmartConfig配置

我们将使用乐鑫推荐的SmartConfig来进行WiFi配网。

SmartConfig简介:

https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/network/esp_smartconfig.html

代码中已实现SmartConfig的连接处理。主要的配置处理代码:

bool WiFiHandler::connectWiFiSmartConfig() {
    WiFi.mode(WIFI_STA);
    
    // 尝试使用保存的WiFi凭证连接
    Serial.println("[WiFi] 尝试使用已保存的WiFi凭证连接...");
    WiFi.begin();
    
    int attempts = 0;
    while (WiFi.status() != WL_CONNECTED && attempts < 20) {
        delay(500);
        Serial.print(".");
        attempts++;
    }
    Serial.println();
    
    if (WiFi.status() == WL_CONNECTED) {
        Serial.println("[WiFi] 使用已保存凭证连接成功");
        return true;
    }
    
    // 如果没有保存的凭证或连接失败,启动SmartConfig
    Serial.println("[WiFi] 启动SmartConfig配置模式...");
    Serial.println("[WiFi] 请使用ESP Touch APP配置WiFi");
    
    WiFi.beginSmartConfig();
    
    // 等待SmartConfig完成(最多等待2分钟)
    int smartConfigTimeout = 240; // 120秒 = 2分钟
    while (!WiFi.smartConfigDone() && smartConfigTimeout > 0) {
        delay(500);
        Serial.print(".");
        smartConfigTimeout--;
    }
    Serial.println();
    
    if (WiFi.smartConfigDone()) {
        Serial.println("[WiFi] SmartConfig配置成功");
        Serial.println("[WiFi] 正在连接WiFi...");
        
        // 等待连接完成
        attempts = 0;
        while (WiFi.status() != WL_CONNECTED && attempts < 20) {
            delay(500);
            Serial.print(".");
            attempts++;
        }
        Serial.println();
        
        if (WiFi.status() == WL_CONNECTED) {
            Serial.println("[WiFi] WiFi连接成功");
            Serial.printf("[WiFi] SSID: %s\n", WiFi.SSID().c_str());
            return true;
        }
    } else {
        Serial.println("[WiFi] SmartConfig超时");
    }
    
    WiFi.stopSmartConfig();
    return false;
}

烧录固件后,我们可以通过下载EspTouch来配置网络,它通过扫描附近存在的ESP系列设备,为其提供连接到路由器的桥接作用。(EspTouch仅为参考连接手段,其他手段请自行查找相关工具)

EspTouch下载链接:https://www.espressif.com/en/products/software/esp-touch/resources

下载后,界面如图所示。请先用手机连接到目标的2.4G网络,再输入密码进行配置。输入后选择广播,即可配置成功。

1764051737435-d97df31d-b0f2-4c98-85f2-3554b80a0ce6.jpeg

此时即可打开串口监视器看分配到ESP32的IP是什么。例如:

[WiFi] STA模式已连接,IP:192.168.1.11
[访问] http://192.168.1.11

然后进入浏览器输入该IP进行控制。

1764053990411-5dc515f1-dcc7-488f-a7d4-8570348a0204.png

您可以进入”机器人控制“页面,进行物理参数的调试控制,比如拖动摇杆操控:

1764054051639-1511ecca-ac05-436f-b2e2-51313161a32b.png

还可以进入“调试工具”获取机器人更详细的参数和状态:

1764054088907-393bd0bb-900a-4fb8-8b84-654a85233ddd.png

如上述方法不起作用,您可更换配网工具或在示例程序中更改为固定WIFI名称和密码进行连接。

注:如果使用AP模式,那么分配给ESP32的IP地址是固定的,为192.168.1.11,直接访问这个IP就好。